static void test_Dump_Load_and_Equals(TestBatchRunner *runner) { if (!RegexTokenizer_is_available()) { SKIP(runner, "RegexTokenizer not available"); SKIP(runner, "RegexTokenizer not available"); SKIP(runner, "RegexTokenizer not available"); return; } StackString *word_char_pattern = SSTR_WRAP_UTF8("\\w+", 3); StackString *whitespace_pattern = SSTR_WRAP_UTF8("\\S+", 3); RegexTokenizer *word_char_tokenizer = RegexTokenizer_new((String*)word_char_pattern); RegexTokenizer *whitespace_tokenizer = RegexTokenizer_new((String*)whitespace_pattern); Obj *word_char_dump = RegexTokenizer_Dump(word_char_tokenizer); Obj *whitespace_dump = RegexTokenizer_Dump(whitespace_tokenizer); RegexTokenizer *word_char_clone = RegexTokenizer_Load(whitespace_tokenizer, word_char_dump); RegexTokenizer *whitespace_clone = RegexTokenizer_Load(whitespace_tokenizer, whitespace_dump); TEST_FALSE(runner, RegexTokenizer_Equals(word_char_tokenizer, (Obj*)whitespace_tokenizer), "Equals() false with different pattern"); TEST_TRUE(runner, RegexTokenizer_Equals(word_char_tokenizer, (Obj*)word_char_clone), "Dump => Load round trip"); TEST_TRUE(runner, RegexTokenizer_Equals(whitespace_tokenizer, (Obj*)whitespace_clone), "Dump => Load round trip"); DECREF(word_char_tokenizer); DECREF(word_char_dump); DECREF(word_char_clone); DECREF(whitespace_tokenizer); DECREF(whitespace_dump); DECREF(whitespace_clone); }
static void test_query_parser_syntax(TestBatchRunner *runner) { if (!RegexTokenizer_is_available()) { for (uint32_t i = 0; leaf_test_funcs[i] != NULL; i++) { SKIP(runner, 3, "RegexTokenizer not available"); } for (uint32_t i = 0; syntax_test_funcs[i] != NULL; i++) { SKIP(runner, 2, "RegexTokenizer not available"); } return; } Folder *index = build_index(); IndexSearcher *searcher = IxSearcher_new((Obj*)index); QueryParser *qparser = QParser_new(IxSearcher_Get_Schema(searcher), NULL, NULL, NULL); QParser_Set_Heed_Colons(qparser, true); for (uint32_t i = 0; leaf_test_funcs[i] != NULL; i++) { LUCY_TestQPSyntax_Test_t test_func = leaf_test_funcs[i]; TestQueryParser *test_case = test_func(); TestQueryParserIVARS *ivars = TestQP_IVARS(test_case); Query *tree = QParser_Tree(qparser, ivars->query_string); Query *expanded = QParser_Expand_Leaf(qparser, ivars->tree); Query *parsed = QParser_Parse(qparser, ivars->query_string); Hits *hits = IxSearcher_Hits(searcher, (Obj*)parsed, 0, 10, NULL); TEST_TRUE(runner, Query_Equals(tree, (Obj*)ivars->tree), "tree() %s", Str_Get_Ptr8(ivars->query_string)); TEST_TRUE(runner, Query_Equals(expanded, (Obj*)ivars->expanded), "expand_leaf() %s", Str_Get_Ptr8(ivars->query_string)); TEST_INT_EQ(runner, Hits_Total_Hits(hits), ivars->num_hits, "hits: %s", Str_Get_Ptr8(ivars->query_string)); DECREF(hits); DECREF(parsed); DECREF(expanded); DECREF(tree); DECREF(test_case); } for (uint32_t i = 0; syntax_test_funcs[i] != NULL; i++) { LUCY_TestQPSyntax_Test_t test_func = syntax_test_funcs[i]; TestQueryParser *test_case = test_func(); TestQueryParserIVARS *ivars = TestQP_IVARS(test_case); Query *tree = QParser_Tree(qparser, ivars->query_string); Query *parsed = QParser_Parse(qparser, ivars->query_string); Hits *hits = IxSearcher_Hits(searcher, (Obj*)parsed, 0, 10, NULL); TEST_TRUE(runner, Query_Equals(tree, (Obj*)ivars->tree), "tree() %s", Str_Get_Ptr8(ivars->query_string)); TEST_INT_EQ(runner, Hits_Total_Hits(hits), ivars->num_hits, "hits: %s", Str_Get_Ptr8(ivars->query_string)); DECREF(hits); DECREF(parsed); DECREF(tree); DECREF(test_case); } DECREF(searcher); DECREF(qparser); DECREF(index); }