22 #include <glib/gstdio.h>
23 #include <cppcutter.h>
45 void create_key(std::string *key, std::size_t min_length,
46 std::size_t max_length)
48 key->resize(min_length + (std::rand() % (max_length - min_length + 1)));
49 for (std::size_t
i = 0;
i < key->size(); ++
i) {
50 (*key)[
i] =
'0' + (std::rand() % 10);
54 void create_keys(std::vector<std::string> *keys, std::size_t num_keys,
55 std::size_t min_length, std::size_t max_length)
58 std::set<std::string> keyset;
59 while (keyset.size() < num_keys) {
60 create_key(&key, min_length, max_length);
63 std::vector<std::string>(keyset.begin(), keyset.end()).swap(*keys);
64 std::random_shuffle(keys->begin(), keys->end());
68 #define ENABLE_API APIScope api_scope(&ctx);
78 std::srand(static_cast<unsigned int>(std::time(NULL)));
81 cut_remove_path(base_dir, NULL);
82 g_mkdir_with_parents(base_dir, 0755);
96 cut_remove_path(base_dir, NULL);
101 unsigned int flags = 0) {
104 cppcut_assert_not_null(dat);
105 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
106 const char *
const ptr = keys[
i].c_str();
107 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
110 cppcut_assert_not_equal(static_cast<const grn_id>(
GRN_ID_NIL),
112 cut_assert_true(added);
119 std::vector<std::string> keys;
120 create_keys(&keys, 1000, 6, 15);
132 std::sprintf(dat_path,
"%s/%s", base_dir,
"test_create_with_path.tmp");
134 std::vector<std::string> keys;
135 create_keys(&keys, 1000, 6, 15);
144 std::sprintf(dat_path,
"%s/%s", base_dir,
"test_open.tmp");
146 std::vector<std::string> keys;
147 create_keys(&keys, 1000, 6, 15);
151 cppcut_assert_not_null(dat2);
152 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
153 const char *
const ptr = keys[
i].c_str();
154 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
155 cppcut_assert_equal(static_cast<grn_id>(
i + 1),
168 std::sprintf(dat_path,
"%s/%s", base_dir,
"test_remove.tmp");
175 std::vector<std::string> keys;
176 create_keys(&keys, 1000, 6, 15);
182 const uint32_t last_file_id = dat->
file_id;
183 cppcut_assert_equal(static_cast<uint32_t>(4), last_file_id);
187 cut_assert_not_exist_path(dat_path);
189 for (uint32_t
i = 1;
i <= last_file_id; ++
i) {
190 std::sprintf(trie_path,
"%s.%03d", dat_path,
i);
191 cut_assert_not_exist_path(trie_path);
201 std::vector<std::string> keys;
202 create_keys(&keys, 1000, 6, 15);
205 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
206 const char *
const ptr = keys[
i].c_str();
207 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
208 cppcut_assert_equal(static_cast<grn_id>(
i + 1),
216 std::vector<std::string> keys;
217 create_keys(&keys, 1000, 6, 15);
220 cppcut_assert_equal(static_cast<grn_id>(
GRN_ID_NIL),
228 std::vector<std::string> keys;
229 create_keys(&keys, 1000, 6, 15);
232 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
234 const int length =
static_cast<int>(keys[
i].length());
237 const int key_length =
239 cppcut_assert_equal(length, key_length);
240 cppcut_assert_equal(keys[
i], std::string(key_buf, key_length));
251 std::vector<std::string> keys;
252 create_keys(&keys, 1000, 6, 15);
255 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
257 const int length =
static_cast<int>(keys[
i].length());
260 const char *
const key_ptr =
262 cppcut_assert_not_null(key_ptr);
263 cppcut_assert_equal(length, static_cast<int>(key_length));
266 cppcut_assert_equal(key_ptr, bulk.
u.
b.head);
267 cppcut_assert_equal(length,
268 static_cast<int>(bulk.
u.
b.curr - bulk.
u.
b.head));
281 std::vector<std::string> keys;
282 create_keys(&keys, 1000, 6, 15);
285 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
287 const int length =
static_cast<int>(keys[
i].length());
290 const char *
const key_ptr =
292 cppcut_assert_not_null(key_ptr);
293 cppcut_assert_equal(length, static_cast<int>(key_length));
297 cppcut_assert_equal(length, static_cast<int>(
GRN_TEXT_LEN(&bulk)));
298 cppcut_assert_equal(keys[
i],
309 std::vector<std::string> keys;
310 create_keys(&keys, 1000, 6, 15);
313 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
320 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
321 const char *
const ptr = keys[
i].c_str();
322 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
324 cppcut_assert_equal(static_cast<grn_id>(keys.size() -
i),
326 cut_assert_true(added);
328 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
340 std::vector<std::string> keys;
341 create_keys(&keys, 1000, 6, 15);
344 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
345 const char *
const ptr = keys[
i].c_str();
346 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
352 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
353 const char *
const ptr = keys[
i].c_str();
354 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
356 cppcut_assert_equal(static_cast<grn_id>(keys.size() -
i),
358 cut_assert_true(added);
360 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
361 const char *
const ptr = keys[
i].c_str();
362 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
373 std::vector<std::string> keys;
374 create_keys(&keys, 1000, 6, 15);
378 cppcut_assert_not_null(dat);
379 for (std::size_t
i = 0;
i < (keys.size() / 2); ++
i) {
380 const char *
const ptr = keys[
i].c_str();
381 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
382 cppcut_assert_equal(static_cast<grn_id>(
i + 1),
387 for (std::size_t
i = (keys.size() / 2);
i < keys.size(); ++
i) {
388 const grn_id key_id =
static_cast<grn_id>(
i + 1 - (keys.size() / 2));
389 const char *
const src_ptr = keys[
i - (keys.size() / 2)].c_str();
390 const uint32_t src_length =
391 static_cast<uint32_t
>(keys[
i - (keys.size() / 2)].length());
392 const char *
const dest_ptr = keys[
i].c_str();
393 const uint32_t dest_length =
static_cast<uint32_t
>(keys[
i].length());
396 cppcut_assert_equal(static_cast<grn_id>(
GRN_ID_NIL),
398 cppcut_assert_equal(key_id,
403 for (std::size_t
i = 0;
i < (keys.size() / 2); ++
i) {
405 const char *src_ptr = keys[
i + (keys.size() / 2)].c_str();
406 const uint32_t src_length =
407 static_cast<uint32_t
>(keys[
i + (keys.size() / 2)].length());
408 const char *
const dest_ptr = keys[
i].c_str();
409 const uint32_t dest_length =
static_cast<uint32_t
>(keys[
i].length());
412 cppcut_assert_equal(static_cast<grn_id>(
GRN_ID_NIL),
414 cppcut_assert_equal(key_id,
424 std::vector<std::string> keys;
425 create_keys(&keys, 1000, 6, 15);
429 cppcut_assert_not_null(dat);
430 for (std::size_t
i = 0;
i < (keys.size() / 2); ++
i) {
431 const char *
const ptr = keys[
i].c_str();
432 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
433 cppcut_assert_equal(static_cast<grn_id>(
i + 1),
438 for (std::size_t
i = (keys.size() / 2);
i < keys.size(); ++
i) {
439 const grn_id key_id =
static_cast<grn_id>(
i + 1 - (keys.size() / 2));
440 const char *
const src_ptr = keys[
i - (keys.size() / 2)].c_str();
441 const uint32_t src_length =
442 static_cast<uint32_t
>(keys[
i - (keys.size() / 2)].length());
443 const char *
const dest_ptr = keys[
i].c_str();
444 const uint32_t dest_length =
static_cast<uint32_t
>(keys[
i].length());
447 dest_ptr, dest_length));
448 cppcut_assert_equal(static_cast<grn_id>(
GRN_ID_NIL),
450 cppcut_assert_equal(key_id,
454 dest_ptr, dest_length));
456 for (std::size_t
i = 0;
i < (keys.size() / 2); ++
i) {
458 const char *src_ptr = keys[
i + (keys.size() / 2)].c_str();
459 const uint32_t src_length =
460 static_cast<uint32_t
>(keys[
i + (keys.size() / 2)].length());
461 const char *
const dest_ptr = keys[
i].c_str();
462 const uint32_t dest_length =
static_cast<uint32_t
>(keys[
i].length());
465 dest_ptr, dest_length));
466 cppcut_assert_equal(static_cast<grn_id>(
GRN_ID_NIL),
468 cppcut_assert_equal(key_id,
472 dest_ptr, dest_length));
480 std::vector<std::string> keys;
481 keys.push_back(
"12");
482 keys.push_back(
"234");
483 keys.push_back(
"45");
484 keys.push_back(
"789");
486 const char text[] =
"0123456789X";
487 const unsigned int text_size =
sizeof(text) - 1;
489 const unsigned int max_num_scan_hits =
490 sizeof(scan_hits) /
sizeof(scan_hits[0]);
494 const char *text_rest;
495 cppcut_assert_equal(3,
497 scan_hits, max_num_scan_hits, &text_rest));
498 cppcut_assert_equal(text + text_size, text_rest);
499 cppcut_assert_equal(static_cast<grn_id>(1), scan_hits[0].
id);
500 cppcut_assert_equal(1U, scan_hits[0].offset);
501 cppcut_assert_equal(2U, scan_hits[0].length);
502 cppcut_assert_equal(static_cast<grn_id>(3), scan_hits[1].
id);
503 cppcut_assert_equal(4U, scan_hits[1].offset);
504 cppcut_assert_equal(2U, scan_hits[1].length);
505 cppcut_assert_equal(static_cast<grn_id>(4), scan_hits[2].
id);
506 cppcut_assert_equal(7U, scan_hits[2].offset);
507 cppcut_assert_equal(3U, scan_hits[2].length);
509 cppcut_assert_equal(1,
511 cppcut_assert_equal(static_cast<std::ptrdiff_t>(3), text_rest - text);
512 cppcut_assert_equal(1,
514 scan_hits, 1, &text_rest));
515 cppcut_assert_equal(static_cast<std::ptrdiff_t>(6), text_rest - text);
516 cppcut_assert_equal(1,
518 scan_hits, 1, &text_rest));
519 cppcut_assert_equal(static_cast<std::ptrdiff_t>(10), text_rest - text);
520 cppcut_assert_equal(0,
522 scan_hits, 1, &text_rest));
528 std::vector<std::string> keys;
529 keys.push_back(
"ユニグラム");
530 keys.push_back(
"グラム");
532 const char text[] =
"ユニ㌘…ハ゛イク゛ラム";
533 const unsigned int text_size =
sizeof(text) - 1;
535 const unsigned int max_num_scan_hits =
536 sizeof(scan_hits) /
sizeof(scan_hits[0]);
540 const char *text_rest;
541 cppcut_assert_equal(2,
543 scan_hits, max_num_scan_hits, &text_rest));
544 cppcut_assert_equal(text + text_size, text_rest);
545 cppcut_assert_equal(static_cast<grn_id>(1), scan_hits[0].
id);
546 cppcut_assert_equal(0U, scan_hits[0].offset);
547 cppcut_assert_equal(9U, scan_hits[0].length);
548 cppcut_assert_equal(static_cast<grn_id>(2), scan_hits[1].
id);
549 cppcut_assert_equal(21U, scan_hits[1].offset);
550 cppcut_assert_equal(12U, scan_hits[1].length);
552 cppcut_assert_equal(1,
554 cppcut_assert_equal(static_cast<std::ptrdiff_t>(9), text_rest - text);
555 cppcut_assert_equal(1,
557 scan_hits, 1, &text_rest));
558 cppcut_assert_equal(static_cast<std::ptrdiff_t>(33), text_rest - text);
559 cppcut_assert_equal(0,
561 scan_hits, 1, &text_rest));
567 std::vector<std::string> keys;
568 create_keys(&keys, 1000, 6, 15);
571 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
573 const char *
const ptr = keys[
i].c_str();
574 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
576 cppcut_assert_equal(1,
578 cppcut_assert_equal(key_id, scan_hits[0].
id);
579 cppcut_assert_equal(0U, scan_hits[0].offset);
580 cppcut_assert_equal(length, scan_hits[0].length);
589 std::vector<std::string> keys;
590 keys.push_back(
"012");
591 keys.push_back(
"01234");
592 keys.push_back(
"0123456");
595 cppcut_assert_equal(static_cast<grn_id>(
GRN_ID_NIL),
597 cppcut_assert_equal(static_cast<grn_id>(1),
599 cppcut_assert_equal(static_cast<grn_id>(1),
601 cppcut_assert_equal(static_cast<grn_id>(2),
603 cppcut_assert_equal(static_cast<grn_id>(2),
605 cppcut_assert_equal(static_cast<grn_id>(3),
607 cppcut_assert_equal(static_cast<grn_id>(3),
609 cppcut_assert_equal(static_cast<grn_id>(
GRN_ID_NIL),
614 std::vector<std::string> keys;
615 create_keys(&keys, 1000, 6, 15);
618 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
620 const char *
const ptr = keys[
i].c_str();
621 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
622 cppcut_assert_equal(key_id,
631 std::vector<std::string> keys;
632 create_keys(&keys, 1000, 6, 15);
635 cppcut_assert_equal(static_cast<unsigned int>(keys.size()),
644 cppcut_assert_not_null(dat);
648 for (uint32_t
i = 1;
i <= 1000; ++
i) {
650 create_key(&key, 1, 3);
656 cppcut_assert_equal(max_key_id, key_id);
665 std::sprintf(dat_path,
"%s/%s", base_dir,
"test_truncate");
667 std::vector<std::string> keys;
668 create_keys(&keys, 1000, 6, 15);
672 cppcut_assert_equal(static_cast<unsigned int>(0),
grn_dat_size(&
ctx, dat));
674 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
675 const char *
const ptr = keys[
i].c_str();
676 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
677 cppcut_assert_equal(static_cast<grn_id>(
GRN_ID_NIL),
685 std::vector<std::string> keys;
686 create_keys(&keys, 1000, 6, 15);
689 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
691 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
693 const char *
const key_ptr =
695 cppcut_assert_not_null(key_ptr);
696 cppcut_assert_equal(length, key_length);
697 cppcut_assert_equal(keys[
i], std::string(key_ptr, key_length));
705 std::vector<std::string> keys;
706 create_keys(&keys, 1000, 6, 15);
709 for (std::size_t
i = 0;
i < keys.size();
i += 2) {
714 for (std::size_t
i = 0;
i < (keys.size() - 1); ++
i) {
722 cppcut_assert_equal(static_cast<grn_id>(
GRN_ID_NIL),
729 std::vector<std::string> keys;
730 create_keys(&keys, 1000, 6, 15);
733 for (std::size_t
i = 0;
i < keys.size();
i += 2) {
738 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
741 cppcut_assert_equal(static_cast<grn_id>(
GRN_ID_NIL),
753 std::sprintf(dat_path,
"%s/%s", base_dir,
"test_repair");
755 std::vector<std::string> keys;
756 create_keys(&keys, 1000, 6, 15);
761 cppcut_assert_equal(static_cast<unsigned int>(keys.size()),
763 cppcut_assert_equal(static_cast<grn_id>(keys.size()),
766 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
767 const char *
const ptr = keys[
i].c_str();
768 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
769 cppcut_assert_equal(static_cast<grn_id>(
i + 1),
773 for (std::size_t
i = 0;
i < keys.size();
i += 2) {
778 cppcut_assert_equal(static_cast<unsigned int>(keys.size() / 2),
781 for (std::size_t
i = 0;
i < keys.size();
i += 2) {
782 const char *
const ptr = keys[
i].c_str();
783 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
785 cppcut_assert_equal(static_cast<grn_id>(
i + 1),
787 cppcut_assert_equal(1, added);
790 cppcut_assert_equal(static_cast<unsigned int>(keys.size()),
793 for (std::size_t
i = 0;
i < keys.size(); ++
i) {
794 const char *
const ptr = keys[
i].c_str();
795 const uint32_t length =
static_cast<uint32_t
>(keys[
i].length());
796 cppcut_assert_equal(static_cast<grn_id>(
i + 1),