|
@@ -126,7 +126,7 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
|
|
|
Y_UNIT_TEST(OutputStateHasNoOutputEdges) {
|
|
|
TScopedAlloc alloc(__LOCATION__);
|
|
|
- const TRowPattern pattern{{TRowPatternFactor{"A", 1, 1, false, false}}};
|
|
|
+ const TRowPattern pattern{{TRowPatternFactor{"A", 1, 1, false, false, false}}};
|
|
|
const auto transitionGraph = TNfaTransitionGraphBuilder::Create(pattern, {{"A", 0}});
|
|
|
const auto& output = transitionGraph->Transitions.at(transitionGraph->Output);
|
|
|
UNIT_ASSERT(std::get_if<TVoidTransition>(&output));
|
|
@@ -135,25 +135,25 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
TScopedAlloc alloc(__LOCATION__);
|
|
|
const TRowPattern pattern{
|
|
|
{
|
|
|
- TRowPatternFactor{"A", 1, 1, false, false},
|
|
|
- TRowPatternFactor{"B", 1, 100, false, false},
|
|
|
+ TRowPatternFactor{"A", 1, 1, false, false, false},
|
|
|
+ TRowPatternFactor{"B", 1, 100, false, false, false},
|
|
|
TRowPatternFactor{
|
|
|
TRowPattern{
|
|
|
- {TRowPatternFactor{"C", 1, 1, false, false}},
|
|
|
- {TRowPatternFactor{"D", 1, 1, false, false}}
|
|
|
+ {TRowPatternFactor{"C", 1, 1, false, false, false}},
|
|
|
+ {TRowPatternFactor{"D", 1, 1, false, false, false}}
|
|
|
},
|
|
|
- 1, 1, false, false
|
|
|
+ 1, 1, false, false, false
|
|
|
}
|
|
|
},
|
|
|
{
|
|
|
TRowPatternFactor{
|
|
|
TRowPattern{{
|
|
|
- TRowPatternFactor{"E", 1, 1, false, false},
|
|
|
- TRowPatternFactor{"F", 1, 100, false, false},
|
|
|
+ TRowPatternFactor{"E", 1, 1, false, false, false},
|
|
|
+ TRowPatternFactor{"F", 1, 100, false, false, false},
|
|
|
}},
|
|
|
- 2, 100, false, false
|
|
|
+ 2, 100, false, false, false
|
|
|
},
|
|
|
- TRowPatternFactor{"G", 1, 1, false, false}
|
|
|
+ TRowPatternFactor{"G", 1, 1, false, false, false}
|
|
|
}
|
|
|
};
|
|
|
const auto graph = TNfaTransitionGraphBuilder::Create(pattern, TNfaSetup::BuildVarLookup(pattern));
|
|
@@ -172,8 +172,8 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
Y_UNIT_TEST(SingleEpsilonsEliminated) {
|
|
|
TScopedAlloc alloc(__LOCATION__);
|
|
|
const TRowPattern pattern{{
|
|
|
- TRowPatternFactor{"A", 1, 1, false, false},
|
|
|
- TRowPatternFactor{"B", 1, 1, false, false},
|
|
|
+ TRowPatternFactor{"A", 1, 1, false, false, false},
|
|
|
+ TRowPatternFactor{"B", 1, 1, false, false, false},
|
|
|
}};
|
|
|
const auto graph = TNfaTransitionGraphBuilder::Create(pattern, TNfaSetup::BuildVarLookup(pattern));
|
|
|
for (size_t node = 0; node != graph->Transitions.size(); node++) {
|
|
@@ -198,7 +198,7 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
Y_UNIT_TEST(SingleVarAcceptNothing) {
|
|
|
TScopedAlloc alloc(__LOCATION__);
|
|
|
THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
- const TRowPattern pattern{{TRowPatternFactor{"A", 1, 1, false, false}}};
|
|
|
+ const TRowPattern pattern{{TRowPatternFactor{"A", 1, 1, false, false, false}}};
|
|
|
TNfaSetup setup{pattern};
|
|
|
auto& defineA = setup.Defines.at(0);
|
|
|
auto& ctx = setup.Ctx();
|
|
@@ -212,7 +212,7 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
Y_UNIT_TEST(SingleVarAcceptEveryRow) {
|
|
|
TScopedAlloc alloc(__LOCATION__);
|
|
|
THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
- const TRowPattern pattern{{TRowPatternFactor{"A", 1, 1, false, false}}};
|
|
|
+ const TRowPattern pattern{{TRowPatternFactor{"A", 1, 1, false, false, false}}};
|
|
|
TNfaSetup setup{pattern};
|
|
|
auto& defineA = setup.Defines.at(0);
|
|
|
auto& ctx = setup.Ctx();
|
|
@@ -226,7 +226,7 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
Y_UNIT_TEST(SingleAlternatedVarAcceptEven) {
|
|
|
TScopedAlloc alloc(__LOCATION__);
|
|
|
THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
- const TRowPattern pattern{{TRowPatternFactor{"A", 1, 1, false, false}}};
|
|
|
+ const TRowPattern pattern{{TRowPatternFactor{"A", 1, 1, false, false, false}}};
|
|
|
TNfaSetup setup{pattern};
|
|
|
auto& defineA = setup.Defines.at(0);
|
|
|
auto& ctx = setup.Ctx();
|
|
@@ -242,7 +242,7 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
TScopedAlloc alloc(__LOCATION__);
|
|
|
THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
// "A{4, 6}"
|
|
|
- const TRowPattern pattern{{TRowPatternFactor{"A", 4, 6, false, false}}};
|
|
|
+ const TRowPattern pattern{{TRowPatternFactor{"A", 4, 6, false, false, false}}};
|
|
|
TNfaSetup setup{pattern};
|
|
|
auto& defineA = setup.Defines.at(0);
|
|
|
auto& ctx = setup.Ctx();
|
|
@@ -274,9 +274,9 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
// "A A A"
|
|
|
const TRowPattern pattern{{
|
|
|
- TRowPatternFactor{"A", 1, 1, false, false},
|
|
|
- TRowPatternFactor{"A", 1, 1, false, false},
|
|
|
- TRowPatternFactor{"A", 1, 1, false, false}
|
|
|
+ TRowPatternFactor{"A", 1, 1, false, false, false},
|
|
|
+ TRowPatternFactor{"A", 1, 1, false, false, false},
|
|
|
+ TRowPatternFactor{"A", 1, 1, false, false, false}
|
|
|
}};
|
|
|
TNfaSetup setup{pattern};
|
|
|
auto& defineA = setup.Defines.at(0);
|
|
@@ -295,8 +295,8 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
//"A B"
|
|
|
const TRowPattern pattern{{
|
|
|
- TRowPatternFactor{"A", 1, 1, false, false},
|
|
|
- TRowPatternFactor{"B", 1, 1, false, false},
|
|
|
+ TRowPatternFactor{"A", 1, 1, false, false, false},
|
|
|
+ TRowPatternFactor{"B", 1, 1, false, false, false},
|
|
|
}};
|
|
|
TNfaSetup setup{pattern};
|
|
|
auto& defineA = setup.Defines.at(0);
|
|
@@ -316,8 +316,8 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
//"A | B"
|
|
|
const TRowPattern pattern{
|
|
|
- {TRowPatternFactor{"A", 1, 1, false, false}},
|
|
|
- {TRowPatternFactor{"B", 1, 1, false, false}},
|
|
|
+ {TRowPatternFactor{"A", 1, 1, false, false, false}},
|
|
|
+ {TRowPatternFactor{"B", 1, 1, false, false, false}},
|
|
|
};
|
|
|
TNfaSetup setup{pattern};
|
|
|
auto& defineA = setup.Defines.at(0);
|
|
@@ -340,7 +340,7 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
//"Any*"
|
|
|
const TRowPattern pattern{{
|
|
|
- TRowPatternFactor{"A", 1, 1000000000, false, false},
|
|
|
+ TRowPatternFactor{"A", 1, 1000000000, false, false, false},
|
|
|
}};
|
|
|
TNfaSetup setup{pattern};
|
|
|
auto& defineA = setup.Defines.at(0);
|
|
@@ -359,6 +359,24 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
UNIT_ASSERT_VALUES_EQUAL(inputSize * (inputSize + 1) / 2, totalMatches);
|
|
|
}
|
|
|
|
|
|
+ Y_UNIT_TEST(UnusedVarIgnored) {
|
|
|
+ TScopedAlloc alloc(__LOCATION__);
|
|
|
+ THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
+ const TRowPattern pattern{{
|
|
|
+ TRowPatternFactor{"ANY", 1, 100, false, false, true},
|
|
|
+ }};
|
|
|
+ TNfaSetup setup{pattern};
|
|
|
+ auto& defineA = setup.Defines.at(0);
|
|
|
+ auto& ctx = setup.Ctx();
|
|
|
+ defineA->SetValue(ctx, NUdf::TUnboxedValuePod{true});
|
|
|
+ TSparseList list;
|
|
|
+ const size_t inputSize = 100;
|
|
|
+ for (size_t i = 0; i != inputSize; ++i) {
|
|
|
+ setup.Nfa.ProcessRow(list.Append(NUdf::TUnboxedValue{}), ctx);
|
|
|
+ UNIT_ASSERT_EQUAL(0, setup.Nfa.GetMatched().value()[0].size());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
//Pattern: A*
|
|
|
//Input: intermittent series events that match A
|
|
|
Y_UNIT_TEST(AStar) {
|
|
@@ -366,7 +384,7 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
//"A*"
|
|
|
const TRowPattern pattern{{
|
|
|
- TRowPatternFactor{"A", 1, 1000000000, false, false},
|
|
|
+ TRowPatternFactor{"A", 1, 1000000000, false, false, false},
|
|
|
}};
|
|
|
TNfaSetup setup{pattern};
|
|
|
auto& defineA = setup.Defines.at(0);
|
|
@@ -403,9 +421,9 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
//"A ANY* B"
|
|
|
const TRowPattern pattern{{
|
|
|
- TRowPatternFactor{"A", 1, 1, false, false},
|
|
|
- TRowPatternFactor{"ANY", 1, 1000000000, false, false},
|
|
|
- TRowPatternFactor{"B", 1, 1, false, false},
|
|
|
+ TRowPatternFactor{"A", 1, 1, false, false, false},
|
|
|
+ TRowPatternFactor{"ANY", 1, 1000000000, false, false, false},
|
|
|
+ TRowPatternFactor{"B", 1, 1, false, false, false},
|
|
|
}};
|
|
|
TNfaSetup setup{pattern};
|
|
|
auto& defineA = setup.Defines.at(0);
|
|
@@ -432,9 +450,9 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
//"A ANY* B"
|
|
|
const TRowPattern pattern{{
|
|
|
- TRowPatternFactor{"A", 1, 1, false, false},
|
|
|
- TRowPatternFactor{"ANY", 1, 1000000000, false, false},
|
|
|
- TRowPatternFactor{"B", 1, 1, false, false},
|
|
|
+ TRowPatternFactor{"A", 1, 1, false, false, false},
|
|
|
+ TRowPatternFactor{"ANY", 1, 1000000000, false, false, false},
|
|
|
+ TRowPatternFactor{"B", 1, 1, false, false, false},
|
|
|
}};
|
|
|
TNfaSetup setup{pattern};
|
|
|
auto& defineA = setup.Defines.at(0);
|
|
@@ -478,11 +496,11 @@ Y_UNIT_TEST_SUITE(MatchRecognizeNfa) {
|
|
|
THolderFactory holderFactory(alloc.Ref(), memUsage);
|
|
|
//"A ANY* B ANY* C"
|
|
|
const TRowPattern pattern{{
|
|
|
- TRowPatternFactor{"A", 1, 1, false, false},
|
|
|
- TRowPatternFactor{"ANY", 1, 1000000000, false, false},
|
|
|
- TRowPatternFactor{"B", 1, 1, false, false},
|
|
|
- TRowPatternFactor{"ANY", 1, 1000000000, false, false},
|
|
|
- TRowPatternFactor{"C", 1, 1, false, false},
|
|
|
+ TRowPatternFactor{"A", 1, 1, false, false, false},
|
|
|
+ TRowPatternFactor{"ANY", 1, 1000000000, false, false, false},
|
|
|
+ TRowPatternFactor{"B", 1, 1, false, false, false},
|
|
|
+ TRowPatternFactor{"ANY", 1, 1000000000, false, false, false},
|
|
|
+ TRowPatternFactor{"C", 1, 1, false, false, false},
|
|
|
}};
|
|
|
TNfaSetup setup{pattern};
|
|
|
auto& defineA = setup.Defines.at(0);
|