1 #include "StabilityTest.hpp"
3 #include "rand/GaloisLFSR.hpp"
4 #include "rand/SimplexNoise.hpp"
5 #include "rand/WorleyNoise.hpp"
10 #include <glm/gtx/io.hpp>
12 CPPUNIT_TEST_SUITE_REGISTRATION(blank::test::StabilityTest);
20 void StabilityTest::setUp() {
24 void StabilityTest::tearDown() {
29 void StabilityTest::testRNG() {
33 CPPUNIT_ASSERT_EQUAL_MESSAGE(
34 "unexpected value #1 from RNG",
35 uint16_t(0x0000), value
38 CPPUNIT_ASSERT_EQUAL_MESSAGE(
39 "unexpected value #2 from RNG",
40 uint16_t(0x0000), value
43 CPPUNIT_ASSERT_EQUAL_MESSAGE(
44 "unexpected value #3 from RNG",
45 uint16_t(0xB000), value
48 CPPUNIT_ASSERT_EQUAL_MESSAGE(
49 "unexpected value #4 from RNG",
50 uint16_t(0x0000), value
53 CPPUNIT_ASSERT_EQUAL_MESSAGE(
54 "unexpected value #5 from RNG",
55 uint16_t(0x0000), value
58 CPPUNIT_ASSERT_EQUAL_MESSAGE(
59 "unexpected value #6 from RNG",
60 uint16_t(0x0000), value
63 CPPUNIT_ASSERT_EQUAL_MESSAGE(
64 "unexpected value #7 from RNG",
65 uint16_t(0x4500), value
68 CPPUNIT_ASSERT_EQUAL_MESSAGE(
69 "unexpected value #8 from RNG",
70 uint16_t(0x0000), value
73 CPPUNIT_ASSERT_EQUAL_MESSAGE(
74 "unexpected value #9 from RNG",
75 uint16_t(0x0000), value
78 CPPUNIT_ASSERT_EQUAL_MESSAGE(
79 "unexpected value #10 from RNG",
80 uint16_t(0x0000), value
83 CPPUNIT_ASSERT_EQUAL_MESSAGE(
84 "unexpected value #11 from RNG",
85 uint16_t(0x2E70), value
88 CPPUNIT_ASSERT_EQUAL_MESSAGE(
89 "unexpected value #12 from RNG",
90 uint16_t(0x0000), value
93 CPPUNIT_ASSERT_EQUAL_MESSAGE(
94 "unexpected value #13 from RNG",
95 uint16_t(0x0000), value
98 CPPUNIT_ASSERT_EQUAL_MESSAGE(
99 "unexpected value #14 from RNG",
100 uint16_t(0x0000), value
103 CPPUNIT_ASSERT_EQUAL_MESSAGE(
104 "unexpected value #15 from RNG",
105 uint16_t(0x1011), value
108 CPPUNIT_ASSERT_EQUAL_MESSAGE(
109 "unexpected value #16 from RNG",
110 uint16_t(0x0000), value
113 CPPUNIT_ASSERT_EQUAL_MESSAGE(
114 "unexpected value #17 from RNG",
115 uint16_t(0x0000), value
118 CPPUNIT_ASSERT_EQUAL_MESSAGE(
119 "unexpected value #18 from RNG",
120 uint16_t(0xB000), value
122 value = random.Next<uint16_t>();
123 CPPUNIT_ASSERT_EQUAL_MESSAGE(
124 "unexpected value #19 from RNG (using Next())",
125 uint16_t(0x0B0B), value
128 CPPUNIT_ASSERT_EQUAL_MESSAGE(
129 "unexpected value #20 from RNG",
130 uint16_t(0x0000), value
133 CPPUNIT_ASSERT_EQUAL_MESSAGE(
134 "unexpected value #21 from RNG",
135 uint16_t(0x0000), value
138 CPPUNIT_ASSERT_EQUAL_MESSAGE(
139 "unexpected value #22 from RNG",
140 uint16_t(0x1500), value
143 CPPUNIT_ASSERT_EQUAL_MESSAGE(
144 "unexpected value #23 from RNG",
145 uint16_t(0x0454), value
148 CPPUNIT_ASSERT_EQUAL_MESSAGE(
149 "unexpected value #24 from RNG",
150 uint16_t(0x0000), value
153 CPPUNIT_ASSERT_EQUAL_MESSAGE(
154 "unexpected value #25 from RNG",
155 uint16_t(0x0000), value
157 value = random.Next<uint16_t>();
158 CPPUNIT_ASSERT_EQUAL_MESSAGE(
159 "unexpected value #26 from RNG (using Next())",
160 uint16_t(0xC970), value
163 CPPUNIT_ASSERT_EQUAL_MESSAGE(
164 "unexpected value #27 from RNG",
165 uint16_t(0x02E5), value
168 CPPUNIT_ASSERT_EQUAL_MESSAGE(
169 "unexpected value #28 from RNG",
170 uint16_t(0x0000), value
173 CPPUNIT_ASSERT_EQUAL_MESSAGE(
174 "unexpected value #29 from RNG",
175 uint16_t(0x0000), value
178 CPPUNIT_ASSERT_EQUAL_MESSAGE(
179 "unexpected value #30 from RNG",
180 uint16_t(0x0101), value
183 CPPUNIT_ASSERT_EQUAL_MESSAGE(
184 "unexpected value #31 from RNG",
185 uint16_t(0x0100), value
188 CPPUNIT_ASSERT_EQUAL_MESSAGE(
189 "unexpected value #32 from RNG",
190 uint16_t(0x0000), value
193 GaloisLFSR random1(1);
195 for (int i = 0; i < 32; ++i) {
198 CPPUNIT_ASSERT_EQUAL_MESSAGE(
199 "RNG with seeds 0 and 1 differ",
203 GaloisLFSR random_bool(0);
205 for (int i = 0; i < (16 * 32); ++i) {
206 random_bool(value_bool);
208 CPPUNIT_ASSERT_EQUAL_MESSAGE(
209 "unexpected result for bool",
213 GaloisLFSR random8(0);
215 for (int i = 0; i < 31; ++i) {
218 CPPUNIT_ASSERT_EQUAL_MESSAGE(
219 "unexpected result for uint8",
220 uint8_t(0x10), value8
223 GaloisLFSR random32(0);
225 for (int i = 0; i < 16; ++i) {
228 CPPUNIT_ASSERT_EQUAL_MESSAGE(
229 "unexpected result for uint32",
230 uint32_t(0xB0000000), value32
234 void StabilityTest::testSimplex() {
235 SimplexNoise noise(0);
237 Assert(noise, glm::vec3(0.0f, 0.0f, 0.0f), 0.0f);
238 Assert(noise, glm::vec3(0.0f, 0.0f, 1.0f), 0.652221322059631f);
239 Assert(noise, glm::vec3(0.0f, 1.0f, 0.0f), 0.867977976799011f);
240 Assert(noise, glm::vec3(0.0f, 1.0f, 1.0f), -0.107878111302853f);
241 Assert(noise, glm::vec3(1.0f, 0.0f, 0.0f), -0.107878260314465f);
242 Assert(noise, glm::vec3(1.0f, 0.0f, 1.0f), -6.31356940061778e-08f);
243 Assert(noise, glm::vec3(1.0f, 1.0f, 0.0f), -0.107878245413303f);
244 Assert(noise, glm::vec3(1.0f, 1.0f, 1.0f), 0.0f);
246 Assert(noise, glm::vec3( 0.0f, 0.0f, -1.0f), -0.107878483831882f);
247 Assert(noise, glm::vec3( 0.0f, -1.0f, 0.0f), -0.760099768638611f);
248 Assert(noise, glm::vec3( 0.0f, -1.0f, -1.0f), 0.0f);
249 Assert(noise, glm::vec3(-1.0f, 0.0f, 0.0f), 0.760099768638611f);
250 Assert(noise, glm::vec3(-1.0f, 0.0f, -1.0f), 0.0f);
251 Assert(noise, glm::vec3(-1.0f, -1.0f, 0.0f), -0.107878118753433f);
252 Assert(noise, glm::vec3(-1.0f, -1.0f, -1.0f), 0.0f);
255 void StabilityTest::testWorley() {
256 WorleyNoise noise(0);
258 Assert(noise, glm::vec3(0.0f, 0.0f, 0.0f), -0.117765009403229f);
259 Assert(noise, glm::vec3(0.0f, 0.0f, 1.0f), -0.209876894950867f);
260 Assert(noise, glm::vec3(0.0f, 1.0f, 0.0f), -0.290086328983307f);
261 Assert(noise, glm::vec3(0.0f, 1.0f, 1.0f), -0.332393705844879f);
262 Assert(noise, glm::vec3(1.0f, 0.0f, 0.0f), -0.621925830841064f);
263 Assert(noise, glm::vec3(1.0f, 0.0f, 1.0f), -0.338455379009247f);
264 Assert(noise, glm::vec3(1.0f, 1.0f, 0.0f), -0.386664032936096f);
265 Assert(noise, glm::vec3(1.0f, 1.0f, 1.0f), -0.533940434455872f);
267 Assert(noise, glm::vec3( 0.0f, 0.0f, -1.0f), -0.425480604171753f);
268 Assert(noise, glm::vec3( 0.0f, -1.0f, 0.0f), -0.189745843410492f);
269 Assert(noise, glm::vec3( 0.0f, -1.0f, -1.0f), -0.30408102273941f);
270 Assert(noise, glm::vec3(-1.0f, 0.0f, 0.0f), -0.618566155433655f);
271 Assert(noise, glm::vec3(-1.0f, 0.0f, -1.0f), -0.060045599937439f);
272 Assert(noise, glm::vec3(-1.0f, -1.0f, 0.0f), -0.366827547550201f);
273 Assert(noise, glm::vec3(-1.0f, -1.0f, -1.0f), -0.575981974601746f);
276 void StabilityTest::Assert(
277 const SimplexNoise &noise,
278 const glm::vec3 &position,
282 msg << "unexpected simplex noise value at " << position;
283 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
285 expected, noise(position), numeric_limits<float>::epsilon()
289 void StabilityTest::Assert(
290 const WorleyNoise &noise,
291 const glm::vec3 &position,
295 msg << "unexpected worley noise value at " << position;
296 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
298 expected, noise(position), numeric_limits<float>::epsilon()