Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/tests/core/math/test_math_funcs.cpp
23450 views
1
/**************************************************************************/
2
/* test_math_funcs.cpp */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#include "core/math/math_funcs_binary.h"
32
#include "tests/test_macros.h"
33
34
TEST_FORCE_LINK(test_math_funcs)
35
36
namespace TestMathFuncs {
37
38
TEST_CASE("[Math] C++ macros") {
39
CHECK(MIN(-2, 2) == -2);
40
CHECK(MIN(600, 2) == 2);
41
42
CHECK(MAX(-2, 2) == 2);
43
CHECK(MAX(600, 2) == 600);
44
45
CHECK(CLAMP(600, -2, 2) == 2);
46
CHECK(CLAMP(620, 600, 650) == 620);
47
// `max` is lower than `min`.
48
CHECK(CLAMP(620, 600, 50) == 50);
49
50
CHECK(Math::abs(-5) == 5);
51
CHECK(Math::abs(0) == 0);
52
CHECK(Math::abs(5) == 5);
53
54
CHECK(SIGN(-5) == -1.0);
55
CHECK(SIGN(0) == 0.0);
56
CHECK(SIGN(5) == 1.0);
57
// Check that SIGN(Math::NaN) returns 0.0.
58
CHECK(SIGN(Math::NaN) == 0.0);
59
}
60
61
TEST_CASE("[Math] Power of two functions") {
62
CHECK(Math::next_power_of_2((uint32_t)0) == 0);
63
CHECK(Math::next_power_of_2((uint32_t)1) == 1);
64
CHECK(Math::next_power_of_2((uint32_t)16) == 16);
65
CHECK(Math::next_power_of_2((uint32_t)17) == 32);
66
CHECK(Math::next_power_of_2((uint32_t)65535) == 65536);
67
68
CHECK(Math::previous_power_of_2((uint32_t)0) == 0);
69
CHECK(Math::previous_power_of_2((uint32_t)1) == 1);
70
CHECK(Math::previous_power_of_2((uint32_t)16) == 16);
71
CHECK(Math::previous_power_of_2((uint32_t)17) == 16);
72
CHECK(Math::previous_power_of_2((uint32_t)65535) == 32768);
73
74
CHECK(Math::closest_power_of_2((uint32_t)0) == 0);
75
CHECK(Math::closest_power_of_2((uint32_t)1) == 1);
76
CHECK(Math::closest_power_of_2((uint32_t)16) == 16);
77
CHECK(Math::closest_power_of_2((uint32_t)17) == 16);
78
CHECK(Math::closest_power_of_2((uint32_t)65535) == 65536);
79
80
CHECK(Math::get_shift_from_power_of_2((uint32_t)0) == -1);
81
CHECK(Math::get_shift_from_power_of_2((uint32_t)1) == 0);
82
CHECK(Math::get_shift_from_power_of_2((uint32_t)16) == 4);
83
CHECK(Math::get_shift_from_power_of_2((uint32_t)17) == -1);
84
CHECK(Math::get_shift_from_power_of_2((uint32_t)65535) == -1);
85
86
CHECK(Math::nearest_shift((uint32_t)0) == 0);
87
CHECK(Math::nearest_shift((uint32_t)1) == 1);
88
CHECK(Math::nearest_shift((uint32_t)16) == 5);
89
CHECK(Math::nearest_shift((uint32_t)17) == 5);
90
CHECK(Math::nearest_shift((uint32_t)65535) == 16);
91
}
92
93
TEST_CASE_TEMPLATE("[Math] abs", T, int, float, double) {
94
CHECK(Math::abs((T)-1) == (T)1);
95
CHECK(Math::abs((T)0) == (T)0);
96
CHECK(Math::abs((T)1) == (T)1);
97
CHECK(Math::abs((T)0.1) == (T)0.1);
98
}
99
100
TEST_CASE_TEMPLATE("[Math] round/floor/ceil", T, float, double) {
101
CHECK(Math::round((T)1.5) == (T)2.0);
102
CHECK(Math::round((T)1.6) == (T)2.0);
103
CHECK(Math::round((T)-1.5) == (T)-2.0);
104
CHECK(Math::round((T)-1.1) == (T)-1.0);
105
106
CHECK(Math::floor((T)1.5) == (T)1.0);
107
CHECK(Math::floor((T)-1.5) == (T)-2.0);
108
109
CHECK(Math::ceil((T)1.5) == (T)2.0);
110
CHECK(Math::ceil((T)-1.9) == (T)-1.0);
111
}
112
113
TEST_CASE_TEMPLATE("[Math] integer division round up unsigned", T, uint32_t, uint64_t) {
114
CHECK(Math::division_round_up((T)0, (T)64) == 0);
115
CHECK(Math::division_round_up((T)1, (T)64) == 1);
116
CHECK(Math::division_round_up((T)63, (T)64) == 1);
117
CHECK(Math::division_round_up((T)64, (T)64) == 1);
118
CHECK(Math::division_round_up((T)65, (T)64) == 2);
119
CHECK(Math::division_round_up((T)65, (T)1) == 65);
120
}
121
122
TEST_CASE_TEMPLATE("[Math] integer division round up signed", T, int32_t, int64_t) {
123
CHECK(Math::division_round_up((T)0, (T)64) == 0);
124
CHECK(Math::division_round_up((T)1, (T)64) == 1);
125
CHECK(Math::division_round_up((T)63, (T)64) == 1);
126
CHECK(Math::division_round_up((T)64, (T)64) == 1);
127
CHECK(Math::division_round_up((T)65, (T)64) == 2);
128
CHECK(Math::division_round_up((T)65, (T)1) == 65);
129
CHECK(Math::division_round_up((T)-1, (T)64) == 0);
130
CHECK(Math::division_round_up((T)-1, (T)-1) == 1);
131
CHECK(Math::division_round_up((T)-1, (T)1) == -1);
132
CHECK(Math::division_round_up((T)-1, (T)-2) == 1);
133
CHECK(Math::division_round_up((T)-4, (T)-2) == 2);
134
}
135
136
TEST_CASE_TEMPLATE("[Math] sin/cos/tan", T, float, double) {
137
CHECK(Math::sin((T)-0.1) == doctest::Approx((T)-0.0998334166));
138
CHECK(Math::sin((T)0.1) == doctest::Approx((T)0.0998334166));
139
CHECK(Math::sin((T)0.5) == doctest::Approx((T)0.4794255386));
140
CHECK(Math::sin((T)1.0) == doctest::Approx((T)0.8414709848));
141
CHECK(Math::sin((T)1.5) == doctest::Approx((T)0.9974949866));
142
CHECK(Math::sin((T)450.0) == doctest::Approx((T)-0.683283725));
143
144
CHECK(Math::cos((T)-0.1) == doctest::Approx((T)0.99500416530));
145
CHECK(Math::cos((T)0.1) == doctest::Approx((T)0.9950041653));
146
CHECK(Math::cos((T)0.5) == doctest::Approx((T)0.8775825619));
147
CHECK(Math::cos((T)1.0) == doctest::Approx((T)0.5403023059));
148
CHECK(Math::cos((T)1.5) == doctest::Approx((T)0.0707372017));
149
CHECK(Math::cos((T)450.0) == doctest::Approx((T)-0.7301529642));
150
151
CHECK(Math::tan((T)-0.1) == doctest::Approx((T)-0.1003346721));
152
CHECK(Math::tan((T)0.1) == doctest::Approx((T)0.1003346721));
153
CHECK(Math::tan((T)0.5) == doctest::Approx((T)0.5463024898));
154
CHECK(Math::tan((T)1.0) == doctest::Approx((T)1.5574077247));
155
CHECK(Math::tan((T)1.5) == doctest::Approx((T)14.1014199472));
156
CHECK(Math::tan((T)450.0) == doctest::Approx((T)0.9358090134));
157
}
158
159
TEST_CASE_TEMPLATE("[Math] sinh/cosh/tanh", T, float, double) {
160
CHECK(Math::sinh((T)-0.1) == doctest::Approx((T)-0.10016675));
161
CHECK(Math::sinh((T)0.1) == doctest::Approx((T)0.10016675));
162
CHECK(Math::sinh((T)0.5) == doctest::Approx((T)0.5210953055));
163
CHECK(Math::sinh((T)1.0) == doctest::Approx((T)1.1752011936));
164
CHECK(Math::sinh((T)1.5) == doctest::Approx((T)2.1292794551));
165
166
CHECK(Math::cosh((T)-0.1) == doctest::Approx((T)1.0050041681));
167
CHECK(Math::cosh((T)0.1) == doctest::Approx((T)1.0050041681));
168
CHECK(Math::cosh((T)0.5) == doctest::Approx((T)1.1276259652));
169
CHECK(Math::cosh((T)1.0) == doctest::Approx((T)1.5430806348));
170
CHECK(Math::cosh((T)1.5) == doctest::Approx((T)2.3524096152));
171
172
CHECK(Math::tanh((T)-0.1) == doctest::Approx((T)-0.0996679946));
173
CHECK(Math::tanh((T)0.1) == doctest::Approx((T)0.0996679946));
174
CHECK(Math::tanh((T)0.5) == doctest::Approx((T)0.4621171573));
175
CHECK(Math::tanh((T)1.0) == doctest::Approx((T)0.761594156));
176
CHECK(Math::tanh((T)1.5) == doctest::Approx((T)0.9051482536));
177
CHECK(Math::tanh((T)450.0) == doctest::Approx((T)1.0));
178
}
179
180
TEST_CASE_TEMPLATE("[Math] asin/acos/atan", T, float, double) {
181
CHECK(Math::asin((T)-0.1) == doctest::Approx((T)-0.1001674212));
182
CHECK(Math::asin((T)0.1) == doctest::Approx((T)0.1001674212));
183
CHECK(Math::asin((T)0.5) == doctest::Approx((T)0.5235987756));
184
CHECK(Math::asin((T)1.0) == doctest::Approx((T)1.5707963268));
185
CHECK(Math::asin((T)2.0) == doctest::Approx((T)1.5707963268));
186
CHECK(Math::asin((T)-2.0) == doctest::Approx((T)-1.5707963268));
187
188
CHECK(Math::acos((T)-0.1) == doctest::Approx((T)1.670963748));
189
CHECK(Math::acos((T)0.1) == doctest::Approx((T)1.4706289056));
190
CHECK(Math::acos((T)0.5) == doctest::Approx((T)1.0471975512));
191
CHECK(Math::acos((T)1.0) == doctest::Approx((T)0.0));
192
CHECK(Math::acos((T)2.0) == doctest::Approx((T)0.0));
193
CHECK(Math::acos((T)-2.0) == doctest::Approx((T)Math::PI));
194
195
CHECK(Math::atan((T)-0.1) == doctest::Approx((T)-0.0996686525));
196
CHECK(Math::atan((T)0.1) == doctest::Approx((T)0.0996686525));
197
CHECK(Math::atan((T)0.5) == doctest::Approx((T)0.463647609));
198
CHECK(Math::atan((T)1.0) == doctest::Approx((T)0.7853981634));
199
CHECK(Math::atan((T)1.5) == doctest::Approx((T)0.9827937232));
200
CHECK(Math::atan((T)450.0) == doctest::Approx((T)1.5685741082));
201
}
202
203
TEST_CASE_TEMPLATE("[Math] asinh/acosh/atanh", T, float, double) {
204
CHECK(Math::asinh((T)-2.0) == doctest::Approx((T)-1.4436354751));
205
CHECK(Math::asinh((T)-0.1) == doctest::Approx((T)-0.0998340788));
206
CHECK(Math::asinh((T)0.1) == doctest::Approx((T)0.0998340788));
207
CHECK(Math::asinh((T)0.5) == doctest::Approx((T)0.4812118250));
208
CHECK(Math::asinh((T)1.0) == doctest::Approx((T)0.8813735870));
209
CHECK(Math::asinh((T)2.0) == doctest::Approx((T)1.4436354751));
210
211
CHECK(Math::acosh((T)-2.0) == doctest::Approx((T)0.0));
212
CHECK(Math::acosh((T)-0.1) == doctest::Approx((T)0.0));
213
CHECK(Math::acosh((T)0.1) == doctest::Approx((T)0.0));
214
CHECK(Math::acosh((T)0.5) == doctest::Approx((T)0.0));
215
CHECK(Math::acosh((T)1.0) == doctest::Approx((T)0.0));
216
CHECK(Math::acosh((T)2.0) == doctest::Approx((T)1.3169578969));
217
CHECK(Math::acosh((T)450.0) == doctest::Approx((T)6.8023935287));
218
219
CHECK(Math::is_inf(Math::atanh((T)-2.0)));
220
CHECK(Math::atanh((T)-2.0) < (T)0.0);
221
CHECK(Math::is_inf(Math::atanh((T)-1.0)));
222
CHECK(Math::atanh((T)-1.0) < (T)0.0);
223
CHECK(Math::atanh((T)-0.1) == doctest::Approx((T)-0.1003353477));
224
CHECK(Math::atanh((T)0.1) == doctest::Approx((T)0.1003353477));
225
CHECK(Math::atanh((T)0.5) == doctest::Approx((T)0.5493061443));
226
CHECK(Math::is_inf(Math::atanh((T)1.0)));
227
CHECK(Math::atanh((T)1.0) > (T)0.0);
228
CHECK(Math::is_inf(Math::atanh((T)1.5)));
229
CHECK(Math::atanh((T)1.5) > (T)0.0);
230
CHECK(Math::is_inf(Math::atanh((T)450.0)));
231
CHECK(Math::atanh((T)450.0) > (T)0.0);
232
}
233
234
TEST_CASE_TEMPLATE("[Math] sinc/sincn/atan2", T, float, double) {
235
CHECK(Math::sinc((T)-0.1) == doctest::Approx((T)0.9983341665));
236
CHECK(Math::sinc((T)0.1) == doctest::Approx((T)0.9983341665));
237
CHECK(Math::sinc((T)0.5) == doctest::Approx((T)0.9588510772));
238
CHECK(Math::sinc((T)1.0) == doctest::Approx((T)0.8414709848));
239
CHECK(Math::sinc((T)1.5) == doctest::Approx((T)0.6649966577));
240
CHECK(Math::sinc((T)450.0) == doctest::Approx((T)-0.0015184083));
241
242
CHECK(Math::sincn((T)-0.1) == doctest::Approx((T)0.9836316431));
243
CHECK(Math::sincn((T)0.1) == doctest::Approx((T)0.9836316431));
244
CHECK(Math::sincn((T)0.5) == doctest::Approx((T)0.6366197724));
245
CHECK(Math::sincn((T)1.0) == doctest::Approx((T)0.0));
246
CHECK(Math::sincn((T)1.5) == doctest::Approx((T)-0.2122065908));
247
CHECK(Math::sincn((T)450.0) == doctest::Approx((T)0.0));
248
249
CHECK(Math::atan2((T)-0.1, (T)0.5) == doctest::Approx((T)-0.1973955598));
250
CHECK(Math::atan2((T)0.1, (T)-0.5) == doctest::Approx((T)2.9441970937));
251
CHECK(Math::atan2((T)0.5, (T)1.5) == doctest::Approx((T)0.3217505544));
252
CHECK(Math::atan2((T)1.0, (T)2.5) == doctest::Approx((T)0.3805063771));
253
CHECK(Math::atan2((T)1.5, (T)1.0) == doctest::Approx((T)0.9827937232));
254
CHECK(Math::atan2((T)450.0, (T)1.0) == doctest::Approx((T)1.5685741082));
255
}
256
257
TEST_CASE_TEMPLATE("[Math] pow/log/log2/exp/sqrt", T, float, double) {
258
CHECK(Math::pow((T)-0.1, (T)2.0) == doctest::Approx((T)0.01));
259
CHECK(Math::pow((T)0.1, (T)2.5) == doctest::Approx((T)0.0031622777));
260
CHECK(Math::pow((T)0.5, (T)0.5) == doctest::Approx((T)0.7071067812));
261
CHECK(Math::pow((T)1.0, (T)1.0) == doctest::Approx((T)1.0));
262
CHECK(Math::pow((T)1.5, (T)-1.0) == doctest::Approx((T)0.6666666667));
263
CHECK(Math::pow((T)450.0, (T)-2.0) == doctest::Approx((T)0.0000049383));
264
CHECK(Math::pow((T)450.0, (T)0.0) == doctest::Approx((T)1.0));
265
266
CHECK(Math::is_nan(Math::log((T)-0.1)));
267
CHECK(Math::log((T)0.1) == doctest::Approx((T)-2.302585093));
268
CHECK(Math::log((T)0.5) == doctest::Approx((T)-0.6931471806));
269
CHECK(Math::log((T)1.0) == doctest::Approx((T)0.0));
270
CHECK(Math::log((T)1.5) == doctest::Approx((T)0.4054651081));
271
CHECK(Math::log((T)450.0) == doctest::Approx((T)6.1092475828));
272
273
CHECK(Math::is_nan(Math::log2((T)-0.1)));
274
CHECK(Math::log2((T)0.1) == doctest::Approx((T)-3.3219280949));
275
CHECK(Math::log2((T)0.5) == doctest::Approx((T)-1.0));
276
CHECK(Math::log2((T)1.0) == doctest::Approx((T)0.0));
277
CHECK(Math::log2((T)1.5) == doctest::Approx((T)0.5849625007));
278
CHECK(Math::log2((T)450.0) == doctest::Approx((T)8.8137811912));
279
280
CHECK(Math::exp((T)-0.1) == doctest::Approx((T)0.904837418));
281
CHECK(Math::exp((T)0.1) == doctest::Approx((T)1.1051709181));
282
CHECK(Math::exp((T)0.5) == doctest::Approx((T)1.6487212707));
283
CHECK(Math::exp((T)1.0) == doctest::Approx((T)2.7182818285));
284
CHECK(Math::exp((T)1.5) == doctest::Approx((T)4.4816890703));
285
286
CHECK(Math::is_nan(Math::sqrt((T)-0.1)));
287
CHECK(Math::sqrt((T)0.1) == doctest::Approx((T)0.316228));
288
CHECK(Math::sqrt((T)0.5) == doctest::Approx((T)0.707107));
289
CHECK(Math::sqrt((T)1.0) == doctest::Approx((T)1.0));
290
CHECK(Math::sqrt((T)1.5) == doctest::Approx((T)1.224745));
291
}
292
293
TEST_CASE_TEMPLATE("[Math] is_nan/is_inf", T, float, double) {
294
CHECK(!Math::is_nan((T)0.0));
295
CHECK(Math::is_nan((T)Math::NaN));
296
297
CHECK(!Math::is_inf((T)0.0));
298
CHECK(Math::is_inf((T)Math::INF));
299
}
300
301
TEST_CASE_TEMPLATE("[Math] linear_to_db", T, float, double) {
302
CHECK(Math::linear_to_db((T)1.0) == doctest::Approx((T)0.0));
303
CHECK(Math::linear_to_db((T)20.0) == doctest::Approx((T)26.0206));
304
CHECK(Math::is_inf(Math::linear_to_db((T)0.0)));
305
CHECK(Math::is_nan(Math::linear_to_db((T)-20.0)));
306
}
307
308
TEST_CASE_TEMPLATE("[Math] db_to_linear", T, float, double) {
309
CHECK(Math::db_to_linear((T)0.0) == doctest::Approx((T)1.0));
310
CHECK(Math::db_to_linear((T)1.0) == doctest::Approx((T)1.122018));
311
CHECK(Math::db_to_linear((T)20.0) == doctest::Approx((T)10.0));
312
CHECK(Math::db_to_linear((T)-20.0) == doctest::Approx((T)0.1));
313
}
314
315
TEST_CASE_TEMPLATE("[Math] step_decimals", T, float, double) {
316
CHECK(Math::step_decimals((T)-0.5) == 1);
317
CHECK(Math::step_decimals((T)0) == 0);
318
CHECK(Math::step_decimals((T)1) == 0);
319
CHECK(Math::step_decimals((T)0.1) == 1);
320
CHECK(Math::step_decimals((T)0.01) == 2);
321
CHECK(Math::step_decimals((T)0.001) == 3);
322
CHECK(Math::step_decimals((T)0.0001) == 4);
323
CHECK(Math::step_decimals((T)0.00001) == 5);
324
CHECK(Math::step_decimals((T)0.000001) == 6);
325
CHECK(Math::step_decimals((T)0.0000001) == 7);
326
CHECK(Math::step_decimals((T)0.00000001) == 8);
327
CHECK(Math::step_decimals((T)0.000000001) == 9);
328
// Too many decimals to handle.
329
CHECK(Math::step_decimals((T)0.0000000001) == 0);
330
}
331
332
TEST_CASE_TEMPLATE("[Math] range_step_decimals", T, float, double) {
333
CHECK(Math::range_step_decimals((T)0.000000001) == 9);
334
// Too many decimals to handle.
335
CHECK(Math::range_step_decimals((T)0.0000000001) == 0);
336
// Should be treated as a step of 0 for use by the editor.
337
CHECK(Math::range_step_decimals((T)0.0) == 16);
338
CHECK(Math::range_step_decimals((T)-0.5) == 16);
339
}
340
341
TEST_CASE_TEMPLATE("[Math] lerp", T, float, double) {
342
CHECK(Math::lerp((T)2.0, (T)5.0, (T)-0.1) == doctest::Approx((T)1.7));
343
CHECK(Math::lerp((T)2.0, (T)5.0, (T)0.0) == doctest::Approx((T)2.0));
344
CHECK(Math::lerp((T)2.0, (T)5.0, (T)0.1) == doctest::Approx((T)2.3));
345
CHECK(Math::lerp((T)2.0, (T)5.0, (T)1.0) == doctest::Approx((T)5.0));
346
CHECK(Math::lerp((T)2.0, (T)5.0, (T)2.0) == doctest::Approx((T)8.0));
347
348
CHECK(Math::lerp((T)-2.0, (T)-5.0, (T)-0.1) == doctest::Approx((T)-1.7));
349
CHECK(Math::lerp((T)-2.0, (T)-5.0, (T)0.0) == doctest::Approx((T)-2.0));
350
CHECK(Math::lerp((T)-2.0, (T)-5.0, (T)0.1) == doctest::Approx((T)-2.3));
351
CHECK(Math::lerp((T)-2.0, (T)-5.0, (T)1.0) == doctest::Approx((T)-5.0));
352
CHECK(Math::lerp((T)-2.0, (T)-5.0, (T)2.0) == doctest::Approx((T)-8.0));
353
}
354
355
TEST_CASE_TEMPLATE("[Math] inverse_lerp", T, float, double) {
356
CHECK(Math::inverse_lerp((T)2.0, (T)5.0, (T)1.7) == doctest::Approx((T)-0.1));
357
CHECK(Math::inverse_lerp((T)2.0, (T)5.0, (T)2.0) == doctest::Approx((T)0.0));
358
CHECK(Math::inverse_lerp((T)2.0, (T)5.0, (T)2.3) == doctest::Approx((T)0.1));
359
CHECK(Math::inverse_lerp((T)2.0, (T)5.0, (T)5.0) == doctest::Approx((T)1.0));
360
CHECK(Math::inverse_lerp((T)2.0, (T)5.0, (T)8.0) == doctest::Approx((T)2.0));
361
362
CHECK(Math::inverse_lerp((T)-2.0, (T)-5.0, (T)-1.7) == doctest::Approx((T)-0.1));
363
CHECK(Math::inverse_lerp((T)-2.0, (T)-5.0, (T)-2.0) == doctest::Approx((T)0.0));
364
CHECK(Math::inverse_lerp((T)-2.0, (T)-5.0, (T)-2.3) == doctest::Approx((T)0.1));
365
CHECK(Math::inverse_lerp((T)-2.0, (T)-5.0, (T)-5.0) == doctest::Approx((T)1.0));
366
CHECK(Math::inverse_lerp((T)-2.0, (T)-5.0, (T)-8.0) == doctest::Approx((T)2.0));
367
}
368
369
TEST_CASE_TEMPLATE("[Math] remap", T, float, double) {
370
CHECK(Math::remap((T)50.0, (T)100.0, (T)200.0, (T)0.0, (T)1000.0) == doctest::Approx((T)-500.0));
371
CHECK(Math::remap((T)100.0, (T)100.0, (T)200.0, (T)0.0, (T)1000.0) == doctest::Approx((T)0.0));
372
CHECK(Math::remap((T)200.0, (T)100.0, (T)200.0, (T)0.0, (T)1000.0) == doctest::Approx((T)1000.0));
373
CHECK(Math::remap((T)250.0, (T)100.0, (T)200.0, (T)0.0, (T)1000.0) == doctest::Approx((T)1500.0));
374
375
CHECK(Math::remap((T)-50.0, (T)-100.0, (T)-200.0, (T)0.0, (T)1000.0) == doctest::Approx((T)-500.0));
376
CHECK(Math::remap((T)-100.0, (T)-100.0, (T)-200.0, (T)0.0, (T)1000.0) == doctest::Approx((T)0.0));
377
CHECK(Math::remap((T)-200.0, (T)-100.0, (T)-200.0, (T)0.0, (T)1000.0) == doctest::Approx((T)1000.0));
378
CHECK(Math::remap((T)-250.0, (T)-100.0, (T)-200.0, (T)0.0, (T)1000.0) == doctest::Approx((T)1500.0));
379
380
CHECK(Math::remap((T)-50.0, (T)-100.0, (T)-200.0, (T)0.0, (T)-1000.0) == doctest::Approx((T)500.0));
381
CHECK(Math::remap((T)-100.0, (T)-100.0, (T)-200.0, (T)0.0, (T)-1000.0) == doctest::Approx((T)0.0));
382
CHECK(Math::remap((T)-200.0, (T)-100.0, (T)-200.0, (T)0.0, (T)-1000.0) == doctest::Approx((T)-1000.0));
383
CHECK(Math::remap((T)-250.0, (T)-100.0, (T)-200.0, (T)0.0, (T)-1000.0) == doctest::Approx((T)-1500.0));
384
385
// Note: undefined behavior can happen when `p_istart == p_istop`. We don't bother testing this as it will
386
// vary between hardware and compilers properly implementing IEEE 754.
387
}
388
389
TEST_CASE_TEMPLATE("[Math] angle_difference", T, float, double) {
390
// Loops around, should return 0.0.
391
CHECK(Math::angle_difference((T)0.0, (T)Math::TAU) == doctest::Approx((T)0.0));
392
CHECK(Math::angle_difference((T)Math::PI, (T)-Math::PI) == doctest::Approx((T)0.0));
393
CHECK(Math::angle_difference((T)0.0, (T)Math::TAU * (T)4.0) == doctest::Approx((T)0.0));
394
395
// Rotation is clockwise, so it should return -PI.
396
CHECK(Math::angle_difference((T)0.0, (T)Math::PI) == doctest::Approx((T)-Math::PI));
397
CHECK(Math::angle_difference((T)0.0, (T)-Math::PI) == doctest::Approx((T)Math::PI));
398
CHECK(Math::angle_difference((T)Math::PI, (T)0.0) == doctest::Approx((T)Math::PI));
399
CHECK(Math::angle_difference((T)-Math::PI, (T)0.0) == doctest::Approx((T)-Math::PI));
400
401
CHECK(Math::angle_difference((T)0.0, (T)3.0) == doctest::Approx((T)3.0));
402
CHECK(Math::angle_difference((T)1.0, (T)-2.0) == doctest::Approx((T)-3.0));
403
CHECK(Math::angle_difference((T)-1.0, (T)2.0) == doctest::Approx((T)3.0));
404
CHECK(Math::angle_difference((T)-2.0, (T)-4.5) == doctest::Approx((T)-2.5));
405
CHECK(Math::angle_difference((T)100.0, (T)102.5) == doctest::Approx((T)2.5));
406
}
407
408
TEST_CASE_TEMPLATE("[Math] lerp_angle", T, float, double) {
409
// Counter-clockwise rotation.
410
CHECK(Math::lerp_angle((T)0.24 * Math::TAU, 0.75 * Math::TAU, 0.5) == doctest::Approx((T)-0.005 * Math::TAU));
411
// Counter-clockwise rotation.
412
CHECK(Math::lerp_angle((T)0.25 * Math::TAU, 0.75 * Math::TAU, 0.5) == doctest::Approx((T)0.0));
413
// Clockwise rotation.
414
CHECK(Math::lerp_angle((T)0.26 * Math::TAU, 0.75 * Math::TAU, 0.5) == doctest::Approx((T)0.505 * Math::TAU));
415
416
CHECK(Math::lerp_angle((T)-0.25 * Math::TAU, 1.25 * Math::TAU, 0.5) == doctest::Approx((T)-0.5 * Math::TAU));
417
CHECK(Math::lerp_angle((T)0.72 * Math::TAU, 1.44 * Math::TAU, 0.96) == doctest::Approx((T)0.4512 * Math::TAU));
418
CHECK(Math::lerp_angle((T)0.72 * Math::TAU, 1.44 * Math::TAU, 1.04) == doctest::Approx((T)0.4288 * Math::TAU));
419
420
// Initial and final angles are effectively identical, so the value returned
421
// should always be the same regardless of the `weight` parameter.
422
CHECK(Math::lerp_angle((T)-4 * Math::TAU, 4 * Math::TAU, -1.0) == doctest::Approx((T)-4.0 * Math::TAU));
423
CHECK(Math::lerp_angle((T)-4 * Math::TAU, 4 * Math::TAU, 0.0) == doctest::Approx((T)-4.0 * Math::TAU));
424
CHECK(Math::lerp_angle((T)-4 * Math::TAU, 4 * Math::TAU, 0.5) == doctest::Approx((T)-4.0 * Math::TAU));
425
CHECK(Math::lerp_angle((T)-4 * Math::TAU, 4 * Math::TAU, 1.0) == doctest::Approx((T)-4.0 * Math::TAU));
426
CHECK(Math::lerp_angle((T)-4 * Math::TAU, 4 * Math::TAU, 500.0) == doctest::Approx((T)-4.0 * Math::TAU));
427
}
428
429
TEST_CASE_TEMPLATE("[Math] move_toward", T, float, double) {
430
CHECK(Math::move_toward(2.0, 5.0, -1.0) == doctest::Approx((T)1.0));
431
CHECK(Math::move_toward(2.0, 5.0, 2.5) == doctest::Approx((T)4.5));
432
CHECK(Math::move_toward(2.0, 5.0, 4.0) == doctest::Approx((T)5.0));
433
CHECK(Math::move_toward(-2.0, -5.0, -1.0) == doctest::Approx((T)-1.0));
434
CHECK(Math::move_toward(-2.0, -5.0, 2.5) == doctest::Approx((T)-4.5));
435
CHECK(Math::move_toward(-2.0, -5.0, 4.0) == doctest::Approx((T)-5.0));
436
}
437
438
TEST_CASE_TEMPLATE("[Math] rotate_toward", T, float, double) {
439
// Rotate toward.
440
CHECK(Math::rotate_toward((T)0.0, (T)Math::PI * (T)0.75, (T)1.5) == doctest::Approx((T)1.5));
441
CHECK(Math::rotate_toward((T)-2.0, (T)1.0, (T)2.5) == doctest::Approx((T)0.5));
442
CHECK(Math::rotate_toward((T)-2.0, (T)Math::PI, (T)Math::PI) == doctest::Approx((T)-Math::PI));
443
CHECK(Math::rotate_toward((T)1.0, (T)Math::PI, (T)20.0) == doctest::Approx((T)Math::PI));
444
445
// Rotate away.
446
CHECK(Math::rotate_toward((T)0.0, (T)0.0, (T)-1.5) == doctest::Approx((T)-1.5));
447
CHECK(Math::rotate_toward((T)0.0, (T)0.0, (T)-Math::PI) == doctest::Approx((T)-Math::PI));
448
CHECK(Math::rotate_toward((T)3.0, (T)Math::PI, (T)-Math::PI) == doctest::Approx((T)0.0));
449
CHECK(Math::rotate_toward((T)2.0, (T)Math::PI, (T)-1.5) == doctest::Approx((T)0.5));
450
CHECK(Math::rotate_toward((T)1.0, (T)2.0, (T)-0.5) == doctest::Approx((T)0.5));
451
CHECK(Math::rotate_toward((T)2.5, (T)2.0, (T)-0.5) == doctest::Approx((T)3.0));
452
CHECK(Math::rotate_toward((T)-1.0, (T)1.0, (T)-1.0) == doctest::Approx((T)-2.0));
453
}
454
455
TEST_CASE_TEMPLATE("[Math] smoothstep", T, float, double) {
456
CHECK(Math::smoothstep((T)0.0, (T)2.0, (T)-5.0) == doctest::Approx((T)0.0));
457
CHECK(Math::smoothstep((T)0.0, (T)2.0, (T)0.5) == doctest::Approx((T)0.15625));
458
CHECK(Math::smoothstep((T)0.0, (T)2.0, (T)1.0) == doctest::Approx((T)0.5));
459
CHECK(Math::smoothstep((T)0.0, (T)2.0, (T)2.0) == doctest::Approx((T)1.0));
460
}
461
462
TEST_CASE("[Math] ease") {
463
CHECK(Math::ease(0.1, 1.0) == doctest::Approx(0.1));
464
CHECK(Math::ease(0.1, 2.0) == doctest::Approx(0.01));
465
CHECK(Math::ease(0.1, 0.5) == doctest::Approx(0.19));
466
CHECK(Math::ease(0.1, 0.0) == doctest::Approx(0));
467
CHECK(Math::ease(0.1, -0.5) == doctest::Approx(0.2236067977));
468
CHECK(Math::ease(0.1, -1.0) == doctest::Approx(0.1));
469
CHECK(Math::ease(0.1, -2.0) == doctest::Approx(0.02));
470
471
CHECK(Math::ease(-1.0, 1.0) == doctest::Approx(0));
472
CHECK(Math::ease(-1.0, 2.0) == doctest::Approx(0));
473
CHECK(Math::ease(-1.0, 0.5) == doctest::Approx(0));
474
CHECK(Math::ease(-1.0, 0.0) == doctest::Approx(0));
475
CHECK(Math::ease(-1.0, -0.5) == doctest::Approx(0));
476
CHECK(Math::ease(-1.0, -1.0) == doctest::Approx(0));
477
CHECK(Math::ease(-1.0, -2.0) == doctest::Approx(0));
478
}
479
480
TEST_CASE("[Math] snapped") {
481
CHECK(Math::snapped(0.5, 0.04) == doctest::Approx(0.52));
482
CHECK(Math::snapped(-0.5, 0.04) == doctest::Approx(-0.48));
483
CHECK(Math::snapped(0.0, 0.04) == doctest::Approx(0));
484
CHECK(Math::snapped(128'000.025, 0.04) == doctest::Approx(128'000.04));
485
486
CHECK(Math::snapped(0.5, 400) == doctest::Approx(0));
487
CHECK(Math::snapped(-0.5, 400) == doctest::Approx(0));
488
CHECK(Math::snapped(0.0, 400) == doctest::Approx(0));
489
CHECK(Math::snapped(128'000.025, 400) == doctest::Approx(128'000.0));
490
491
CHECK(Math::snapped(0.5, 0.0) == doctest::Approx(0.5));
492
CHECK(Math::snapped(-0.5, 0.0) == doctest::Approx(-0.5));
493
CHECK(Math::snapped(0.0, 0.0) == doctest::Approx(0.0));
494
CHECK(Math::snapped(128'000.025, 0.0) == doctest::Approx(128'000.0));
495
496
CHECK(Math::snapped(0.5, -1.0) == doctest::Approx(0));
497
CHECK(Math::snapped(-0.5, -1.0) == doctest::Approx(-1.0));
498
CHECK(Math::snapped(0.0, -1.0) == doctest::Approx(0));
499
CHECK(Math::snapped(128'000.025, -1.0) == doctest::Approx(128'000.0));
500
}
501
502
TEST_CASE("[Math] larger_prime") {
503
CHECK(Math::larger_prime(0) == 5);
504
CHECK(Math::larger_prime(1) == 5);
505
CHECK(Math::larger_prime(2) == 5);
506
CHECK(Math::larger_prime(5) == 13);
507
CHECK(Math::larger_prime(500) == 769);
508
CHECK(Math::larger_prime(1'000'000) == 1'572'869);
509
CHECK(Math::larger_prime(1'000'000'000) == 1'610'612'741);
510
511
// The next prime is larger than `INT32_MAX` and is not present in the built-in prime table.
512
ERR_PRINT_OFF;
513
CHECK(Math::larger_prime(2'000'000'000) == 0);
514
ERR_PRINT_ON;
515
}
516
517
TEST_CASE_TEMPLATE("[Math] fmod", T, float, double) {
518
CHECK(Math::fmod((T)-2.0, (T)0.3) == doctest::Approx((T)-0.2));
519
CHECK(Math::fmod((T)0.0, (T)0.3) == doctest::Approx((T)0.0));
520
CHECK(Math::fmod((T)2.0, (T)0.3) == doctest::Approx((T)0.2));
521
522
CHECK(Math::fmod((T)-2.0, (T)-0.3) == doctest::Approx((T)-0.2));
523
CHECK(Math::fmod((T)0.0, (T)-0.3) == doctest::Approx((T)0.0));
524
CHECK(Math::fmod((T)2.0, (T)-0.3) == doctest::Approx((T)0.2));
525
}
526
527
TEST_CASE_TEMPLATE("[Math] fposmod", T, float, double) {
528
CHECK(Math::fposmod((T)-2.0, (T)0.3) == doctest::Approx((T)0.1));
529
CHECK(Math::fposmod((T)0.0, (T)0.3) == doctest::Approx((T)0.0));
530
CHECK(Math::fposmod((T)2.0, (T)0.3) == doctest::Approx((T)0.2));
531
532
CHECK(Math::fposmod((T)-2.0, (T)-0.3) == doctest::Approx((T)-0.2));
533
CHECK(Math::fposmod((T)0.0, (T)-0.3) == doctest::Approx((T)0.0));
534
CHECK(Math::fposmod((T)2.0, (T)-0.3) == doctest::Approx((T)-0.1));
535
}
536
537
TEST_CASE_TEMPLATE("[Math] fposmodp", T, float, double) {
538
CHECK(Math::fposmodp((T)-2.0, (T)0.3) == doctest::Approx((T)0.1));
539
CHECK(Math::fposmodp((T)0.0, (T)0.3) == doctest::Approx((T)0.0));
540
CHECK(Math::fposmodp((T)2.0, (T)0.3) == doctest::Approx((T)0.2));
541
542
CHECK(Math::fposmodp((T)-2.0, (T)-0.3) == doctest::Approx((T)-0.5));
543
CHECK(Math::fposmodp((T)0.0, (T)-0.3) == doctest::Approx((T)0.0));
544
CHECK(Math::fposmodp((T)2.0, (T)-0.3) == doctest::Approx((T)0.2));
545
}
546
547
TEST_CASE("[Math] posmod") {
548
CHECK(Math::posmod(-20, 3) == 1);
549
CHECK(Math::posmod(0, 3) == 0);
550
CHECK(Math::posmod(20, 3) == 2);
551
CHECK(Math::posmod(-20, -3) == -2);
552
CHECK(Math::posmod(0, -3) == 0);
553
CHECK(Math::posmod(20, -3) == -1);
554
}
555
556
TEST_CASE("[Math] wrapi") {
557
CHECK(Math::wrapi(-30, -20, 160) == 150);
558
CHECK(Math::wrapi(30, -20, 160) == 30);
559
CHECK(Math::wrapi(300, -20, 160) == 120);
560
CHECK(Math::wrapi(300'000'000'000, -20, 160) == 120);
561
}
562
563
TEST_CASE_TEMPLATE("[Math] wrapf", T, float, double) {
564
CHECK(Math::wrapf((T)-30.0, (T)-20.0, (T)160.0) == doctest::Approx((T)150.0));
565
CHECK(Math::wrapf((T)30.0, (T)-2.0, (T)160.0) == doctest::Approx((T)30.0));
566
CHECK(Math::wrapf((T)300.0, (T)-20.0, (T)160.0) == doctest::Approx((T)120.0));
567
568
CHECK(Math::wrapf(300'000'000'000.0, -20.0, 160.0) == doctest::Approx((T)120.0));
569
// float's precision is too low for 300'000'000'000.0, so we reduce it by a factor of 1000.
570
CHECK(Math::wrapf((float)15'000'000.0, (float)-20.0, (float)160.0) == doctest::Approx((T)60.0));
571
}
572
573
TEST_CASE_TEMPLATE("[Math] fract", T, float, double) {
574
CHECK(Math::fract((T)1.0) == doctest::Approx((T)0.0));
575
CHECK(Math::fract((T)77.8) == doctest::Approx((T)0.8));
576
CHECK(Math::fract((T)-10.1) == doctest::Approx((T)0.9));
577
}
578
579
TEST_CASE_TEMPLATE("[Math] pingpong", T, float, double) {
580
CHECK(Math::pingpong((T)0.0, (T)0.0) == doctest::Approx((T)0.0));
581
CHECK(Math::pingpong((T)1.0, (T)1.0) == doctest::Approx((T)1.0));
582
CHECK(Math::pingpong((T)0.5, (T)2.0) == doctest::Approx((T)0.5));
583
CHECK(Math::pingpong((T)3.5, (T)2.0) == doctest::Approx((T)0.5));
584
CHECK(Math::pingpong((T)11.5, (T)2.0) == doctest::Approx((T)0.5));
585
CHECK(Math::pingpong((T)-2.5, (T)2.0) == doctest::Approx((T)1.5));
586
}
587
588
TEST_CASE_TEMPLATE("[Math] deg_to_rad/rad_to_deg", T, float, double) {
589
CHECK(Math::deg_to_rad((T)180.0) == doctest::Approx((T)Math::PI));
590
CHECK(Math::deg_to_rad((T)-27.0) == doctest::Approx((T)-0.471239));
591
592
CHECK(Math::rad_to_deg((T)Math::PI) == doctest::Approx((T)180.0));
593
CHECK(Math::rad_to_deg((T)-1.5) == doctest::Approx((T)-85.94366927));
594
}
595
596
TEST_CASE_TEMPLATE("[Math] cubic_interpolate", T, float, double) {
597
CHECK(Math::cubic_interpolate((T)0.2, (T)0.8, (T)0.0, (T)1.0, (T)0.0) == doctest::Approx((T)0.2));
598
CHECK(Math::cubic_interpolate((T)0.2, (T)0.8, (T)0.0, (T)1.0, (T)0.25) == doctest::Approx((T)0.33125));
599
CHECK(Math::cubic_interpolate((T)0.2, (T)0.8, (T)0.0, (T)1.0, (T)0.5) == doctest::Approx((T)0.5));
600
CHECK(Math::cubic_interpolate((T)0.2, (T)0.8, (T)0.0, (T)1.0, (T)0.75) == doctest::Approx((T)0.66875));
601
CHECK(Math::cubic_interpolate((T)0.2, (T)0.8, (T)0.0, (T)1.0, (T)1.0) == doctest::Approx((T)0.8));
602
603
CHECK(Math::cubic_interpolate((T)20.2, (T)30.1, (T)-100.0, (T)32.0, (T)-50.0) == doctest::Approx((T)-6662732.3));
604
CHECK(Math::cubic_interpolate((T)20.2, (T)30.1, (T)-100.0, (T)32.0, (T)-5.0) == doctest::Approx((T)-9356.3));
605
CHECK(Math::cubic_interpolate((T)20.2, (T)30.1, (T)-100.0, (T)32.0, (T)0.0) == doctest::Approx((T)20.2));
606
CHECK(Math::cubic_interpolate((T)20.2, (T)30.1, (T)-100.0, (T)32.0, (T)1.0) == doctest::Approx((T)30.1));
607
CHECK(Math::cubic_interpolate((T)20.2, (T)30.1, (T)-100.0, (T)32.0, (T)4.0) == doctest::Approx((T)1853.2));
608
}
609
610
TEST_CASE_TEMPLATE("[Math] cubic_interpolate_angle", T, float, double) {
611
CHECK(Math::cubic_interpolate_angle((T)(Math::PI * (1.0 / 6.0)), (T)(Math::PI * (5.0 / 6.0)), (T)0.0, (T)Math::PI, (T)0.0) == doctest::Approx((T)Math::PI * (1.0 / 6.0)));
612
CHECK(Math::cubic_interpolate_angle((T)(Math::PI * (1.0 / 6.0)), (T)(Math::PI * (5.0 / 6.0)), (T)0.0, (T)Math::PI, (T)0.25) == doctest::Approx((T)0.973566));
613
CHECK(Math::cubic_interpolate_angle((T)(Math::PI * (1.0 / 6.0)), (T)(Math::PI * (5.0 / 6.0)), (T)0.0, (T)Math::PI, (T)0.5) == doctest::Approx((T)Math::PI / 2.0));
614
CHECK(Math::cubic_interpolate_angle((T)(Math::PI * (1.0 / 6.0)), (T)(Math::PI * (5.0 / 6.0)), (T)0.0, (T)Math::PI, (T)0.75) == doctest::Approx((T)2.16803));
615
CHECK(Math::cubic_interpolate_angle((T)(Math::PI * (1.0 / 6.0)), (T)(Math::PI * (5.0 / 6.0)), (T)0.0, (T)Math::PI, (T)1.0) == doctest::Approx((T)Math::PI * (5.0 / 6.0)));
616
}
617
618
TEST_CASE_TEMPLATE("[Math] cubic_interpolate_in_time", T, float, double) {
619
CHECK(Math::cubic_interpolate_in_time((T)0.2, (T)0.8, (T)0.0, (T)1.0, (T)0.0, (T)0.5, (T)0.0, (T)1.0) == doctest::Approx((T)0.0));
620
CHECK(Math::cubic_interpolate_in_time((T)0.2, (T)0.8, (T)0.0, (T)1.0, (T)0.25, (T)0.5, (T)0.0, (T)1.0) == doctest::Approx((T)0.1625));
621
CHECK(Math::cubic_interpolate_in_time((T)0.2, (T)0.8, (T)0.0, (T)1.0, (T)0.5, (T)0.5, (T)0.0, (T)1.0) == doctest::Approx((T)0.4));
622
CHECK(Math::cubic_interpolate_in_time((T)0.2, (T)0.8, (T)0.0, (T)1.0, (T)0.75, (T)0.5, (T)0.0, (T)1.0) == doctest::Approx((T)0.6375));
623
CHECK(Math::cubic_interpolate_in_time((T)0.2, (T)0.8, (T)0.0, (T)1.0, (T)1.0, (T)0.5, (T)0.0, (T)1.0) == doctest::Approx((T)0.8));
624
}
625
626
TEST_CASE_TEMPLATE("[Math] cubic_interpolate_angle_in_time", T, float, double) {
627
CHECK(Math::cubic_interpolate_angle_in_time((T)(Math::PI * (1.0 / 6.0)), (T)(Math::PI * (5.0 / 6.0)), (T)0.0, (T)Math::PI, (T)0.0, (T)0.5, (T)0.0, (T)1.0) == doctest::Approx((T)0.0));
628
CHECK(Math::cubic_interpolate_angle_in_time((T)(Math::PI * (1.0 / 6.0)), (T)(Math::PI * (5.0 / 6.0)), (T)0.0, (T)Math::PI, (T)0.25, (T)0.5, (T)0.0, (T)1.0) == doctest::Approx((T)0.494964));
629
CHECK(Math::cubic_interpolate_angle_in_time((T)(Math::PI * (1.0 / 6.0)), (T)(Math::PI * (5.0 / 6.0)), (T)0.0, (T)Math::PI, (T)0.5, (T)0.5, (T)0.0, (T)1.0) == doctest::Approx((T)1.27627));
630
CHECK(Math::cubic_interpolate_angle_in_time((T)(Math::PI * (1.0 / 6.0)), (T)(Math::PI * (5.0 / 6.0)), (T)0.0, (T)Math::PI, (T)0.75, (T)0.5, (T)0.0, (T)1.0) == doctest::Approx((T)2.07394));
631
CHECK(Math::cubic_interpolate_angle_in_time((T)(Math::PI * (1.0 / 6.0)), (T)(Math::PI * (5.0 / 6.0)), (T)0.0, (T)Math::PI, (T)1.0, (T)0.5, (T)0.0, (T)1.0) == doctest::Approx((T)Math::PI * (5.0 / 6.0)));
632
}
633
634
TEST_CASE_TEMPLATE("[Math] bezier_interpolate", T, float, double) {
635
CHECK(Math::bezier_interpolate((T)0.0, (T)0.2, (T)0.8, (T)1.0, (T)0.0) == doctest::Approx((T)0.0));
636
CHECK(Math::bezier_interpolate((T)0.0, (T)0.2, (T)0.8, (T)1.0, (T)0.25) == doctest::Approx((T)0.2125));
637
CHECK(Math::bezier_interpolate((T)0.0, (T)0.2, (T)0.8, (T)1.0, (T)0.5) == doctest::Approx((T)0.5));
638
CHECK(Math::bezier_interpolate((T)0.0, (T)0.2, (T)0.8, (T)1.0, (T)0.75) == doctest::Approx((T)0.7875));
639
CHECK(Math::bezier_interpolate((T)0.0, (T)0.2, (T)0.8, (T)1.0, (T)1.0) == doctest::Approx((T)1.0));
640
}
641
642
} // namespace TestMathFuncs
643
644