| #include "clar_libgit2.h" |
| #include "oidmap.h" |
| |
| GIT__USE_OIDMAP; |
| |
| typedef struct { |
| git_oid oid; |
| size_t extra; |
| } oidmap_item; |
| |
| #define NITEMS 0x0fff |
| |
| void test_core_oidmap__basic(void) |
| { |
| git_oidmap *map; |
| oidmap_item items[NITEMS]; |
| uint32_t i, j; |
| |
| for (i = 0; i < NITEMS; ++i) { |
| items[i].extra = i; |
| for (j = 0; j < GIT_OID_RAWSZ / 4; ++j) { |
| items[i].oid.id[j * 4 ] = (unsigned char)i; |
| items[i].oid.id[j * 4 + 1] = (unsigned char)(i >> 8); |
| items[i].oid.id[j * 4 + 2] = (unsigned char)(i >> 16); |
| items[i].oid.id[j * 4 + 3] = (unsigned char)(i >> 24); |
| } |
| } |
| |
| map = git_oidmap_alloc(); |
| cl_assert(map != NULL); |
| |
| for (i = 0; i < NITEMS; ++i) { |
| khiter_t pos; |
| int ret; |
| |
| pos = kh_get(oid, map, &items[i].oid); |
| cl_assert(pos == kh_end(map)); |
| |
| pos = kh_put(oid, map, &items[i].oid, &ret); |
| cl_assert(ret != 0); |
| |
| kh_val(map, pos) = &items[i]; |
| } |
| |
| |
| for (i = 0; i < NITEMS; ++i) { |
| khiter_t pos; |
| |
| pos = kh_get(oid, map, &items[i].oid); |
| cl_assert(pos != kh_end(map)); |
| |
| cl_assert_equal_p(kh_val(map, pos), &items[i]); |
| } |
| |
| git_oidmap_free(map); |
| } |
| |
| void test_core_oidmap__hash_collision(void) |
| { |
| git_oidmap *map; |
| oidmap_item items[NITEMS]; |
| uint32_t i, j; |
| |
| for (i = 0; i < NITEMS; ++i) { |
| uint32_t segment = i / 8; |
| int modi = i - (segment * 8); |
| |
| items[i].extra = i; |
| |
| for (j = 0; j < GIT_OID_RAWSZ / 4; ++j) { |
| items[i].oid.id[j * 4 ] = (unsigned char)modi; |
| items[i].oid.id[j * 4 + 1] = (unsigned char)(modi >> 8); |
| items[i].oid.id[j * 4 + 2] = (unsigned char)(modi >> 16); |
| items[i].oid.id[j * 4 + 3] = (unsigned char)(modi >> 24); |
| } |
| |
| items[i].oid.id[ 8] = (unsigned char)i; |
| items[i].oid.id[ 9] = (unsigned char)(i >> 8); |
| items[i].oid.id[10] = (unsigned char)(i >> 16); |
| items[i].oid.id[11] = (unsigned char)(i >> 24); |
| } |
| |
| map = git_oidmap_alloc(); |
| cl_assert(map != NULL); |
| |
| for (i = 0; i < NITEMS; ++i) { |
| khiter_t pos; |
| int ret; |
| |
| pos = kh_get(oid, map, &items[i].oid); |
| cl_assert(pos == kh_end(map)); |
| |
| pos = kh_put(oid, map, &items[i].oid, &ret); |
| cl_assert(ret != 0); |
| |
| kh_val(map, pos) = &items[i]; |
| } |
| |
| |
| for (i = 0; i < NITEMS; ++i) { |
| khiter_t pos; |
| |
| pos = kh_get(oid, map, &items[i].oid); |
| cl_assert(pos != kh_end(map)); |
| |
| cl_assert_equal_p(kh_val(map, pos), &items[i]); |
| } |
| |
| git_oidmap_free(map); |
| } |