1 #include <sstream>
2 #include <string>
3
4 #include <marisa_alpha/tail.h>
5
6 #include "assert.h"
7
8 namespace {
9
TestBinaryTail()10 void TestBinaryTail() {
11 TEST_START();
12
13 marisa_alpha::Tail tail;
14
15 ASSERT(tail.size() == 0);
16 ASSERT(tail.empty());
17 ASSERT(tail.total_size() == sizeof(marisa_alpha::UInt32));
18
19 marisa_alpha::Vector<marisa_alpha::String> keys;
20 tail.build(keys, NULL, MARISA_ALPHA_BINARY_TAIL);
21
22 ASSERT(tail.size() == 0);
23 ASSERT(tail.empty());
24 ASSERT(tail.total_size() == sizeof(marisa_alpha::UInt32));
25
26 keys.push_back(marisa_alpha::String(""));
27 marisa_alpha::Vector<marisa_alpha::UInt32> offsets;
28 tail.build(keys, &offsets, MARISA_ALPHA_BINARY_TAIL);
29
30 ASSERT(tail.size() == 1);
31 ASSERT(tail.mode() == MARISA_ALPHA_BINARY_TAIL);
32 ASSERT(!tail.empty());
33 ASSERT(tail.total_size() == (sizeof(marisa_alpha::UInt32) + tail.size()));
34 ASSERT(offsets.size() == keys.size() + 1);
35 ASSERT(offsets[0] == 1);
36 ASSERT(offsets[1] == tail.size());
37
38 const char binary_key[] = { 'N', 'P', '\0', 'T', 'r', 'i', 'e' };
39 keys[0] = marisa_alpha::String(binary_key, sizeof(binary_key));
40 tail.build(keys, &offsets, MARISA_ALPHA_TEXT_TAIL);
41
42 ASSERT(tail.size() == sizeof(binary_key) + 1);
43 ASSERT(tail.mode() == MARISA_ALPHA_BINARY_TAIL);
44 ASSERT(!tail.empty());
45 ASSERT(tail.total_size() == (sizeof(marisa_alpha::UInt32) + tail.size()));
46 ASSERT(offsets.size() == keys.size() + 1);
47 ASSERT(offsets[0] == 1);
48 ASSERT(offsets[1] == tail.size());
49
50 tail.build(keys, &offsets, MARISA_ALPHA_BINARY_TAIL);
51
52 ASSERT(tail.size() == sizeof(binary_key) + 1);
53 ASSERT(tail.mode() == MARISA_ALPHA_BINARY_TAIL);
54 ASSERT(!tail.empty());
55 ASSERT(tail.total_size() == (sizeof(marisa_alpha::UInt32) + tail.size()));
56 ASSERT(offsets.size() == keys.size() + 1);
57 ASSERT(offsets[0] == 1);
58 ASSERT(offsets[1] == tail.size());
59
60 keys.clear();
61 keys.push_back(marisa_alpha::String("abc"));
62 keys.push_back(marisa_alpha::String("bc"));
63 keys.push_back(marisa_alpha::String("abc"));
64 keys.push_back(marisa_alpha::String("c"));
65 keys.push_back(marisa_alpha::String("ABC"));
66 keys.push_back(marisa_alpha::String("AB"));
67
68 tail.build(keys, NULL, MARISA_ALPHA_BINARY_TAIL);
69
70 ASSERT(tail.size() == 15);
71 ASSERT(tail.mode() == MARISA_ALPHA_BINARY_TAIL);
72 ASSERT(!tail.empty());
73 ASSERT(tail.total_size() == (sizeof(marisa_alpha::UInt32) + tail.size()));
74
75 tail.build(keys, &offsets, MARISA_ALPHA_BINARY_TAIL);
76
77 ASSERT(tail.size() == 15);
78 ASSERT(tail.mode() == MARISA_ALPHA_BINARY_TAIL);
79 ASSERT(!tail.empty());
80 ASSERT(tail.total_size() == (sizeof(marisa_alpha::UInt32) + tail.size()));
81 ASSERT(offsets.size() == 7);
82 for (marisa_alpha::UInt32 i = 0; i < keys.size(); ++i) {
83 ASSERT(marisa_alpha::String(
84 reinterpret_cast<const char *>(tail[offsets[i]]),
85 offsets[i + 1] - offsets[i]) == keys[i]);
86 }
87
88 tail.save("tail-test.dat");
89 tail.clear();
90
91 ASSERT(tail.size() == 0);
92 ASSERT(tail.empty());
93 ASSERT(tail.total_size() == sizeof(marisa_alpha::UInt32));
94
95 marisa_alpha::Mapper mapper;
96 tail.mmap(&mapper, "tail-test.dat");
97
98 ASSERT(tail.size() == 15);
99 ASSERT(tail.mode() == MARISA_ALPHA_BINARY_TAIL);
100 ASSERT(!tail.empty());
101 ASSERT(tail.total_size() == (sizeof(marisa_alpha::UInt32) + tail.size()));
102 for (marisa_alpha::UInt32 i = 0; i < keys.size(); ++i) {
103 ASSERT(marisa_alpha::String(
104 reinterpret_cast<const char *>(tail[offsets[i]]),
105 offsets[i + 1] - offsets[i]) == keys[i]);
106 }
107
108 tail.clear();
109 tail.load("tail-test.dat");
110
111 ASSERT(tail.size() == 15);
112 ASSERT(tail.mode() == MARISA_ALPHA_BINARY_TAIL);
113 ASSERT(!tail.empty());
114 ASSERT(tail.total_size() == (sizeof(marisa_alpha::UInt32) + tail.size()));
115 for (marisa_alpha::UInt32 i = 0; i < keys.size(); ++i) {
116 ASSERT(marisa_alpha::String(
117 reinterpret_cast<const char *>(tail[offsets[i]]),
118 offsets[i + 1] - offsets[i]) == keys[i]);
119 }
120
121 std::stringstream stream;
122 tail.write(stream);
123
124 tail.clear();
125 tail.read(stream);
126
127 ASSERT(tail.size() == 15);
128 ASSERT(tail.mode() == MARISA_ALPHA_BINARY_TAIL);
129 ASSERT(!tail.empty());
130 ASSERT(tail.total_size() == (sizeof(marisa_alpha::UInt32) + tail.size()));
131 for (marisa_alpha::UInt32 i = 0; i < keys.size(); ++i) {
132 ASSERT(marisa_alpha::String(
133 reinterpret_cast<const char *>(tail[offsets[i]]),
134 offsets[i + 1] - offsets[i]) == keys[i]);
135 }
136
137 TEST_END();
138 }
139
TestTextTail()140 void TestTextTail() {
141 TEST_START();
142
143 marisa_alpha::Tail tail;
144 marisa_alpha::Vector<marisa_alpha::String> keys;
145 tail.build(keys, NULL, MARISA_ALPHA_TEXT_TAIL);
146
147 ASSERT(tail.size() == 0);
148 ASSERT(tail.empty());
149 ASSERT(tail.total_size() == sizeof(marisa_alpha::UInt32));
150
151 keys.push_back(marisa_alpha::String(""));
152 marisa_alpha::Vector<marisa_alpha::UInt32> offsets;
153 tail.build(keys, &offsets, MARISA_ALPHA_TEXT_TAIL);
154
155 ASSERT(tail.size() == 2);
156 ASSERT(tail.mode() == MARISA_ALPHA_TEXT_TAIL);
157 ASSERT(!tail.empty());
158 ASSERT(tail.total_size() == (sizeof(marisa_alpha::UInt32) + tail.size()));
159 ASSERT(offsets.size() == keys.size());
160 ASSERT(offsets[0] == 1);
161 ASSERT(*tail[offsets[0]] == '\0');
162
163 keys.clear();
164 keys.push_back(marisa_alpha::String("abc"));
165 keys.push_back(marisa_alpha::String("bc"));
166 keys.push_back(marisa_alpha::String("abc"));
167 keys.push_back(marisa_alpha::String("c"));
168 keys.push_back(marisa_alpha::String("ABC"));
169 keys.push_back(marisa_alpha::String("AB"));
170
171 tail.build(keys, NULL, MARISA_ALPHA_TEXT_TAIL);
172
173 ASSERT(tail.size() == 12);
174 ASSERT(tail.mode() == MARISA_ALPHA_TEXT_TAIL);
175 ASSERT(!tail.empty());
176 ASSERT(tail.total_size() == (sizeof(marisa_alpha::UInt32) + tail.size()));
177
178 tail.build(keys, &offsets, MARISA_ALPHA_TEXT_TAIL);
179
180 ASSERT(tail.size() == 12);
181 ASSERT(tail.mode() == MARISA_ALPHA_TEXT_TAIL);
182 ASSERT(!tail.empty());
183 ASSERT(tail.total_size() == (sizeof(marisa_alpha::UInt32) + tail.size()));
184 ASSERT(offsets.size() == keys.size());
185 for (marisa_alpha::UInt32 i = 0; i < keys.size(); ++i) {
186 ASSERT(marisa_alpha::String(reinterpret_cast<const char *>(
187 tail[offsets[i]])) == keys[i]);
188 }
189
190 tail.save("tail-test.dat");
191 tail.clear();
192
193 ASSERT(tail.size() == 0);
194 ASSERT(tail.empty());
195 ASSERT(tail.total_size() == sizeof(marisa_alpha::UInt32));
196
197 marisa_alpha::Mapper mapper;
198 tail.mmap(&mapper, "tail-test.dat");
199
200 ASSERT(tail.size() == 12);
201 ASSERT(tail.mode() == MARISA_ALPHA_TEXT_TAIL);
202 ASSERT(!tail.empty());
203 ASSERT(tail.total_size() == sizeof(marisa_alpha::UInt32) + tail.size());
204 for (marisa_alpha::UInt32 i = 0; i < keys.size(); ++i) {
205 ASSERT(marisa_alpha::String(reinterpret_cast<const char *>(
206 tail[offsets[i]])) == keys[i]);
207 }
208
209 tail.clear();
210 tail.load("tail-test.dat");
211
212 ASSERT(tail.size() == 12);
213 ASSERT(tail.mode() == MARISA_ALPHA_TEXT_TAIL);
214 ASSERT(!tail.empty());
215 ASSERT(tail.total_size() == sizeof(marisa_alpha::UInt32) + tail.size());
216 for (marisa_alpha::UInt32 i = 0; i < keys.size(); ++i) {
217 ASSERT(marisa_alpha::String(reinterpret_cast<const char *>(
218 tail[offsets[i]])) == keys[i]);
219 }
220
221 std::stringstream stream;
222 tail.write(stream);
223
224 tail.clear();
225 tail.read(stream);
226
227 ASSERT(tail.size() == 12);
228 ASSERT(tail.mode() == MARISA_ALPHA_TEXT_TAIL);
229 ASSERT(!tail.empty());
230 ASSERT(tail.total_size() == sizeof(marisa_alpha::UInt32) + tail.size());
231 for (marisa_alpha::UInt32 i = 0; i < keys.size(); ++i) {
232 ASSERT(marisa_alpha::String(reinterpret_cast<const char *>(
233 tail[offsets[i]])) == keys[i]);
234 }
235
236 TEST_END();
237 }
238
239 } // namespace
240
main()241 int main() {
242 TestBinaryTail();
243 TestTextTail();
244
245 return 0;
246 }
247