]> git.localhorst.tv Git - blank.git/blob - tst/rand/StabilityTest.cpp
test stability of worley noise generator
[blank.git] / tst / rand / StabilityTest.cpp
1 #include "StabilityTest.hpp"
2
3 #include "rand/GaloisLFSR.hpp"
4 #include "rand/SimplexNoise.hpp"
5 #include "rand/WorleyNoise.hpp"
6
7 #include <cstdint>
8 #include <string>
9 #include <sstream>
10 #include <glm/gtx/io.hpp>
11
12 CPPUNIT_TEST_SUITE_REGISTRATION(blank::test::StabilityTest);
13
14 using namespace std;
15
16
17 namespace blank {
18 namespace test {
19
20 void StabilityTest::setUp() {
21
22 }
23
24 void StabilityTest::tearDown() {
25
26 }
27
28
29 void StabilityTest::testRNG() {
30         GaloisLFSR random(0);
31         uint16_t value;
32         random(value);
33         CPPUNIT_ASSERT_EQUAL_MESSAGE(
34                 "unexpected value #1 from RNG",
35                 uint16_t(0x0000), value
36         );
37         random(value);
38         CPPUNIT_ASSERT_EQUAL_MESSAGE(
39                 "unexpected value #2 from RNG",
40                 uint16_t(0x0000), value
41         );
42         random(value);
43         CPPUNIT_ASSERT_EQUAL_MESSAGE(
44                 "unexpected value #3 from RNG",
45                 uint16_t(0xB000), value
46         );
47         random(value);
48         CPPUNIT_ASSERT_EQUAL_MESSAGE(
49                 "unexpected value #4 from RNG",
50                 uint16_t(0x0000), value
51         );
52         random(value);
53         CPPUNIT_ASSERT_EQUAL_MESSAGE(
54                 "unexpected value #5 from RNG",
55                 uint16_t(0x0000), value
56         );
57         random(value);
58         CPPUNIT_ASSERT_EQUAL_MESSAGE(
59                 "unexpected value #6 from RNG",
60                 uint16_t(0x0000), value
61         );
62         random(value);
63         CPPUNIT_ASSERT_EQUAL_MESSAGE(
64                 "unexpected value #7 from RNG",
65                 uint16_t(0x4500), value
66         );
67         random(value);
68         CPPUNIT_ASSERT_EQUAL_MESSAGE(
69                 "unexpected value #8 from RNG",
70                 uint16_t(0x0000), value
71         );
72         random(value);
73         CPPUNIT_ASSERT_EQUAL_MESSAGE(
74                 "unexpected value #9 from RNG",
75                 uint16_t(0x0000), value
76         );
77         random(value);
78         CPPUNIT_ASSERT_EQUAL_MESSAGE(
79                 "unexpected value #10 from RNG",
80                 uint16_t(0x0000), value
81         );
82         random(value);
83         CPPUNIT_ASSERT_EQUAL_MESSAGE(
84                 "unexpected value #11 from RNG",
85                 uint16_t(0x2E70), value
86         );
87         random(value);
88         CPPUNIT_ASSERT_EQUAL_MESSAGE(
89                 "unexpected value #12 from RNG",
90                 uint16_t(0x0000), value
91         );
92         random(value);
93         CPPUNIT_ASSERT_EQUAL_MESSAGE(
94                 "unexpected value #13 from RNG",
95                 uint16_t(0x0000), value
96         );
97         random(value);
98         CPPUNIT_ASSERT_EQUAL_MESSAGE(
99                 "unexpected value #14 from RNG",
100                 uint16_t(0x0000), value
101         );
102         random(value);
103         CPPUNIT_ASSERT_EQUAL_MESSAGE(
104                 "unexpected value #15 from RNG",
105                 uint16_t(0x1011), value
106         );
107         random(value);
108         CPPUNIT_ASSERT_EQUAL_MESSAGE(
109                 "unexpected value #16 from RNG",
110                 uint16_t(0x0000), value
111         );
112         random(value);
113         CPPUNIT_ASSERT_EQUAL_MESSAGE(
114                 "unexpected value #17 from RNG",
115                 uint16_t(0x0000), value
116         );
117         random(value);
118         CPPUNIT_ASSERT_EQUAL_MESSAGE(
119                 "unexpected value #18 from RNG",
120                 uint16_t(0xB000), value
121         );
122         value = random.Next<uint16_t>();
123         CPPUNIT_ASSERT_EQUAL_MESSAGE(
124                 "unexpected value #19 from RNG (using Next())",
125                 uint16_t(0x0B0B), value
126         );
127         random(value);
128         CPPUNIT_ASSERT_EQUAL_MESSAGE(
129                 "unexpected value #20 from RNG",
130                 uint16_t(0x0000), value
131         );
132         random(value);
133         CPPUNIT_ASSERT_EQUAL_MESSAGE(
134                 "unexpected value #21 from RNG",
135                 uint16_t(0x0000), value
136         );
137         random(value);
138         CPPUNIT_ASSERT_EQUAL_MESSAGE(
139                 "unexpected value #22 from RNG",
140                 uint16_t(0x1500), value
141         );
142         random(value);
143         CPPUNIT_ASSERT_EQUAL_MESSAGE(
144                 "unexpected value #23 from RNG",
145                 uint16_t(0x0454), value
146         );
147         random(value);
148         CPPUNIT_ASSERT_EQUAL_MESSAGE(
149                 "unexpected value #24 from RNG",
150                 uint16_t(0x0000), value
151         );
152         random(value);
153         CPPUNIT_ASSERT_EQUAL_MESSAGE(
154                 "unexpected value #25 from RNG",
155                 uint16_t(0x0000), value
156         );
157         value = random.Next<uint16_t>();
158         CPPUNIT_ASSERT_EQUAL_MESSAGE(
159                 "unexpected value #26 from RNG (using Next())",
160                 uint16_t(0xC970), value
161         );
162         random(value);
163         CPPUNIT_ASSERT_EQUAL_MESSAGE(
164                 "unexpected value #27 from RNG",
165                 uint16_t(0x02E5), value
166         );
167         random(value);
168         CPPUNIT_ASSERT_EQUAL_MESSAGE(
169                 "unexpected value #28 from RNG",
170                 uint16_t(0x0000), value
171         );
172         random(value);
173         CPPUNIT_ASSERT_EQUAL_MESSAGE(
174                 "unexpected value #29 from RNG",
175                 uint16_t(0x0000), value
176         );
177         random(value);
178         CPPUNIT_ASSERT_EQUAL_MESSAGE(
179                 "unexpected value #30 from RNG",
180                 uint16_t(0x0101), value
181         );
182         random(value);
183         CPPUNIT_ASSERT_EQUAL_MESSAGE(
184                 "unexpected value #31 from RNG",
185                 uint16_t(0x0100), value
186         );
187         random(value);
188         CPPUNIT_ASSERT_EQUAL_MESSAGE(
189                 "unexpected value #32 from RNG",
190                 uint16_t(0x0000), value
191         );
192
193         GaloisLFSR random1(1);
194         uint16_t value1;
195         for (int i = 0; i < 32; ++i) {
196                 random1(value1);
197         }
198         CPPUNIT_ASSERT_EQUAL_MESSAGE(
199                 "RNG with seeds 0 and 1 differ",
200                 value, value1
201         );
202
203         GaloisLFSR random_bool(0);
204         bool value_bool;
205         for (int i = 0; i < (16 * 32); ++i) {
206                 random_bool(value_bool);
207         }
208         CPPUNIT_ASSERT_EQUAL_MESSAGE(
209                 "unexpected result for bool",
210                 false, value_bool
211         );
212
213         GaloisLFSR random8(0);
214         uint8_t value8;
215         for (int i = 0; i < 31; ++i) {
216                 random8(value8);
217         }
218         CPPUNIT_ASSERT_EQUAL_MESSAGE(
219                 "unexpected result for uint8",
220                 uint8_t(0x10), value8
221         );
222
223         GaloisLFSR random32(0);
224         uint32_t value32;
225         for (int i = 0; i < 16; ++i) {
226                 random32(value32);
227         }
228         CPPUNIT_ASSERT_EQUAL_MESSAGE(
229                 "unexpected result for uint32",
230                 uint32_t(0xB0000000), value32
231         );
232 }
233
234 void StabilityTest::testSimplex() {
235         SimplexNoise noise(0);
236
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);
245
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);
253 }
254
255 void StabilityTest::testWorley() {
256         WorleyNoise noise(0);
257
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);
266
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);
274 }
275
276 void StabilityTest::Assert(
277         const SimplexNoise &noise,
278         const glm::vec3 &position,
279         float expected
280 ) {
281         stringstream msg;
282         msg << "unexpected simplex noise value at " << position;
283         CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
284                 msg.str(),
285                 expected, noise(position), numeric_limits<float>::epsilon()
286         );
287 }
288
289 void StabilityTest::Assert(
290         const WorleyNoise &noise,
291         const glm::vec3 &position,
292         float expected
293 ) {
294         stringstream msg;
295         msg << "unexpected worley noise value at " << position;
296         CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
297                 msg.str(),
298                 expected, noise(position), numeric_limits<float>::epsilon()
299         );
300 }
301
302 }
303 }