Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
ConversionTests.cpp
Go to the documentation of this file.
2
3namespace Divide
4{
5
6TEST_CASE( "Time Downcast", "[conversion_tests]" )
7{
8 constexpr U32 inputSeconds = 4;
9 constexpr U32 inputMilliseconds = 5;
10 constexpr U32 inputMicroseconds = 6;
11
12 constexpr U32 microToNanoResult = 6'000u;
13
14 constexpr U32 milliToMicroResult = 5'000u;
15 constexpr D64 milliToNanoResult = 5e6;
16
17 constexpr U32 secondsToMilliResult = 4'000u;
18 constexpr D64 secondsToMicroResult = 4e6;
19 constexpr D64 secondsToNanoResult = 4e9;
20
21 constexpr U32 microToNano = Time::MicrosecondsToNanoseconds<U32>(inputMicroseconds);
22 constexpr U32 milliToMicro = Time::MillisecondsToMicroseconds<U32>(inputMilliseconds);
23 constexpr D64 milliToNano = Time::MillisecondsToNanoseconds<D64>(inputMilliseconds);
24 constexpr U32 secondsToMilli = Time::SecondsToMilliseconds<U32>(inputSeconds);
25 constexpr D64 secondsToMicro = Time::SecondsToMicroseconds<D64>(inputSeconds);
26 constexpr D64 secondsToNano = Time::SecondsToNanoseconds<D64>(inputSeconds);
27
28 CHECK_EQUAL(microToNanoResult, microToNano);
29 CHECK_EQUAL(milliToMicroResult, milliToMicro);
30 CHECK_TRUE(COMPARE(milliToNanoResult, milliToNano));
31 CHECK_EQUAL(secondsToMilliResult, secondsToMilli);
32 CHECK_TRUE(COMPARE(secondsToMicroResult, secondsToMicro));
33 CHECK_TRUE(COMPARE(secondsToNanoResult, secondsToNano));
34}
35
36TEST_CASE( "Time Upcast", "[conversion_tests]" )
37{
38 constexpr U32 secondsResult = 4;
39 constexpr U32 millisecondsResult = 5;
40 constexpr U32 microsecondsResult = 6;
41
42 constexpr D64 inputNanoToSeconds = 4e9;
43 constexpr D64 inputNanoToMilli = 5e6;
44 constexpr U32 inputNanoToMicro = 6'000u;
45
46 constexpr D64 inputMicroToSeconds = 4e6;
47 constexpr U32 inputMicroToMilli = 5'000u;
48 constexpr U32 inputMilliToSeconds = 4'000u;
49
50 constexpr U32 nanoToSeconds = Time::NanosecondsToSeconds<U32>(inputNanoToSeconds);
51 constexpr U32 nanoToMilli = Time::NanosecondsToMilliseconds<U32>(inputNanoToMilli);
52 constexpr U32 nanoToMicro = Time::NanosecondsToMicroseconds<U32>(inputNanoToMicro);
53
54 constexpr U32 microToSeconds = Time::MicrosecondsToSeconds<U32>(inputMicroToSeconds);
55 constexpr U32 microToMilli = Time::MicrosecondsToMilliseconds<U32>(inputMicroToMilli);
56
57 constexpr U32 milliToSeconds = Time::MillisecondsToSeconds<U32>(inputMilliToSeconds);
58
59 CHECK_EQUAL(secondsResult, nanoToSeconds);
60 CHECK_EQUAL(millisecondsResult, nanoToMilli);
61 CHECK_EQUAL(microsecondsResult, nanoToMicro);
62
63 CHECK_EQUAL(secondsResult, microToSeconds);
64 CHECK_EQUAL(millisecondsResult, microToMilli);
65
66 CHECK_EQUAL(secondsResult, milliToSeconds);
67}
68
69TEST_CASE( "MAP Range test", "[conversion_tests]" )
70{
71 constexpr U32 in_min = 0;
72 constexpr U32 in_max = 100;
73 constexpr U32 out_min = 0;
74 constexpr U32 out_max = 10;
75 constexpr U32 in = 20;
76 constexpr U32 result = 2;
77 CHECK_EQUAL(result, MAP(in, in_min, in_max, out_min, out_max));
78}
79
80TEST_CASE( "Float To Char Conversions", "[conversion_tests]" )
81{
82 // We don't expect these to match properly, but we still need a decent level of precision
83 constexpr F32 tolerance = 0.005f;
84
85 constexpr F32_NORM input1 = 0.75f;
86 constexpr F32_SNORM input2 = -0.66f;
87 constexpr F32_SNORM input3 = 0.36f;
88
89 const U8 result1U = FLOAT_TO_CHAR_UNORM(input1);
90 const F32_NORM result1F = UNORM_CHAR_TO_FLOAT(result1U);
91 CHECK_TRUE(COMPARE_TOLERANCE(result1F, input1, tolerance));
92
93 const I8 result2I = FLOAT_TO_CHAR_SNORM(input2);
94 const F32_SNORM result2F = SNORM_CHAR_TO_FLOAT(result2I);
95 CHECK_TRUE(COMPARE_TOLERANCE(result2F, input2, tolerance));
96
97 const U8 result3I = PACKED_FLOAT_TO_CHAR_UNORM(input3);
98 const F32_SNORM result3F = UNORM_CHAR_TO_PACKED_FLOAT(result3I);
99 CHECK_TRUE(COMPARE_TOLERANCE(result3F, input3, tolerance));
100}
101
102TEST_CASE( "Vec Packing Tests", "[conversion_tests]" )
103{
104 // We don't expect these to match properly, but we still need a decent level of precision
105 constexpr F32 tolerance = 0.05f;
106
107 const vec2<F32_SNORM> input1{ 0.5f, -0.3f };
108 const vec3<F32_SNORM> input2{ 0.55f, -0.1f, 1.0f};
109 const vec3<F32_SNORM> input3{ 0.25f, 0.67f, 0.123f};
110 const vec4<U8> input4{ 32, 64, 128, 255};
111 const F32 input5{ -1023.99f };
112 const U32 result1U = Util::PACK_HALF2x16(input1);
113 const F32 result2U = Util::PACK_VEC3(input2);
114
115 const U16 result1US = Util::PACK_HALF1x16(input5);
116 const F32 result1F = Util::UNPACK_HALF1x16(result1US);
117
118 const vec2<F32_SNORM> result1V = Util::UNPACK_HALF2x16(result1U);
119 const vec3<F32_SNORM> result2V = Util::UNPACK_VEC3(result2U);
120
121 CHECK_TRUE(result1V.compare(input1, tolerance));
122 CHECK_TRUE(result2V.compare(input2, tolerance));
123 CHECK_TRUE(COMPARE_TOLERANCE(result1F, input5, tolerance));
124
125 const U32 result3U = Util::PACK_11_11_10(input3);
126 const vec3<F32_SNORM> result3V = Util::UNPACK_11_11_10(result3U);
127
128 CHECK_TRUE(result3V.compare(input3, tolerance));
129
130 const U32 result4U = Util::PACK_UNORM4x8(input4);
131 const vec4<U8> result4V = Util::UNPACK_UNORM4x8_U8(result4U);
132 CHECK_EQUAL(result4V, input4);
133}
134
135
136} //namespace Divide
bool compare(vec2< U > v) const noexcept
compare 2 vectors
bool compare(const vec3< U > &v) const noexcept
compare 2 vectors
void UNPACK_11_11_10(U32 src, vec3< F32_NORM > &res)
Definition: MathHelper.cpp:430
U32 PACK_11_11_10(const vec3< F32_NORM > &value)
Definition: MathHelper.cpp:426
F32 PACK_VEC3(F32_SNORM x, F32_SNORM y, F32_SNORM z) noexcept
Definition: MathHelper.inl:316
void UNPACK_VEC3(F32 src, F32_SNORM &x, F32_SNORM &y, F32_SNORM &z) noexcept
Definition: MathHelper.inl:335
void UNPACK_HALF1x16(U16 src, F32 &value)
Only convert the range [-1024., 1024.] for accurate results.
Definition: MathHelper.cpp:331
U32 PACK_UNORM4x8(const vec4< F32_NORM > &value)
Definition: MathHelper.cpp:369
vec4< U8 > UNPACK_UNORM4x8_U8(U32 src)
Definition: MathHelper.cpp:414
U16 PACK_HALF1x16(F32 value)
Only convert the range [-1024., 1024.] for accurate results.
Definition: MathHelper.cpp:327
U32 PACK_HALF2x16(vec2< F32 > value)
Definition: MathHelper.cpp:312
void UNPACK_HALF2x16(U32 src, vec2< F32 > &value)
Definition: MathHelper.cpp:316
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
constexpr U8 FLOAT_TO_CHAR_UNORM(F32_NORM value) noexcept
Returns round(value * 255)
Definition: MathHelper.inl:307
constexpr I8 FLOAT_TO_CHAR_SNORM(F32_SNORM value) noexcept
Returns clamped value * 128.
Definition: MathHelper.inl:276
constexpr F32_SNORM UNORM_CHAR_TO_PACKED_FLOAT(U8 value) noexcept
Definition: MathHelper.inl:295
constexpr F32_NORM UNORM_CHAR_TO_FLOAT(U8 value) noexcept
Returns value / 255.f.
Definition: MathHelper.inl:302
uint8_t U8
constexpr U8 PACKED_FLOAT_TO_CHAR_UNORM(F32_SNORM value) noexcept
Helper methods to go from an snorm float (-1...1) to packed unorm char (value => (value + 1) * 0....
Definition: MathHelper.inl:287
uint16_t U16
::value constexpr T MAP(T input, T in_min, T in_max, T out_min, T out_max, D64 &slopeOut) noexcept
Definition: MathHelper.inl:141
bool COMPARE_TOLERANCE(const T X, const U Y, const T TOLERANCE) noexcept
double D64
constexpr F32_SNORM SNORM_CHAR_TO_FLOAT(I8 value) noexcept
Definition: MathHelper.inl:282
bool COMPARE(T X, U Y) noexcept
TEST_CASE("ByteBuffer RW Bool", "[byte_buffer]")
uint32_t U32
#define CHECK_EQUAL(LHS, RHS)
#define CHECK_TRUE(...)