]>
Commit | Line | Data |
---|---|---|
c2b67043 RB |
1 | #include "clar_libgit2.h" |
2 | #include "strmap.h" | |
3 | ||
22a2d3d5 | 4 | static git_strmap *g_table; |
40ed4990 RB |
5 | |
6 | void test_core_strmap__initialize(void) | |
7 | { | |
22a2d3d5 | 8 | cl_git_pass(git_strmap_new(&g_table)); |
40ed4990 RB |
9 | cl_assert(g_table != NULL); |
10 | } | |
11 | ||
12 | void test_core_strmap__cleanup(void) | |
13 | { | |
14 | git_strmap_free(g_table); | |
15 | } | |
16 | ||
c2b67043 RB |
17 | void test_core_strmap__0(void) |
18 | { | |
22a2d3d5 | 19 | cl_assert(git_strmap_size(g_table) == 0); |
c2b67043 RB |
20 | } |
21 | ||
22a2d3d5 | 22 | static void insert_strings(git_strmap *table, size_t count) |
c2b67043 | 23 | { |
22a2d3d5 | 24 | size_t i, j, over; |
c2b67043 RB |
25 | char *str; |
26 | ||
27 | for (i = 0; i < count; ++i) { | |
28 | str = malloc(10); | |
29 | for (j = 0; j < 10; ++j) | |
30 | str[j] = 'a' + (i % 26); | |
31 | str[9] = '\0'; | |
32 | ||
33 | /* if > 26, then encode larger value in first letters */ | |
34 | for (j = 0, over = i / 26; over > 0; j++, over = over / 26) | |
35 | str[j] = 'A' + (over % 26); | |
36 | ||
22a2d3d5 | 37 | cl_git_pass(git_strmap_set(table, str, str)); |
c2b67043 RB |
38 | } |
39 | ||
22a2d3d5 | 40 | cl_assert_equal_i(git_strmap_size(table), count); |
c2b67043 RB |
41 | } |
42 | ||
22a2d3d5 | 43 | void test_core_strmap__inserted_strings_can_be_retrieved(void) |
c2b67043 | 44 | { |
c2b67043 | 45 | char *str; |
22a2d3d5 | 46 | int i; |
c2b67043 | 47 | |
40ed4990 | 48 | insert_strings(g_table, 20); |
c2b67043 | 49 | |
40ed4990 RB |
50 | cl_assert(git_strmap_exists(g_table, "aaaaaaaaa")); |
51 | cl_assert(git_strmap_exists(g_table, "ggggggggg")); | |
52 | cl_assert(!git_strmap_exists(g_table, "aaaaaaaab")); | |
53 | cl_assert(!git_strmap_exists(g_table, "abcdefghi")); | |
c2b67043 RB |
54 | |
55 | i = 0; | |
40ed4990 | 56 | git_strmap_foreach_value(g_table, str, { i++; free(str); }); |
c2b67043 | 57 | cl_assert(i == 20); |
c2b67043 RB |
58 | } |
59 | ||
22a2d3d5 | 60 | void test_core_strmap__deleted_entry_cannot_be_retrieved(void) |
c2b67043 | 61 | { |
c2b67043 | 62 | char *str; |
22a2d3d5 | 63 | int i; |
c2b67043 | 64 | |
40ed4990 | 65 | insert_strings(g_table, 20); |
c2b67043 | 66 | |
40ed4990 | 67 | cl_assert(git_strmap_exists(g_table, "bbbbbbbbb")); |
22a2d3d5 UG |
68 | str = git_strmap_get(g_table, "bbbbbbbbb"); |
69 | cl_assert_equal_s(str, "bbbbbbbbb"); | |
70 | cl_git_pass(git_strmap_delete(g_table, "bbbbbbbbb")); | |
71 | free(str); | |
c2b67043 | 72 | |
40ed4990 | 73 | cl_assert(!git_strmap_exists(g_table, "bbbbbbbbb")); |
c2b67043 RB |
74 | |
75 | i = 0; | |
40ed4990 | 76 | git_strmap_foreach_value(g_table, str, { i++; free(str); }); |
22a2d3d5 | 77 | cl_assert_equal_i(i, 19); |
c2b67043 RB |
78 | } |
79 | ||
22a2d3d5 | 80 | void test_core_strmap__inserting_many_keys_succeeds(void) |
c2b67043 | 81 | { |
c2b67043 | 82 | char *str; |
22a2d3d5 | 83 | int i; |
c2b67043 | 84 | |
40ed4990 | 85 | insert_strings(g_table, 10000); |
c2b67043 RB |
86 | |
87 | i = 0; | |
40ed4990 | 88 | git_strmap_foreach_value(g_table, str, { i++; free(str); }); |
22a2d3d5 UG |
89 | cl_assert_equal_i(i, 10000); |
90 | } | |
91 | ||
92 | void test_core_strmap__get_succeeds_with_existing_entries(void) | |
93 | { | |
94 | const char *keys[] = { "foo", "bar", "gobble" }; | |
95 | char *values[] = { "oof", "rab", "elbbog" }; | |
96 | size_t i; | |
97 | ||
98 | for (i = 0; i < ARRAY_SIZE(keys); i++) | |
99 | cl_git_pass(git_strmap_set(g_table, keys[i], values[i])); | |
100 | ||
101 | cl_assert_equal_s(git_strmap_get(g_table, "foo"), "oof"); | |
102 | cl_assert_equal_s(git_strmap_get(g_table, "bar"), "rab"); | |
103 | cl_assert_equal_s(git_strmap_get(g_table, "gobble"), "elbbog"); | |
104 | } | |
105 | ||
106 | void test_core_strmap__get_returns_null_on_nonexisting_key(void) | |
107 | { | |
108 | const char *keys[] = { "foo", "bar", "gobble" }; | |
109 | char *values[] = { "oof", "rab", "elbbog" }; | |
110 | size_t i; | |
111 | ||
112 | for (i = 0; i < ARRAY_SIZE(keys); i++) | |
113 | cl_git_pass(git_strmap_set(g_table, keys[i], values[i])); | |
114 | ||
115 | cl_assert_equal_p(git_strmap_get(g_table, "other"), NULL); | |
116 | } | |
117 | ||
118 | void test_core_strmap__set_persists_key(void) | |
119 | { | |
120 | cl_git_pass(git_strmap_set(g_table, "foo", "oof")); | |
121 | cl_assert_equal_s(git_strmap_get(g_table, "foo"), "oof"); | |
122 | } | |
123 | ||
124 | void test_core_strmap__set_persists_multpile_keys(void) | |
125 | { | |
126 | cl_git_pass(git_strmap_set(g_table, "foo", "oof")); | |
127 | cl_git_pass(git_strmap_set(g_table, "bar", "rab")); | |
128 | cl_assert_equal_s(git_strmap_get(g_table, "foo"), "oof"); | |
129 | cl_assert_equal_s(git_strmap_get(g_table, "bar"), "rab"); | |
130 | } | |
131 | ||
132 | void test_core_strmap__set_updates_existing_key(void) | |
133 | { | |
134 | cl_git_pass(git_strmap_set(g_table, "foo", "oof")); | |
135 | cl_git_pass(git_strmap_set(g_table, "bar", "rab")); | |
136 | cl_git_pass(git_strmap_set(g_table, "gobble", "elbbog")); | |
137 | cl_assert_equal_i(git_strmap_size(g_table), 3); | |
138 | ||
139 | cl_git_pass(git_strmap_set(g_table, "foo", "other")); | |
140 | cl_assert_equal_i(git_strmap_size(g_table), 3); | |
141 | ||
142 | cl_assert_equal_s(git_strmap_get(g_table, "foo"), "other"); | |
143 | } | |
144 | ||
145 | void test_core_strmap__iteration(void) | |
146 | { | |
147 | struct { | |
148 | char *key; | |
149 | char *value; | |
150 | int seen; | |
151 | } entries[] = { | |
152 | { "foo", "oof" }, | |
153 | { "bar", "rab" }, | |
154 | { "gobble", "elbbog" }, | |
155 | }; | |
156 | const char *key, *value; | |
157 | size_t i, n; | |
158 | ||
159 | for (i = 0; i < ARRAY_SIZE(entries); i++) | |
160 | cl_git_pass(git_strmap_set(g_table, entries[i].key, entries[i].value)); | |
161 | ||
162 | i = 0, n = 0; | |
163 | while (git_strmap_iterate((void **) &value, g_table, &i, &key) == 0) { | |
164 | size_t j; | |
165 | ||
166 | for (j = 0; j < ARRAY_SIZE(entries); j++) { | |
167 | if (strcmp(entries[j].key, key)) | |
168 | continue; | |
169 | ||
170 | cl_assert_equal_i(entries[j].seen, 0); | |
171 | cl_assert_equal_s(entries[j].value, value); | |
172 | entries[j].seen++; | |
173 | break; | |
174 | } | |
175 | ||
176 | n++; | |
177 | } | |
178 | ||
179 | for (i = 0; i < ARRAY_SIZE(entries); i++) | |
180 | cl_assert_equal_i(entries[i].seen, 1); | |
181 | ||
182 | cl_assert_equal_i(n, ARRAY_SIZE(entries)); | |
183 | } | |
184 | ||
185 | void test_core_strmap__iterating_empty_map_stops_immediately(void) | |
186 | { | |
187 | size_t i = 0; | |
188 | ||
189 | cl_git_fail_with(git_strmap_iterate(NULL, g_table, &i, NULL), GIT_ITEROVER); | |
c2b67043 | 190 | } |