err = hs_free_scratch(scratch);
ASSERT_EQ(HS_SUCCESS, err);
}
+
+TEST(LogicalCombination, MultiCombStream1) {
+ hs_database_t *db = nullptr;
+ hs_compile_error_t *compile_err = nullptr;
+ CallBackContext c;
+ string data[] = {"xxxxxxxabcxxxxxxxdefxxxghixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+ "xxxxxxxxxxxxxxxxghixxxxxxxxxxxabcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+ "xxxxxxxxxxxxxxxxdefxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+ "xxxxxxxxxxxxxxxxxyzxxxxxxxxxxxxxxxxxxxxxghixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+ "xxxxxghixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxy",
+ "z"};
+ const char *expr[] = {"abc", "def", "xyz", "zxyz",
+ "101 & 102", "201 & !202"};
+ unsigned flags[] = {0, 0, 0, 0, HS_FLAG_COMBINATION, HS_FLAG_COMBINATION};
+ unsigned ids[] = {101, 102, 201, 202, 1001, 1002};
+ hs_error_t err = hs_compile_multi(expr, flags, ids, 6, HS_MODE_STREAM,
+ nullptr, &db, &compile_err);
+
+ ASSERT_EQ(HS_SUCCESS, err);
+ ASSERT_TRUE(db != nullptr);
+
+ hs_scratch_t *scratch = nullptr;
+ err = hs_alloc_scratch(db, &scratch);
+ ASSERT_EQ(HS_SUCCESS, err);
+ ASSERT_TRUE(scratch != nullptr);
+
+ hs_stream_t *stream = nullptr;
+ err = hs_open_stream(db, 0, &stream);
+ ASSERT_EQ(HS_SUCCESS, err);
+ ASSERT_TRUE(stream != nullptr);
+
+ c.halt = 0;
+ int i;
+ for (i = 0; i < 11; i++) {
+ err = hs_scan_stream(stream, data[i].c_str(), data[i].size(), 0,
+ scratch, record_cb, (void *)&c);
+ ASSERT_EQ(HS_SUCCESS, err);
+ }
+ err = hs_close_stream(stream, scratch, dummy_cb, nullptr);
+ ASSERT_EQ(HS_SUCCESS, err);
+
+ ASSERT_EQ(11U, c.matches.size());
+ ASSERT_EQ(MatchRecord(10, 101), c.matches[0]);
+ ASSERT_EQ(MatchRecord(20, 102), c.matches[1]);
+ ASSERT_EQ(MatchRecord(20, 1001), c.matches[2]);
+ ASSERT_EQ(MatchRecord(109, 101), c.matches[3]);
+ ASSERT_EQ(MatchRecord(109, 1001), c.matches[4]);
+ ASSERT_EQ(MatchRecord(171, 102), c.matches[5]);
+ ASSERT_EQ(MatchRecord(171, 1001), c.matches[6]);
+ ASSERT_EQ(MatchRecord(247, 201), c.matches[7]);
+ ASSERT_EQ(MatchRecord(247, 1002), c.matches[8]);
+ ASSERT_EQ(MatchRecord(761, 201), c.matches[9]);
+ ASSERT_EQ(MatchRecord(761, 202), c.matches[10]);
+
+ hs_free_database(db);
+ err = hs_free_scratch(scratch);
+ ASSERT_EQ(HS_SUCCESS, err);
+}