Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
test-prefix-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>
23 #include <dat/prefix-cursor.hpp>
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("東京")); // 3rd
34  trie->insert("京都", std::strlen("京都")); // 1st
35  trie->insert("東京都", std::strlen("東京都")); // 4th
36  trie->insert("京都府", std::strlen("京都府")); // 2nd
37  trie->insert("東京都庁", std::strlen("東京都庁")); // 5th
38  }
39 }
40 
41 namespace test_dat_prefix_cursor
42 {
43  void test_null(void)
44  {
45  grn::dat::Trie trie;
46  create_trie(&trie);
47 
49  cursor.open(trie, grn::dat::String());
50  cppcut_assert_equal(false, cursor.next().is_valid());
51  }
52 
53  void test_str(void)
54  {
55  grn::dat::Trie trie;
56  create_trie(&trie);
57 
59 
60  cursor.open(trie, grn::dat::String("京都"));
61  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
62  cppcut_assert_equal(false, cursor.next().is_valid());
63 
64  cursor.open(trie, grn::dat::String("京都府"));
65  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
66  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
67  cppcut_assert_equal(false, cursor.next().is_valid());
68 
69  cursor.open(trie, grn::dat::String("東京"));
70  cppcut_assert_equal(grn::dat::UInt32(1), 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(1), 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(1), cursor.next().id());
80  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
81  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
82  cppcut_assert_equal(false, cursor.next().is_valid());
83 
84  cursor.open(trie, grn::dat::String("東京都議会"));
85  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
86  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
87  cppcut_assert_equal(false, cursor.next().is_valid());
88  }
89 
90  void test_min_length(void)
91  {
92  grn::dat::Trie trie;
93  create_trie(&trie);
94 
96 
97  cursor.open(trie, grn::dat::String("東京都庁ビル"), std::strlen(""));
98  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
99  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
100  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
101  cppcut_assert_equal(false, cursor.next().is_valid());
102 
103  cursor.open(trie, grn::dat::String("東京都庁ビル"), std::strlen("東"));
104  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
105  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
106  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
107  cppcut_assert_equal(false, cursor.next().is_valid());
108 
109  cursor.open(trie, grn::dat::String("東京都庁ビル"), std::strlen("東京"));
110  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
111  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
112  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
113  cppcut_assert_equal(false, cursor.next().is_valid());
114 
115  cursor.open(trie, grn::dat::String("東京都庁ビル"), std::strlen("東京都"));
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(false, cursor.next().is_valid());
119 
120  cursor.open(trie, grn::dat::String("東京都庁ビル"),
121  std::strlen("東京都庁"));
122  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
123  cppcut_assert_equal(false, cursor.next().is_valid());
124 
125  cursor.open(trie, grn::dat::String("東京都庁ビル"),
126  std::strlen("東京都庁ビル"));
127  cppcut_assert_equal(false, cursor.next().is_valid());
128  }
129 
130  void test_offset(void)
131  {
132  grn::dat::Trie trie;
133  create_trie(&trie);
134 
135  grn::dat::PrefixCursor cursor;
136 
137  cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 0);
138  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
139  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
140  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
141  cppcut_assert_equal(false, cursor.next().is_valid());
142 
143  cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 1);
144  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
145  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
146  cppcut_assert_equal(false, cursor.next().is_valid());
147 
148  cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 2);
149  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
150  cppcut_assert_equal(false, cursor.next().is_valid());
151 
152  cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 3);
153  cppcut_assert_equal(false, cursor.next().is_valid());
154  }
155 
156  void test_limit(void)
157  {
158  grn::dat::Trie trie;
159  create_trie(&trie);
160 
161  grn::dat::PrefixCursor cursor;
162 
163  cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 0,
165  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
166  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
167  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
168  cppcut_assert_equal(false, cursor.next().is_valid());
169 
170  cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 0, 3);
171  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
172  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
173  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
174  cppcut_assert_equal(false, cursor.next().is_valid());
175 
176  cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 0, 2);
177  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
178  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
179  cppcut_assert_equal(false, cursor.next().is_valid());
180 
181  cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 0, 1);
182  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
183  cppcut_assert_equal(false, cursor.next().is_valid());
184 
185  cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 0, 0);
186  cppcut_assert_equal(false, cursor.next().is_valid());
187 
188  cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 2, 100);
189  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
190  cppcut_assert_equal(false, cursor.next().is_valid());
191 
192  cursor.open(trie, grn::dat::String("東京都庁ビル"), 0, 1, 1);
193  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
194  cppcut_assert_equal(false, cursor.next().is_valid());
195  }
196 
198  {
199  grn::dat::Trie trie;
200  create_trie(&trie);
201 
202  grn::dat::PrefixCursor cursor;
203 
204  cursor.open(trie, grn::dat::String("京都府"), 0,
206  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
207  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
208  cppcut_assert_equal(false, cursor.next().is_valid());
209 
210  cursor.open(trie, grn::dat::String("京都府"), std::strlen("京都"),
212  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
213  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
214  cppcut_assert_equal(false, cursor.next().is_valid());
215 
216  cursor.open(trie, grn::dat::String("京都府"), 0,
218  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
219  cppcut_assert_equal(false, cursor.next().is_valid());
220 
221  cursor.open(trie, grn::dat::String("京都府"), 0,
223  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
224  cppcut_assert_equal(false, cursor.next().is_valid());
225  }
226 
228  {
229  grn::dat::Trie trie;
230  create_trie(&trie);
231 
232  grn::dat::PrefixCursor cursor;
233 
234  cursor.open(trie, grn::dat::String("東京都庁"), 0,
236  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
237  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
238  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
239  cppcut_assert_equal(false, cursor.next().is_valid());
240 
241  cursor.open(trie, grn::dat::String("東京都庁"), std::strlen("東京都"),
243  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
244  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
245  cppcut_assert_equal(false, cursor.next().is_valid());
246 
247  cursor.open(trie, grn::dat::String("東京都庁"), std::strlen("東京都"),
249  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
250  cppcut_assert_equal(false, cursor.next().is_valid());
251 
252  cursor.open(trie, grn::dat::String("東京都庁"), std::strlen("東京都"),
254  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
255  cppcut_assert_equal(false, cursor.next().is_valid());
256 
257  cursor.open(trie, grn::dat::String("東京都庁"), 0,
259  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
260  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
261  cppcut_assert_equal(false, cursor.next().is_valid());
262 
263  cursor.open(trie, grn::dat::String("東京都庁"), 0,
265  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
266  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
267  cppcut_assert_equal(false, cursor.next().is_valid());
268  }
269 
271  {
272  grn::dat::Trie trie;
273  create_trie(&trie);
274 
275  grn::dat::PrefixCursor cursor;
276 
277  cursor.open(trie, grn::dat::String("東京都庁ビル"), 0,
279  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
280  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
281  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
282  cppcut_assert_equal(false, cursor.next().is_valid());
283 
284  cursor.open(trie, grn::dat::String("東京都庁ビル"), std::strlen("東京"),
286  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
287  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
288  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
289  cppcut_assert_equal(false, cursor.next().is_valid());
290 
291  cursor.open(trie, grn::dat::String("東京都庁"), std::strlen("東京"),
293  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
294  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
295  cppcut_assert_equal(false, cursor.next().is_valid());
296 
297  cursor.open(trie, grn::dat::String("京都府"), 0,
299  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
300  cppcut_assert_equal(false, cursor.next().is_valid());
301  }
302 }