Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
test-key-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/key-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("Werdna", std::strlen("Werdna")); // 7th
34  trie->insert("Trebor", std::strlen("Trebor")); // 6th
35  trie->insert("Human", std::strlen("Human")); // 5th
36  trie->insert("Elf", std::strlen("Elf")); // 2nd
37  trie->insert("Dwarf", std::strlen("Dward")); // 1st
38  trie->insert("Gnome", std::strlen("Gnome")); // 3rd
39  trie->insert("Hobbit", std::strlen("Hobbit")); // 4th
40  }
41 }
42 
43 namespace test_dat_key_cursor
44 {
45  void test_null(void)
46  {
47  grn::dat::Trie trie;
48  create_trie(&trie);
49 
50  grn::dat::KeyCursor cursor;
51  cursor.open(trie, grn::dat::String(), grn::dat::String());
52  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
53  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
54  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
55  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
56  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
57  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
58  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
59  cppcut_assert_equal(false, cursor.next().is_valid());
60  }
61 
62  void test_min(void)
63  {
64  grn::dat::Trie trie;
65  create_trie(&trie);
66 
67  grn::dat::KeyCursor cursor;
68 
69  cursor.open(trie, grn::dat::String("Hobbit"), grn::dat::String());
70  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
71  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
72  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
73  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
74  cppcut_assert_equal(false, cursor.next().is_valid());
75 
76  cursor.open(trie, grn::dat::String("T"), grn::dat::String());
77  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
78  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
79  cppcut_assert_equal(false, cursor.next().is_valid());
80 
81  cursor.open(trie, grn::dat::String("Z"), grn::dat::String());
82  cppcut_assert_equal(false, cursor.next().is_valid());
83  }
84 
85  void test_max_by_str(void)
86  {
87  grn::dat::Trie trie;
88  create_trie(&trie);
89 
90  grn::dat::KeyCursor cursor;
91 
92  cursor.open(trie, grn::dat::String(), grn::dat::String("Elf"));
93  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
94  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
95  cppcut_assert_equal(false, cursor.next().is_valid());
96 
97  cursor.open(trie, grn::dat::String(), grn::dat::String("F"));
98  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
99  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
100  cppcut_assert_equal(false, cursor.next().is_valid());
101 
102  cursor.open(trie, grn::dat::String(), grn::dat::String("A"));
103  cppcut_assert_equal(false, cursor.next().is_valid());
104  }
105 
106  void test_min_max(void)
107  {
108  grn::dat::Trie trie;
109  create_trie(&trie);
110 
111  grn::dat::KeyCursor cursor;
112  cursor.open(trie, grn::dat::String("Gnome"), grn::dat::String("Trebor"));
113  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
114  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
115  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
116  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
117  cppcut_assert_equal(false, cursor.next().is_valid());
118  }
119 
120  void test_offset(void)
121  {
122  grn::dat::Trie trie;
123  create_trie(&trie);
124 
125  grn::dat::KeyCursor cursor;
126 
127  cursor.open(trie, grn::dat::String("Hobbit"),
128  grn::dat::String("Trebor"), 0);
129  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
130  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
131  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
132  cppcut_assert_equal(false, cursor.next().is_valid());
133 
134  cursor.open(trie, grn::dat::String(), grn::dat::String(), 5);
135  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
136  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
137  cppcut_assert_equal(false, cursor.next().is_valid());
138 
139  cursor.open(trie, grn::dat::String("Gnome"),
140  grn::dat::String("Trebor"), 2);
141  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
142  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
143  cppcut_assert_equal(false, cursor.next().is_valid());
144 
145  cursor.open(trie, grn::dat::String("Gnome"),
146  grn::dat::String("Trebor"), 100);
147  cppcut_assert_equal(false, cursor.next().is_valid());
148  }
149 
150  void test_limit(void)
151  {
152  grn::dat::Trie trie;
153  create_trie(&trie);
154 
155  grn::dat::KeyCursor cursor;
156 
157  cursor.open(trie, grn::dat::String("Gnome"), grn::dat::String("Werdna"),
159  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
160  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
161  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
162  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
163  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
164  cppcut_assert_equal(false, cursor.next().is_valid());
165 
166  cursor.open(trie, grn::dat::String("Gnome"), grn::dat::String("Werdna"),
167  0, 3);
168  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
169  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
170  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
171  cppcut_assert_equal(false, cursor.next().is_valid());
172 
173  cursor.open(trie, grn::dat::String("A"), grn::dat::String("Z"), 3, 2);
174  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
175  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
176  cppcut_assert_equal(false, cursor.next().is_valid());
177 
178  cursor.open(trie, grn::dat::String("A"), grn::dat::String("Z"), 0, 0);
179  cppcut_assert_equal(false, cursor.next().is_valid());
180  }
181 
183  {
184  grn::dat::Trie trie;
185  create_trie(&trie);
186 
187  grn::dat::KeyCursor cursor;
188 
189  cursor.open(trie, grn::dat::String(), grn::dat::String(),
191  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
192  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
193  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
194  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
195  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
196  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
197  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
198  cppcut_assert_equal(false, cursor.next().is_valid());
199 
200  cursor.open(trie, grn::dat::String("Elf"), grn::dat::String("Human"),
202  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
203  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
204  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
205  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
206  cppcut_assert_equal(false, cursor.next().is_valid());
207 
208  cursor.open(trie, grn::dat::String("Dwarf"), grn::dat::String("Trebor"),
210  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
211  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
212  cppcut_assert_equal(false, cursor.next().is_valid());
213  }
214 
216  {
217  grn::dat::Trie trie;
218  create_trie(&trie);
219 
220  grn::dat::KeyCursor cursor;
221 
222  cursor.open(trie, grn::dat::String(), grn::dat::String(),
224  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
225  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
226  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
227  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
228  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
229  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
230  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
231  cppcut_assert_equal(false, cursor.next().is_valid());
232 
233  cursor.open(trie, grn::dat::String("Elf"), grn::dat::String("Human"),
235  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
236  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
237  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
238  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
239  cppcut_assert_equal(false, cursor.next().is_valid());
240 
241  cursor.open(trie, grn::dat::String("Dwarf"), grn::dat::String("Trebor"),
243  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
244  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
245  cppcut_assert_equal(false, cursor.next().is_valid());
246  }
247 
249  {
250  grn::dat::Trie trie;
251  create_trie(&trie);
252 
253  grn::dat::KeyCursor cursor;
254 
255  cursor.open(trie, grn::dat::String(), grn::dat::String(),
258  cppcut_assert_equal(grn::dat::UInt32(5), cursor.next().id());
259  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
260  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
261  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
262  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
263  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
264  cppcut_assert_equal(grn::dat::UInt32(1), cursor.next().id());
265  cppcut_assert_equal(false, cursor.next().is_valid());
266 
267  cursor.open(trie, grn::dat::String("Dwarf"), grn::dat::String("Werdna"),
270  cppcut_assert_equal(grn::dat::UInt32(4), cursor.next().id());
271  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
272  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
273  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
274  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
275  cppcut_assert_equal(false, cursor.next().is_valid());
276 
277  cursor.open(trie, grn::dat::String("Elf"), grn::dat::String("Trebor"),
279  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
280  cppcut_assert_equal(grn::dat::UInt32(2), cursor.next().id());
281  cppcut_assert_equal(false, cursor.next().is_valid());
282 
283  cursor.open(trie, grn::dat::String("Elf"), grn::dat::String("Trebor"),
285  cppcut_assert_equal(grn::dat::UInt32(7), cursor.next().id());
286  cppcut_assert_equal(grn::dat::UInt32(3), cursor.next().id());
287  cppcut_assert_equal(false, cursor.next().is_valid());
288 
289  cursor.open(trie, grn::dat::String("Fighter"), grn::dat::String("Samurai"),
292  cppcut_assert_equal(grn::dat::UInt32(6), cursor.next().id());
293  cppcut_assert_equal(grn::dat::UInt32(7), 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 }