]> git.proxmox.com Git - libgit2.git/blob - tests/t0502-table.c
f68f0b1b936c397976127b08400c6e30c07cdfc8
[libgit2.git] / tests / t0502-table.c
1 #include "test_lib.h"
2 #include "test_helpers.h"
3 #include "commit.h"
4 #include "revobject.h"
5 #include "hash.h"
6
7
8 BEGIN_TEST(table_create)
9
10 git_revpool_table *table = NULL;
11
12 table = git_revpool_table_create(55);
13 must_be_true(table != NULL);
14 must_be_true(table->size_mask + 1 == 64);
15
16 git_revpool_table_free(table);
17
18 END_TEST
19
20 BEGIN_TEST(table_populate)
21
22 const int objects_n = 32;
23 int i;
24 git_revpool_object *objects;
25 git_revpool_table *table = NULL;
26
27 table = git_revpool_table_create(objects_n * 2);
28 must_be_true(table != NULL);
29
30 objects = git__malloc(objects_n * sizeof(git_revpool_object));
31 memset(objects, 0x0, objects_n * sizeof(git_revpool_object));
32
33 /* populate the hash table */
34 for (i = 0; i < objects_n; ++i) {
35 git_hash_buf(&(objects[i].id), &i, sizeof(int));
36 must_pass(git_revpool_table_insert(table, &(objects[i])));
37 }
38
39 /* make sure all the inserted objects can be found */
40 for (i = 0; i < objects_n; ++i) {
41 git_oid id;
42 git_revpool_object *ob;
43
44 git_hash_buf(&id, &i, sizeof(int));
45 ob = git_revpool_table_lookup(table, &id);
46
47 must_be_true(ob != NULL);
48 must_be_true(ob == &(objects[i]));
49 }
50
51 /* make sure we cannot find inexisting objects */
52 for (i = 0; i < 50; ++i) {
53 int hash_id;
54 git_oid id;
55
56 hash_id = (rand() % 50000) + objects_n;
57 git_hash_buf(&id, &hash_id, sizeof(int));
58 must_be_true(git_revpool_table_lookup(table, &id) == NULL);
59 }
60
61 git_revpool_table_free(table);
62 free(objects);
63
64 END_TEST
65
66
67 BEGIN_TEST(table_resize)
68
69 const int objects_n = 64;
70 int i;
71 unsigned int old_size;
72 git_revpool_object *objects;
73 git_revpool_table *table = NULL;
74
75 table = git_revpool_table_create(objects_n);
76 must_be_true(table != NULL);
77
78 objects = git__malloc(objects_n * sizeof(git_revpool_object));
79 memset(objects, 0x0, objects_n * sizeof(git_revpool_object));
80
81 old_size = table->size_mask + 1;
82
83 /* populate the hash table -- should be automatically resized */
84 for (i = 0; i < objects_n; ++i) {
85 git_hash_buf(&(objects[i].id), &i, sizeof(int));
86 must_pass(git_revpool_table_insert(table, &(objects[i])));
87 }
88
89 must_be_true(table->size_mask > old_size);
90
91 /* make sure all the inserted objects can be found */
92 for (i = 0; i < objects_n; ++i) {
93 git_oid id;
94 git_revpool_object *ob;
95
96 git_hash_buf(&id, &i, sizeof(int));
97 ob = git_revpool_table_lookup(table, &id);
98
99 must_be_true(ob != NULL);
100 must_be_true(ob == &(objects[i]));
101 }
102
103 /* force another resize */
104 old_size = table->size_mask + 1;
105 git_revpool_table_resize(table);
106 must_be_true(table->size_mask > old_size);
107
108 /* make sure all the inserted objects can be found */
109 for (i = 0; i < objects_n; ++i) {
110 git_oid id;
111 git_revpool_object *ob;
112
113 git_hash_buf(&id, &i, sizeof(int));
114 ob = git_revpool_table_lookup(table, &id);
115
116 must_be_true(ob != NULL);
117 must_be_true(ob == &(objects[i]));
118 }
119
120 git_revpool_table_free(table);
121 free(objects);
122
123 END_TEST