Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
test-predictive-cursor.cpp
Go to the documentation of this file.
1 /* -*- c-basic-offset: 2; coding: utf-8 -*- */
2 /*
3  Copyright (C) 2011-2012 Brazil
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Lesser General Public
7  License version 2.1 as published by the Free Software Foundation.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Lesser General Public License for more details.
13 
14  You should have received a copy of the GNU Lesser General Public
15  License along with this library; if not, write to the Free Software
16  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18 
19 #include <gcutter.h>
20 #include <cppcutter.h>
21 
22 #include <grn-assertions.h>
24 #include <dat/trie.hpp>
25 
26 #include <cstring>
27 
28 namespace
29 {
30  void create_trie(grn::dat::Trie *trie)
31  {
32  trie->create();
33  trie->insert("北斗", std::strlen("北斗")); // 2nd
34  trie->insert("北斗神拳", std::strlen("北斗神拳")); // 3rd
35  trie->insert("北斗神拳伝承者", std::strlen("北斗神拳伝承者")); // 4th
36  trie->insert("南斗聖拳", std::strlen("南斗聖拳")); // 6th
37  trie->insert("南斗孤鷲拳", std::strlen("南斗孤鷲拳")); // 5th
38  trie->insert("元斗皇拳", std::strlen("元斗皇拳")); // 1st
39  }
40 }
41 
42 namespace test_dat_predictive_cursor
43 {
44  void test_null(void)
45  {
46  grn::dat::Trie trie;
47  create_trie(&trie);
48 
50  cursor.open(trie, grn::dat::String());
51  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
52  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
53  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
54  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
55  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
56  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
57  cppcut_assert_equal(false, cursor.next().is_valid());
58  }
59 
60  void test_str(void)
61  {
62  grn::dat::Trie trie;
63  create_trie(&trie);
64 
66 
67  cursor.open(trie, grn::dat::String("北斗"));
68  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
69  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
70  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
71  cppcut_assert_equal(false, cursor.next().is_valid());
72 
73  cursor.open(trie, grn::dat::String("北斗神拳"));
74  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
75  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
76  cppcut_assert_equal(false, cursor.next().is_valid());
77 
78  cursor.open(trie, grn::dat::String("北斗神拳伝承者"));
79  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
80  cppcut_assert_equal(false, cursor.next().is_valid());
81 
82  cursor.open(trie, grn::dat::String("南斗"));
83  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
84  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
85  cppcut_assert_equal(false, cursor.next().is_valid());
86 
87  cursor.open(trie, grn::dat::String("南斗聖拳"));
88  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
89  cppcut_assert_equal(false, cursor.next().is_valid());
90 
91  cursor.open(trie, grn::dat::String("南斗水鳥拳"));
92  cppcut_assert_equal(false, cursor.next().is_valid());
93 
94  cursor.open(trie, grn::dat::String("元斗"));
95  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
96  cppcut_assert_equal(false, cursor.next().is_valid());
97  }
98 
99  void test_offset(void)
100  {
101  grn::dat::Trie trie;
102  create_trie(&trie);
103 
105 
106  cursor.open(trie, grn::dat::String(), 0);
107  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
108  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
109  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
110  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
111  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
112  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
113  cppcut_assert_equal(false, cursor.next().is_valid());
114 
115  cursor.open(trie, grn::dat::String(), 3);
116  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
117  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
118  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
119  cppcut_assert_equal(false, cursor.next().is_valid());
120 
121  cursor.open(trie, grn::dat::String("北斗"), 2);
122  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
123  cppcut_assert_equal(false, cursor.next().is_valid());
124 
125  cursor.open(trie, grn::dat::String("北斗"), 5);
126  cppcut_assert_equal(false, cursor.next().is_valid());
127  }
128 
129  void test_limit(void)
130  {
131  grn::dat::Trie trie;
132  create_trie(&trie);
133 
135 
136  cursor.open(trie, grn::dat::String(), 0, grn::dat::MAX_UINT32);
137  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
138  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
139  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
140  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
141  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
142  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
143  cppcut_assert_equal(false, cursor.next().is_valid());
144 
145  cursor.open(trie, grn::dat::String(), 0, 4);
146  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
147  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
148  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
149  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
150  cppcut_assert_equal(false, cursor.next().is_valid());
151 
152  cursor.open(trie, grn::dat::String(), 2, 3);
153  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
154  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
155  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
156  cppcut_assert_equal(false, cursor.next().is_valid());
157 
158  cursor.open(trie, grn::dat::String("北斗"), 0, 2);
159  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
160  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
161  cppcut_assert_equal(false, cursor.next().is_valid());
162 
163  cursor.open(trie, grn::dat::String("北斗"), 1, 1);
164  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
165  cppcut_assert_equal(false, cursor.next().is_valid());
166 
167  cursor.open(trie, grn::dat::String("南斗"), 0, 0);
168  cppcut_assert_equal(false, cursor.next().is_valid());
169 
170  cursor.open(trie, grn::dat::String("北斗"), 1, 100);
171  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
172  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
173  cppcut_assert_equal(false, cursor.next().is_valid());
174  }
175 
177  {
178  grn::dat::Trie trie;
179  create_trie(&trie);
180 
182 
183  cursor.open(trie, grn::dat::String(), 0, grn::dat::MAX_UINT32,
185  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
186  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
187  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
188  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
189  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
190  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
191  cppcut_assert_equal(false, cursor.next().is_valid());
192 
193  cursor.open(trie, grn::dat::String(), 3, grn::dat::MAX_UINT32,
195  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
196  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
197  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
198  cppcut_assert_equal(false, cursor.next().is_valid());
199 
200  cursor.open(trie, grn::dat::String(), 3, 2,
202  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
203  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
204  cppcut_assert_equal(false, cursor.next().is_valid());
205 
206  cursor.open(trie, grn::dat::String("北斗"), 0, grn::dat::MAX_UINT32,
208  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
209  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
210  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
211  cppcut_assert_equal(false, cursor.next().is_valid());
212  }
213 
215  {
216  grn::dat::Trie trie;
217  create_trie(&trie);
218 
220 
221  cursor.open(trie, grn::dat::String(), 0, grn::dat::MAX_UINT32,
223  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
224  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
225  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
226  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
227  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
228  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
229  cppcut_assert_equal(false, cursor.next().is_valid());
230 
231  cursor.open(trie, grn::dat::String(), 3, grn::dat::MAX_UINT32,
233  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
234  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
235  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
236  cppcut_assert_equal(false, cursor.next().is_valid());
237 
238  cursor.open(trie, grn::dat::String(), 3, 2,
240  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
241  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
242  cppcut_assert_equal(false, cursor.next().is_valid());
243 
244  cursor.open(trie, grn::dat::String("北斗"), 0, grn::dat::MAX_UINT32,
246  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
247  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
248  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
249  cppcut_assert_equal(false, cursor.next().is_valid());
250 
251  cursor.open(trie, grn::dat::String("北斗"), 2, grn::dat::MAX_UINT32,
253  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
254  cppcut_assert_equal(false, cursor.next().is_valid());
255 
256  cursor.open(trie, grn::dat::String("北斗"), 0, 1,
258  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
259  cppcut_assert_equal(false, cursor.next().is_valid());
260 
261  cursor.open(trie, grn::dat::String("北斗"), 3, grn::dat::MAX_UINT32,
263  cppcut_assert_equal(false, cursor.next().is_valid());
264 
265  cursor.open(trie, grn::dat::String("北斗"), 0, 0,
267  cppcut_assert_equal(false, cursor.next().is_valid());
268  }
269 
271  {
272  grn::dat::Trie trie;
273  create_trie(&trie);
274 
276 
277  cursor.open(trie, grn::dat::String(), 0, grn::dat::MAX_UINT32,
279  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
280  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
281  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
282  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
283  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
284  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
285  cppcut_assert_equal(false, cursor.next().is_valid());
286 
287  cursor.open(trie, grn::dat::String("北"), 0, grn::dat::MAX_UINT32,
289  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
290  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
291  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
292  cppcut_assert_equal(false, cursor.next().is_valid());
293 
294  cursor.open(trie, grn::dat::String("北斗"), 0, grn::dat::MAX_UINT32,
296  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
297  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
298  cppcut_assert_equal(false, cursor.next().is_valid());
299 
300  cursor.open(trie, grn::dat::String("北斗神"), 0, grn::dat::MAX_UINT32,
302  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
303  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
304  cppcut_assert_equal(false, cursor.next().is_valid());
305 
306  cursor.open(trie, grn::dat::String("北斗神拳"), 0, grn::dat::MAX_UINT32,
308  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
309  cppcut_assert_equal(false, cursor.next().is_valid());
310 
311  cursor.open(trie, grn::dat::String("北斗神拳伝承"), 0,
313  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
314  cppcut_assert_equal(false, cursor.next().is_valid());
315 
316  cursor.open(trie, grn::dat::String("北斗神拳伝承者"), 0,
318  cppcut_assert_equal(false, cursor.next().is_valid());
319 
320  cursor.open(trie, grn::dat::String("北斗"), 1, grn::dat::MAX_UINT32,
322  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
323  cppcut_assert_equal(false, cursor.next().is_valid());
324 
325  cursor.open(trie, grn::dat::String("北斗"), 0, 1,
327  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
328  cppcut_assert_equal(false, cursor.next().is_valid());
329  }
330 }