1 #include <string.h>
2
3 #include <marisa_alpha.h>
4
5 #include "assert.h"
6
TestHandle(void)7 void TestHandle(void) {
8 marisa_alpha_trie *trie = NULL;
9
10 TEST_START();
11
12 ASSERT(marisa_alpha_init(&trie) == MARISA_ALPHA_OK);
13 ASSERT(marisa_alpha_init(&trie) == MARISA_ALPHA_HANDLE_ERROR);
14 ASSERT(marisa_alpha_end(trie) == MARISA_ALPHA_OK);
15 ASSERT(marisa_alpha_end(NULL) == MARISA_ALPHA_HANDLE_ERROR);
16
17 ASSERT(marisa_alpha_build(NULL, NULL, 0, NULL, NULL, NULL, 0) ==
18 MARISA_ALPHA_HANDLE_ERROR);
19
20 ASSERT(marisa_alpha_mmap(NULL, NULL, 0, 0) == MARISA_ALPHA_HANDLE_ERROR);
21 ASSERT(marisa_alpha_map(NULL, NULL, 0) == MARISA_ALPHA_HANDLE_ERROR);
22
23 ASSERT(marisa_alpha_load(NULL, NULL, 0, 0) == MARISA_ALPHA_HANDLE_ERROR);
24 ASSERT(marisa_alpha_fread(NULL, NULL) == MARISA_ALPHA_HANDLE_ERROR);
25 ASSERT(marisa_alpha_read(NULL, 0) == MARISA_ALPHA_HANDLE_ERROR);
26
27 ASSERT(marisa_alpha_save(NULL, NULL, 0, 0, 0) == MARISA_ALPHA_HANDLE_ERROR);
28 ASSERT(marisa_alpha_fwrite(NULL, NULL) == MARISA_ALPHA_HANDLE_ERROR);
29 ASSERT(marisa_alpha_write(NULL, 0) == MARISA_ALPHA_HANDLE_ERROR);
30
31 ASSERT(marisa_alpha_restore(NULL, 0, NULL, 0, NULL) ==
32 MARISA_ALPHA_HANDLE_ERROR);
33
34 ASSERT(marisa_alpha_lookup(NULL, NULL, 0, NULL) ==
35 MARISA_ALPHA_HANDLE_ERROR);
36
37 ASSERT(marisa_alpha_find(NULL, NULL, 0, NULL, NULL, 0, NULL) ==
38 MARISA_ALPHA_HANDLE_ERROR);
39 ASSERT(marisa_alpha_find_first(NULL, NULL, 0, NULL, NULL) ==
40 MARISA_ALPHA_HANDLE_ERROR);
41 ASSERT(marisa_alpha_find_last(NULL, NULL, 0, NULL, NULL) ==
42 MARISA_ALPHA_HANDLE_ERROR);
43 ASSERT(marisa_alpha_find_callback(NULL, NULL, 0, NULL, NULL) ==
44 MARISA_ALPHA_HANDLE_ERROR);
45
46 ASSERT(marisa_alpha_predict(NULL, NULL, 0, NULL, 0, NULL) ==
47 MARISA_ALPHA_HANDLE_ERROR);
48 ASSERT(marisa_alpha_predict_breadth_first(NULL, NULL, 0, NULL, 0, NULL) ==
49 MARISA_ALPHA_HANDLE_ERROR);
50 ASSERT(marisa_alpha_predict_depth_first(NULL, NULL, 0, NULL, 0, NULL) ==
51 MARISA_ALPHA_HANDLE_ERROR);
52 ASSERT(marisa_alpha_predict_callback(NULL, NULL, 0, NULL, NULL) ==
53 MARISA_ALPHA_HANDLE_ERROR);
54
55 ASSERT(marisa_alpha_get_num_tries(NULL) == 0);
56 ASSERT(marisa_alpha_get_num_keys(NULL) == 0);
57 ASSERT(marisa_alpha_get_num_nodes(NULL) == 0);
58 ASSERT(marisa_alpha_get_total_size(NULL) == 0);
59
60 ASSERT(marisa_alpha_clear(NULL) == MARISA_ALPHA_HANDLE_ERROR);
61
62 TEST_END();
63 }
64
callback_for_find(void * num_keys,marisa_alpha_uint32 key_id,size_t key_length)65 int callback_for_find(void *num_keys,
66 marisa_alpha_uint32 key_id, size_t key_length) {
67 ASSERT(*(size_t *)num_keys == 0);
68 ASSERT(key_id == 1);
69 ASSERT(key_length == 3);
70 ++*(size_t *)num_keys;
71 return 1;
72 }
73
callback_for_predict(void * num_keys,marisa_alpha_uint32 key_id,const char * key,size_t key_length)74 int callback_for_predict(void *num_keys,
75 marisa_alpha_uint32 key_id, const char *key, size_t key_length) {
76 ASSERT(*(size_t *)num_keys < 2);
77 switch (*(size_t *)num_keys) {
78 case 0: {
79 ASSERT(key_id == 0);
80 ASSERT(key_length == 3);
81 ASSERT(strcmp(key, "app") == 0);
82 break;
83 }
84 case 1: {
85 ASSERT(key_id == 3);
86 ASSERT(key_length == 5);
87 ASSERT(strcmp(key, "apple") == 0);
88 break;
89 }
90 }
91 ++*(size_t *)num_keys;
92 return 1;
93 }
94
TestTrie()95 void TestTrie() {
96 marisa_alpha_trie *trie = NULL;
97 const char *keys[8];
98 marisa_alpha_uint32 key_ids[8];
99 size_t i;
100 char key_buf[16];
101 size_t key_length;
102 marisa_alpha_uint32 key_id;
103 marisa_alpha_uint32 found_key_ids[8];
104 size_t found_key_lengths[8];
105 size_t num_found_keys;
106
107 TEST_START();
108
109 ASSERT(marisa_alpha_init(&trie) == MARISA_ALPHA_OK);
110
111 ASSERT(marisa_alpha_get_num_tries(trie) == 0);
112 ASSERT(marisa_alpha_get_num_keys(trie) == 0);
113 ASSERT(marisa_alpha_get_num_nodes(trie) == 0);
114 ASSERT(marisa_alpha_get_total_size(trie) ==
115 (sizeof(marisa_alpha_uint32) * 23));
116
117 ASSERT(marisa_alpha_build(trie, NULL, 0, NULL, NULL, NULL, 0) ==
118 MARISA_ALPHA_OK);
119
120 ASSERT(marisa_alpha_get_num_tries(trie) == 1);
121 ASSERT(marisa_alpha_get_num_keys(trie) == 0);
122 ASSERT(marisa_alpha_get_num_nodes(trie) == 1);
123
124 keys[0] = "apple";
125 keys[1] = "and";
126 keys[2] = "Bad";
127 keys[3] = "apple";
128 keys[4] = "app";
129
130 ASSERT(marisa_alpha_build(trie, keys, 5, NULL, NULL, key_ids,
131 1 | MARISA_ALPHA_WITHOUT_TAIL | MARISA_ALPHA_LABEL_ORDER) ==
132 MARISA_ALPHA_OK);
133
134 ASSERT(marisa_alpha_get_num_tries(trie) == 1);
135 ASSERT(marisa_alpha_get_num_keys(trie) == 4);
136 ASSERT(marisa_alpha_get_num_nodes(trie) == 11);
137
138 ASSERT(key_ids[0] == 3);
139 ASSERT(key_ids[1] == 1);
140 ASSERT(key_ids[2] == 0);
141 ASSERT(key_ids[3] == 3);
142 ASSERT(key_ids[4] == 2);
143
144 for (i = 0; i < marisa_alpha_get_num_tries(trie); ++i) {
145 ASSERT(marisa_alpha_restore(trie,
146 key_ids[i], key_buf, sizeof(key_buf), &key_length) == MARISA_ALPHA_OK);
147 ASSERT(key_length == strlen(keys[i]));
148 ASSERT(strcmp(key_buf, keys[i]) == 0);
149
150 ASSERT(marisa_alpha_lookup(trie,
151 keys[i], MARISA_ALPHA_ZERO_TERMINATED, &key_id) == MARISA_ALPHA_OK);
152 ASSERT(key_id == key_ids[i]);
153
154 ASSERT(marisa_alpha_lookup(trie,
155 keys[i], strlen(keys[i]), &key_id) == MARISA_ALPHA_OK);
156 ASSERT(key_id == key_ids[i]);
157 }
158
159 ASSERT(marisa_alpha_clear(trie) == MARISA_ALPHA_OK);
160
161 ASSERT(marisa_alpha_get_num_tries(trie) == 0);
162 ASSERT(marisa_alpha_get_num_keys(trie) == 0);
163 ASSERT(marisa_alpha_get_num_nodes(trie) == 0);
164 ASSERT(marisa_alpha_get_total_size(trie) ==
165 (sizeof(marisa_alpha_uint32) * 23));
166
167 ASSERT(marisa_alpha_build(trie, keys, 5, NULL, NULL, key_ids,
168 1 | MARISA_ALPHA_WITHOUT_TAIL | MARISA_ALPHA_WEIGHT_ORDER) ==
169 MARISA_ALPHA_OK);
170
171 ASSERT(marisa_alpha_get_num_tries(trie) == 1);
172 ASSERT(marisa_alpha_get_num_keys(trie) == 4);
173 ASSERT(marisa_alpha_get_num_nodes(trie) == 11);
174
175 ASSERT(key_ids[0] == 3);
176 ASSERT(key_ids[1] == 1);
177 ASSERT(key_ids[2] == 2);
178 ASSERT(key_ids[3] == 3);
179 ASSERT(key_ids[4] == 0);
180
181 ASSERT(marisa_alpha_find(trie, "ap", MARISA_ALPHA_ZERO_TERMINATED,
182 found_key_ids, found_key_lengths, 8, &num_found_keys) ==
183 MARISA_ALPHA_OK);
184 ASSERT(num_found_keys == 0);
185
186 ASSERT(marisa_alpha_find(trie, "applex", MARISA_ALPHA_ZERO_TERMINATED,
187 found_key_ids, found_key_lengths, 8, &num_found_keys) ==
188 MARISA_ALPHA_OK);
189 ASSERT(num_found_keys == 2);
190 ASSERT(found_key_ids[0] == key_ids[4]);
191 ASSERT(found_key_lengths[0] == 3);
192 ASSERT(found_key_ids[1] == key_ids[0]);
193 ASSERT(found_key_lengths[1] == 5);
194
195 num_found_keys = 0;
196 ASSERT(marisa_alpha_find_callback(trie, "anderson",
197 MARISA_ALPHA_ZERO_TERMINATED,
198 callback_for_find, &num_found_keys) == MARISA_ALPHA_OK);
199 ASSERT(num_found_keys == 1);
200
201 ASSERT(marisa_alpha_predict(trie, "a", MARISA_ALPHA_ZERO_TERMINATED,
202 found_key_ids, 8, &num_found_keys) == MARISA_ALPHA_OK);
203 ASSERT(num_found_keys == 3);
204 ASSERT(found_key_ids[0] == key_ids[4]);
205 ASSERT(found_key_ids[1] == key_ids[1]);
206 ASSERT(found_key_ids[2] == key_ids[0]);
207
208 num_found_keys = 0;
209 ASSERT(marisa_alpha_predict_callback(trie, "app",
210 MARISA_ALPHA_ZERO_TERMINATED,
211 callback_for_predict, &num_found_keys) == MARISA_ALPHA_OK);
212
213 ASSERT(marisa_alpha_end(trie) == MARISA_ALPHA_OK);
214
215 TEST_END();
216 }
217
main(void)218 int main(void) {
219 TestHandle();
220 TestTrie();
221
222 return 0;
223 }
224