summaryrefslogtreecommitdiffstats
path: root/tests/core/math
diff options
context:
space:
mode:
authorEddieBreeg <eddiebreeg0@protonmail.com>2023-08-07 20:19:20 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-01-02 14:14:47 +0100
commit8747c67d9e549e9b2cf5a93201be105b9c8d9291 (patch)
tree448bf57e5f613c3111c746b4b6bd2dcc35e7c21d /tests/core/math
parent13a0d6e9b253654f5cc2a44f3d0b3cae10440443 (diff)
downloadredot-engine-8747c67d9e549e9b2cf5a93201be105b9c8d9291.tar.gz
Fix potential integer underflow in rounded up divisions
A new `Math::division_round_up()` function was added, allowing for easy and correct computation of integer divisions when the result needs to be rounded up. Fixes #80358. Co-authored-by: Rémi Verschelde <rverschelde@gmail.com>
Diffstat (limited to 'tests/core/math')
-rw-r--r--tests/core/math/test_math_funcs.h23
1 files changed, 23 insertions, 0 deletions
diff --git a/tests/core/math/test_math_funcs.h b/tests/core/math/test_math_funcs.h
index 5fbea4aece..0a9d9c97d9 100644
--- a/tests/core/math/test_math_funcs.h
+++ b/tests/core/math/test_math_funcs.h
@@ -110,6 +110,29 @@ TEST_CASE_TEMPLATE("[Math] round/floor/ceil", T, float, double) {
CHECK(Math::ceil((T)-1.9) == (T)-1.0);
}
+TEST_CASE_TEMPLATE("[Math] integer division round up unsigned", T, uint32_t, uint64_t) {
+ CHECK(Math::division_round_up((T)0, (T)64) == 0);
+ CHECK(Math::division_round_up((T)1, (T)64) == 1);
+ CHECK(Math::division_round_up((T)63, (T)64) == 1);
+ CHECK(Math::division_round_up((T)64, (T)64) == 1);
+ CHECK(Math::division_round_up((T)65, (T)64) == 2);
+ CHECK(Math::division_round_up((T)65, (T)1) == 65);
+}
+
+TEST_CASE_TEMPLATE("[Math] integer division round up signed", T, int32_t, int64_t) {
+ CHECK(Math::division_round_up((T)0, (T)64) == 0);
+ CHECK(Math::division_round_up((T)1, (T)64) == 1);
+ CHECK(Math::division_round_up((T)63, (T)64) == 1);
+ CHECK(Math::division_round_up((T)64, (T)64) == 1);
+ CHECK(Math::division_round_up((T)65, (T)64) == 2);
+ CHECK(Math::division_round_up((T)65, (T)1) == 65);
+ CHECK(Math::division_round_up((T)-1, (T)64) == 0);
+ CHECK(Math::division_round_up((T)-1, (T)-1) == 1);
+ CHECK(Math::division_round_up((T)-1, (T)1) == -1);
+ CHECK(Math::division_round_up((T)-1, (T)-2) == 1);
+ CHECK(Math::division_round_up((T)-4, (T)-2) == 2);
+}
+
TEST_CASE_TEMPLATE("[Math] sin/cos/tan", T, float, double) {
CHECK(Math::sin((T)-0.1) == doctest::Approx((T)-0.0998334166));
CHECK(Math::sin((T)0.1) == doctest::Approx((T)0.0998334166));