summaryrefslogtreecommitdiff
path: root/tests/core/integer.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/core/integer.c')
-rw-r--r--tests/core/integer.c253
1 files changed, 253 insertions, 0 deletions
diff --git a/tests/core/integer.c b/tests/core/integer.c
new file mode 100644
index 000000000..bd19651af
--- /dev/null
+++ b/tests/core/integer.c
@@ -0,0 +1,253 @@
+#include "clar_libgit2.h"
+
+void test_core_integer__multiply_int64_no_overflow(void)
+{
+#if !defined(git__multiply_int64_overflow)
+ int64_t result = 0;
+ cl_assert(!git__multiply_int64_overflow(&result, 0x0ll, 0x0ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x0ll, 0x1ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x0ll, -0x1ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x0ll, 0x2ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x0ll, -0x2ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x0ll, 0x7ffffffffffffffll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x0ll, -0x7ffffffffffffffll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x0ll, 0x800000000000000ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x0ll, -0x800000000000000ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x0ll, 0x7fffffffffffffffll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x0ll, -0x7fffffffffffffffll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x0ll, -0x8000000000000000ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x1ll, 0x0ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x1ll, 0x1ll));
+ cl_assert_equal_i(result, 0x1ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x1ll, -0x1ll));
+ cl_assert_equal_i(result, -0x1ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x1ll, 0x2ll));
+ cl_assert_equal_i(result, 0x2ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x1ll, -0x2ll));
+ cl_assert_equal_i(result, -0x2ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x1ll, 0x7ffffffffffffffll));
+ cl_assert_equal_i(result, 0x7ffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x1ll, -0x7ffffffffffffffll));
+ cl_assert_equal_i(result, -0x7ffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x1ll, 0x800000000000000ll));
+ cl_assert_equal_i(result, 0x800000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x1ll, -0x800000000000000ll));
+ cl_assert_equal_i(result, -0x800000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x1ll, 0x7fffffffffffffffll));
+ cl_assert_equal_i(result, 0x7fffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x1ll, -0x7fffffffffffffffll));
+ cl_assert_equal_i(result, -0x7fffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x1ll, 0x0ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x1ll, 0x1ll));
+ cl_assert_equal_i(result, -0x1ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x1ll, -0x1ll));
+ cl_assert_equal_i(result, 0x1ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x1ll, 0x2ll));
+ cl_assert_equal_i(result, -0x2ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x1ll, -0x2ll));
+ cl_assert_equal_i(result, 0x2ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x1ll, 0x7ffffffffffffffll));
+ cl_assert_equal_i(result, -0x7ffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x1ll, -0x7ffffffffffffffll));
+ cl_assert_equal_i(result, 0x7ffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x1ll, 0x800000000000000ll));
+ cl_assert_equal_i(result, -0x800000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x1ll, -0x800000000000000ll));
+ cl_assert_equal_i(result, 0x800000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x1ll, 0x7fffffffffffffffll));
+ cl_assert_equal_i(result, -0x7fffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x1ll, -0x7fffffffffffffffll));
+ cl_assert_equal_i(result, 0x7fffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x2ll, 0x0ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x2ll, 0x1ll));
+ cl_assert_equal_i(result, 0x2ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x2ll, -0x1ll));
+ cl_assert_equal_i(result, -0x2ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x2ll, 0x2ll));
+ cl_assert_equal_i(result, 0x4ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x2ll, -0x2ll));
+ cl_assert_equal_i(result, -0x4ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x2ll, 0x7ffffffffffffffll));
+ cl_assert_equal_i(result, 0xffffffffffffffell);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x2ll, -0x7ffffffffffffffll));
+ cl_assert_equal_i(result, -0xffffffffffffffell);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x2ll, 0x800000000000000ll));
+ cl_assert_equal_i(result, 0x1000000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x2ll, -0x800000000000000ll));
+ cl_assert_equal_i(result, -0x1000000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x2ll, 0x0ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x2ll, 0x1ll));
+ cl_assert_equal_i(result, -0x2ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x2ll, -0x1ll));
+ cl_assert_equal_i(result, 0x2ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x2ll, 0x2ll));
+ cl_assert_equal_i(result, -0x4ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x2ll, -0x2ll));
+ cl_assert_equal_i(result, 0x4ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x2ll, 0x7ffffffffffffffll));
+ cl_assert_equal_i(result, -0xffffffffffffffell);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x2ll, -0x7ffffffffffffffll));
+ cl_assert_equal_i(result, 0xffffffffffffffell);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x2ll, 0x800000000000000ll));
+ cl_assert_equal_i(result, -0x1000000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x2ll, -0x800000000000000ll));
+ cl_assert_equal_i(result, 0x1000000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x2ll, -0x4000000000000000ll));
+ cl_assert_equal_i(result, -0x8000000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x7ffffffffffffffll, 0x0ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x7ffffffffffffffll, 0x1ll));
+ cl_assert_equal_i(result, 0x7ffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x7ffffffffffffffll, -0x1ll));
+ cl_assert_equal_i(result, -0x7ffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x7ffffffffffffffll, 0x2ll));
+ cl_assert_equal_i(result, 0xffffffffffffffell);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x7ffffffffffffffll, -0x2ll));
+ cl_assert_equal_i(result, -0xffffffffffffffell);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x7ffffffffffffffll, 0x0ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x7ffffffffffffffll, 0x1ll));
+ cl_assert_equal_i(result, -0x7ffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x7ffffffffffffffll, -0x1ll));
+ cl_assert_equal_i(result, 0x7ffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x7ffffffffffffffll, 0x2ll));
+ cl_assert_equal_i(result, -0xffffffffffffffell);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x7ffffffffffffffll, -0x2ll));
+ cl_assert_equal_i(result, 0xffffffffffffffell);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x800000000000000ll, 0x0ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x800000000000000ll, 0x1ll));
+ cl_assert_equal_i(result, 0x800000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x800000000000000ll, -0x1ll));
+ cl_assert_equal_i(result, -0x800000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x800000000000000ll, 0x2ll));
+ cl_assert_equal_i(result, 0x1000000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x800000000000000ll, -0x2ll));
+ cl_assert_equal_i(result, -0x1000000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x800000000000000ll, 0x0ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x800000000000000ll, 0x1ll));
+ cl_assert_equal_i(result, -0x800000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x800000000000000ll, -0x1ll));
+ cl_assert_equal_i(result, 0x800000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x800000000000000ll, 0x2ll));
+ cl_assert_equal_i(result, -0x1000000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x800000000000000ll, -0x2ll));
+ cl_assert_equal_i(result, 0x1000000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x7fffffffffffffffll, 0x0ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x7fffffffffffffffll, 0x1ll));
+ cl_assert_equal_i(result, 0x7fffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, 0x7fffffffffffffffll, -0x1ll));
+ cl_assert_equal_i(result, -0x7fffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x4000000000000000ll, 0x2ll));
+ cl_assert_equal_i(result, -0x8000000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x7fffffffffffffffll, 0x0ll));
+ cl_assert_equal_i(result, 0x0ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x7fffffffffffffffll, 0x1ll));
+ cl_assert_equal_i(result, -0x7fffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x7fffffffffffffffll, -0x1ll));
+ cl_assert_equal_i(result, 0x7fffffffffffffffll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x8000000000000000ll, 0x0ll));
+ cl_assert_equal_i(result, 0x0ll);
+#endif
+}
+
+void test_core_integer__multiply_int64_overflow(void)
+{
+#if !defined(git__multiply_int64_overflow)
+ int64_t result = 0;
+ cl_assert(git__multiply_int64_overflow(&result, 0x2ll, 0x4000000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x2ll, 0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x2ll, -0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x2ll, -0x8000000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x2ll, 0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x2ll, -0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x2ll, -0x8000000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7ffffffffffffffll, 0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7ffffffffffffffll, -0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7ffffffffffffffll, 0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7ffffffffffffffll, -0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7ffffffffffffffll, 0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7ffffffffffffffll, -0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7ffffffffffffffll, -0x8000000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7ffffffffffffffll, 0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7ffffffffffffffll, -0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7ffffffffffffffll, 0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7ffffffffffffffll, -0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7ffffffffffffffll, 0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7ffffffffffffffll, -0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7ffffffffffffffll, -0x8000000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x800000000000000ll, 0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x800000000000000ll, -0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x800000000000000ll, 0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x800000000000000ll, -0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x800000000000000ll, 0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x800000000000000ll, -0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x800000000000000ll, -0x8000000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x800000000000000ll, 0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x800000000000000ll, -0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x800000000000000ll, 0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x800000000000000ll, -0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x800000000000000ll, 0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x800000000000000ll, -0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x800000000000000ll, -0x8000000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x4000000000000000ll, 0x2ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7fffffffffffffffll, 0x2ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7fffffffffffffffll, -0x2ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7fffffffffffffffll, 0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7fffffffffffffffll, -0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7fffffffffffffffll, 0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7fffffffffffffffll, -0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7fffffffffffffffll, 0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7fffffffffffffffll, -0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, 0x7fffffffffffffffll, -0x8000000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7fffffffffffffffll, 0x2ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7fffffffffffffffll, -0x2ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7fffffffffffffffll, 0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7fffffffffffffffll, -0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7fffffffffffffffll, 0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7fffffffffffffffll, -0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7fffffffffffffffll, 0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7fffffffffffffffll, -0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x7fffffffffffffffll, -0x8000000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x8000000000000000ll, 0x2ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x8000000000000000ll, -0x2ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x8000000000000000ll, 0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x8000000000000000ll, -0x7ffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x8000000000000000ll, 0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x8000000000000000ll, -0x800000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x8000000000000000ll, 0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x8000000000000000ll, -0x7fffffffffffffffll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x8000000000000000ll, -0x8000000000000000ll));
+#endif
+}
+
+void test_core_integer__multiply_int64_edge_cases(void)
+{
+#if !defined(git__multiply_int64_overflow)
+ int64_t result = 0;
+ cl_assert(!git__multiply_int64_overflow(&result, -0x8000000000000000ll, -0x1ll));
+ cl_assert_equal_i(result, -0x8000000000000000ll);
+ cl_assert(!git__multiply_int64_overflow(&result, -0x1ll, -0x8000000000000000ll));
+ cl_assert_equal_i(result, -0x8000000000000000ll);
+ cl_assert(git__multiply_int64_overflow(&result, 0x1ll, -0x8000000000000000ll));
+ cl_assert(git__multiply_int64_overflow(&result, -0x8000000000000000ll, 0x1ll));
+#endif
+}