summaryrefslogtreecommitdiff
path: root/tests/libgit2/core/oidmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/libgit2/core/oidmap.c')
-rw-r--r--tests/libgit2/core/oidmap.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/tests/libgit2/core/oidmap.c b/tests/libgit2/core/oidmap.c
new file mode 100644
index 000000000..7f98287a6
--- /dev/null
+++ b/tests/libgit2/core/oidmap.c
@@ -0,0 +1,127 @@
+#include "clar_libgit2.h"
+#include "oidmap.h"
+
+static struct {
+ git_oid oid;
+ size_t extra;
+} test_oids[0x0FFF];
+
+static git_oidmap *g_map;
+
+void test_core_oidmap__initialize(void)
+{
+ uint32_t i, j;
+ for (i = 0; i < ARRAY_SIZE(test_oids); ++i) {
+ uint32_t segment = i / 8;
+ int modi = i - (segment * 8);
+
+ test_oids[i].extra = i;
+
+ for (j = 0; j < GIT_OID_RAWSZ / 4; ++j) {
+ test_oids[i].oid.id[j * 4 ] = (unsigned char)modi;
+ test_oids[i].oid.id[j * 4 + 1] = (unsigned char)(modi >> 8);
+ test_oids[i].oid.id[j * 4 + 2] = (unsigned char)(modi >> 16);
+ test_oids[i].oid.id[j * 4 + 3] = (unsigned char)(modi >> 24);
+ }
+
+ test_oids[i].oid.id[ 8] = (unsigned char)i;
+ test_oids[i].oid.id[ 9] = (unsigned char)(i >> 8);
+ test_oids[i].oid.id[10] = (unsigned char)(i >> 16);
+ test_oids[i].oid.id[11] = (unsigned char)(i >> 24);
+ }
+
+ cl_git_pass(git_oidmap_new(&g_map));
+}
+
+void test_core_oidmap__cleanup(void)
+{
+ git_oidmap_free(g_map);
+}
+
+void test_core_oidmap__basic(void)
+{
+ size_t i;
+
+ for (i = 0; i < ARRAY_SIZE(test_oids); ++i) {
+ cl_assert(!git_oidmap_exists(g_map, &test_oids[i].oid));
+ cl_git_pass(git_oidmap_set(g_map, &test_oids[i].oid, &test_oids[i]));
+ }
+
+ for (i = 0; i < ARRAY_SIZE(test_oids); ++i) {
+ cl_assert(git_oidmap_exists(g_map, &test_oids[i].oid));
+ cl_assert_equal_p(git_oidmap_get(g_map, &test_oids[i].oid), &test_oids[i]);
+ }
+}
+
+void test_core_oidmap__hash_collision(void)
+{
+ size_t i;
+
+ for (i = 0; i < ARRAY_SIZE(test_oids); ++i) {
+ cl_assert(!git_oidmap_exists(g_map, &test_oids[i].oid));
+ cl_git_pass(git_oidmap_set(g_map, &test_oids[i].oid, &test_oids[i]));
+ }
+
+ for (i = 0; i < ARRAY_SIZE(test_oids); ++i) {
+ cl_assert(git_oidmap_exists(g_map, &test_oids[i].oid));
+ cl_assert_equal_p(git_oidmap_get(g_map, &test_oids[i].oid), &test_oids[i]);
+ }
+}
+
+void test_core_oidmap__get_succeeds_with_existing_keys(void)
+{
+ size_t i;
+
+ for (i = 0; i < ARRAY_SIZE(test_oids); ++i)
+ cl_git_pass(git_oidmap_set(g_map, &test_oids[i].oid, &test_oids[i]));
+
+ for (i = 0; i < ARRAY_SIZE(test_oids); ++i)
+ cl_assert_equal_p(git_oidmap_get(g_map, &test_oids[i].oid), &test_oids[i]);
+}
+
+void test_core_oidmap__get_fails_with_nonexisting_key(void)
+{
+ size_t i;
+
+ /* Do _not_ add last OID to verify that we cannot look it up */
+ for (i = 0; i < ARRAY_SIZE(test_oids) - 1; ++i)
+ cl_git_pass(git_oidmap_set(g_map, &test_oids[i].oid, &test_oids[i]));
+
+ cl_assert_equal_p(git_oidmap_get(g_map, &test_oids[ARRAY_SIZE(test_oids) - 1].oid), NULL);
+}
+
+void test_core_oidmap__setting_oid_persists(void)
+{
+ git_oid oids[] = {
+ {{ 0x01 }},
+ {{ 0x02 }},
+ {{ 0x03 }}
+ };
+
+ cl_git_pass(git_oidmap_set(g_map, &oids[0], "one"));
+ cl_git_pass(git_oidmap_set(g_map, &oids[1], "two"));
+ cl_git_pass(git_oidmap_set(g_map, &oids[2], "three"));
+
+ cl_assert_equal_s(git_oidmap_get(g_map, &oids[0]), "one");
+ cl_assert_equal_s(git_oidmap_get(g_map, &oids[1]), "two");
+ cl_assert_equal_s(git_oidmap_get(g_map, &oids[2]), "three");
+}
+
+void test_core_oidmap__setting_existing_key_updates(void)
+{
+ git_oid oids[] = {
+ {{ 0x01 }},
+ {{ 0x02 }},
+ {{ 0x03 }}
+ };
+
+ cl_git_pass(git_oidmap_set(g_map, &oids[0], "one"));
+ cl_git_pass(git_oidmap_set(g_map, &oids[1], "two"));
+ cl_git_pass(git_oidmap_set(g_map, &oids[2], "three"));
+ cl_assert_equal_i(git_oidmap_size(g_map), 3);
+
+ cl_git_pass(git_oidmap_set(g_map, &oids[1], "other"));
+ cl_assert_equal_i(git_oidmap_size(g_map), 3);
+
+ cl_assert_equal_s(git_oidmap_get(g_map, &oids[1]), "other");
+}