oidmap.c 2.37 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
#include "clar_libgit2.h"
#include "oidmap.h"

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) {
31
		size_t pos;
32 33
		int ret;

34
		pos = git_oidmap_lookup_index(map, &items[i].oid);
35
		cl_assert(!git_oidmap_valid_index(map, pos));
36

37
		pos = git_oidmap_put(map, &items[i].oid, &ret);
38 39
		cl_assert(ret != 0);

40
		git_oidmap_set_value_at(map, pos, &items[i]);
41 42 43 44
	}


	for (i = 0; i < NITEMS; ++i) {
45
		size_t pos;
46

47
		pos = git_oidmap_lookup_index(map, &items[i].oid);
48
		cl_assert(git_oidmap_valid_index(map, pos));
49

50
		cl_assert_equal_p(git_oidmap_value_at(map, pos), &items[i]);
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
	}

	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) {
85
		size_t pos;
86 87
		int ret;

88
		pos = git_oidmap_lookup_index(map, &items[i].oid);
89
		cl_assert(!git_oidmap_valid_index(map, pos));
90

91
		pos = git_oidmap_put(map, &items[i].oid, &ret);
92 93
		cl_assert(ret != 0);

94
		git_oidmap_set_value_at(map, pos, &items[i]);
95 96 97 98
	}


	for (i = 0; i < NITEMS; ++i) {
99
		size_t pos;
100

101
		pos = git_oidmap_lookup_index(map, &items[i].oid);
102
		cl_assert(git_oidmap_valid_index(map, pos));
103

104
		cl_assert_equal_p(git_oidmap_value_at(map, pos), &items[i]);
105 106 107 108
	}

	git_oidmap_free(map);
}