1 #include <string.h>
2
3 #include <marisa.h>
4
5 #include "assert.h"
6
TestHandle(void)7 void TestHandle(void) {
8 marisa_trie *trie = NULL;
9
10 TEST_START();
11
12 ASSERT(marisa_init(&trie) == MARISA_OK);
13 ASSERT(marisa_init(&trie) == MARISA_HANDLE_ERROR);
14 ASSERT(marisa_end(trie) == MARISA_OK);
15 ASSERT(marisa_end(NULL) == MARISA_HANDLE_ERROR);
16
17 ASSERT(marisa_build(NULL, NULL, 0, NULL, NULL, NULL, 0) ==
18 MARISA_HANDLE_ERROR);
19
20 ASSERT(marisa_mmap(NULL, NULL, 0, 0) == MARISA_HANDLE_ERROR);
21 ASSERT(marisa_map(NULL, NULL, 0) == MARISA_HANDLE_ERROR);
22
23 ASSERT(marisa_load(NULL, NULL, 0, 0) == MARISA_HANDLE_ERROR);
24 ASSERT(marisa_fread(NULL, NULL) == MARISA_HANDLE_ERROR);
25 ASSERT(marisa_read(NULL, 0) == MARISA_HANDLE_ERROR);
26
27 ASSERT(marisa_save(NULL, NULL, 0, 0, 0) == MARISA_HANDLE_ERROR);
28 ASSERT(marisa_fwrite(NULL, NULL) == MARISA_HANDLE_ERROR);
29 ASSERT(marisa_write(NULL, 0) == MARISA_HANDLE_ERROR);
30
31 ASSERT(marisa_restore(NULL, 0, NULL, 0, NULL) == MARISA_HANDLE_ERROR);
32
33 ASSERT(marisa_lookup(NULL, NULL, 0, NULL) == MARISA_HANDLE_ERROR);
34
35 ASSERT(marisa_find(NULL, NULL, 0, NULL, NULL, 0, NULL) ==
36 MARISA_HANDLE_ERROR);
37 ASSERT(marisa_find_first(NULL, NULL, 0, NULL, NULL) == MARISA_HANDLE_ERROR);
38 ASSERT(marisa_find_last(NULL, NULL, 0, NULL, NULL) == MARISA_HANDLE_ERROR);
39 ASSERT(marisa_find_callback(NULL, NULL, 0, NULL, NULL) ==
40 MARISA_HANDLE_ERROR);
41
42 ASSERT(marisa_predict(NULL, NULL, 0, NULL, 0, NULL) == MARISA_HANDLE_ERROR);
43 ASSERT(marisa_predict_breadth_first(NULL, NULL, 0, NULL, 0, NULL) ==
44 MARISA_HANDLE_ERROR);
45 ASSERT(marisa_predict_depth_first(NULL, NULL, 0, NULL, 0, NULL) ==
46 MARISA_HANDLE_ERROR);
47 ASSERT(marisa_predict_callback(NULL, NULL, 0, NULL, NULL) ==
48 MARISA_HANDLE_ERROR);
49
50 ASSERT(marisa_get_num_tries(NULL) == 0);
51 ASSERT(marisa_get_num_keys(NULL) == 0);
52 ASSERT(marisa_get_num_nodes(NULL) == 0);
53 ASSERT(marisa_get_total_size(NULL) == 0);
54
55 ASSERT(marisa_clear(NULL) == MARISA_HANDLE_ERROR);
56
57 TEST_END();
58 }
59
callback_for_find(void * num_keys,marisa_uint32 key_id,size_t key_length)60 int callback_for_find(void *num_keys,
61 marisa_uint32 key_id, size_t key_length) {
62 ASSERT(*(size_t *)num_keys == 0);
63 ASSERT(key_id == 1);
64 ASSERT(key_length == 3);
65 ++*(size_t *)num_keys;
66 return 1;
67 }
68
callback_for_predict(void * num_keys,marisa_uint32 key_id,const char * key,size_t key_length)69 int callback_for_predict(void *num_keys,
70 marisa_uint32 key_id, const char *key, size_t key_length) {
71 ASSERT(*(size_t *)num_keys < 2);
72 switch (*(size_t *)num_keys) {
73 case 0: {
74 ASSERT(key_id == 0);
75 ASSERT(key_length == 3);
76 ASSERT(strcmp(key, "app") == 0);
77 break;
78 }
79 case 1: {
80 ASSERT(key_id == 3);
81 ASSERT(key_length == 5);
82 ASSERT(strcmp(key, "apple") == 0);
83 break;
84 }
85 }
86 ++*(size_t *)num_keys;
87 return 1;
88 }
89
TestTrie()90 void TestTrie() {
91 marisa_trie *trie = NULL;
92 const char *keys[8];
93 marisa_uint32 key_ids[8];
94 size_t i;
95 char key_buf[16];
96 size_t key_length;
97 marisa_uint32 key_id;
98 marisa_uint32 found_key_ids[8];
99 size_t found_key_lengths[8];
100 size_t num_found_keys;
101
102 TEST_START();
103
104 ASSERT(marisa_init(&trie) == MARISA_OK);
105
106 ASSERT(marisa_get_num_tries(trie) == 0);
107 ASSERT(marisa_get_num_keys(trie) == 0);
108 ASSERT(marisa_get_num_nodes(trie) == 0);
109 ASSERT(marisa_get_total_size(trie) == (sizeof(marisa_uint32) * 23));
110
111 ASSERT(marisa_build(trie, NULL, 0, NULL, NULL, NULL, 0) == MARISA_OK);
112
113 ASSERT(marisa_get_num_tries(trie) == 1);
114 ASSERT(marisa_get_num_keys(trie) == 0);
115 ASSERT(marisa_get_num_nodes(trie) == 1);
116
117 keys[0] = "apple";
118 keys[1] = "and";
119 keys[2] = "Bad";
120 keys[3] = "apple";
121 keys[4] = "app";
122
123 ASSERT(marisa_build(trie, keys, 5, NULL, NULL, key_ids,
124 1 | MARISA_WITHOUT_TAIL | MARISA_LABEL_ORDER) == MARISA_OK);
125
126 ASSERT(marisa_get_num_tries(trie) == 1);
127 ASSERT(marisa_get_num_keys(trie) == 4);
128 ASSERT(marisa_get_num_nodes(trie) == 11);
129
130 ASSERT(key_ids[0] == 3);
131 ASSERT(key_ids[1] == 1);
132 ASSERT(key_ids[2] == 0);
133 ASSERT(key_ids[3] == 3);
134 ASSERT(key_ids[4] == 2);
135
136 for (i = 0; i < marisa_get_num_tries(trie); ++i) {
137 ASSERT(marisa_restore(trie,
138 key_ids[i], key_buf, sizeof(key_buf), &key_length) == MARISA_OK);
139 ASSERT(key_length == strlen(keys[i]));
140 ASSERT(strcmp(key_buf, keys[i]) == 0);
141
142 ASSERT(marisa_lookup(trie,
143 keys[i], MARISA_ZERO_TERMINATED, &key_id) == MARISA_OK);
144 ASSERT(key_id == key_ids[i]);
145
146 ASSERT(marisa_lookup(trie,
147 keys[i], strlen(keys[i]), &key_id) == MARISA_OK);
148 ASSERT(key_id == key_ids[i]);
149 }
150
151 ASSERT(marisa_clear(trie) == MARISA_OK);
152
153 ASSERT(marisa_get_num_tries(trie) == 0);
154 ASSERT(marisa_get_num_keys(trie) == 0);
155 ASSERT(marisa_get_num_nodes(trie) == 0);
156 ASSERT(marisa_get_total_size(trie) == (sizeof(marisa_uint32) * 23));
157
158 ASSERT(marisa_build(trie, keys, 5, NULL, NULL, key_ids,
159 1 | MARISA_WITHOUT_TAIL | MARISA_WEIGHT_ORDER) == MARISA_OK);
160
161 ASSERT(marisa_get_num_tries(trie) == 1);
162 ASSERT(marisa_get_num_keys(trie) == 4);
163 ASSERT(marisa_get_num_nodes(trie) == 11);
164
165 ASSERT(key_ids[0] == 3);
166 ASSERT(key_ids[1] == 1);
167 ASSERT(key_ids[2] == 2);
168 ASSERT(key_ids[3] == 3);
169 ASSERT(key_ids[4] == 0);
170
171 ASSERT(marisa_find(trie, "ap", MARISA_ZERO_TERMINATED,
172 found_key_ids, found_key_lengths, 8, &num_found_keys) == MARISA_OK);
173 ASSERT(num_found_keys == 0);
174
175 ASSERT(marisa_find(trie, "applex", MARISA_ZERO_TERMINATED,
176 found_key_ids, found_key_lengths, 8, &num_found_keys) == MARISA_OK);
177 ASSERT(num_found_keys == 2);
178 ASSERT(found_key_ids[0] == key_ids[4]);
179 ASSERT(found_key_lengths[0] == 3);
180 ASSERT(found_key_ids[1] == key_ids[0]);
181 ASSERT(found_key_lengths[1] == 5);
182
183 num_found_keys = 0;
184 ASSERT(marisa_find_callback(trie, "anderson", MARISA_ZERO_TERMINATED,
185 callback_for_find, &num_found_keys) == MARISA_OK);
186 ASSERT(num_found_keys == 1);
187
188 ASSERT(marisa_predict(trie, "a", MARISA_ZERO_TERMINATED,
189 found_key_ids, 8, &num_found_keys) == MARISA_OK);
190 ASSERT(num_found_keys == 3);
191 ASSERT(found_key_ids[0] == key_ids[4]);
192 ASSERT(found_key_ids[1] == key_ids[1]);
193 ASSERT(found_key_ids[2] == key_ids[0]);
194
195 num_found_keys = 0;
196 ASSERT(marisa_predict_callback(trie, "app", MARISA_ZERO_TERMINATED,
197 callback_for_predict, &num_found_keys) == MARISA_OK);
198
199 ASSERT(marisa_end(trie) == MARISA_OK);
200
201 TEST_END();
202 }
203
main(void)204 int main(void) {
205 TestHandle();
206 TestTrie();
207
208 return 0;
209 }
210