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