xref: /aosp_15_r20/external/marisa-trie/tests/marisa-test.cc (revision ab8db090fce404b23716c4c9194221ee27efe31c)
1*ab8db090SAndroid Build Coastguard Worker #include <cstdlib>
2*ab8db090SAndroid Build Coastguard Worker #include <cstring>
3*ab8db090SAndroid Build Coastguard Worker #include <ctime>
4*ab8db090SAndroid Build Coastguard Worker #include <sstream>
5*ab8db090SAndroid Build Coastguard Worker 
6*ab8db090SAndroid Build Coastguard Worker #include <marisa.h>
7*ab8db090SAndroid Build Coastguard Worker 
8*ab8db090SAndroid Build Coastguard Worker #include "marisa-assert.h"
9*ab8db090SAndroid Build Coastguard Worker 
10*ab8db090SAndroid Build Coastguard Worker namespace {
11*ab8db090SAndroid Build Coastguard Worker 
TestEmptyTrie()12*ab8db090SAndroid Build Coastguard Worker void TestEmptyTrie() {
13*ab8db090SAndroid Build Coastguard Worker   TEST_START();
14*ab8db090SAndroid Build Coastguard Worker 
15*ab8db090SAndroid Build Coastguard Worker   marisa::Trie trie;
16*ab8db090SAndroid Build Coastguard Worker 
17*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.save("marisa-test.dat"), MARISA_STATE_ERROR);
18*ab8db090SAndroid Build Coastguard Worker #ifdef _MSC_VER
19*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.write(::_fileno(stdout)), MARISA_STATE_ERROR);
20*ab8db090SAndroid Build Coastguard Worker #else  // _MSC_VER
21*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.write(::fileno(stdout)), MARISA_STATE_ERROR);
22*ab8db090SAndroid Build Coastguard Worker #endif  // _MSC_VER
23*ab8db090SAndroid Build Coastguard Worker   EXCEPT(std::cout << trie, MARISA_STATE_ERROR);
24*ab8db090SAndroid Build Coastguard Worker   EXCEPT(marisa::fwrite(stdout, trie), MARISA_STATE_ERROR);
25*ab8db090SAndroid Build Coastguard Worker 
26*ab8db090SAndroid Build Coastguard Worker   marisa::Agent agent;
27*ab8db090SAndroid Build Coastguard Worker 
28*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.lookup(agent), MARISA_STATE_ERROR);
29*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.reverse_lookup(agent), MARISA_STATE_ERROR);
30*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.common_prefix_search(agent), MARISA_STATE_ERROR);
31*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.predictive_search(agent), MARISA_STATE_ERROR);
32*ab8db090SAndroid Build Coastguard Worker 
33*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.num_tries(), MARISA_STATE_ERROR);
34*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.num_keys(), MARISA_STATE_ERROR);
35*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.num_nodes(), MARISA_STATE_ERROR);
36*ab8db090SAndroid Build Coastguard Worker 
37*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.tail_mode(), MARISA_STATE_ERROR);
38*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.node_order(), MARISA_STATE_ERROR);
39*ab8db090SAndroid Build Coastguard Worker 
40*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.empty(), MARISA_STATE_ERROR);
41*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.size(), MARISA_STATE_ERROR);
42*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.total_size(), MARISA_STATE_ERROR);
43*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.io_size(), MARISA_STATE_ERROR);
44*ab8db090SAndroid Build Coastguard Worker 
45*ab8db090SAndroid Build Coastguard Worker   marisa::Keyset keyset;
46*ab8db090SAndroid Build Coastguard Worker   trie.build(keyset);
47*ab8db090SAndroid Build Coastguard Worker 
48*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.lookup(agent));
49*ab8db090SAndroid Build Coastguard Worker   EXCEPT(trie.reverse_lookup(agent), MARISA_BOUND_ERROR);
50*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.common_prefix_search(agent));
51*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.predictive_search(agent));
52*ab8db090SAndroid Build Coastguard Worker 
53*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_tries() == 1);
54*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_keys() == 0);
55*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_nodes() == 1);
56*ab8db090SAndroid Build Coastguard Worker 
57*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.tail_mode() == MARISA_DEFAULT_TAIL);
58*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.node_order() == MARISA_DEFAULT_ORDER);
59*ab8db090SAndroid Build Coastguard Worker 
60*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.empty());
61*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.size() == 0);
62*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.total_size() != 0);
63*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.io_size() != 0);
64*ab8db090SAndroid Build Coastguard Worker 
65*ab8db090SAndroid Build Coastguard Worker   keyset.push_back("");
66*ab8db090SAndroid Build Coastguard Worker   trie.build(keyset);
67*ab8db090SAndroid Build Coastguard Worker 
68*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.lookup(agent));
69*ab8db090SAndroid Build Coastguard Worker   trie.reverse_lookup(agent);
70*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.common_prefix_search(agent));
71*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.common_prefix_search(agent));
72*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.predictive_search(agent));
73*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.predictive_search(agent));
74*ab8db090SAndroid Build Coastguard Worker 
75*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_keys() == 1);
76*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_nodes() == 1);
77*ab8db090SAndroid Build Coastguard Worker 
78*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.empty());
79*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.size() == 1);
80*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.total_size() != 0);
81*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.io_size() != 0);
82*ab8db090SAndroid Build Coastguard Worker 
83*ab8db090SAndroid Build Coastguard Worker   TEST_END();
84*ab8db090SAndroid Build Coastguard Worker }
85*ab8db090SAndroid Build Coastguard Worker 
TestTinyTrie()86*ab8db090SAndroid Build Coastguard Worker void TestTinyTrie() {
87*ab8db090SAndroid Build Coastguard Worker   TEST_START();
88*ab8db090SAndroid Build Coastguard Worker 
89*ab8db090SAndroid Build Coastguard Worker   marisa::Keyset keyset;
90*ab8db090SAndroid Build Coastguard Worker   keyset.push_back("bach");
91*ab8db090SAndroid Build Coastguard Worker   keyset.push_back("bet");
92*ab8db090SAndroid Build Coastguard Worker   keyset.push_back("chat");
93*ab8db090SAndroid Build Coastguard Worker   keyset.push_back("check");
94*ab8db090SAndroid Build Coastguard Worker   keyset.push_back("check");
95*ab8db090SAndroid Build Coastguard Worker 
96*ab8db090SAndroid Build Coastguard Worker   marisa::Trie trie;
97*ab8db090SAndroid Build Coastguard Worker   trie.build(keyset, 1);
98*ab8db090SAndroid Build Coastguard Worker 
99*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_tries() == 1);
100*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_keys() == 4);
101*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_nodes() == 7);
102*ab8db090SAndroid Build Coastguard Worker 
103*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.tail_mode() == MARISA_DEFAULT_TAIL);
104*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.node_order() == MARISA_DEFAULT_ORDER);
105*ab8db090SAndroid Build Coastguard Worker 
106*ab8db090SAndroid Build Coastguard Worker   ASSERT(keyset[0].id() == 2);
107*ab8db090SAndroid Build Coastguard Worker   ASSERT(keyset[1].id() == 3);
108*ab8db090SAndroid Build Coastguard Worker   ASSERT(keyset[2].id() == 1);
109*ab8db090SAndroid Build Coastguard Worker   ASSERT(keyset[3].id() == 0);
110*ab8db090SAndroid Build Coastguard Worker   ASSERT(keyset[4].id() == 0);
111*ab8db090SAndroid Build Coastguard Worker 
112*ab8db090SAndroid Build Coastguard Worker   marisa::Agent agent;
113*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < keyset.size(); ++i) {
114*ab8db090SAndroid Build Coastguard Worker     agent.set_query(keyset[i].ptr(), keyset[i].length());
115*ab8db090SAndroid Build Coastguard Worker     ASSERT(trie.lookup(agent));
116*ab8db090SAndroid Build Coastguard Worker     ASSERT(agent.key().id() == keyset[i].id());
117*ab8db090SAndroid Build Coastguard Worker 
118*ab8db090SAndroid Build Coastguard Worker     agent.set_query(keyset[i].id());
119*ab8db090SAndroid Build Coastguard Worker     trie.reverse_lookup(agent);
120*ab8db090SAndroid Build Coastguard Worker     ASSERT(agent.key().length() == keyset[i].length());
121*ab8db090SAndroid Build Coastguard Worker     ASSERT(std::memcmp(agent.key().ptr(), keyset[i].ptr(),
122*ab8db090SAndroid Build Coastguard Worker         agent.key().length()) == 0);
123*ab8db090SAndroid Build Coastguard Worker   }
124*ab8db090SAndroid Build Coastguard Worker 
125*ab8db090SAndroid Build Coastguard Worker   agent.set_query("be");
126*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.common_prefix_search(agent));
127*ab8db090SAndroid Build Coastguard Worker   agent.set_query("beX");
128*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.common_prefix_search(agent));
129*ab8db090SAndroid Build Coastguard Worker   agent.set_query("bet");
130*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.common_prefix_search(agent));
131*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.common_prefix_search(agent));
132*ab8db090SAndroid Build Coastguard Worker   agent.set_query("betX");
133*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.common_prefix_search(agent));
134*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.common_prefix_search(agent));
135*ab8db090SAndroid Build Coastguard Worker 
136*ab8db090SAndroid Build Coastguard Worker   agent.set_query("chatX");
137*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.predictive_search(agent));
138*ab8db090SAndroid Build Coastguard Worker   agent.set_query("chat");
139*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.predictive_search(agent));
140*ab8db090SAndroid Build Coastguard Worker   ASSERT(agent.key().length() == 4);
141*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.predictive_search(agent));
142*ab8db090SAndroid Build Coastguard Worker 
143*ab8db090SAndroid Build Coastguard Worker   agent.set_query("cha");
144*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.predictive_search(agent));
145*ab8db090SAndroid Build Coastguard Worker   ASSERT(agent.key().length() == 4);
146*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.predictive_search(agent));
147*ab8db090SAndroid Build Coastguard Worker 
148*ab8db090SAndroid Build Coastguard Worker   agent.set_query("c");
149*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.predictive_search(agent));
150*ab8db090SAndroid Build Coastguard Worker   ASSERT(agent.key().length() == 5);
151*ab8db090SAndroid Build Coastguard Worker   ASSERT(std::memcmp(agent.key().ptr(), "check", 5) == 0);
152*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.predictive_search(agent));
153*ab8db090SAndroid Build Coastguard Worker   ASSERT(agent.key().length() == 4);
154*ab8db090SAndroid Build Coastguard Worker   ASSERT(std::memcmp(agent.key().ptr(), "chat", 4) == 0);
155*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.predictive_search(agent));
156*ab8db090SAndroid Build Coastguard Worker 
157*ab8db090SAndroid Build Coastguard Worker   agent.set_query("ch");
158*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.predictive_search(agent));
159*ab8db090SAndroid Build Coastguard Worker   ASSERT(agent.key().length() == 5);
160*ab8db090SAndroid Build Coastguard Worker   ASSERT(std::memcmp(agent.key().ptr(), "check", 5) == 0);
161*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.predictive_search(agent));
162*ab8db090SAndroid Build Coastguard Worker   ASSERT(agent.key().length() == 4);
163*ab8db090SAndroid Build Coastguard Worker   ASSERT(std::memcmp(agent.key().ptr(), "chat", 4) == 0);
164*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.predictive_search(agent));
165*ab8db090SAndroid Build Coastguard Worker 
166*ab8db090SAndroid Build Coastguard Worker   trie.build(keyset, 1 | MARISA_LABEL_ORDER);
167*ab8db090SAndroid Build Coastguard Worker 
168*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_tries() == 1);
169*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_keys() == 4);
170*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_nodes() == 7);
171*ab8db090SAndroid Build Coastguard Worker 
172*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.tail_mode() == MARISA_DEFAULT_TAIL);
173*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.node_order() == MARISA_LABEL_ORDER);
174*ab8db090SAndroid Build Coastguard Worker 
175*ab8db090SAndroid Build Coastguard Worker   ASSERT(keyset[0].id() == 0);
176*ab8db090SAndroid Build Coastguard Worker   ASSERT(keyset[1].id() == 1);
177*ab8db090SAndroid Build Coastguard Worker   ASSERT(keyset[2].id() == 2);
178*ab8db090SAndroid Build Coastguard Worker   ASSERT(keyset[3].id() == 3);
179*ab8db090SAndroid Build Coastguard Worker   ASSERT(keyset[4].id() == 3);
180*ab8db090SAndroid Build Coastguard Worker 
181*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < keyset.size(); ++i) {
182*ab8db090SAndroid Build Coastguard Worker     agent.set_query(keyset[i].ptr(), keyset[i].length());
183*ab8db090SAndroid Build Coastguard Worker     ASSERT(trie.lookup(agent));
184*ab8db090SAndroid Build Coastguard Worker     ASSERT(agent.key().id() == keyset[i].id());
185*ab8db090SAndroid Build Coastguard Worker 
186*ab8db090SAndroid Build Coastguard Worker     agent.set_query(keyset[i].id());
187*ab8db090SAndroid Build Coastguard Worker     trie.reverse_lookup(agent);
188*ab8db090SAndroid Build Coastguard Worker     ASSERT(agent.key().length() == keyset[i].length());
189*ab8db090SAndroid Build Coastguard Worker     ASSERT(std::memcmp(agent.key().ptr(), keyset[i].ptr(),
190*ab8db090SAndroid Build Coastguard Worker         agent.key().length()) == 0);
191*ab8db090SAndroid Build Coastguard Worker   }
192*ab8db090SAndroid Build Coastguard Worker 
193*ab8db090SAndroid Build Coastguard Worker   agent.set_query("");
194*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < trie.size(); ++i) {
195*ab8db090SAndroid Build Coastguard Worker     ASSERT(trie.predictive_search(agent));
196*ab8db090SAndroid Build Coastguard Worker     ASSERT(agent.key().id() == i);
197*ab8db090SAndroid Build Coastguard Worker   }
198*ab8db090SAndroid Build Coastguard Worker   ASSERT(!trie.predictive_search(agent));
199*ab8db090SAndroid Build Coastguard Worker 
200*ab8db090SAndroid Build Coastguard Worker   TEST_END();
201*ab8db090SAndroid Build Coastguard Worker }
202*ab8db090SAndroid Build Coastguard Worker 
MakeKeyset(std::size_t num_keys,marisa::TailMode tail_mode,marisa::Keyset * keyset)203*ab8db090SAndroid Build Coastguard Worker void MakeKeyset(std::size_t num_keys, marisa::TailMode tail_mode,
204*ab8db090SAndroid Build Coastguard Worker     marisa::Keyset *keyset) {
205*ab8db090SAndroid Build Coastguard Worker   char key_buf[16];
206*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < num_keys; ++i) {
207*ab8db090SAndroid Build Coastguard Worker     const std::size_t length =
208*ab8db090SAndroid Build Coastguard Worker         static_cast<std::size_t>(std::rand()) % sizeof(key_buf);
209*ab8db090SAndroid Build Coastguard Worker     for (std::size_t j = 0; j < length; ++j) {
210*ab8db090SAndroid Build Coastguard Worker       key_buf[j] = (char)(std::rand() % 10);
211*ab8db090SAndroid Build Coastguard Worker       if (tail_mode == MARISA_TEXT_TAIL) {
212*ab8db090SAndroid Build Coastguard Worker         key_buf[j] = static_cast<char>(key_buf[j] + '0');
213*ab8db090SAndroid Build Coastguard Worker       }
214*ab8db090SAndroid Build Coastguard Worker     }
215*ab8db090SAndroid Build Coastguard Worker     keyset->push_back(key_buf, length);
216*ab8db090SAndroid Build Coastguard Worker   }
217*ab8db090SAndroid Build Coastguard Worker }
218*ab8db090SAndroid Build Coastguard Worker 
TestLookup(const marisa::Trie & trie,const marisa::Keyset & keyset)219*ab8db090SAndroid Build Coastguard Worker void TestLookup(const marisa::Trie &trie, const marisa::Keyset &keyset) {
220*ab8db090SAndroid Build Coastguard Worker   marisa::Agent agent;
221*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < keyset.size(); ++i) {
222*ab8db090SAndroid Build Coastguard Worker     agent.set_query(keyset[i].ptr(), keyset[i].length());
223*ab8db090SAndroid Build Coastguard Worker     ASSERT(trie.lookup(agent));
224*ab8db090SAndroid Build Coastguard Worker     ASSERT(agent.key().id() == keyset[i].id());
225*ab8db090SAndroid Build Coastguard Worker 
226*ab8db090SAndroid Build Coastguard Worker     agent.set_query(keyset[i].id());
227*ab8db090SAndroid Build Coastguard Worker     trie.reverse_lookup(agent);
228*ab8db090SAndroid Build Coastguard Worker     ASSERT(agent.key().length() == keyset[i].length());
229*ab8db090SAndroid Build Coastguard Worker     ASSERT(std::memcmp(agent.key().ptr(), keyset[i].ptr(),
230*ab8db090SAndroid Build Coastguard Worker         agent.key().length()) == 0);
231*ab8db090SAndroid Build Coastguard Worker   }
232*ab8db090SAndroid Build Coastguard Worker }
233*ab8db090SAndroid Build Coastguard Worker 
TestCommonPrefixSearch(const marisa::Trie & trie,const marisa::Keyset & keyset)234*ab8db090SAndroid Build Coastguard Worker void TestCommonPrefixSearch(const marisa::Trie &trie,
235*ab8db090SAndroid Build Coastguard Worker     const marisa::Keyset &keyset) {
236*ab8db090SAndroid Build Coastguard Worker   marisa::Agent agent;
237*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < keyset.size(); ++i) {
238*ab8db090SAndroid Build Coastguard Worker     agent.set_query(keyset[i].ptr(), keyset[i].length());
239*ab8db090SAndroid Build Coastguard Worker     ASSERT(trie.common_prefix_search(agent));
240*ab8db090SAndroid Build Coastguard Worker     ASSERT(agent.key().id() <= keyset[i].id());
241*ab8db090SAndroid Build Coastguard Worker     while (trie.common_prefix_search(agent)) {
242*ab8db090SAndroid Build Coastguard Worker       ASSERT(agent.key().id() <= keyset[i].id());
243*ab8db090SAndroid Build Coastguard Worker     }
244*ab8db090SAndroid Build Coastguard Worker     ASSERT(agent.key().id() == keyset[i].id());
245*ab8db090SAndroid Build Coastguard Worker   }
246*ab8db090SAndroid Build Coastguard Worker }
247*ab8db090SAndroid Build Coastguard Worker 
TestPredictiveSearch(const marisa::Trie & trie,const marisa::Keyset & keyset)248*ab8db090SAndroid Build Coastguard Worker void TestPredictiveSearch(const marisa::Trie &trie,
249*ab8db090SAndroid Build Coastguard Worker     const marisa::Keyset &keyset) {
250*ab8db090SAndroid Build Coastguard Worker   marisa::Agent agent;
251*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < keyset.size(); ++i) {
252*ab8db090SAndroid Build Coastguard Worker     agent.set_query(keyset[i].ptr(), keyset[i].length());
253*ab8db090SAndroid Build Coastguard Worker     ASSERT(trie.predictive_search(agent));
254*ab8db090SAndroid Build Coastguard Worker     ASSERT(agent.key().id() == keyset[i].id());
255*ab8db090SAndroid Build Coastguard Worker     while (trie.predictive_search(agent)) {
256*ab8db090SAndroid Build Coastguard Worker       ASSERT(agent.key().id() > keyset[i].id());
257*ab8db090SAndroid Build Coastguard Worker     }
258*ab8db090SAndroid Build Coastguard Worker   }
259*ab8db090SAndroid Build Coastguard Worker }
260*ab8db090SAndroid Build Coastguard Worker 
TestTrie(int num_tries,marisa::TailMode tail_mode,marisa::NodeOrder node_order,marisa::Keyset & keyset)261*ab8db090SAndroid Build Coastguard Worker void TestTrie(int num_tries, marisa::TailMode tail_mode,
262*ab8db090SAndroid Build Coastguard Worker     marisa::NodeOrder node_order, marisa::Keyset &keyset) {
263*ab8db090SAndroid Build Coastguard Worker   for (std::size_t i = 0; i < keyset.size(); ++i) {
264*ab8db090SAndroid Build Coastguard Worker     keyset[i].set_weight(1.0F);
265*ab8db090SAndroid Build Coastguard Worker   }
266*ab8db090SAndroid Build Coastguard Worker 
267*ab8db090SAndroid Build Coastguard Worker   marisa::Trie trie;
268*ab8db090SAndroid Build Coastguard Worker   trie.build(keyset, num_tries | tail_mode | node_order);
269*ab8db090SAndroid Build Coastguard Worker 
270*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_tries() == (std::size_t)num_tries);
271*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_keys() <= keyset.size());
272*ab8db090SAndroid Build Coastguard Worker 
273*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.tail_mode() == tail_mode);
274*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.node_order() == node_order);
275*ab8db090SAndroid Build Coastguard Worker 
276*ab8db090SAndroid Build Coastguard Worker   TestLookup(trie, keyset);
277*ab8db090SAndroid Build Coastguard Worker   TestCommonPrefixSearch(trie, keyset);
278*ab8db090SAndroid Build Coastguard Worker   TestPredictiveSearch(trie, keyset);
279*ab8db090SAndroid Build Coastguard Worker 
280*ab8db090SAndroid Build Coastguard Worker   trie.save("marisa-test.dat");
281*ab8db090SAndroid Build Coastguard Worker 
282*ab8db090SAndroid Build Coastguard Worker   trie.clear();
283*ab8db090SAndroid Build Coastguard Worker   trie.load("marisa-test.dat");
284*ab8db090SAndroid Build Coastguard Worker 
285*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_tries() == (std::size_t)num_tries);
286*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_keys() <= keyset.size());
287*ab8db090SAndroid Build Coastguard Worker 
288*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.tail_mode() == tail_mode);
289*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.node_order() == node_order);
290*ab8db090SAndroid Build Coastguard Worker 
291*ab8db090SAndroid Build Coastguard Worker   TestLookup(trie, keyset);
292*ab8db090SAndroid Build Coastguard Worker 
293*ab8db090SAndroid Build Coastguard Worker   {
294*ab8db090SAndroid Build Coastguard Worker     std::FILE *file;
295*ab8db090SAndroid Build Coastguard Worker #ifdef _MSC_VER
296*ab8db090SAndroid Build Coastguard Worker     ASSERT(::fopen_s(&file, "marisa-test.dat", "wb") == 0);
297*ab8db090SAndroid Build Coastguard Worker #else  // _MSC_VER
298*ab8db090SAndroid Build Coastguard Worker     file = std::fopen("marisa-test.dat", "wb");
299*ab8db090SAndroid Build Coastguard Worker     ASSERT(file != NULL);
300*ab8db090SAndroid Build Coastguard Worker #endif  // _MSC_VER
301*ab8db090SAndroid Build Coastguard Worker     marisa::fwrite(file, trie);
302*ab8db090SAndroid Build Coastguard Worker     std::fclose(file);
303*ab8db090SAndroid Build Coastguard Worker     trie.clear();
304*ab8db090SAndroid Build Coastguard Worker #ifdef _MSC_VER
305*ab8db090SAndroid Build Coastguard Worker     ASSERT(::fopen_s(&file, "marisa-test.dat", "rb") == 0);
306*ab8db090SAndroid Build Coastguard Worker #else  // _MSC_VER
307*ab8db090SAndroid Build Coastguard Worker     file = std::fopen("marisa-test.dat", "rb");
308*ab8db090SAndroid Build Coastguard Worker     ASSERT(file != NULL);
309*ab8db090SAndroid Build Coastguard Worker #endif  // _MSC_VER
310*ab8db090SAndroid Build Coastguard Worker     marisa::fread(file, &trie);
311*ab8db090SAndroid Build Coastguard Worker     std::fclose(file);
312*ab8db090SAndroid Build Coastguard Worker   }
313*ab8db090SAndroid Build Coastguard Worker 
314*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_tries() == (std::size_t)num_tries);
315*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_keys() <= keyset.size());
316*ab8db090SAndroid Build Coastguard Worker 
317*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.tail_mode() == tail_mode);
318*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.node_order() == node_order);
319*ab8db090SAndroid Build Coastguard Worker 
320*ab8db090SAndroid Build Coastguard Worker   TestLookup(trie, keyset);
321*ab8db090SAndroid Build Coastguard Worker 
322*ab8db090SAndroid Build Coastguard Worker   trie.clear();
323*ab8db090SAndroid Build Coastguard Worker   trie.mmap("marisa-test.dat");
324*ab8db090SAndroid Build Coastguard Worker 
325*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_tries() == (std::size_t)num_tries);
326*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_keys() <= keyset.size());
327*ab8db090SAndroid Build Coastguard Worker 
328*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.tail_mode() == tail_mode);
329*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.node_order() == node_order);
330*ab8db090SAndroid Build Coastguard Worker 
331*ab8db090SAndroid Build Coastguard Worker   TestLookup(trie, keyset);
332*ab8db090SAndroid Build Coastguard Worker 
333*ab8db090SAndroid Build Coastguard Worker   {
334*ab8db090SAndroid Build Coastguard Worker     std::stringstream stream;
335*ab8db090SAndroid Build Coastguard Worker     stream << trie;
336*ab8db090SAndroid Build Coastguard Worker     trie.clear();
337*ab8db090SAndroid Build Coastguard Worker     stream >> trie;
338*ab8db090SAndroid Build Coastguard Worker   }
339*ab8db090SAndroid Build Coastguard Worker 
340*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_tries() == (std::size_t)num_tries);
341*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.num_keys() <= keyset.size());
342*ab8db090SAndroid Build Coastguard Worker 
343*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.tail_mode() == tail_mode);
344*ab8db090SAndroid Build Coastguard Worker   ASSERT(trie.node_order() == node_order);
345*ab8db090SAndroid Build Coastguard Worker 
346*ab8db090SAndroid Build Coastguard Worker   TestLookup(trie, keyset);
347*ab8db090SAndroid Build Coastguard Worker }
348*ab8db090SAndroid Build Coastguard Worker 
TestTrie(marisa::TailMode tail_mode,marisa::NodeOrder node_order,marisa::Keyset & keyset)349*ab8db090SAndroid Build Coastguard Worker void TestTrie(marisa::TailMode tail_mode, marisa::NodeOrder node_order,
350*ab8db090SAndroid Build Coastguard Worker     marisa::Keyset &keyset) {
351*ab8db090SAndroid Build Coastguard Worker   TEST_START();
352*ab8db090SAndroid Build Coastguard Worker   std::cout << ((tail_mode == MARISA_TEXT_TAIL) ? "TEXT" : "BINARY") << ", ";
353*ab8db090SAndroid Build Coastguard Worker   std::cout << ((node_order == MARISA_WEIGHT_ORDER) ?
354*ab8db090SAndroid Build Coastguard Worker       "WEIGHT" : "LABEL") << ": ";
355*ab8db090SAndroid Build Coastguard Worker 
356*ab8db090SAndroid Build Coastguard Worker   for (int i = 1; i < 5; ++i) {
357*ab8db090SAndroid Build Coastguard Worker     TestTrie(i, tail_mode, node_order, keyset);
358*ab8db090SAndroid Build Coastguard Worker   }
359*ab8db090SAndroid Build Coastguard Worker 
360*ab8db090SAndroid Build Coastguard Worker   TEST_END();
361*ab8db090SAndroid Build Coastguard Worker }
362*ab8db090SAndroid Build Coastguard Worker 
TestTrie(marisa::TailMode tail_mode)363*ab8db090SAndroid Build Coastguard Worker void TestTrie(marisa::TailMode tail_mode) {
364*ab8db090SAndroid Build Coastguard Worker   marisa::Keyset keyset;
365*ab8db090SAndroid Build Coastguard Worker   MakeKeyset(1000, tail_mode, &keyset);
366*ab8db090SAndroid Build Coastguard Worker 
367*ab8db090SAndroid Build Coastguard Worker   TestTrie(tail_mode, MARISA_WEIGHT_ORDER, keyset);
368*ab8db090SAndroid Build Coastguard Worker   TestTrie(tail_mode, MARISA_LABEL_ORDER, keyset);
369*ab8db090SAndroid Build Coastguard Worker }
370*ab8db090SAndroid Build Coastguard Worker 
TestTrie()371*ab8db090SAndroid Build Coastguard Worker void TestTrie() {
372*ab8db090SAndroid Build Coastguard Worker   TestTrie(MARISA_TEXT_TAIL);
373*ab8db090SAndroid Build Coastguard Worker   TestTrie(MARISA_BINARY_TAIL);
374*ab8db090SAndroid Build Coastguard Worker }
375*ab8db090SAndroid Build Coastguard Worker 
376*ab8db090SAndroid Build Coastguard Worker }  // namespace
377*ab8db090SAndroid Build Coastguard Worker 
main()378*ab8db090SAndroid Build Coastguard Worker int main() try {
379*ab8db090SAndroid Build Coastguard Worker   std::srand((unsigned int)std::time(NULL));
380*ab8db090SAndroid Build Coastguard Worker 
381*ab8db090SAndroid Build Coastguard Worker   TestEmptyTrie();
382*ab8db090SAndroid Build Coastguard Worker   TestTinyTrie();
383*ab8db090SAndroid Build Coastguard Worker   TestTrie();
384*ab8db090SAndroid Build Coastguard Worker 
385*ab8db090SAndroid Build Coastguard Worker   return 0;
386*ab8db090SAndroid Build Coastguard Worker } catch (const marisa::Exception &ex) {
387*ab8db090SAndroid Build Coastguard Worker   std::cerr << ex.what() << std::endl;
388*ab8db090SAndroid Build Coastguard Worker   throw;
389*ab8db090SAndroid Build Coastguard Worker }
390