1*ab8db090SAndroid Build Coastguard Worker #include <algorithm>
2*ab8db090SAndroid Build Coastguard Worker #include <cstring>
3*ab8db090SAndroid Build Coastguard Worker #include <sstream>
4*ab8db090SAndroid Build Coastguard Worker
5*ab8db090SAndroid Build Coastguard Worker #include <marisa/grimoire/trie/config.h>
6*ab8db090SAndroid Build Coastguard Worker #include <marisa/grimoire/trie/header.h>
7*ab8db090SAndroid Build Coastguard Worker #include <marisa/grimoire/trie/key.h>
8*ab8db090SAndroid Build Coastguard Worker #include <marisa/grimoire/trie/range.h>
9*ab8db090SAndroid Build Coastguard Worker #include <marisa/grimoire/trie/tail.h>
10*ab8db090SAndroid Build Coastguard Worker #include <marisa/grimoire/trie/state.h>
11*ab8db090SAndroid Build Coastguard Worker
12*ab8db090SAndroid Build Coastguard Worker #include "marisa-assert.h"
13*ab8db090SAndroid Build Coastguard Worker
14*ab8db090SAndroid Build Coastguard Worker namespace {
15*ab8db090SAndroid Build Coastguard Worker
TestConfig()16*ab8db090SAndroid Build Coastguard Worker void TestConfig() {
17*ab8db090SAndroid Build Coastguard Worker TEST_START();
18*ab8db090SAndroid Build Coastguard Worker
19*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::Config config;
20*ab8db090SAndroid Build Coastguard Worker
21*ab8db090SAndroid Build Coastguard Worker ASSERT(config.num_tries() == MARISA_DEFAULT_NUM_TRIES);
22*ab8db090SAndroid Build Coastguard Worker ASSERT(config.tail_mode() == MARISA_DEFAULT_TAIL);
23*ab8db090SAndroid Build Coastguard Worker ASSERT(config.node_order() == MARISA_DEFAULT_ORDER);
24*ab8db090SAndroid Build Coastguard Worker ASSERT(config.cache_level() == MARISA_DEFAULT_CACHE);
25*ab8db090SAndroid Build Coastguard Worker
26*ab8db090SAndroid Build Coastguard Worker config.parse(10 | MARISA_BINARY_TAIL | MARISA_LABEL_ORDER |
27*ab8db090SAndroid Build Coastguard Worker MARISA_TINY_CACHE);
28*ab8db090SAndroid Build Coastguard Worker
29*ab8db090SAndroid Build Coastguard Worker ASSERT(config.num_tries() == 10);
30*ab8db090SAndroid Build Coastguard Worker ASSERT(config.tail_mode() == MARISA_BINARY_TAIL);
31*ab8db090SAndroid Build Coastguard Worker ASSERT(config.node_order() == MARISA_LABEL_ORDER);
32*ab8db090SAndroid Build Coastguard Worker ASSERT(config.cache_level() == MARISA_TINY_CACHE);
33*ab8db090SAndroid Build Coastguard Worker
34*ab8db090SAndroid Build Coastguard Worker config.parse(0);
35*ab8db090SAndroid Build Coastguard Worker
36*ab8db090SAndroid Build Coastguard Worker ASSERT(config.num_tries() == MARISA_DEFAULT_NUM_TRIES);
37*ab8db090SAndroid Build Coastguard Worker ASSERT(config.tail_mode() == MARISA_DEFAULT_TAIL);
38*ab8db090SAndroid Build Coastguard Worker ASSERT(config.node_order() == MARISA_DEFAULT_ORDER);
39*ab8db090SAndroid Build Coastguard Worker ASSERT(config.cache_level() == MARISA_DEFAULT_CACHE);
40*ab8db090SAndroid Build Coastguard Worker
41*ab8db090SAndroid Build Coastguard Worker TEST_END();
42*ab8db090SAndroid Build Coastguard Worker }
43*ab8db090SAndroid Build Coastguard Worker
TestHeader()44*ab8db090SAndroid Build Coastguard Worker void TestHeader() {
45*ab8db090SAndroid Build Coastguard Worker TEST_START();
46*ab8db090SAndroid Build Coastguard Worker
47*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::Header header;
48*ab8db090SAndroid Build Coastguard Worker
49*ab8db090SAndroid Build Coastguard Worker {
50*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::Writer writer;
51*ab8db090SAndroid Build Coastguard Worker writer.open("trie-test.dat");
52*ab8db090SAndroid Build Coastguard Worker header.write(writer);
53*ab8db090SAndroid Build Coastguard Worker }
54*ab8db090SAndroid Build Coastguard Worker
55*ab8db090SAndroid Build Coastguard Worker {
56*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::Mapper mapper;
57*ab8db090SAndroid Build Coastguard Worker mapper.open("trie-test.dat");
58*ab8db090SAndroid Build Coastguard Worker header.map(mapper);
59*ab8db090SAndroid Build Coastguard Worker }
60*ab8db090SAndroid Build Coastguard Worker
61*ab8db090SAndroid Build Coastguard Worker {
62*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::Reader reader;
63*ab8db090SAndroid Build Coastguard Worker reader.open("trie-test.dat");
64*ab8db090SAndroid Build Coastguard Worker header.read(reader);
65*ab8db090SAndroid Build Coastguard Worker }
66*ab8db090SAndroid Build Coastguard Worker
67*ab8db090SAndroid Build Coastguard Worker TEST_END();
68*ab8db090SAndroid Build Coastguard Worker }
69*ab8db090SAndroid Build Coastguard Worker
TestKey()70*ab8db090SAndroid Build Coastguard Worker void TestKey() {
71*ab8db090SAndroid Build Coastguard Worker TEST_START();
72*ab8db090SAndroid Build Coastguard Worker
73*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::Key key;
74*ab8db090SAndroid Build Coastguard Worker
75*ab8db090SAndroid Build Coastguard Worker ASSERT(key.ptr() == NULL);
76*ab8db090SAndroid Build Coastguard Worker ASSERT(key.length() == 0);
77*ab8db090SAndroid Build Coastguard Worker ASSERT(key.id() == 0);
78*ab8db090SAndroid Build Coastguard Worker ASSERT(key.terminal() == 0);
79*ab8db090SAndroid Build Coastguard Worker
80*ab8db090SAndroid Build Coastguard Worker const char *str = "xyz";
81*ab8db090SAndroid Build Coastguard Worker
82*ab8db090SAndroid Build Coastguard Worker key.set_str(str, 3);
83*ab8db090SAndroid Build Coastguard Worker key.set_weight(10.0F);
84*ab8db090SAndroid Build Coastguard Worker key.set_id(20);
85*ab8db090SAndroid Build Coastguard Worker
86*ab8db090SAndroid Build Coastguard Worker
87*ab8db090SAndroid Build Coastguard Worker ASSERT(key.ptr() == str);
88*ab8db090SAndroid Build Coastguard Worker ASSERT(key.length() == 3);
89*ab8db090SAndroid Build Coastguard Worker ASSERT(key[0] == 'x');
90*ab8db090SAndroid Build Coastguard Worker ASSERT(key[1] == 'y');
91*ab8db090SAndroid Build Coastguard Worker ASSERT(key[2] == 'z');
92*ab8db090SAndroid Build Coastguard Worker ASSERT(key.weight() == 10.0F);
93*ab8db090SAndroid Build Coastguard Worker ASSERT(key.id() == 20);
94*ab8db090SAndroid Build Coastguard Worker
95*ab8db090SAndroid Build Coastguard Worker key.set_terminal(30);
96*ab8db090SAndroid Build Coastguard Worker ASSERT(key.terminal() == 30);
97*ab8db090SAndroid Build Coastguard Worker
98*ab8db090SAndroid Build Coastguard Worker key.substr(1, 2);
99*ab8db090SAndroid Build Coastguard Worker
100*ab8db090SAndroid Build Coastguard Worker ASSERT(key.ptr() == str + 1);
101*ab8db090SAndroid Build Coastguard Worker ASSERT(key.length() == 2);
102*ab8db090SAndroid Build Coastguard Worker ASSERT(key[0] == 'y');
103*ab8db090SAndroid Build Coastguard Worker ASSERT(key[1] == 'z');
104*ab8db090SAndroid Build Coastguard Worker
105*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::Key key2;
106*ab8db090SAndroid Build Coastguard Worker key2.set_str("abc", 3);
107*ab8db090SAndroid Build Coastguard Worker
108*ab8db090SAndroid Build Coastguard Worker ASSERT(key == key);
109*ab8db090SAndroid Build Coastguard Worker ASSERT(key != key2);
110*ab8db090SAndroid Build Coastguard Worker ASSERT(key > key2);
111*ab8db090SAndroid Build Coastguard Worker ASSERT(key2 < key);
112*ab8db090SAndroid Build Coastguard Worker
113*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::ReverseKey r_key;
114*ab8db090SAndroid Build Coastguard Worker
115*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key.ptr() == NULL);
116*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key.length() == 0);
117*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key.id() == 0);
118*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key.terminal() == 0);
119*ab8db090SAndroid Build Coastguard Worker
120*ab8db090SAndroid Build Coastguard Worker r_key.set_str(str, 3);
121*ab8db090SAndroid Build Coastguard Worker r_key.set_weight(100.0F);
122*ab8db090SAndroid Build Coastguard Worker r_key.set_id(200);
123*ab8db090SAndroid Build Coastguard Worker
124*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key.ptr() == str);
125*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key.length() == 3);
126*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key[0] == 'z');
127*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key[1] == 'y');
128*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key[2] == 'x');
129*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key.weight() == 100.0F);
130*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key.id() == 200);
131*ab8db090SAndroid Build Coastguard Worker
132*ab8db090SAndroid Build Coastguard Worker r_key.set_terminal(300);
133*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key.terminal() == 300);
134*ab8db090SAndroid Build Coastguard Worker
135*ab8db090SAndroid Build Coastguard Worker r_key.substr(1, 2);
136*ab8db090SAndroid Build Coastguard Worker
137*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key.ptr() == str);
138*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key.length() == 2);
139*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key[0] == 'y');
140*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key[1] == 'x');
141*ab8db090SAndroid Build Coastguard Worker
142*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::ReverseKey r_key2;
143*ab8db090SAndroid Build Coastguard Worker r_key2.set_str("abc", 3);
144*ab8db090SAndroid Build Coastguard Worker
145*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key == r_key);
146*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key != r_key2);
147*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key > r_key2);
148*ab8db090SAndroid Build Coastguard Worker ASSERT(r_key2 < r_key);
149*ab8db090SAndroid Build Coastguard Worker
150*ab8db090SAndroid Build Coastguard Worker TEST_END();
151*ab8db090SAndroid Build Coastguard Worker }
152*ab8db090SAndroid Build Coastguard Worker
TestRange()153*ab8db090SAndroid Build Coastguard Worker void TestRange() {
154*ab8db090SAndroid Build Coastguard Worker TEST_START();
155*ab8db090SAndroid Build Coastguard Worker
156*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::Range range;
157*ab8db090SAndroid Build Coastguard Worker
158*ab8db090SAndroid Build Coastguard Worker ASSERT(range.begin() == 0);
159*ab8db090SAndroid Build Coastguard Worker ASSERT(range.end() == 0);
160*ab8db090SAndroid Build Coastguard Worker ASSERT(range.key_pos() == 0);
161*ab8db090SAndroid Build Coastguard Worker
162*ab8db090SAndroid Build Coastguard Worker range.set_begin(1);
163*ab8db090SAndroid Build Coastguard Worker range.set_end(2);
164*ab8db090SAndroid Build Coastguard Worker range.set_key_pos(3);
165*ab8db090SAndroid Build Coastguard Worker
166*ab8db090SAndroid Build Coastguard Worker ASSERT(range.begin() == 1);
167*ab8db090SAndroid Build Coastguard Worker ASSERT(range.end() == 2);
168*ab8db090SAndroid Build Coastguard Worker ASSERT(range.key_pos() == 3);
169*ab8db090SAndroid Build Coastguard Worker
170*ab8db090SAndroid Build Coastguard Worker range = marisa::grimoire::trie::make_range(10, 20, 30);
171*ab8db090SAndroid Build Coastguard Worker
172*ab8db090SAndroid Build Coastguard Worker ASSERT(range.begin() == 10);
173*ab8db090SAndroid Build Coastguard Worker ASSERT(range.end() == 20);
174*ab8db090SAndroid Build Coastguard Worker ASSERT(range.key_pos() == 30);
175*ab8db090SAndroid Build Coastguard Worker
176*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::WeightedRange w_range;
177*ab8db090SAndroid Build Coastguard Worker
178*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range.begin() == 0);
179*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range.end() == 0);
180*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range.key_pos() == 0);
181*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range.weight() == 0.0F);
182*ab8db090SAndroid Build Coastguard Worker
183*ab8db090SAndroid Build Coastguard Worker w_range.set_begin(10);
184*ab8db090SAndroid Build Coastguard Worker w_range.set_end(20);
185*ab8db090SAndroid Build Coastguard Worker w_range.set_key_pos(30);
186*ab8db090SAndroid Build Coastguard Worker w_range.set_weight(40.0F);
187*ab8db090SAndroid Build Coastguard Worker
188*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range.begin() == 10);
189*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range.end() == 20);
190*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range.key_pos() == 30);
191*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range.weight() == 40.0F);
192*ab8db090SAndroid Build Coastguard Worker
193*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::WeightedRange w_range2 =
194*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::make_weighted_range(100, 200, 300, 400.0F);
195*ab8db090SAndroid Build Coastguard Worker
196*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range2.begin() == 100);
197*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range2.end() == 200);
198*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range2.key_pos() == 300);
199*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range2.weight() == 400.0F);
200*ab8db090SAndroid Build Coastguard Worker
201*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range < w_range2);
202*ab8db090SAndroid Build Coastguard Worker ASSERT(w_range2 > w_range);
203*ab8db090SAndroid Build Coastguard Worker
204*ab8db090SAndroid Build Coastguard Worker TEST_END();
205*ab8db090SAndroid Build Coastguard Worker }
206*ab8db090SAndroid Build Coastguard Worker
TestEntry()207*ab8db090SAndroid Build Coastguard Worker void TestEntry() {
208*ab8db090SAndroid Build Coastguard Worker TEST_START();
209*ab8db090SAndroid Build Coastguard Worker
210*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::Entry entry;
211*ab8db090SAndroid Build Coastguard Worker
212*ab8db090SAndroid Build Coastguard Worker ASSERT(entry.length() == 0);
213*ab8db090SAndroid Build Coastguard Worker ASSERT(entry.id() == 0);
214*ab8db090SAndroid Build Coastguard Worker
215*ab8db090SAndroid Build Coastguard Worker const char *str = "XYZ";
216*ab8db090SAndroid Build Coastguard Worker
217*ab8db090SAndroid Build Coastguard Worker entry.set_str(str, 3);
218*ab8db090SAndroid Build Coastguard Worker entry.set_id(123);
219*ab8db090SAndroid Build Coastguard Worker
220*ab8db090SAndroid Build Coastguard Worker ASSERT(entry.ptr() == str);
221*ab8db090SAndroid Build Coastguard Worker ASSERT(entry.length() == 3);
222*ab8db090SAndroid Build Coastguard Worker ASSERT(entry[0] == 'Z');
223*ab8db090SAndroid Build Coastguard Worker ASSERT(entry[1] == 'Y');
224*ab8db090SAndroid Build Coastguard Worker ASSERT(entry[2] == 'X');
225*ab8db090SAndroid Build Coastguard Worker ASSERT(entry.id() == 123);
226*ab8db090SAndroid Build Coastguard Worker
227*ab8db090SAndroid Build Coastguard Worker TEST_END();
228*ab8db090SAndroid Build Coastguard Worker }
229*ab8db090SAndroid Build Coastguard Worker
TestTextTail()230*ab8db090SAndroid Build Coastguard Worker void TestTextTail() {
231*ab8db090SAndroid Build Coastguard Worker TEST_START();
232*ab8db090SAndroid Build Coastguard Worker
233*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::Tail tail;
234*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::Vector<marisa::grimoire::trie::Entry> entries;
235*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::Vector<marisa::UInt32> offsets;
236*ab8db090SAndroid Build Coastguard Worker tail.build(entries, &offsets, MARISA_TEXT_TAIL);
237*ab8db090SAndroid Build Coastguard Worker
238*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.mode() == MARISA_TEXT_TAIL);
239*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.size() == 0);
240*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.empty());
241*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.total_size() == tail.size());
242*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.io_size() == (sizeof(marisa::UInt64) * 6));
243*ab8db090SAndroid Build Coastguard Worker
244*ab8db090SAndroid Build Coastguard Worker ASSERT(offsets.empty());
245*ab8db090SAndroid Build Coastguard Worker
246*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::Entry entry;
247*ab8db090SAndroid Build Coastguard Worker entry.set_str("X", 1);
248*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
249*ab8db090SAndroid Build Coastguard Worker
250*ab8db090SAndroid Build Coastguard Worker tail.build(entries, &offsets, MARISA_TEXT_TAIL);
251*ab8db090SAndroid Build Coastguard Worker
252*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.mode() == MARISA_TEXT_TAIL);
253*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.size() == 2);
254*ab8db090SAndroid Build Coastguard Worker ASSERT(!tail.empty());
255*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.total_size() == tail.size());
256*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.io_size() == (sizeof(marisa::UInt64) * 7));
257*ab8db090SAndroid Build Coastguard Worker
258*ab8db090SAndroid Build Coastguard Worker ASSERT(offsets.size() == entries.size());
259*ab8db090SAndroid Build Coastguard Worker ASSERT(offsets[0] == 0);
260*ab8db090SAndroid Build Coastguard Worker ASSERT(tail[offsets[0]] == 'X');
261*ab8db090SAndroid Build Coastguard Worker ASSERT(tail[offsets[0] + 1] == '\0');
262*ab8db090SAndroid Build Coastguard Worker
263*ab8db090SAndroid Build Coastguard Worker entries.clear();
264*ab8db090SAndroid Build Coastguard Worker entry.set_str("abc", 3);
265*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
266*ab8db090SAndroid Build Coastguard Worker entry.set_str("bc", 2);
267*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
268*ab8db090SAndroid Build Coastguard Worker entry.set_str("abc", 3);
269*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
270*ab8db090SAndroid Build Coastguard Worker entry.set_str("c", 1);
271*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
272*ab8db090SAndroid Build Coastguard Worker entry.set_str("ABC", 3);
273*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
274*ab8db090SAndroid Build Coastguard Worker entry.set_str("AB", 2);
275*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
276*ab8db090SAndroid Build Coastguard Worker
277*ab8db090SAndroid Build Coastguard Worker tail.build(entries, &offsets, MARISA_TEXT_TAIL);
278*ab8db090SAndroid Build Coastguard Worker std::sort(entries.begin(), entries.end(),
279*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::Entry::IDComparer());
280*ab8db090SAndroid Build Coastguard Worker
281*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.size() == 11);
282*ab8db090SAndroid Build Coastguard Worker ASSERT(offsets.size() == entries.size());
283*ab8db090SAndroid Build Coastguard Worker for (std::size_t i = 0; i < entries.size(); ++i) {
284*ab8db090SAndroid Build Coastguard Worker const char * const ptr = &tail[offsets[i]];
285*ab8db090SAndroid Build Coastguard Worker ASSERT(std::strlen(ptr) == entries[i].length());
286*ab8db090SAndroid Build Coastguard Worker ASSERT(std::strcmp(ptr, entries[i].ptr()) == 0);
287*ab8db090SAndroid Build Coastguard Worker }
288*ab8db090SAndroid Build Coastguard Worker
289*ab8db090SAndroid Build Coastguard Worker {
290*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::Writer writer;
291*ab8db090SAndroid Build Coastguard Worker writer.open("trie-test.dat");
292*ab8db090SAndroid Build Coastguard Worker tail.write(writer);
293*ab8db090SAndroid Build Coastguard Worker }
294*ab8db090SAndroid Build Coastguard Worker
295*ab8db090SAndroid Build Coastguard Worker tail.clear();
296*ab8db090SAndroid Build Coastguard Worker
297*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.size() == 0);
298*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.total_size() == tail.size());
299*ab8db090SAndroid Build Coastguard Worker
300*ab8db090SAndroid Build Coastguard Worker {
301*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::Mapper mapper;
302*ab8db090SAndroid Build Coastguard Worker mapper.open("trie-test.dat");
303*ab8db090SAndroid Build Coastguard Worker tail.map(mapper);
304*ab8db090SAndroid Build Coastguard Worker
305*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.mode() == MARISA_TEXT_TAIL);
306*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.size() == 11);
307*ab8db090SAndroid Build Coastguard Worker for (std::size_t i = 0; i < entries.size(); ++i) {
308*ab8db090SAndroid Build Coastguard Worker const char * const ptr = &tail[offsets[i]];
309*ab8db090SAndroid Build Coastguard Worker ASSERT(std::strlen(ptr) == entries[i].length());
310*ab8db090SAndroid Build Coastguard Worker ASSERT(std::strcmp(ptr, entries[i].ptr()) == 0);
311*ab8db090SAndroid Build Coastguard Worker }
312*ab8db090SAndroid Build Coastguard Worker tail.clear();
313*ab8db090SAndroid Build Coastguard Worker }
314*ab8db090SAndroid Build Coastguard Worker
315*ab8db090SAndroid Build Coastguard Worker {
316*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::Reader reader;
317*ab8db090SAndroid Build Coastguard Worker reader.open("trie-test.dat");
318*ab8db090SAndroid Build Coastguard Worker tail.read(reader);
319*ab8db090SAndroid Build Coastguard Worker }
320*ab8db090SAndroid Build Coastguard Worker
321*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.size() == 11);
322*ab8db090SAndroid Build Coastguard Worker ASSERT(offsets.size() == entries.size());
323*ab8db090SAndroid Build Coastguard Worker for (std::size_t i = 0; i < entries.size(); ++i) {
324*ab8db090SAndroid Build Coastguard Worker const char * const ptr = &tail[offsets[i]];
325*ab8db090SAndroid Build Coastguard Worker ASSERT(std::strlen(ptr) == entries[i].length());
326*ab8db090SAndroid Build Coastguard Worker ASSERT(std::strcmp(ptr, entries[i].ptr()) == 0);
327*ab8db090SAndroid Build Coastguard Worker }
328*ab8db090SAndroid Build Coastguard Worker
329*ab8db090SAndroid Build Coastguard Worker {
330*ab8db090SAndroid Build Coastguard Worker std::stringstream stream;
331*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::Writer writer;
332*ab8db090SAndroid Build Coastguard Worker writer.open(stream);
333*ab8db090SAndroid Build Coastguard Worker tail.write(writer);
334*ab8db090SAndroid Build Coastguard Worker tail.clear();
335*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::Reader reader;
336*ab8db090SAndroid Build Coastguard Worker reader.open(stream);
337*ab8db090SAndroid Build Coastguard Worker tail.read(reader);
338*ab8db090SAndroid Build Coastguard Worker }
339*ab8db090SAndroid Build Coastguard Worker
340*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.size() == 11);
341*ab8db090SAndroid Build Coastguard Worker ASSERT(offsets.size() == entries.size());
342*ab8db090SAndroid Build Coastguard Worker for (std::size_t i = 0; i < entries.size(); ++i) {
343*ab8db090SAndroid Build Coastguard Worker const char * const ptr = &tail[offsets[i]];
344*ab8db090SAndroid Build Coastguard Worker ASSERT(std::strlen(ptr) == entries[i].length());
345*ab8db090SAndroid Build Coastguard Worker ASSERT(std::strcmp(ptr, entries[i].ptr()) == 0);
346*ab8db090SAndroid Build Coastguard Worker }
347*ab8db090SAndroid Build Coastguard Worker
348*ab8db090SAndroid Build Coastguard Worker TEST_END();
349*ab8db090SAndroid Build Coastguard Worker }
350*ab8db090SAndroid Build Coastguard Worker
TestBinaryTail()351*ab8db090SAndroid Build Coastguard Worker void TestBinaryTail() {
352*ab8db090SAndroid Build Coastguard Worker TEST_START();
353*ab8db090SAndroid Build Coastguard Worker
354*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::Tail tail;
355*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::Vector<marisa::grimoire::trie::Entry> entries;
356*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::Vector<marisa::UInt32> offsets;
357*ab8db090SAndroid Build Coastguard Worker tail.build(entries, &offsets, MARISA_BINARY_TAIL);
358*ab8db090SAndroid Build Coastguard Worker
359*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.mode() == MARISA_TEXT_TAIL);
360*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.size() == 0);
361*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.empty());
362*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.total_size() == tail.size());
363*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.io_size() == (sizeof(marisa::UInt64) * 6));
364*ab8db090SAndroid Build Coastguard Worker
365*ab8db090SAndroid Build Coastguard Worker ASSERT(offsets.empty());
366*ab8db090SAndroid Build Coastguard Worker
367*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::Entry entry;
368*ab8db090SAndroid Build Coastguard Worker entry.set_str("X", 1);
369*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
370*ab8db090SAndroid Build Coastguard Worker
371*ab8db090SAndroid Build Coastguard Worker tail.build(entries, &offsets, MARISA_BINARY_TAIL);
372*ab8db090SAndroid Build Coastguard Worker
373*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.mode() == MARISA_BINARY_TAIL);
374*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.size() == 1);
375*ab8db090SAndroid Build Coastguard Worker ASSERT(!tail.empty());
376*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.total_size() == (tail.size() + sizeof(marisa::UInt64)));
377*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.io_size() == (sizeof(marisa::UInt64) * 8));
378*ab8db090SAndroid Build Coastguard Worker
379*ab8db090SAndroid Build Coastguard Worker ASSERT(offsets.size() == entries.size());
380*ab8db090SAndroid Build Coastguard Worker ASSERT(offsets[0] == 0);
381*ab8db090SAndroid Build Coastguard Worker
382*ab8db090SAndroid Build Coastguard Worker const char binary_entry[] = { 'N', 'P', '\0', 'T', 'r', 'i', 'e' };
383*ab8db090SAndroid Build Coastguard Worker entries[0].set_str(binary_entry, sizeof(binary_entry));
384*ab8db090SAndroid Build Coastguard Worker
385*ab8db090SAndroid Build Coastguard Worker tail.build(entries, &offsets, MARISA_TEXT_TAIL);
386*ab8db090SAndroid Build Coastguard Worker
387*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.mode() == MARISA_BINARY_TAIL);
388*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.size() == entries[0].length());
389*ab8db090SAndroid Build Coastguard Worker
390*ab8db090SAndroid Build Coastguard Worker ASSERT(offsets.size() == entries.size());
391*ab8db090SAndroid Build Coastguard Worker ASSERT(offsets[0] == 0);
392*ab8db090SAndroid Build Coastguard Worker
393*ab8db090SAndroid Build Coastguard Worker entries.clear();
394*ab8db090SAndroid Build Coastguard Worker entry.set_str("abc", 3);
395*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
396*ab8db090SAndroid Build Coastguard Worker entry.set_str("bc", 2);
397*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
398*ab8db090SAndroid Build Coastguard Worker entry.set_str("abc", 3);
399*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
400*ab8db090SAndroid Build Coastguard Worker entry.set_str("c", 1);
401*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
402*ab8db090SAndroid Build Coastguard Worker entry.set_str("ABC", 3);
403*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
404*ab8db090SAndroid Build Coastguard Worker entry.set_str("AB", 2);
405*ab8db090SAndroid Build Coastguard Worker entries.push_back(entry);
406*ab8db090SAndroid Build Coastguard Worker
407*ab8db090SAndroid Build Coastguard Worker tail.build(entries, &offsets, MARISA_BINARY_TAIL);
408*ab8db090SAndroid Build Coastguard Worker std::sort(entries.begin(), entries.end(),
409*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::Entry::IDComparer());
410*ab8db090SAndroid Build Coastguard Worker
411*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.mode() == MARISA_BINARY_TAIL);
412*ab8db090SAndroid Build Coastguard Worker ASSERT(tail.size() == 8);
413*ab8db090SAndroid Build Coastguard Worker ASSERT(offsets.size() == entries.size());
414*ab8db090SAndroid Build Coastguard Worker for (std::size_t i = 0; i < entries.size(); ++i) {
415*ab8db090SAndroid Build Coastguard Worker const char * const ptr = &tail[offsets[i]];
416*ab8db090SAndroid Build Coastguard Worker ASSERT(std::memcmp(ptr, entries[i].ptr(), entries[i].length()) == 0);
417*ab8db090SAndroid Build Coastguard Worker }
418*ab8db090SAndroid Build Coastguard Worker
419*ab8db090SAndroid Build Coastguard Worker TEST_END();
420*ab8db090SAndroid Build Coastguard Worker }
421*ab8db090SAndroid Build Coastguard Worker
TestHistory()422*ab8db090SAndroid Build Coastguard Worker void TestHistory() {
423*ab8db090SAndroid Build Coastguard Worker TEST_START();
424*ab8db090SAndroid Build Coastguard Worker
425*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::History history;
426*ab8db090SAndroid Build Coastguard Worker
427*ab8db090SAndroid Build Coastguard Worker ASSERT(history.node_id() == 0);
428*ab8db090SAndroid Build Coastguard Worker ASSERT(history.louds_pos() == 0);
429*ab8db090SAndroid Build Coastguard Worker ASSERT(history.key_pos() == 0);
430*ab8db090SAndroid Build Coastguard Worker ASSERT(history.link_id() == MARISA_INVALID_LINK_ID);
431*ab8db090SAndroid Build Coastguard Worker ASSERT(history.key_id() == MARISA_INVALID_KEY_ID);
432*ab8db090SAndroid Build Coastguard Worker
433*ab8db090SAndroid Build Coastguard Worker history.set_node_id(100);
434*ab8db090SAndroid Build Coastguard Worker history.set_louds_pos(200);
435*ab8db090SAndroid Build Coastguard Worker history.set_key_pos(300);
436*ab8db090SAndroid Build Coastguard Worker history.set_link_id(400);
437*ab8db090SAndroid Build Coastguard Worker history.set_key_id(500);
438*ab8db090SAndroid Build Coastguard Worker
439*ab8db090SAndroid Build Coastguard Worker ASSERT(history.node_id() == 100);
440*ab8db090SAndroid Build Coastguard Worker ASSERT(history.louds_pos() == 200);
441*ab8db090SAndroid Build Coastguard Worker ASSERT(history.key_pos() == 300);
442*ab8db090SAndroid Build Coastguard Worker ASSERT(history.link_id() == 400);
443*ab8db090SAndroid Build Coastguard Worker ASSERT(history.key_id() == 500);
444*ab8db090SAndroid Build Coastguard Worker
445*ab8db090SAndroid Build Coastguard Worker TEST_END();
446*ab8db090SAndroid Build Coastguard Worker }
447*ab8db090SAndroid Build Coastguard Worker
TestState()448*ab8db090SAndroid Build Coastguard Worker void TestState() {
449*ab8db090SAndroid Build Coastguard Worker TEST_START();
450*ab8db090SAndroid Build Coastguard Worker
451*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::State state;
452*ab8db090SAndroid Build Coastguard Worker
453*ab8db090SAndroid Build Coastguard Worker ASSERT(state.key_buf().empty());
454*ab8db090SAndroid Build Coastguard Worker ASSERT(state.history().empty());
455*ab8db090SAndroid Build Coastguard Worker ASSERT(state.node_id() == 0);
456*ab8db090SAndroid Build Coastguard Worker ASSERT(state.query_pos() == 0);
457*ab8db090SAndroid Build Coastguard Worker ASSERT(state.history_pos() == 0);
458*ab8db090SAndroid Build Coastguard Worker ASSERT(state.status_code() == marisa::grimoire::trie::MARISA_READY_TO_ALL);
459*ab8db090SAndroid Build Coastguard Worker
460*ab8db090SAndroid Build Coastguard Worker state.set_node_id(10);
461*ab8db090SAndroid Build Coastguard Worker state.set_query_pos(100);
462*ab8db090SAndroid Build Coastguard Worker state.set_history_pos(1000);
463*ab8db090SAndroid Build Coastguard Worker state.set_status_code(
464*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::MARISA_END_OF_PREDICTIVE_SEARCH);
465*ab8db090SAndroid Build Coastguard Worker
466*ab8db090SAndroid Build Coastguard Worker ASSERT(state.node_id() == 10);
467*ab8db090SAndroid Build Coastguard Worker ASSERT(state.query_pos() == 100);
468*ab8db090SAndroid Build Coastguard Worker ASSERT(state.history_pos() == 1000);
469*ab8db090SAndroid Build Coastguard Worker ASSERT(state.status_code() ==
470*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::MARISA_END_OF_PREDICTIVE_SEARCH);
471*ab8db090SAndroid Build Coastguard Worker
472*ab8db090SAndroid Build Coastguard Worker state.lookup_init();
473*ab8db090SAndroid Build Coastguard Worker ASSERT(state.status_code() == marisa::grimoire::trie::MARISA_READY_TO_ALL);
474*ab8db090SAndroid Build Coastguard Worker
475*ab8db090SAndroid Build Coastguard Worker state.reverse_lookup_init();
476*ab8db090SAndroid Build Coastguard Worker ASSERT(state.status_code() == marisa::grimoire::trie::MARISA_READY_TO_ALL);
477*ab8db090SAndroid Build Coastguard Worker
478*ab8db090SAndroid Build Coastguard Worker state.common_prefix_search_init();
479*ab8db090SAndroid Build Coastguard Worker ASSERT(state.status_code() ==
480*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::MARISA_READY_TO_COMMON_PREFIX_SEARCH);
481*ab8db090SAndroid Build Coastguard Worker
482*ab8db090SAndroid Build Coastguard Worker state.predictive_search_init();
483*ab8db090SAndroid Build Coastguard Worker ASSERT(state.status_code() ==
484*ab8db090SAndroid Build Coastguard Worker marisa::grimoire::trie::MARISA_READY_TO_PREDICTIVE_SEARCH);
485*ab8db090SAndroid Build Coastguard Worker
486*ab8db090SAndroid Build Coastguard Worker TEST_END();
487*ab8db090SAndroid Build Coastguard Worker }
488*ab8db090SAndroid Build Coastguard Worker
489*ab8db090SAndroid Build Coastguard Worker } // namespace
490*ab8db090SAndroid Build Coastguard Worker
main()491*ab8db090SAndroid Build Coastguard Worker int main() try {
492*ab8db090SAndroid Build Coastguard Worker TestConfig();
493*ab8db090SAndroid Build Coastguard Worker TestHeader();
494*ab8db090SAndroid Build Coastguard Worker TestKey();
495*ab8db090SAndroid Build Coastguard Worker TestRange();
496*ab8db090SAndroid Build Coastguard Worker TestEntry();
497*ab8db090SAndroid Build Coastguard Worker TestTextTail();
498*ab8db090SAndroid Build Coastguard Worker TestBinaryTail();
499*ab8db090SAndroid Build Coastguard Worker TestHistory();
500*ab8db090SAndroid Build Coastguard Worker TestState();
501*ab8db090SAndroid Build Coastguard Worker
502*ab8db090SAndroid Build Coastguard Worker return 0;
503*ab8db090SAndroid Build Coastguard Worker } catch (const marisa::Exception &ex) {
504*ab8db090SAndroid Build Coastguard Worker std::cerr << ex.what() << std::endl;
505*ab8db090SAndroid Build Coastguard Worker throw;
506*ab8db090SAndroid Build Coastguard Worker }
507