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