]> git.proxmox.com Git - libgit2.git/blobdiff - tests/core/vector.c
New upstream version 1.4.3+dfsg.1
[libgit2.git] / tests / core / vector.c
index 66f90b82b6f119bad1ddf0af51594baa404035bc..08cd2c19bf99798ab6bacb6080ffe5497f9dc1cd 100644 (file)
@@ -1,3 +1,5 @@
+#include <stdint.h>
+
 #include "clar_libgit2.h"
 #include "vector.h"
 
@@ -6,7 +8,7 @@ void test_core_vector__0(void)
 {
        git_vector x;
        int i;
-       git_vector_init(&x, 1, NULL);
+       cl_git_pass(git_vector_init(&x, 1, NULL));
        for (i = 0; i < 10; ++i) {
                git_vector_insert(&x, (void*) 0xabc);
        }
@@ -18,13 +20,13 @@ void test_core_vector__0(void)
 void test_core_vector__1(void)
 {
        git_vector x;
-       // make initial capacity exact for our insertions.
-       git_vector_init(&x, 3, NULL);
+       /* make initial capacity exact for our insertions. */
+       cl_git_pass(git_vector_init(&x, 3, NULL));
        git_vector_insert(&x, (void*) 0xabc);
        git_vector_insert(&x, (void*) 0xdef);
        git_vector_insert(&x, (void*) 0x123);
 
-       git_vector_remove(&x, 0); // used to read past array bounds.
+       git_vector_remove(&x, 0); /* used to read past array bounds. */
        git_vector_free(&x);
 }
 
@@ -66,15 +68,15 @@ void test_core_vector__2(void)
 
 static int compare_them(const void *a, const void *b)
 {
-       return (int)((long)a - (long)b);
+       return (int)((intptr_t)a - (intptr_t)b);
 }
 
 /* insert_sorted */
 void test_core_vector__3(void)
 {
        git_vector x;
-       long i;
-       git_vector_init(&x, 1, &compare_them);
+       intptr_t i;
+       cl_git_pass(git_vector_init(&x, 1, &compare_them));
 
        for (i = 0; i < 10; i += 2) {
                git_vector_insert_sorted(&x, (void*)(i + 1), NULL);
@@ -96,8 +98,8 @@ void test_core_vector__3(void)
 void test_core_vector__4(void)
 {
        git_vector x;
-       long i;
-       git_vector_init(&x, 1, &compare_them);
+       intptr_t i;
+       cl_git_pass(git_vector_init(&x, 1, &compare_them));
 
        for (i = 0; i < 10; i += 2) {
                git_vector_insert_sorted(&x, (void*)(i + 1), NULL);
@@ -161,7 +163,7 @@ void test_core_vector__5(void)
        git_vector x;
        int i;
 
-       git_vector_init(&x, 1, &compare_structs);
+       cl_git_pass(git_vector_init(&x, 1, &compare_structs));
 
        for (i = 0; i < 10; i += 2)
                git_vector_insert_sorted(&x, alloc_struct(i), &merge_structs);
@@ -203,7 +205,7 @@ void test_core_vector__remove_matching(void)
        size_t i;
        void *compare;
 
-       git_vector_init(&x, 1, NULL);
+       cl_git_pass(git_vector_init(&x, 1, NULL));
        git_vector_insert(&x, (void*) 0x001);
 
        cl_assert(x.length == 1);
@@ -274,3 +276,155 @@ void test_core_vector__remove_matching(void)
 
        git_vector_free(&x);
 }
+
+static void assert_vector(git_vector *x, void *expected[], size_t len)
+{
+       size_t i;
+
+       cl_assert_equal_i(len, x->length);
+
+       for (i = 0; i < len; i++)
+               cl_assert(expected[i] == x->contents[i]);
+}
+
+void test_core_vector__grow_and_shrink(void)
+{
+       git_vector x = GIT_VECTOR_INIT;
+       void *expected1[] = {
+               (void *)0x02, (void *)0x03, (void *)0x04, (void *)0x05,
+               (void *)0x06, (void *)0x07, (void *)0x08, (void *)0x09,
+               (void *)0x0a
+       };
+       void *expected2[] = {
+               (void *)0x02, (void *)0x04, (void *)0x05, (void *)0x06,
+               (void *)0x07, (void *)0x08, (void *)0x09, (void *)0x0a
+       };
+       void *expected3[] = {
+               (void *)0x02, (void *)0x04, (void *)0x05, (void *)0x06,
+               (void *)0x0a
+       };
+       void *expected4[] = {
+               (void *)0x02, (void *)0x04, (void *)0x05
+       };
+       void *expected5[] = {
+               (void *)0x00, (void *)0x00, (void *)0x02, (void *)0x04,
+               (void *)0x05
+       };
+       void *expected6[] = {
+               (void *)0x00, (void *)0x00, (void *)0x02, (void *)0x04,
+               (void *)0x05, (void *)0x00
+       };
+       void *expected7[] = {
+               (void *)0x00, (void *)0x00, (void *)0x02, (void *)0x04,
+               (void *)0x00, (void *)0x00, (void *)0x00, (void *)0x05,
+               (void *)0x00
+       };
+       void *expected8[] = {
+               (void *)0x04, (void *)0x00, (void *)0x00, (void *)0x00,
+               (void *)0x05, (void *)0x00
+       };
+       void *expected9[] = {
+               (void *)0x04, (void *)0x00, (void *)0x05, (void *)0x00
+       };
+       void *expectedA[] = { (void *)0x04, (void *)0x00 };
+       void *expectedB[] = { (void *)0x04 };
+
+       git_vector_insert(&x, (void *)0x01);
+       git_vector_insert(&x, (void *)0x02);
+       git_vector_insert(&x, (void *)0x03);
+       git_vector_insert(&x, (void *)0x04);
+       git_vector_insert(&x, (void *)0x05);
+       git_vector_insert(&x, (void *)0x06);
+       git_vector_insert(&x, (void *)0x07);
+       git_vector_insert(&x, (void *)0x08);
+       git_vector_insert(&x, (void *)0x09);
+       git_vector_insert(&x, (void *)0x0a);
+
+       git_vector_remove_range(&x, 0, 1);
+       assert_vector(&x, expected1, ARRAY_SIZE(expected1));
+
+       git_vector_remove_range(&x, 1, 1);
+       assert_vector(&x, expected2, ARRAY_SIZE(expected2));
+
+       git_vector_remove_range(&x, 4, 3);
+       assert_vector(&x, expected3, ARRAY_SIZE(expected3));
+
+       git_vector_remove_range(&x, 3, 2);
+       assert_vector(&x, expected4, ARRAY_SIZE(expected4));
+
+       git_vector_insert_null(&x, 0, 2);
+       assert_vector(&x, expected5, ARRAY_SIZE(expected5));
+
+       git_vector_insert_null(&x, 5, 1);
+       assert_vector(&x, expected6, ARRAY_SIZE(expected6));
+
+       git_vector_insert_null(&x, 4, 3);
+       assert_vector(&x, expected7, ARRAY_SIZE(expected7));
+
+       git_vector_remove_range(&x, 0, 3);
+       assert_vector(&x, expected8, ARRAY_SIZE(expected8));
+
+       git_vector_remove_range(&x, 1, 2);
+       assert_vector(&x, expected9, ARRAY_SIZE(expected9));
+
+       git_vector_remove_range(&x, 2, 2);
+       assert_vector(&x, expectedA, ARRAY_SIZE(expectedA));
+
+       git_vector_remove_range(&x, 1, 1);
+       assert_vector(&x, expectedB, ARRAY_SIZE(expectedB));
+
+       git_vector_remove_range(&x, 0, 1);
+       assert_vector(&x, NULL, 0);
+
+       git_vector_free(&x);
+}
+
+void test_core_vector__reverse(void)
+{
+       git_vector v = GIT_VECTOR_INIT;
+       size_t i;
+
+       void *in1[] = {(void *) 0x0, (void *) 0x1, (void *) 0x2, (void *) 0x3};
+       void *out1[] = {(void *) 0x3, (void *) 0x2, (void *) 0x1, (void *) 0x0};
+
+       void *in2[] = {(void *) 0x0, (void *) 0x1, (void *) 0x2, (void *) 0x3, (void *) 0x4};
+       void *out2[] = {(void *) 0x4, (void *) 0x3, (void *) 0x2, (void *) 0x1, (void *) 0x0};
+
+       for (i = 0; i < 4; i++)
+               cl_git_pass(git_vector_insert(&v, in1[i]));
+
+       git_vector_reverse(&v);
+
+       for (i = 0; i < 4; i++)
+               cl_assert_equal_p(out1[i], git_vector_get(&v, i));
+
+       git_vector_clear(&v);
+       for (i = 0; i < 5; i++)
+               cl_git_pass(git_vector_insert(&v, in2[i]));
+
+       git_vector_reverse(&v);
+
+       for (i = 0; i < 5; i++)
+               cl_assert_equal_p(out2[i], git_vector_get(&v, i));
+
+       git_vector_free(&v);
+}
+
+void test_core_vector__dup_empty_vector(void)
+{
+       git_vector v = GIT_VECTOR_INIT;
+       git_vector dup = GIT_VECTOR_INIT;
+       int dummy;
+
+       cl_assert_equal_i(0, v.length);
+
+       cl_git_pass(git_vector_dup(&dup, &v, v._cmp));
+       cl_assert_equal_i(0, dup._alloc_size);
+       cl_assert_equal_i(0, dup.length);
+
+       cl_git_pass(git_vector_insert(&dup, &dummy));
+       cl_assert_equal_i(8, dup._alloc_size);
+       cl_assert_equal_i(1, dup.length);
+
+       git_vector_free(&dup);
+}