]> git.lizzy.rs Git - dragonfireclient.git/blob - src/unittest/test_noise.cpp
fix integer overflow in mapgen (#11641)
[dragonfireclient.git] / src / unittest / test_noise.cpp
1 /*
2 Minetest
3 Copyright (C) 2010-2014 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #include "test.h"
21
22 #include <cmath>
23 #include "exceptions.h"
24 #include "noise.h"
25
26 class TestNoise : public TestBase {
27 public:
28         TestNoise() { TestManager::registerTestModule(this); }
29         const char *getName() { return "TestNoise"; }
30
31         void runTests(IGameDef *gamedef);
32
33         void testNoise2dAtOriginWithZeroSeed();
34         void testNoise2dWithMaxSeed();
35         void testNoise2dWithFunPrimes();
36         void testNoise2dPoint();
37         void testNoise2dBulk();
38         void testNoise3dAtOriginWithZeroSeed();
39         void testNoise3dWithMaxSeed();
40         void testNoise3dWithFunPrimes();
41         void testNoise3dPoint();
42         void testNoise3dBulk();
43         void testNoiseInvalidParams();
44
45         static const float expected_2d_results[10 * 10];
46         static const float expected_3d_results[10 * 10 * 10];
47 };
48
49 static TestNoise g_test_instance;
50
51 void TestNoise::runTests(IGameDef *gamedef)
52 {
53         TEST(testNoise2dAtOriginWithZeroSeed);
54         TEST(testNoise2dWithMaxSeed);
55         TEST(testNoise2dWithFunPrimes);
56         TEST(testNoise2dPoint);
57         TEST(testNoise2dBulk);
58         TEST(testNoise3dAtOriginWithZeroSeed);
59         TEST(testNoise3dWithMaxSeed);
60         TEST(testNoise3dWithFunPrimes);
61         TEST(testNoise3dPoint);
62         TEST(testNoise3dBulk);
63         TEST(testNoiseInvalidParams);
64 }
65
66 ////////////////////////////////////////////////////////////////////////////////
67
68 void TestNoise::testNoise2dAtOriginWithZeroSeed()
69 {
70         float actual{ noise2d(0, 0, 0) };
71         constexpr float expected{ -0.281791f };
72         UASSERT(std::fabs(actual - expected) <= 0.00001);
73 }
74
75 void TestNoise::testNoise2dWithMaxSeed()
76 {
77         float actual{ noise2d(4096, 4096, 2147483647) };
78         constexpr float expected{ 0.950606f };
79         UASSERT(std::fabs(actual - expected) <= 0.00001);
80 }
81
82 void TestNoise::testNoise2dWithFunPrimes()
83 {
84         float actual{ noise2d(-3947, -2333, 7027) };
85         constexpr float expected{ -0.294907f };
86         UASSERT(std::fabs(actual - expected) <= 0.00001);
87 }
88
89 void TestNoise::testNoise2dPoint()
90 {
91         NoiseParams np_normal(20, 40, v3f(50, 50, 50), 9,  5, 0.6, 2.0);
92
93         u32 i = 0;
94         for (u32 y = 0; y != 10; y++)
95         for (u32 x = 0; x != 10; x++, i++) {
96                 float actual   = NoisePerlin2D(&np_normal, x, y, 1337);
97                 float expected = expected_2d_results[i];
98                 UASSERT(std::fabs(actual - expected) <= 0.00001);
99         }
100 }
101
102 void TestNoise::testNoise2dBulk()
103 {
104         NoiseParams np_normal(20, 40, v3f(50, 50, 50), 9,  5, 0.6, 2.0);
105         Noise noise_normal_2d(&np_normal, 1337, 10, 10);
106         float *noisevals = noise_normal_2d.perlinMap2D(0, 0, NULL);
107
108         for (u32 i = 0; i != 10 * 10; i++) {
109                 float actual   = noisevals[i];
110                 float expected = expected_2d_results[i];
111                 UASSERT(std::fabs(actual - expected) <= 0.00001);
112         }
113 }
114
115 void TestNoise::testNoise3dAtOriginWithZeroSeed()
116 {
117         float actual{ noise2d(0, 0, 0) };
118         constexpr float expected{ -0.281791f };
119         UASSERT(std::fabs(actual - expected) <= 0.00001);
120 }
121
122 void TestNoise::testNoise3dWithMaxSeed()
123 {
124         float actual{ noise3d(4096, 4096, 4096, 2147483647) };
125         constexpr float expected{ -0.775243f };
126         UASSERT(std::fabs(actual - expected) <= 0.00001);
127 }
128
129 void TestNoise::testNoise3dWithFunPrimes()
130 {
131         float actual{ noise2d(3903, -1723, 7411) };
132         constexpr float expected{ 0.989124f };
133         UASSERT(std::fabs(actual - expected) <= 0.00001);
134 }
135
136 void TestNoise::testNoise3dPoint()
137 {
138         NoiseParams np_normal(20, 40, v3f(50, 50, 50), 9,  5, 0.6, 2.0);
139
140         u32 i = 0;
141         for (u32 z = 0; z != 10; z++)
142         for (u32 y = 0; y != 10; y++)
143         for (u32 x = 0; x != 10; x++, i++) {
144                 float actual   = NoisePerlin3D(&np_normal, x, y, z, 1337);
145                 float expected = expected_3d_results[i];
146                 UASSERT(std::fabs(actual - expected) <= 0.00001);
147         }
148 }
149
150 void TestNoise::testNoise3dBulk()
151 {
152         NoiseParams np_normal(20, 40, v3f(50, 50, 50), 9, 5, 0.6, 2.0);
153         Noise noise_normal_3d(&np_normal, 1337, 10, 10, 10);
154         float *noisevals = noise_normal_3d.perlinMap3D(0, 0, 0, NULL);
155
156         for (u32 i = 0; i != 10 * 10 * 10; i++) {
157                 float actual   = noisevals[i];
158                 float expected = expected_3d_results[i];
159                 UASSERT(std::fabs(actual - expected) <= 0.00001);
160         }
161 }
162
163 void TestNoise::testNoiseInvalidParams()
164 {
165         bool exception_thrown = false;
166
167         try {
168                 NoiseParams np_highmem(4, 70, v3f(1, 1, 1), 5, 60, 0.7, 10.0);
169                 Noise noise_highmem_3d(&np_highmem, 1337, 200, 200, 200);
170                 noise_highmem_3d.perlinMap3D(0, 0, 0, NULL);
171         } catch (InvalidNoiseParamsException &) {
172                 exception_thrown = true;
173         }
174
175         UASSERT(exception_thrown);
176 }
177
178 const float TestNoise::expected_2d_results[10 * 10] = {
179         19.11726, 18.49626, 16.48476, 15.02135, 14.75713, 16.26008, 17.54822,
180         18.06860, 18.57016, 18.48407, 18.49649, 17.89160, 15.94162, 14.54901,
181         14.31298, 15.72643, 16.94669, 17.55494, 18.58796, 18.87925, 16.08101,
182         15.53764, 13.83844, 12.77139, 12.73648, 13.95632, 14.97904, 15.81829,
183         18.37694, 19.73759, 13.19182, 12.71924, 11.34560, 10.78025, 11.18980,
184         12.52303, 13.45012, 14.30001, 17.43298, 19.15244, 10.93217, 10.48625,
185          9.30923,  9.18632, 10.16251, 12.11264, 13.19697, 13.80801, 16.39567,
186         17.66203, 10.40222,  9.86070,  8.47223,  8.45471, 10.04780, 13.54730,
187         15.33709, 15.48503, 16.46177, 16.52508, 10.80333, 10.19045,  8.59420,
188          8.47646, 10.22676, 14.43173, 16.48353, 16.24859, 16.20863, 15.52847,
189         11.01179, 10.45209,  8.98678,  8.83986, 10.43004, 14.46054, 16.29387,
190         15.73521, 15.01744, 13.85542, 10.55201, 10.33375,  9.85102, 10.07821,
191         11.58235, 15.62046, 17.35505, 16.13181, 12.66011,  9.51853, 11.50994,
192         11.54074, 11.77989, 12.29790, 13.76139, 17.81982, 19.49008, 17.79470,
193         12.34344,  7.78363,
194 };
195
196 const float TestNoise::expected_3d_results[10 * 10 * 10] = {
197         19.11726, 18.01059, 16.90392, 15.79725, 16.37154, 17.18597, 18.00040,
198         18.33467, 18.50889, 18.68311, 17.85386, 16.90585, 15.95785, 15.00985,
199         15.61132, 16.43415, 17.25697, 17.95415, 18.60942, 19.26471, 16.59046,
200         15.80112, 15.01178, 14.22244, 14.85110, 15.68232, 16.51355, 17.57361,
201         18.70996, 19.84631, 15.32705, 14.69638, 14.06571, 13.43504, 14.09087,
202         14.93050, 15.77012, 17.19309, 18.81050, 20.42790, 15.06729, 14.45855,
203         13.84981, 13.24107, 14.39364, 15.79782, 17.20201, 18.42640, 19.59085,
204         20.75530, 14.95090, 14.34456, 13.73821, 13.13187, 14.84825, 16.89645,
205         18.94465, 19.89025, 20.46832, 21.04639, 14.83452, 14.23057, 13.62662,
206         13.02267, 15.30287, 17.99508, 20.68730, 21.35411, 21.34580, 21.33748,
207         15.39817, 15.03590, 14.67364, 14.31137, 16.78242, 19.65824, 22.53405,
208         22.54626, 21.60395, 20.66164, 16.18850, 16.14768, 16.10686, 16.06603,
209         18.60362, 21.50956, 24.41549, 23.64784, 21.65566, 19.66349, 16.97884,
210         17.25946, 17.54008, 17.82069, 20.42482, 23.36088, 26.29694, 24.74942,
211         21.70738, 18.66534, 18.78506, 17.51834, 16.25162, 14.98489, 15.14217,
212         15.50287, 15.86357, 16.40597, 17.00895, 17.61193, 18.20160, 16.98795,
213         15.77430, 14.56065, 14.85059, 15.35533, 15.86007, 16.63399, 17.49763,
214         18.36128, 17.61814, 16.45757, 15.29699, 14.13641, 14.55902, 15.20779,
215         15.85657, 16.86200, 17.98632, 19.11064, 17.03468, 15.92718, 14.81968,
216         13.71218, 14.26744, 15.06026, 15.85306, 17.09001, 18.47501, 19.86000,
217         16.67870, 15.86256, 15.04641, 14.23026, 15.31397, 16.66909, 18.02420,
218         18.89042, 19.59369, 20.29695, 16.35522, 15.86447, 15.37372, 14.88297,
219         16.55165, 18.52883, 20.50600, 20.91547, 20.80237, 20.68927, 16.03174,
220         15.86639, 15.70103, 15.53568, 17.78933, 20.38857, 22.98780, 22.94051,
221         22.01105, 21.08159, 16.42434, 16.61407, 16.80381, 16.99355, 19.16133,
222         21.61169, 24.06204, 23.65252, 22.28970, 20.92689, 17.05562, 17.61035,
223         18.16508, 18.71981, 20.57809, 22.62260, 24.66711, 23.92686, 22.25835,
224         20.58984, 17.68691, 18.60663, 19.52635, 20.44607, 21.99486, 23.63352,
225         25.27217, 24.20119, 22.22699, 20.25279, 18.45285, 17.02608, 15.59931,
226         14.17254, 13.91279, 13.81976, 13.72674, 14.47727, 15.50900, 16.54073,
227         18.54934, 17.07005, 15.59076, 14.11146, 14.08987, 14.27651, 14.46316,
228         15.31383, 16.38584, 17.45785, 18.64582, 17.11401, 15.58220, 14.05039,
229         14.26694, 14.73326, 15.19958, 16.15038, 17.26268, 18.37498, 18.74231,
230         17.15798, 15.57364, 13.98932, 14.44402, 15.19001, 15.93600, 16.98694,
231         18.13952, 19.29210, 18.29012, 17.26656, 16.24301, 15.21946, 16.23430,
232         17.54035, 18.84639, 19.35445, 19.59653, 19.83860, 17.75954, 17.38438,
233         17.00923, 16.63407, 18.25505, 20.16120, 22.06734, 21.94068, 21.13642,
234         20.33215, 17.22896, 17.50220, 17.77544, 18.04868, 20.27580, 22.78205,
235         25.28829, 24.52691, 22.67631, 20.82571, 17.45050, 18.19224, 18.93398,
236         19.67573, 21.54024, 23.56514, 25.59004, 24.75878, 22.97546, 21.19213,
237         17.92274, 19.07302, 20.22330, 21.37358, 22.55256, 23.73565, 24.91873,
238         24.20587, 22.86103, 21.51619, 18.39499, 19.95381, 21.51263, 23.07145,
239         23.56490, 23.90615, 24.24741, 23.65296, 22.74660, 21.84024, 18.12065,
240         16.53382, 14.94700, 13.36018, 12.68341, 12.13666, 11.58990, 12.54858,
241         14.00906, 15.46955, 18.89708, 17.15214, 15.40721, 13.66227, 13.32914,
242         13.19769, 13.06625, 13.99367, 15.27405, 16.55443, 19.67351, 17.77046,
243         15.86741, 13.96436, 13.97486, 14.25873, 14.54260, 15.43877, 16.53904,
244         17.63931, 20.44994, 18.38877, 16.32761, 14.26645, 14.62059, 15.31977,
245         16.01895, 16.88387, 17.80403, 18.72419, 19.90153, 18.67057, 17.43962,
246         16.20866, 17.15464, 18.41161, 19.66858, 19.81848, 19.59936, 19.38024,
247         19.16386, 18.90429, 18.64473, 18.38517, 19.95845, 21.79357, 23.62868,
248         22.96589, 21.47046, 19.97503, 18.42618, 19.13802, 19.84985, 20.56168,
249         22.76226, 25.17553, 27.58879, 26.11330, 23.34156, 20.56982, 18.47667,
250         19.77041, 21.06416, 22.35790, 23.91914, 25.51859, 27.11804, 25.86504,
251         23.66121, 21.45738, 18.78986, 20.53570, 22.28153, 24.02736, 24.52704,
252         24.84869, 25.17035, 24.48488, 23.46371, 22.44254, 19.10306, 21.30098,
253         23.49890, 25.69682, 25.13494, 24.17879, 23.22265, 23.10473, 23.26621,
254         23.42769, 17.93453, 16.72707, 15.51962, 14.31216, 12.96039, 11.58800,
255         10.21561, 11.29675, 13.19573, 15.09471, 18.05853, 16.85308, 15.64762,
256         14.44216, 13.72634, 13.08047, 12.43459, 13.48912, 15.11045, 16.73179,
257         18.18253, 16.97908, 15.77562, 14.57217, 14.49229, 14.57293, 14.65357,
258         15.68150, 17.02518, 18.36887, 18.30654, 17.10508, 15.90363, 14.70217,
259         15.25825, 16.06540, 16.87255, 17.87387, 18.93991, 20.00595, 17.54117,
260         17.32369, 17.10622, 16.88875, 18.07494, 19.46166, 20.84837, 21.12988,
261         21.04298, 20.95609, 16.64874, 17.55554, 18.46234, 19.36913, 21.18461,
262         23.12989, 25.07517, 24.53784, 23.17297, 21.80810, 15.75632, 17.78738,
263         19.81845, 21.84951, 24.29427, 26.79812, 29.30198, 27.94580, 25.30295,
264         22.66010, 15.98046, 18.43027, 20.88008, 23.32989, 25.21976, 27.02964,
265         28.83951, 27.75863, 25.71416, 23.66970, 16.57679, 19.21017, 21.84355,
266         24.47693, 25.41719, 26.11557, 26.81396, 26.37308, 25.55245, 24.73182,
267         17.17313, 19.99008, 22.80702, 25.62397, 25.61462, 25.20151, 24.78840,
268         24.98753, 25.39074, 25.79395, 17.76927, 17.01824, 16.26722, 15.51620,
269         13.45256, 11.20141,  8.95025, 10.14162, 12.48049, 14.81936, 17.05051,
270         16.49955, 15.94860, 15.39764, 14.28896, 13.10061, 11.91225, 13.10109,
271         15.08232, 17.06355, 16.33175, 15.98086, 15.62998, 15.27909, 15.12537,
272         14.99981, 14.87425, 16.06056, 17.68415, 19.30775, 15.61299, 15.46217,
273         15.31136, 15.16054, 15.96177, 16.89901, 17.83625, 19.02003, 20.28599,
274         21.55194, 14.61341, 15.58383, 16.55426, 17.52469, 18.99524, 20.53725,
275         22.07925, 22.56233, 22.69243, 22.82254, 13.57371, 15.79697, 18.02024,
276         20.24351, 22.34258, 24.42392, 26.50526, 26.18790, 25.07097, 23.95404,
277         12.53401, 16.01011, 19.48622, 22.96232, 25.68993, 28.31060, 30.93126,
278         29.81347, 27.44951, 25.08555, 12.98106, 16.67323, 20.36540, 24.05756,
279         26.36633, 28.47748, 30.58862, 29.76471, 27.96244, 26.16016, 13.92370,
280         17.48634, 21.04897, 24.61161, 26.15244, 27.40443, 28.65643, 28.49117,
281         27.85349, 27.21581, 14.86633, 18.29944, 21.73255, 25.16566, 25.93854,
282         26.33138, 26.72423, 27.21763, 27.74455, 28.27147, 17.60401, 17.30942,
283         17.01482, 16.72023, 13.94473, 10.81481,  7.68490,  8.98648, 11.76524,
284         14.54400, 16.04249, 16.14603, 16.24958, 16.35312, 14.85158, 13.12075,
285         11.38991, 12.71305, 15.05418, 17.39531, 14.48097, 14.98265, 15.48433,
286         15.98602, 15.75844, 15.42668, 15.09493, 16.43962, 18.34312, 20.24663,
287         12.91945, 13.81927, 14.71909, 15.61891, 16.66530, 17.73262, 18.79995,
288         20.16619, 21.63206, 23.09794, 11.68565, 13.84398, 16.00230, 18.16062,
289         19.91554, 21.61284, 23.31013, 23.99478, 24.34188, 24.68898, 10.49868,
290         14.03841, 17.57814, 21.11788, 23.50056, 25.71795, 27.93534, 27.83796,
291         26.96897, 26.09999,  9.31170, 14.23284, 19.15399, 24.07513, 27.08558,
292         29.82307, 32.56055, 31.68113, 29.59606, 27.51099,  9.98166, 14.91619,
293         19.85071, 24.78524, 27.51291, 29.92532, 32.33773, 31.77077, 30.21070,
294         28.65063, 11.27060, 15.76250, 20.25440, 24.74629, 26.88768, 28.69329,
295         30.49889, 30.60925, 30.15453, 29.69981, 12.55955, 16.60881, 20.65808,
296         24.70735, 26.26245, 27.46126, 28.66005, 29.44773, 30.09835, 30.74898,
297         15.20134, 15.53016, 15.85898, 16.18780, 13.53087, 10.44740,  7.36393,
298          8.95806, 12.11139, 15.26472, 13.87432, 14.52378, 15.17325, 15.82272,
299         14.49093, 12.87611, 11.26130, 12.73342, 15.23453, 17.73563, 12.54730,
300         13.51741, 14.48752, 15.45763, 15.45100, 15.30483, 15.15867, 16.50878,
301         18.35766, 20.20654, 11.22027, 12.51103, 13.80179, 15.09254, 16.41106,
302         17.73355, 19.05603, 20.28415, 21.48080, 22.67745, 10.27070, 12.53633,
303         14.80195, 17.06758, 19.04654, 20.98454, 22.92254, 23.63840, 23.94687,
304         24.25534,  9.37505, 12.70901, 16.04297, 19.37693, 21.92136, 24.35300,
305         26.78465, 26.93249, 26.31907, 25.70565,  8.47939, 12.88168, 17.28398,
306         21.68627, 24.79618, 27.72146, 30.64674, 30.22658, 28.69127, 27.15597,
307          9.77979, 13.97583, 18.17186, 22.36790, 25.18828, 27.81215, 30.43601,
308         30.34293, 29.34420, 28.34548, 11.81220, 15.37712, 18.94204, 22.50695,
309         24.75282, 26.81024, 28.86766, 29.40003, 29.42404, 29.44806, 13.84461,
310         16.77841, 19.71221, 22.64601, 24.31735, 25.80833, 27.29932, 28.45713,
311         29.50388, 30.55064, 12.05287, 13.06077, 14.06866, 15.07656, 12.81500,
312         10.08638,  7.35776,  9.30520, 12.81134, 16.31747, 11.31943, 12.47863,
313         13.63782, 14.79702, 13.82253, 12.54323, 11.26392, 12.88993, 15.48436,
314         18.07880, 10.58600, 11.89649, 13.20698, 14.51747, 14.83005, 15.00007,
315         15.17009, 16.47465, 18.15739, 19.84013,  9.85256, 11.31435, 12.77614,
316         14.23793, 15.83757, 17.45691, 19.07625, 20.05937, 20.83042, 21.60147,
317          9.36002, 11.37275, 13.38548, 15.39822, 17.58109, 19.78828, 21.99546,
318         22.68573, 22.87036, 23.05500,  8.90189, 11.52266, 14.14343, 16.76420,
319         19.42976, 22.10172, 24.77368, 25.17519, 24.81987, 24.46455,  8.44375,
320         11.67256, 14.90137, 18.13018, 21.27843, 24.41516, 27.55190, 27.66464,
321         26.76937, 25.87411, 10.51042, 13.30769, 16.10496, 18.90222, 21.70659,
322         24.51197, 27.31734, 27.77045, 27.43945, 27.10846, 13.41869, 15.43789,
323         17.45709, 19.47628, 21.66124, 23.86989, 26.07853, 27.08170, 27.68305,
324         28.28440, 16.32697, 17.56809, 18.80922, 20.05033, 21.61590, 23.22781,
325         24.83972, 26.39296, 27.92665, 29.46033,  8.90439, 10.59137, 12.27835,
326         13.96532, 12.09914,  9.72536,  7.35159,  9.65235, 13.51128, 17.37022,
327          8.76455, 10.43347, 12.10239, 13.77132, 13.15412, 12.21033, 11.26655,
328         13.04643, 15.73420, 18.42198,  8.62470, 10.27557, 11.92644, 13.57731,
329         14.20910, 14.69531, 15.18151, 16.44051, 17.95712, 19.47373,  8.48485,
330         10.11767, 11.75049, 13.38331, 15.26408, 17.18027, 19.09647, 19.83460,
331         20.18004, 20.52548,  8.44933, 10.20917, 11.96901, 13.72885, 16.11565,
332         18.59202, 21.06838, 21.73307, 21.79386, 21.85465,  8.42872, 10.33631,
333         12.24389, 14.15147, 16.93816, 19.85044, 22.76272, 23.41788, 23.32067,
334         23.22346,  8.40812, 10.46344, 12.51877, 14.57409, 17.76068, 21.10886,
335         24.45705, 25.10269, 24.84748, 24.59226, 11.24106, 12.63955, 14.03805,
336         15.43654, 18.22489, 21.21178, 24.19868, 25.19796, 25.53469, 25.87143,
337         15.02519, 15.49866, 15.97213, 16.44560, 18.56967, 20.92953, 23.28940,
338         24.76337, 25.94205, 27.12073, 18.80933, 18.35777, 17.90622, 17.45466,
339         18.91445, 20.64729, 22.38013, 24.32880, 26.34941, 28.37003,
340 };