add test for growing an array's capacity

Fri, 19 Dec 2025 17:54:15 +0100

author
Mike Becker <universe@uap-core.de>
date
Fri, 19 Dec 2025 17:54:15 +0100
changeset 1636
5ed91801f79d
parent 1635
4983b6a34996
child 1637
34c2e1436945

add test for growing an array's capacity

tests/test_list.c file | annotate | diff | comparison | revisions
--- a/tests/test_list.c	Fri Dec 19 17:41:53 2025 +0100
+++ b/tests/test_list.c	Fri Dec 19 17:54:15 2025 +0100
@@ -74,6 +74,69 @@
     cx_array_free(arr);
 }
 
+CX_TEST(test_array_add_capacity_grow_strategy) {
+    /*
+     * if (cap < 128) alignment = 16;
+     * else if (cap < 1024) alignment = 64;
+     * else if (cap < 8192) alignment = 512;
+     * else alignment = 1024;
+     */
+    CX_ARRAY(char, arr);
+    cx_array_init(arr, 5);
+    CX_TEST_DO {
+        int elem = 42;
+
+        arr.size = 5;
+        CX_TEST_ASSERT(cx_array_add(arr, elem) == 0);
+        CX_TEST_ASSERT(arr.size == 6);
+        CX_TEST_ASSERT(arr.capacity == 16);
+        arr.size = 16;
+        CX_TEST_ASSERT(cx_array_add(arr, elem) == 0);
+        CX_TEST_ASSERT(arr.size == 17);
+        CX_TEST_ASSERT(arr.capacity == 32);
+
+        CX_TEST_ASSERT(0 == cx_array_reserve(arr, 600));
+        CX_TEST_ASSERT(arr.size == 17);
+        CX_TEST_ASSERT(arr.capacity == 600);
+
+        arr.size = 600;
+        CX_TEST_ASSERT(cx_array_add(arr, elem) == 0);
+        CX_TEST_ASSERT(arr.size == 601);
+        CX_TEST_ASSERT(arr.capacity == 640);
+        arr.size = 640;
+        CX_TEST_ASSERT(cx_array_add(arr, elem) == 0);
+        CX_TEST_ASSERT(arr.size == 641);
+        CX_TEST_ASSERT(arr.capacity == 704);
+
+        CX_TEST_ASSERT(0 == cx_array_reserve(arr, 7000));
+        CX_TEST_ASSERT(arr.size == 641);
+        CX_TEST_ASSERT(arr.capacity == 7000);
+
+        arr.size = 7000;
+        CX_TEST_ASSERT(cx_array_add(arr, elem) == 0);
+        CX_TEST_ASSERT(arr.size == 7001);
+        CX_TEST_ASSERT(arr.capacity == 7168);
+        arr.size = 7168;
+        CX_TEST_ASSERT(cx_array_add(arr, elem) == 0);
+        CX_TEST_ASSERT(arr.size == 7169);
+        CX_TEST_ASSERT(arr.capacity == 7680);
+
+        CX_TEST_ASSERT(0 == cx_array_reserve(arr, 9000));
+        CX_TEST_ASSERT(arr.size == 7169);
+        CX_TEST_ASSERT(arr.capacity == 9000);
+
+        arr.size = 9000;
+        CX_TEST_ASSERT(cx_array_add(arr, elem) == 0);
+        CX_TEST_ASSERT(arr.size == 9001);
+        CX_TEST_ASSERT(arr.capacity == 9216);
+        arr.size = 9216;
+        CX_TEST_ASSERT(cx_array_add(arr, elem) == 0);
+        CX_TEST_ASSERT(arr.size == 9217);
+        CX_TEST_ASSERT(arr.capacity == 10240);
+    }
+    cx_array_free(arr);
+}
+
 CX_TEST(test_array_remove) {
     CX_ARRAY(int, arr);
     cx_array_init(arr, 5);
@@ -3438,6 +3501,7 @@
     CxTestSuite *suite = cx_test_suite_new("array (low-level)");
 
     cx_test_register(suite, test_array_add);
+    cx_test_register(suite, test_array_add_capacity_grow_strategy);
     cx_test_register(suite, test_array_remove);
     cx_test_register(suite, test_array_remove_fast);
     cx_test_register(suite, test_array_remove_array);

mercurial