[Groonga-commit] groonga/groonga [master] added a test of grn_dat_scan().

Back to archive index

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)
   {
     {




Groonga-commit メーリングリストの案内
Back to archive index