1 #include "StabilityTest.hpp"
3 #include "math/GaloisLFSR.hpp"
4 #include "math/SimplexNoise.hpp"
5 #include "math/WorleyNoise.hpp"
10 #include <glm/gtx/io.hpp>
12 CPPUNIT_TEST_SUITE_REGISTRATION(blobs::math::test::StabilityTest);
21 void StabilityTest::setUp() {
25 void StabilityTest::tearDown() {
30 void StabilityTest::testRNG() {
34 CPPUNIT_ASSERT_EQUAL_MESSAGE(
35 "unexpected value #1 from RNG",
36 uint16_t(0x0000), value
39 CPPUNIT_ASSERT_EQUAL_MESSAGE(
40 "unexpected value #2 from RNG",
41 uint16_t(0x0000), value
44 CPPUNIT_ASSERT_EQUAL_MESSAGE(
45 "unexpected value #3 from RNG",
46 uint16_t(0xB000), value
49 CPPUNIT_ASSERT_EQUAL_MESSAGE(
50 "unexpected value #4 from RNG",
51 uint16_t(0x0000), value
54 CPPUNIT_ASSERT_EQUAL_MESSAGE(
55 "unexpected value #5 from RNG",
56 uint16_t(0x0000), value
59 CPPUNIT_ASSERT_EQUAL_MESSAGE(
60 "unexpected value #6 from RNG",
61 uint16_t(0x0000), value
64 CPPUNIT_ASSERT_EQUAL_MESSAGE(
65 "unexpected value #7 from RNG",
66 uint16_t(0x4500), value
69 CPPUNIT_ASSERT_EQUAL_MESSAGE(
70 "unexpected value #8 from RNG",
71 uint16_t(0x0000), value
74 CPPUNIT_ASSERT_EQUAL_MESSAGE(
75 "unexpected value #9 from RNG",
76 uint16_t(0x0000), value
79 CPPUNIT_ASSERT_EQUAL_MESSAGE(
80 "unexpected value #10 from RNG",
81 uint16_t(0x0000), value
84 CPPUNIT_ASSERT_EQUAL_MESSAGE(
85 "unexpected value #11 from RNG",
86 uint16_t(0x2E70), value
89 CPPUNIT_ASSERT_EQUAL_MESSAGE(
90 "unexpected value #12 from RNG",
91 uint16_t(0x0000), value
94 CPPUNIT_ASSERT_EQUAL_MESSAGE(
95 "unexpected value #13 from RNG",
96 uint16_t(0x0000), value
99 CPPUNIT_ASSERT_EQUAL_MESSAGE(
100 "unexpected value #14 from RNG",
101 uint16_t(0x0000), value
104 CPPUNIT_ASSERT_EQUAL_MESSAGE(
105 "unexpected value #15 from RNG",
106 uint16_t(0x1011), value
109 CPPUNIT_ASSERT_EQUAL_MESSAGE(
110 "unexpected value #16 from RNG",
111 uint16_t(0x0000), value
114 CPPUNIT_ASSERT_EQUAL_MESSAGE(
115 "unexpected value #17 from RNG",
116 uint16_t(0x0000), value
119 CPPUNIT_ASSERT_EQUAL_MESSAGE(
120 "unexpected value #18 from RNG",
121 uint16_t(0xB000), value
123 value = random.Next<uint16_t>();
124 CPPUNIT_ASSERT_EQUAL_MESSAGE(
125 "unexpected value #19 from RNG (using Next())",
126 uint16_t(0x0B0B), value
129 CPPUNIT_ASSERT_EQUAL_MESSAGE(
130 "unexpected value #20 from RNG",
131 uint16_t(0x0000), value
134 CPPUNIT_ASSERT_EQUAL_MESSAGE(
135 "unexpected value #21 from RNG",
136 uint16_t(0x0000), value
139 CPPUNIT_ASSERT_EQUAL_MESSAGE(
140 "unexpected value #22 from RNG",
141 uint16_t(0x1500), value
144 CPPUNIT_ASSERT_EQUAL_MESSAGE(
145 "unexpected value #23 from RNG",
146 uint16_t(0x0454), value
149 CPPUNIT_ASSERT_EQUAL_MESSAGE(
150 "unexpected value #24 from RNG",
151 uint16_t(0x0000), value
154 CPPUNIT_ASSERT_EQUAL_MESSAGE(
155 "unexpected value #25 from RNG",
156 uint16_t(0x0000), value
158 value = random.Next<uint16_t>();
159 CPPUNIT_ASSERT_EQUAL_MESSAGE(
160 "unexpected value #26 from RNG (using Next())",
161 uint16_t(0xC970), value
164 CPPUNIT_ASSERT_EQUAL_MESSAGE(
165 "unexpected value #27 from RNG",
166 uint16_t(0x02E5), value
169 CPPUNIT_ASSERT_EQUAL_MESSAGE(
170 "unexpected value #28 from RNG",
171 uint16_t(0x0000), value
174 CPPUNIT_ASSERT_EQUAL_MESSAGE(
175 "unexpected value #29 from RNG",
176 uint16_t(0x0000), value
179 CPPUNIT_ASSERT_EQUAL_MESSAGE(
180 "unexpected value #30 from RNG",
181 uint16_t(0x0101), value
184 CPPUNIT_ASSERT_EQUAL_MESSAGE(
185 "unexpected value #31 from RNG",
186 uint16_t(0x0100), value
189 CPPUNIT_ASSERT_EQUAL_MESSAGE(
190 "unexpected value #32 from RNG",
191 uint16_t(0x0000), value
194 GaloisLFSR random1(1);
196 for (int i = 0; i < 32; ++i) {
199 CPPUNIT_ASSERT_EQUAL_MESSAGE(
200 "RNG with seeds 0 and 1 differ",
204 GaloisLFSR random_bool(0);
206 for (int i = 0; i < (16 * 32); ++i) {
207 random_bool(value_bool);
209 CPPUNIT_ASSERT_EQUAL_MESSAGE(
210 "unexpected result for bool",
214 GaloisLFSR random8(0);
216 for (int i = 0; i < 31; ++i) {
219 CPPUNIT_ASSERT_EQUAL_MESSAGE(
220 "unexpected result for uint8",
221 uint8_t(0x10), value8
224 GaloisLFSR random32(0);
226 for (int i = 0; i < 16; ++i) {
229 CPPUNIT_ASSERT_EQUAL_MESSAGE(
230 "unexpected result for uint32",
231 uint32_t(0xB0000000), value32
235 void StabilityTest::testSimplex() {
236 SimplexNoise noise(0);
238 Assert(noise, glm::vec3(0.0f, 0.0f, 0.0f), 0.0f);
239 Assert(noise, glm::vec3(0.0f, 0.0f, 1.0f), 0.652221322059631f);
240 Assert(noise, glm::vec3(0.0f, 1.0f, 0.0f), 0.867977976799011f);
241 Assert(noise, glm::vec3(0.0f, 1.0f, 1.0f), -0.107878111302853f);
242 Assert(noise, glm::vec3(1.0f, 0.0f, 0.0f), -0.107878260314465f);
243 Assert(noise, glm::vec3(1.0f, 0.0f, 1.0f), -6.31356940061778e-08f);
244 Assert(noise, glm::vec3(1.0f, 1.0f, 0.0f), -0.107878245413303f);
245 Assert(noise, glm::vec3(1.0f, 1.0f, 1.0f), 0.0f);
247 Assert(noise, glm::vec3( 0.0f, 0.0f, -1.0f), -0.107878483831882f);
248 Assert(noise, glm::vec3( 0.0f, -1.0f, 0.0f), -0.760099768638611f);
249 Assert(noise, glm::vec3( 0.0f, -1.0f, -1.0f), 0.0f);
250 Assert(noise, glm::vec3(-1.0f, 0.0f, 0.0f), 0.760099768638611f);
251 Assert(noise, glm::vec3(-1.0f, 0.0f, -1.0f), 0.0f);
252 Assert(noise, glm::vec3(-1.0f, -1.0f, 0.0f), -0.107878118753433f);
253 Assert(noise, glm::vec3(-1.0f, -1.0f, -1.0f), 0.0f);
256 void StabilityTest::testWorley() {
257 WorleyNoise noise(0);
259 Assert(noise, glm::vec3(0.0f, 0.0f, 0.0f), -0.117765009403229f);
260 Assert(noise, glm::vec3(0.0f, 0.0f, 1.0f), -0.209876894950867f);
261 Assert(noise, glm::vec3(0.0f, 1.0f, 0.0f), -0.290086328983307f);
262 Assert(noise, glm::vec3(0.0f, 1.0f, 1.0f), -0.332393705844879f);
263 Assert(noise, glm::vec3(1.0f, 0.0f, 0.0f), -0.621925830841064f);
264 Assert(noise, glm::vec3(1.0f, 0.0f, 1.0f), -0.338455379009247f);
265 Assert(noise, glm::vec3(1.0f, 1.0f, 0.0f), -0.386664032936096f);
266 Assert(noise, glm::vec3(1.0f, 1.0f, 1.0f), -0.533940434455872f);
268 Assert(noise, glm::vec3( 0.0f, 0.0f, -1.0f), -0.425480604171753f);
269 Assert(noise, glm::vec3( 0.0f, -1.0f, 0.0f), -0.189745843410492f);
270 Assert(noise, glm::vec3( 0.0f, -1.0f, -1.0f), -0.30408102273941f);
271 Assert(noise, glm::vec3(-1.0f, 0.0f, 0.0f), -0.618566155433655f);
272 Assert(noise, glm::vec3(-1.0f, 0.0f, -1.0f), -0.060045599937439f);
273 Assert(noise, glm::vec3(-1.0f, -1.0f, 0.0f), -0.366827547550201f);
274 Assert(noise, glm::vec3(-1.0f, -1.0f, -1.0f), -0.575981974601746f);
277 void StabilityTest::Assert(
278 const SimplexNoise &noise,
279 const glm::vec3 &position,
283 msg << "unexpected simplex noise value at " << position;
284 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
286 expected, noise(position), numeric_limits<float>::epsilon()
290 void StabilityTest::Assert(
291 const WorleyNoise &noise,
292 const glm::vec3 &position,
296 msg << "unexpected worley noise value at " << position;
297 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
299 expected, noise(position), numeric_limits<float>::epsilon()