• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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