1#include "test.h"
2
3#include <base/color.h>
4
5#include <gtest/gtest.h>
6
7TEST(Color, HslToRgbToHslConv)
8{
9 for(unsigned PackedColor = 0; PackedColor <= 0xFFFFFF; PackedColor += 0xA)
10 {
11 ColorHSLA OldHsl = ColorHSLA(PackedColor);
12 ColorRGBA ConvertedRgb = color_cast<ColorRGBA>(hsl: OldHsl);
13 ColorHSLA NewHsl = color_cast<ColorHSLA>(rgb: ConvertedRgb);
14
15 if(OldHsl.s == 0.0f || OldHsl.s == 1.0f)
16 {
17 ASSERT_FLOAT_EQ(OldHsl.l, NewHsl.l);
18 }
19 else if(OldHsl.l == 0.0f || OldHsl.l == 1.0f)
20 {
21 ASSERT_FLOAT_EQ(OldHsl.l, NewHsl.l);
22 }
23 else
24 {
25 ASSERT_NEAR(std::fmod(OldHsl.h, 1.0f), std::fmod(NewHsl.h, 1.0f), 0.001f);
26 ASSERT_NEAR(OldHsl.s, NewHsl.s, 0.0001f);
27 ASSERT_FLOAT_EQ(OldHsl.l, NewHsl.l);
28 }
29 }
30}
31
32TEST(Color, RgbToHslToRgbConv)
33{
34 for(unsigned PackedColor = 0; PackedColor <= 0xFFFFFF; PackedColor += 0xA)
35 {
36 ColorRGBA OldRgb = ColorRGBA(PackedColor);
37 ColorHSLA ConvertedHsl = color_cast<ColorHSLA>(rgb: OldRgb);
38 ColorRGBA NewRgb = color_cast<ColorRGBA>(hsl: ConvertedHsl);
39
40 ASSERT_NEAR(OldRgb.r, NewRgb.r, 0.000001f);
41 ASSERT_NEAR(OldRgb.g, NewRgb.g, 0.000001f);
42 ASSERT_NEAR(OldRgb.b, NewRgb.b, 0.000001f);
43 }
44}
45
46TEST(Color, HslToHsvToHslConv)
47{
48 for(unsigned PackedColor = 0; PackedColor <= 0xFFFFFF; PackedColor += 0xA)
49 {
50 ColorHSLA OldHsl = ColorHSLA(PackedColor);
51 ColorHSVA ConvertedHsv = color_cast<ColorHSVA>(hsl: OldHsl);
52 ColorHSLA NewHsl = color_cast<ColorHSLA>(hsv: ConvertedHsv);
53
54 if(OldHsl.s == 0.0f || OldHsl.s == 1.0f)
55 {
56 ASSERT_FLOAT_EQ(OldHsl.l, NewHsl.l);
57 }
58 else if(OldHsl.l == 0.0f || OldHsl.l == 1.0f)
59 {
60 ASSERT_FLOAT_EQ(OldHsl.l, NewHsl.l);
61 }
62 else
63 {
64 ASSERT_NEAR(std::fmod(OldHsl.h, 1.0f), std::fmod(NewHsl.h, 1.0f), 0.001f);
65 ASSERT_NEAR(OldHsl.s, NewHsl.s, 0.0001f);
66 ASSERT_FLOAT_EQ(OldHsl.l, NewHsl.l);
67 }
68 }
69}
70
71TEST(Color, HsvToHslToHsvConv)
72{
73 for(unsigned PackedColor = 0; PackedColor <= 0xFFFFFF; PackedColor += 0xA)
74 {
75 ColorHSVA OldHsv = ColorHSVA(PackedColor);
76 ColorHSLA ConvertedHsl = color_cast<ColorHSLA>(hsv: OldHsv);
77 ColorHSVA NewHsv = color_cast<ColorHSVA>(hsl: ConvertedHsl);
78
79 if(OldHsv.s == 0.0f || OldHsv.s == 1.0f)
80 {
81 ASSERT_FLOAT_EQ(OldHsv.v, NewHsv.v);
82 }
83 else if(OldHsv.v == 0.0f || OldHsv.v == 1.0f)
84 {
85 ASSERT_FLOAT_EQ(OldHsv.v, NewHsv.v);
86 }
87 else
88 {
89 ASSERT_NEAR(std::fmod(OldHsv.h, 1.0f), std::fmod(NewHsv.h, 1.0f), 0.001f);
90 ASSERT_NEAR(OldHsv.s, NewHsv.s, 0.0001f);
91 ASSERT_FLOAT_EQ(OldHsv.v, NewHsv.v);
92 }
93 }
94}
95
96// Any color_cast should keep the same alpha value
97TEST(Color, ConvKeepsAlpha)
98{
99 const int Max = 100;
100 for(int i = 0; i <= Max; i++)
101 {
102 const float Alpha = i / (float)Max;
103 ASSERT_FLOAT_EQ(color_cast<ColorRGBA>(ColorHSLA(0.1f, 0.2f, 0.3f, Alpha)).a, Alpha);
104 ASSERT_FLOAT_EQ(color_cast<ColorRGBA>(ColorHSVA(0.1f, 0.2f, 0.3f, Alpha)).a, Alpha);
105 ASSERT_FLOAT_EQ(color_cast<ColorHSLA>(ColorRGBA(0.1f, 0.2f, 0.3f, Alpha)).a, Alpha);
106 ASSERT_FLOAT_EQ(color_cast<ColorHSLA>(ColorHSVA(0.1f, 0.2f, 0.3f, Alpha)).a, Alpha);
107 ASSERT_FLOAT_EQ(color_cast<ColorHSVA>(ColorRGBA(0.1f, 0.2f, 0.3f, Alpha)).a, Alpha);
108 ASSERT_FLOAT_EQ(color_cast<ColorHSVA>(ColorHSLA(0.1f, 0.2f, 0.3f, Alpha)).a, Alpha);
109 }
110}
111