yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
snes_color_test.cc
Go to the documentation of this file.
2
3#include <gtest/gtest.h>
4
5#include "imgui/imgui.h"
6
7namespace yaze {
8namespace gfx {
9namespace {
10
11// Test fixture for SnesColor tests
12class SnesColorTest : public ::testing::Test {
13 protected:
14 void SetUp() override {
15 // Common setup if needed
16 }
17};
18
19// ============================================================================
20// RGB Format Conversion Tests
21// ============================================================================
22
23TEST_F(SnesColorTest, SetRgbFromImGuiNormalizedValues) {
24 SnesColor color;
25
26 // ImGui ColorPicker returns values in 0-1 range
27 ImVec4 imgui_color(0.5f, 0.75f, 1.0f, 1.0f);
28 color.set_rgb(imgui_color);
29
30 // Internal storage should be in 0-255 range
31 auto rgb = color.rgb();
32 EXPECT_FLOAT_EQ(rgb.x, 127.5f); // 0.5 * 255
33 EXPECT_FLOAT_EQ(rgb.y, 191.25f); // 0.75 * 255
34 EXPECT_FLOAT_EQ(rgb.z, 255.0f); // 1.0 * 255
35 EXPECT_FLOAT_EQ(rgb.w, 255.0f); // Alpha always 255
36}
37
38TEST_F(SnesColorTest, SetRgbBlackColor) {
39 SnesColor color;
40
41 ImVec4 black(0.0f, 0.0f, 0.0f, 1.0f);
42 color.set_rgb(black);
43
44 auto rgb = color.rgb();
45 EXPECT_FLOAT_EQ(rgb.x, 0.0f);
46 EXPECT_FLOAT_EQ(rgb.y, 0.0f);
47 EXPECT_FLOAT_EQ(rgb.z, 0.0f);
48 EXPECT_FLOAT_EQ(rgb.w, 255.0f);
49}
50
51TEST_F(SnesColorTest, SetRgbWhiteColor) {
52 SnesColor color;
53
54 ImVec4 white(1.0f, 1.0f, 1.0f, 1.0f);
55 color.set_rgb(white);
56
57 auto rgb = color.rgb();
58 EXPECT_FLOAT_EQ(rgb.x, 255.0f);
59 EXPECT_FLOAT_EQ(rgb.y, 255.0f);
60 EXPECT_FLOAT_EQ(rgb.z, 255.0f);
61 EXPECT_FLOAT_EQ(rgb.w, 255.0f);
62}
63
64TEST_F(SnesColorTest, SetRgbMidRangeColor) {
65 SnesColor color;
66
67 // Test a mid-range color (medium gray)
68 ImVec4 gray(0.5f, 0.5f, 0.5f, 1.0f);
69 color.set_rgb(gray);
70
71 auto rgb = color.rgb();
72 EXPECT_NEAR(rgb.x, 127.5f, 0.01f);
73 EXPECT_NEAR(rgb.y, 127.5f, 0.01f);
74 EXPECT_NEAR(rgb.z, 127.5f, 0.01f);
75}
76
77// ============================================================================
78// Constructor Tests
79// ============================================================================
80
81TEST_F(SnesColorTest, ConstructFromImVec4) {
82 // ImGui color in 0-1 range
83 ImVec4 imgui_color(0.25f, 0.5f, 0.75f, 1.0f);
84
85 SnesColor color(imgui_color);
86
87 // Should be converted to 0-255 range
88 auto rgb = color.rgb();
89 EXPECT_NEAR(rgb.x, 63.75f, 0.01f); // 0.25 * 255
90 EXPECT_NEAR(rgb.y, 127.5f, 0.01f); // 0.5 * 255
91 EXPECT_NEAR(rgb.z, 191.25f, 0.01f); // 0.75 * 255
92 EXPECT_FLOAT_EQ(rgb.w, 255.0f);
93}
94
95TEST_F(SnesColorTest, ConstructFromSnesValue) {
96 // SNES BGR555 format: 0x7FFF = white (all bits set in 15-bit color)
97 SnesColor white(0x7FFF);
98
99 auto rgb = white.rgb();
100 // All channels should be max (after BGR555 conversion)
101 EXPECT_GT(rgb.x, 240.0f); // Close to 255
102 EXPECT_GT(rgb.y, 240.0f);
103 EXPECT_GT(rgb.z, 240.0f);
104}
105
106TEST_F(SnesColorTest, ConstructFromSnesBlack) {
107 // SNES BGR555 format: 0x0000 = black
108 SnesColor black(0x0000);
109
110 auto rgb = black.rgb();
111 EXPECT_FLOAT_EQ(rgb.x, 0.0f);
112 EXPECT_FLOAT_EQ(rgb.y, 0.0f);
113 EXPECT_FLOAT_EQ(rgb.z, 0.0f);
114}
115
116// ============================================================================
117// SNES Format Conversion Tests
118// ============================================================================
119
120TEST_F(SnesColorTest, SetSnesUpdatesRgb) {
121 SnesColor color;
122
123 // Set a SNES color value
124 color.set_snes(0x7FFF); // White in BGR555
125
126 // RGB should be updated
127 auto rgb = color.rgb();
128 EXPECT_GT(rgb.x, 240.0f);
129 EXPECT_GT(rgb.y, 240.0f);
130 EXPECT_GT(rgb.z, 240.0f);
131}
132
133TEST_F(SnesColorTest, RgbToSnesConversion) {
134 SnesColor color;
135
136 // Set pure red in RGB (0-1 range for ImGui)
137 ImVec4 red(1.0f, 0.0f, 0.0f, 1.0f);
138 color.set_rgb(red);
139
140 // SNES value should be set (BGR555 format)
141 uint16_t snes = color.snes();
142 EXPECT_NE(snes, 0x0000); // Should not be black
143
144 // Extract red component from BGR555 (bits 0-4)
145 uint16_t snes_red = snes & 0x1F;
146 EXPECT_EQ(snes_red, 0x1F); // Max red in 5-bit
147}
148
149// ============================================================================
150// Round-Trip Conversion Tests
151// ============================================================================
152
153TEST_F(SnesColorTest, RoundTripImGuiToSnesColor) {
154 // Start with ImGui color
155 ImVec4 original(0.6f, 0.4f, 0.8f, 1.0f);
156
157 // Convert to SnesColor
158 SnesColor color(original);
159
160 // Convert back to ImVec4 (normalized)
161 auto rgb = color.rgb();
162 ImVec4 converted(rgb.x / 255.0f, rgb.y / 255.0f, rgb.z / 255.0f, 1.0f);
163
164 // Should be approximately equal (within floating point precision)
165 EXPECT_NEAR(converted.x, original.x, 0.01f);
166 EXPECT_NEAR(converted.y, original.y, 0.01f);
167 EXPECT_NEAR(converted.z, original.z, 0.01f);
168}
169
170TEST_F(SnesColorTest, MultipleSetRgbCalls) {
171 SnesColor color;
172
173 // First color
174 ImVec4 color1(0.2f, 0.4f, 0.6f, 1.0f);
175 color.set_rgb(color1);
176
177 auto rgb1 = color.rgb();
178 EXPECT_NEAR(rgb1.x, 51.0f, 1.0f);
179 EXPECT_NEAR(rgb1.y, 102.0f, 1.0f);
180 EXPECT_NEAR(rgb1.z, 153.0f, 1.0f);
181
182 // Second color (should completely replace)
183 ImVec4 color2(0.8f, 0.6f, 0.4f, 1.0f);
184 color.set_rgb(color2);
185
186 auto rgb2 = color.rgb();
187 EXPECT_NEAR(rgb2.x, 204.0f, 1.0f);
188 EXPECT_NEAR(rgb2.y, 153.0f, 1.0f);
189 EXPECT_NEAR(rgb2.z, 102.0f, 1.0f);
190}
191
192// ============================================================================
193// Edge Case Tests
194// ============================================================================
195
196TEST_F(SnesColorTest, HandlesMaxValues) {
197 SnesColor color;
198
199 ImVec4 max(1.0f, 1.0f, 1.0f, 1.0f);
200 color.set_rgb(max);
201
202 auto rgb = color.rgb();
203 EXPECT_FLOAT_EQ(rgb.x, 255.0f);
204 EXPECT_FLOAT_EQ(rgb.y, 255.0f);
205 EXPECT_FLOAT_EQ(rgb.z, 255.0f);
206}
207
208TEST_F(SnesColorTest, HandlesMinValues) {
209 SnesColor color;
210
211 ImVec4 min(0.0f, 0.0f, 0.0f, 1.0f);
212 color.set_rgb(min);
213
214 auto rgb = color.rgb();
215 EXPECT_FLOAT_EQ(rgb.x, 0.0f);
216 EXPECT_FLOAT_EQ(rgb.y, 0.0f);
217 EXPECT_FLOAT_EQ(rgb.z, 0.0f);
218}
219
220TEST_F(SnesColorTest, AlphaAlwaysMaximum) {
221 SnesColor color;
222
223 // Try setting alpha to different values (should always be ignored)
224 ImVec4 color_with_alpha(0.5f, 0.5f, 0.5f, 0.5f);
225 color.set_rgb(color_with_alpha);
226
227 auto rgb = color.rgb();
228 EXPECT_FLOAT_EQ(rgb.w, 255.0f); // Alpha should always be 255
229}
230
231// ============================================================================
232// Modified Flag Tests
233// ============================================================================
234
235TEST_F(SnesColorTest, ModifiedFlagSetOnRgbChange) {
236 SnesColor color;
237
238 EXPECT_FALSE(color.is_modified());
239
240 ImVec4 new_color(0.5f, 0.5f, 0.5f, 1.0f);
241 color.set_rgb(new_color);
242
243 EXPECT_TRUE(color.is_modified());
244}
245
246TEST_F(SnesColorTest, ModifiedFlagSetOnSnesChange) {
247 SnesColor color;
248
249 EXPECT_FALSE(color.is_modified());
250
251 color.set_snes(0x7FFF);
252
253 EXPECT_TRUE(color.is_modified());
254}
255
256} // namespace
257} // namespace gfx
258} // namespace yaze
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
constexpr bool is_modified() const
Definition snes_color.h:194
void set_snes(uint16_t val)
Set color from SNES 15-bit format.
constexpr uint16_t snes() const
Get SNES 15-bit color.
Definition snes_color.h:192
void set_rgb(const ImVec4 val)
Set color from ImVec4 (0.0-1.0 range)
TEST_F(GraphicsOptimizationBenchmarks, PaletteLookupPerformance)
Main namespace for the application.
Definition controller.cc:20