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