yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
palette_manager_test.cc
Go to the documentation of this file.
2
3#include <gtest/gtest.h>
4
7#include "app/rom.h"
8
9namespace yaze {
10namespace gfx {
11namespace {
12
13// Test fixture for PaletteManager integration tests
14class PaletteManagerTest : public ::testing::Test {
15 protected:
16 void SetUp() override {
17 // PaletteManager is a singleton, so we need to reset it between tests
18 // Note: In a real scenario, we'd need a way to reset the singleton
19 // For now, we'll work with the existing instance
20 }
21
22 void TearDown() override {
23 // Clean up any test state
24 PaletteManager::Get().ClearHistory();
25 }
26};
27
28// ============================================================================
29// Initialization Tests
30// ============================================================================
31
32TEST_F(PaletteManagerTest, InitializationState) {
33 auto& manager = PaletteManager::Get();
34
35 // Before initialization, should not be initialized
36 // Note: This might fail if other tests have already initialized it
37 // In production, we'd need a Reset() method for testing
38
39 // After initialization with null ROM, should handle gracefully
40 manager.Initialize(nullptr);
41 EXPECT_FALSE(manager.IsInitialized());
42}
43
44TEST_F(PaletteManagerTest, HasNoUnsavedChangesInitially) {
45 auto& manager = PaletteManager::Get();
46
47 // Should have no unsaved changes initially
48 EXPECT_FALSE(manager.HasUnsavedChanges());
49 EXPECT_EQ(manager.GetModifiedColorCount(), 0);
50}
51
52// ============================================================================
53// Dirty Tracking Tests
54// ============================================================================
55
56TEST_F(PaletteManagerTest, TracksModifiedGroups) {
57 auto& manager = PaletteManager::Get();
58
59 // Initially, no groups should be modified
60 auto modified_groups = manager.GetModifiedGroups();
61 EXPECT_TRUE(modified_groups.empty());
62}
63
64TEST_F(PaletteManagerTest, GetModifiedColorCount) {
65 auto& manager = PaletteManager::Get();
66
67 // Initially, no colors modified
68 EXPECT_EQ(manager.GetModifiedColorCount(), 0);
69
70 // After initialization and making changes, count should increase
71 // (This would require a valid ROM to test properly)
72}
73
74// ============================================================================
75// Undo/Redo Tests
76// ============================================================================
77
78TEST_F(PaletteManagerTest, UndoRedoInitialState) {
79 auto& manager = PaletteManager::Get();
80
81 // Initially, should not be able to undo or redo
82 EXPECT_FALSE(manager.CanUndo());
83 EXPECT_FALSE(manager.CanRedo());
84 EXPECT_EQ(manager.GetUndoStackSize(), 0);
85 EXPECT_EQ(manager.GetRedoStackSize(), 0);
86}
87
88TEST_F(PaletteManagerTest, ClearHistoryResetsStacks) {
89 auto& manager = PaletteManager::Get();
90
91 // Clear history should reset both stacks
92 manager.ClearHistory();
93
94 EXPECT_FALSE(manager.CanUndo());
95 EXPECT_FALSE(manager.CanRedo());
96 EXPECT_EQ(manager.GetUndoStackSize(), 0);
97 EXPECT_EQ(manager.GetRedoStackSize(), 0);
98}
99
100TEST_F(PaletteManagerTest, UndoWithoutChangesIsNoOp) {
101 auto& manager = PaletteManager::Get();
102
103 EXPECT_FALSE(manager.CanUndo());
104
105 // Should not crash
106 manager.Undo();
107
108 EXPECT_FALSE(manager.CanUndo());
109}
110
111TEST_F(PaletteManagerTest, RedoWithoutUndoIsNoOp) {
112 auto& manager = PaletteManager::Get();
113
114 EXPECT_FALSE(manager.CanRedo());
115
116 // Should not crash
117 manager.Redo();
118
119 EXPECT_FALSE(manager.CanRedo());
120}
121
122// ============================================================================
123// Batch Operations Tests
124// ============================================================================
125
126TEST_F(PaletteManagerTest, BatchModeTracking) {
127 auto& manager = PaletteManager::Get();
128
129 EXPECT_FALSE(manager.InBatch());
130
131 manager.BeginBatch();
132 EXPECT_TRUE(manager.InBatch());
133
134 manager.EndBatch();
135 EXPECT_FALSE(manager.InBatch());
136}
137
138TEST_F(PaletteManagerTest, NestedBatchOperations) {
139 auto& manager = PaletteManager::Get();
140
141 EXPECT_FALSE(manager.InBatch());
142
143 manager.BeginBatch();
144 EXPECT_TRUE(manager.InBatch());
145
146 manager.BeginBatch(); // Nested
147 EXPECT_TRUE(manager.InBatch());
148
149 manager.EndBatch();
150 EXPECT_TRUE(manager.InBatch()); // Still in batch (outer)
151
152 manager.EndBatch();
153 EXPECT_FALSE(manager.InBatch()); // Now out of batch
154}
155
156TEST_F(PaletteManagerTest, EndBatchWithoutBeginIsNoOp) {
157 auto& manager = PaletteManager::Get();
158
159 EXPECT_FALSE(manager.InBatch());
160
161 // Should not crash
162 manager.EndBatch();
163
164 EXPECT_FALSE(manager.InBatch());
165}
166
167// ============================================================================
168// Change Notification Tests
169// ============================================================================
170
171TEST_F(PaletteManagerTest, RegisterAndUnregisterListener) {
172 auto& manager = PaletteManager::Get();
173
174 int callback_count = 0;
175 auto callback = [&callback_count](const PaletteChangeEvent& event) {
176 callback_count++;
177 };
178
179 // Register listener
180 int id = manager.RegisterChangeListener(callback);
181 EXPECT_GT(id, 0);
182
183 // Unregister listener
184 manager.UnregisterChangeListener(id);
185
186 // After unregistering, callback should not be called
187 // (Would need to trigger an event to test this properly)
188}
189
190TEST_F(PaletteManagerTest, MultipleListeners) {
191 auto& manager = PaletteManager::Get();
192
193 int callback1_count = 0;
194 int callback2_count = 0;
195
196 auto callback1 = [&callback1_count](const PaletteChangeEvent& event) {
197 callback1_count++;
198 };
199
200 auto callback2 = [&callback2_count](const PaletteChangeEvent& event) {
201 callback2_count++;
202 };
203
204 int id1 = manager.RegisterChangeListener(callback1);
205 int id2 = manager.RegisterChangeListener(callback2);
206
207 EXPECT_NE(id1, id2);
208
209 // Clean up
210 manager.UnregisterChangeListener(id1);
211 manager.UnregisterChangeListener(id2);
212}
213
214// ============================================================================
215// Color Query Tests (without ROM)
216// ============================================================================
217
218TEST_F(PaletteManagerTest, GetColorWithoutInitialization) {
219 auto& manager = PaletteManager::Get();
220
221 // Getting color without initialization should return default color
222 SnesColor color = manager.GetColor("ow_main", 0, 0);
223
224 // Default SnesColor should have zero values
225 auto rgb = color.rgb();
226 EXPECT_FLOAT_EQ(rgb.x, 0.0f);
227 EXPECT_FLOAT_EQ(rgb.y, 0.0f);
228 EXPECT_FLOAT_EQ(rgb.z, 0.0f);
229}
230
231TEST_F(PaletteManagerTest, SetColorWithoutInitializationFails) {
232 auto& manager = PaletteManager::Get();
233
234 SnesColor new_color(0x7FFF);
235 auto status = manager.SetColor("ow_main", 0, 0, new_color);
236
237 EXPECT_FALSE(status.ok());
238 EXPECT_EQ(status.code(), absl::StatusCode::kFailedPrecondition);
239}
240
241TEST_F(PaletteManagerTest, ResetColorWithoutInitializationReturnsError) {
242 auto& manager = PaletteManager::Get();
243
244 auto status = manager.ResetColor("ow_main", 0, 0);
245
246 // Should return an error or default color
247 // Exact behavior depends on implementation
248}
249
250TEST_F(PaletteManagerTest, ResetPaletteWithoutInitializationFails) {
251 auto& manager = PaletteManager::Get();
252
253 auto status = manager.ResetPalette("ow_main", 0);
254
255 EXPECT_FALSE(status.ok());
256 EXPECT_EQ(status.code(), absl::StatusCode::kFailedPrecondition);
257}
258
259// ============================================================================
260// Save/Discard Tests (without ROM)
261// ============================================================================
262
263TEST_F(PaletteManagerTest, SaveGroupWithoutInitializationFails) {
264 auto& manager = PaletteManager::Get();
265
266 auto status = manager.SaveGroup("ow_main");
267
268 EXPECT_FALSE(status.ok());
269 EXPECT_EQ(status.code(), absl::StatusCode::kFailedPrecondition);
270}
271
272TEST_F(PaletteManagerTest, SaveAllWithoutInitializationFails) {
273 auto& manager = PaletteManager::Get();
274
275 auto status = manager.SaveAllToRom();
276
277 EXPECT_FALSE(status.ok());
278 EXPECT_EQ(status.code(), absl::StatusCode::kFailedPrecondition);
279}
280
281TEST_F(PaletteManagerTest, DiscardGroupWithoutInitializationIsNoOp) {
282 auto& manager = PaletteManager::Get();
283
284 // Should not crash
285 manager.DiscardGroup("ow_main");
286
287 // No unsaved changes
288 EXPECT_FALSE(manager.HasUnsavedChanges());
289}
290
291TEST_F(PaletteManagerTest, DiscardAllWithoutInitializationIsNoOp) {
292 auto& manager = PaletteManager::Get();
293
294 // Should not crash
295 manager.DiscardAllChanges();
296
297 // No unsaved changes
298 EXPECT_FALSE(manager.HasUnsavedChanges());
299}
300
301// ============================================================================
302// Group Modification Query Tests
303// ============================================================================
304
305TEST_F(PaletteManagerTest, IsGroupModifiedInitiallyFalse) {
306 auto& manager = PaletteManager::Get();
307
308 EXPECT_FALSE(manager.IsGroupModified("ow_main"));
309 EXPECT_FALSE(manager.IsGroupModified("dungeon_main"));
310 EXPECT_FALSE(manager.IsGroupModified("global_sprites"));
311}
312
313TEST_F(PaletteManagerTest, IsPaletteModifiedInitiallyFalse) {
314 auto& manager = PaletteManager::Get();
315
316 EXPECT_FALSE(manager.IsPaletteModified("ow_main", 0));
317 EXPECT_FALSE(manager.IsPaletteModified("ow_main", 5));
318}
319
320TEST_F(PaletteManagerTest, IsColorModifiedInitiallyFalse) {
321 auto& manager = PaletteManager::Get();
322
323 EXPECT_FALSE(manager.IsColorModified("ow_main", 0, 0));
324 EXPECT_FALSE(manager.IsColorModified("ow_main", 0, 7));
325}
326
327// ============================================================================
328// Invalid Input Tests
329// ============================================================================
330
331TEST_F(PaletteManagerTest, SetColorInvalidGroupName) {
332 auto& manager = PaletteManager::Get();
333
334 SnesColor color(0x7FFF);
335 auto status = manager.SetColor("invalid_group", 0, 0, color);
336
337 EXPECT_FALSE(status.ok());
338}
339
340TEST_F(PaletteManagerTest, GetColorInvalidGroupName) {
341 auto& manager = PaletteManager::Get();
342
343 SnesColor color = manager.GetColor("invalid_group", 0, 0);
344
345 // Should return default color
346 auto rgb = color.rgb();
347 EXPECT_FLOAT_EQ(rgb.x, 0.0f);
348 EXPECT_FLOAT_EQ(rgb.y, 0.0f);
349 EXPECT_FLOAT_EQ(rgb.z, 0.0f);
350}
351
352TEST_F(PaletteManagerTest, IsGroupModifiedInvalidGroupName) {
353 auto& manager = PaletteManager::Get();
354
355 EXPECT_FALSE(manager.IsGroupModified("invalid_group"));
356}
357
358} // namespace
359} // namespace gfx
360} // namespace yaze
static PaletteManager & Get()
Get the singleton instance.
SNES Color container.
Definition snes_color.h:109
constexpr ImVec4 rgb() const
Get RGB values (WARNING: stored as 0-255 in ImVec4)
Definition snes_color.h:182
TEST_F(GraphicsOptimizationBenchmarks, PaletteLookupPerformance)
Main namespace for the application.
Definition controller.cc:20
Event notification for palette changes.