null+****@clear*****
null+****@clear*****
2012年 1月 10日 (火) 14:41:24 JST
Susumu Yata 2012-01-10 14:41:24 +0900 (Tue, 10 Jan 2012)
New Revision: e4b44e41630f94c21d1c36ea6a9026e8436e7526
Log:
added a test of grn_dat_scan().
Modified files:
test/unit/core/dat/test-dat.cpp
Modified: test/unit/core/dat/test-dat.cpp (+112 -2)
===================================================================
--- test/unit/core/dat/test-dat.cpp 2012-01-10 14:40:55 +0900 (0f58e23)
+++ test/unit/core/dat/test-dat.cpp 2012-01-10 14:41:24 +0900 (6b24da3)
@@ -82,8 +82,10 @@ namespace test_dat
}
}
- grn_dat *create_trie(const std::vector<std::string> &keys, const char *path) {
- grn_dat * const dat = grn_dat_create(&ctx, path, 0, 0, GRN_OBJ_KEY_VAR_SIZE);
+ grn_dat *create_trie(const std::vector<std::string> &keys, const char *path,
+ unsigned int flags = 0) {
+ flags |= GRN_OBJ_KEY_VAR_SIZE;
+ grn_dat * const dat = grn_dat_create(&ctx, path, 0, 0, flags);
cppcut_assert_not_null(dat);
for (std::size_t i = 0; i < keys.size(); ++i) {
const char * const ptr = keys[i].c_str();
@@ -424,6 +426,114 @@ namespace test_dat
cppcut_assert_equal(GRN_SUCCESS, grn_dat_close(&ctx, dat));
}
+ void test_scan(void)
+ {
+ {
+ std::vector<std::string> keys;
+ keys.push_back("12");
+ keys.push_back("234");
+ keys.push_back("45");
+ keys.push_back("789");
+
+ const char text[] = "0123456789X";
+ const unsigned int text_size = sizeof(text) - 1;
+ grn_dat_scan_hit scan_hits[4];
+ const unsigned int max_num_scan_hits = sizeof(scan_hits) / sizeof(scan_hits[0]);
+
+ grn_dat * const dat = create_trie(keys, NULL);
+
+ const char *text_rest;
+ cppcut_assert_equal(3,
+ grn_dat_scan(&ctx, dat, text, text_size,
+ scan_hits, max_num_scan_hits, &text_rest));
+ cppcut_assert_equal(text + text_size, text_rest);
+ cppcut_assert_equal(static_cast<grn_id>(1), scan_hits[0].id);
+ cppcut_assert_equal(1U, scan_hits[0].offset);
+ cppcut_assert_equal(2U, scan_hits[0].length);
+ cppcut_assert_equal(static_cast<grn_id>(3), scan_hits[1].id);
+ cppcut_assert_equal(4U, scan_hits[1].offset);
+ cppcut_assert_equal(2U, scan_hits[1].length);
+ cppcut_assert_equal(static_cast<grn_id>(4), scan_hits[2].id);
+ cppcut_assert_equal(7U, scan_hits[2].offset);
+ cppcut_assert_equal(3U, scan_hits[2].length);
+
+ cppcut_assert_equal(1,
+ grn_dat_scan(&ctx, dat, text, text_size,
+ scan_hits, 1, &text_rest));
+ cppcut_assert_equal(static_cast<std::ptrdiff_t>(3), text_rest - text);
+ cppcut_assert_equal(1,
+ grn_dat_scan(&ctx, dat, text_rest, text_size - (text_rest - text),
+ scan_hits, 1, &text_rest));
+ cppcut_assert_equal(static_cast<std::ptrdiff_t>(6), text_rest - text);
+ cppcut_assert_equal(1,
+ grn_dat_scan(&ctx, dat, text_rest, text_size - (text_rest - text),
+ scan_hits, 1, &text_rest));
+ cppcut_assert_equal(static_cast<std::ptrdiff_t>(10), text_rest - text);
+ cppcut_assert_equal(0,
+ grn_dat_scan(&ctx, dat, text_rest, text_size - (text_rest - text),
+ scan_hits, 1, &text_rest));
+
+ cppcut_assert_equal(GRN_SUCCESS, grn_dat_close(&ctx, dat));
+ }
+
+ {
+ std::vector<std::string> keys;
+ keys.push_back("ユニグラム");
+ keys.push_back("グラム");
+
+ const char text[] = "ユニ㌘ハ゛イク゛ラム";
+ const unsigned int text_size = sizeof(text) - 1;
+ grn_dat_scan_hit scan_hits[4];
+ const unsigned int max_num_scan_hits = sizeof(scan_hits) / sizeof(scan_hits[0]);
+
+ grn_dat * const dat = create_trie(keys, NULL, GRN_OBJ_KEY_NORMALIZE);
+
+ const char *text_rest;
+ cppcut_assert_equal(2,
+ grn_dat_scan(&ctx, dat, text, text_size,
+ scan_hits, max_num_scan_hits, &text_rest));
+ cppcut_assert_equal(text + text_size, text_rest);
+ cppcut_assert_equal(static_cast<grn_id>(1), scan_hits[0].id);
+ cppcut_assert_equal(0U, scan_hits[0].offset);
+ cppcut_assert_equal(9U, scan_hits[0].length);
+ cppcut_assert_equal(static_cast<grn_id>(2), scan_hits[1].id);
+ cppcut_assert_equal(18U, scan_hits[1].offset);
+ cppcut_assert_equal(12U, scan_hits[1].length);
+
+ cppcut_assert_equal(1,
+ grn_dat_scan(&ctx, dat, text, text_size,
+ scan_hits, 1, &text_rest));
+ cppcut_assert_equal(static_cast<std::ptrdiff_t>(9), text_rest - text);
+ cppcut_assert_equal(1,
+ grn_dat_scan(&ctx, dat, text_rest, text_size - (text_rest - text),
+ scan_hits, 1, &text_rest));
+ cppcut_assert_equal(static_cast<std::ptrdiff_t>(30), text_rest - text);
+ cppcut_assert_equal(0,
+ grn_dat_scan(&ctx, dat, text_rest, text_size - (text_rest - text),
+ scan_hits, 1, &text_rest));
+
+ cppcut_assert_equal(GRN_SUCCESS, grn_dat_close(&ctx, dat));
+ }
+
+ {
+ std::vector<std::string> keys;
+ create_keys(&keys, 1000, 6, 15);
+
+ grn_dat * const dat = create_trie(keys, NULL);
+ for (std::size_t i = 0; i < keys.size(); ++i) {
+ const grn_id key_id = static_cast<grn_id>(i + 1);
+ const char * const ptr = keys[i].c_str();
+ const uint32_t length = static_cast<uint32_t>(keys[i].length());
+ grn_dat_scan_hit scan_hits[2];
+ cppcut_assert_equal(1, grn_dat_scan(&ctx, dat, ptr, length, scan_hits, 2, NULL));
+ cppcut_assert_equal(key_id, scan_hits[0].id);
+ cppcut_assert_equal(0U, scan_hits[0].offset);
+ cppcut_assert_equal(length, scan_hits[0].length);
+ }
+ cppcut_assert_equal(GRN_SUCCESS, grn_dat_close(&ctx, dat));
+ }
+ }
+
void test_lcp_search(void)
{
{