23 #include <glib/gstdio.h>
24 #include <cppcutter.h>
38 void create_key(std::string *key, std::size_t min_length,
39 std::size_t max_length)
41 key->resize(min_length + (std::rand() % (max_length - min_length + 1)));
42 for (std::size_t
i = 0;
i < key->size(); ++
i) {
43 (*key)[
i] =
'0' + (std::rand() % 10);
47 void create_keys(std::vector<std::string> *keys, std::size_t num_keys,
48 std::size_t min_length, std::size_t max_length)
51 std::set<std::string> keyset;
52 while (keyset.size() < num_keys) {
53 create_key(&key, min_length, max_length);
56 std::vector<std::string>(keyset.begin(), keyset.end()).swap(*keys);
57 std::random_shuffle(keys->begin(), keys->end());
61 namespace test_dat_pat
63 const gchar *base_dir = NULL;
68 std::srand(static_cast<unsigned int>(std::time(NULL)));
71 cut_remove_path(base_dir, NULL);
72 g_mkdir_with_parents(base_dir, 0755);
82 cut_remove_path(base_dir, NULL);
88 std::sprintf(path,
"%s/%s.pat", base_dir, filename);
93 std::sprintf(path,
"%s/%s.dat", base_dir, filename);
97 const std::vector<std::string> &keys)
103 cppcut_assert_not_null(pat);
105 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
112 const std::vector<std::string> &keys)
118 cppcut_assert_not_null(dat);
120 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
128 const char *
const filename =
"test_open";
136 cut_assert_not_exist_path(pat_path);
137 cut_assert_not_exist_path(dat_path);
142 cppcut_assert_null(pat);
143 cppcut_assert_null(dat);
145 std::vector<std::string> keys;
146 create_keys(&keys, 1000, 3, 5);
153 cut_assert_exist_path(pat_path);
154 cut_assert_exist_path(dat_path);
159 cppcut_assert_not_null(pat);
160 cppcut_assert_not_null(dat);
168 const char *
const filename =
"test_remove";
170 std::vector<std::string> keys;
186 cut_assert_not_exist_path(pat_path);
187 cut_assert_not_exist_path(dat_path);
198 const char *
const filename =
"test_get";
200 std::vector<std::string> keys;
201 create_keys(&keys, 1000, 3, 5);
206 for (
int i = 0;
i < 1000; ++
i) {
207 create_key(&key, 3, 5);
213 cppcut_assert_equal(pat_id, dat_id);
216 const int pat_length =
219 const int dat_length =
221 cut_assert_equal_memory(pat_key, pat_length, dat_key, dat_length);
231 const char *
const filename =
"test_add";
233 std::vector<std::string> keys;
234 create_keys(&keys, 1000, 3, 5);
239 for (
int i = 0;
i < 1000; ++
i) {
240 create_key(&key, 3, 5);
243 grn_pat_add(&
ctx, pat, key.c_str(), key.length(), NULL, &pat_added);
246 grn_dat_add(&
ctx, dat, key.c_str(), key.length(), NULL, &dat_added);
247 cppcut_assert_equal(pat_id, dat_id);
248 cppcut_assert_equal(pat_added, dat_added);
262 const char *
const filename =
"test_delete_by_id";
269 std::vector<std::string> keys;
270 create_keys(&keys, 1000, 3, 5);
279 for (std::size_t
i = 0;
i < keys.size();
i += 2) {
292 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
307 const char *
const filename =
"test_delete";
314 std::vector<std::string> keys;
315 create_keys(&keys, 1000, 3, 5);
329 for (std::size_t
i = 0;
i < keys.size();
i += 2) {
330 const char *
const ptr = keys[
i].c_str();
331 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
338 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
339 const char *
const ptr = keys[
i].c_str();
340 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
354 const char *
const filename =
"test_scan";
356 std::vector<std::string> keys;
357 create_keys(&keys, 1000, 3, 5);
362 for (
int i = 0;
i < 1000; ++
i) {
363 create_key(&query, 8, 16);
366 const char *pat_rest;
367 const int pat_num_hits =
369 pat_hits, 4, &pat_rest);
372 const char *dat_rest;
373 const int dat_num_hits =
375 dat_hits, 4, &dat_rest);
377 cppcut_assert_equal(pat_num_hits, dat_num_hits);
378 for (
int j = 0; j < pat_num_hits; ++j) {
379 cppcut_assert_equal(pat_hits[j].
id, dat_hits[j].
id);
380 cppcut_assert_equal(pat_hits[j].offset, dat_hits[j].offset);
381 cppcut_assert_equal(pat_hits[j].length, dat_hits[j].length);
383 cppcut_assert_equal(pat_rest, dat_rest);
392 const char *
const filename =
"test_lcp_search";
394 std::vector<std::string> keys;
395 create_keys(&keys, 1000, 3, 5);
400 for (
int i = 0;
i < 1000; ++
i) {
401 create_key(&query, 3, 6);
407 cppcut_assert_equal(pat_id, dat_id);
416 const char *
const filename =
"test_id_cursor";
418 std::vector<std::string> keys;
419 create_keys(&keys, 1000, 3, 5);
424 for (
int i = 0;
i < 1000; ++
i) {
425 grn_id min_id =
static_cast<grn_id>(std::rand() % (keys.size() + 1));
426 grn_id max_id =
static_cast<grn_id>(std::rand() % (keys.size() + 1));
435 std::swap(min_id, max_id);
438 const char *
const min_key =
439 (min_id !=
GRN_ID_NIL) ? keys[min_id - 1].c_str() : NULL;
440 const int min_length =
441 min_key ?
static_cast<int>(keys[min_id - 1].length()) : 0;
442 const char *
const max_key =
443 (max_id !=
GRN_ID_NIL) ? keys[max_id - 1].c_str() : NULL;
444 const int max_length =
445 max_key ?
static_cast<int>(keys[max_id - 1].length()) : 0;
447 const int temp = std::rand();
448 const int offset = temp & 0x0F;
449 const int limit = ((temp & 0xF0) == 0xF0) ? -1 : ((temp & 0xF0) >> 4);
453 (((temp & 0x400) == 0x400) ?
457 &
ctx, pat, min_key, min_length, max_key, max_length,
458 offset, limit, flags);
459 cppcut_assert_not_null(pat_cursor);
462 &
ctx, dat, min_key, min_length, max_key, max_length,
463 offset, limit, flags);
464 cppcut_assert_not_null(dat_cursor);
471 cppcut_assert_equal(pat_id, dat_id);
484 const char *
const filename =
"test_key_cursor";
486 std::vector<std::string> keys;
487 create_keys(&keys, 1000, 3, 5);
493 for (
int i = 0;
i < 1000; ++
i) {
494 create_key(&min_str, 3, 5);
495 create_key(&max_str, 3, 5);
496 if (min_str > max_str) {
497 min_str.swap(max_str);
500 const int temp = std::rand();
501 const int offset = temp & 0x0F;
502 const int limit = ((temp & 0xF0) == 0xF0) ? -1 : ((temp & 0xF0) >> 4);
506 (((temp & 0x400) == 0x400) ?
509 const bool disables_min = !(rand() % 32);
510 const bool disables_max = !(rand() % 32);
514 disables_min ? 0 : min_str.length(),
515 disables_max ? NULL : max_str.c_str(),
516 disables_max ? 0 : max_str.length(),
517 offset, limit, flags);
518 cppcut_assert_not_null(pat_cursor);
522 disables_min ? 0 : min_str.length(),
523 disables_max ? NULL : max_str.c_str(),
524 disables_max ? 0 : max_str.length(),
525 offset, limit, flags);
526 cppcut_assert_not_null(dat_cursor);
533 cppcut_assert_equal(pat_id, dat_id);
546 const char *
const filename =
"test_prefix_cursor";
548 std::vector<std::string> keys;
549 create_keys(&keys, 1000, 3, 5);
554 for (
int i = 0;
i < 1000; ++
i) {
555 create_key(&max_str, 3, 5);
557 const int temp = std::rand();
558 const int offset = temp & 0x03;
559 const int limit = ((temp & 0xF0) == 0xF0) ? -1 : ((temp & 0xF0) >> 4);
563 (((temp & 0x400) == 0x400) ?
566 const int min_length = std::rand() % (max_str.length() + 1);
570 max_str.length(), offset, limit, flags);
571 cppcut_assert_not_null(pat_cursor);
575 max_str.length(), offset, limit, flags);
576 cppcut_assert_not_null(dat_cursor);
583 cppcut_assert_equal(pat_id, dat_id);
596 const char *
const filename =
"test_predictive_cursor";
598 std::vector<std::string> keys;
599 create_keys(&keys, 1000, 3, 5);
604 for (
int i = 0;
i < 1000; ++
i) {
605 create_key(&min_str, 3, 5);
607 const int temp = std::rand();
608 const int offset = temp & 0x0F;
609 const int limit = ((temp & 0xF0) == 0xF0) ? -1 : ((temp & 0xF0) >> 4);
613 (((temp & 0x400) == 0x400) ?
618 NULL, 0, offset, limit, flags);
619 cppcut_assert_not_null(pat_cursor);
623 NULL, 0, offset, limit, flags);
624 cppcut_assert_not_null(dat_cursor);
631 cppcut_assert_equal(pat_id, dat_id);
644 const char *
const filename =
"test_truncate";
646 std::vector<std::string> keys;
647 create_keys(&keys, 1000, 3, 5);
654 cppcut_assert_equal(static_cast<unsigned int>(0),
grn_pat_size(&
ctx, pat));
655 cppcut_assert_equal(static_cast<unsigned int>(0),
grn_dat_size(&
ctx, dat));
657 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
658 const char *
const ptr = keys[
i].c_str();
659 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
660 cppcut_assert_equal(static_cast<grn_id>(
GRN_ID_NIL),
662 cppcut_assert_equal(static_cast<grn_id>(
GRN_ID_NIL),