add unit tests for not consuming matchers

This commit is contained in:
Jan 2021-02-13 16:18:53 +01:00
parent 32f815c378
commit f14357537e
2 changed files with 56 additions and 1 deletions

View File

@ -95,6 +95,9 @@ public:
result.m_captures.emplace_back(m_capture_id, match); result.m_captures.emplace_back(m_capture_id, match);
} }
if (m_no_consume)
result.m_consumed_token_count = 0;
return result; return result;
} }
}; };

View File

@ -971,4 +971,56 @@ namespace test::parsing::matcher
REQUIRE(test.PerformTest()); REQUIRE(test.PerformTest());
REQUIRE(test.GetConsumedTokenCount() == 3); REQUIRE(test.GetConsumedTokenCount() == 3);
} }
TEST_CASE("Matcher: Ensure noconsume does not consume a token", "[parsing][matcher]")
{
MatchersTestsHelper test;
const TokenPos pos;
test.Tokens({
HeaderParserValue::Keyword(pos, HeaderParserValueType::NAMESPACE),
HeaderParserValue::Identifier(pos, new std::string("test_namespace")),
HeaderParserValue::Character(pos, '{'),
HeaderParserValue::Invalid(pos)
});
const auto create = test.Factory();
test.Matchers({
create.Type(HeaderParserValueType::NAMESPACE),
create.Identifier(),
create.Char('{').NoConsume()
});
REQUIRE(test.PerformTest());
REQUIRE(test.GetConsumedTokenCount() == 2);
}
TEST_CASE("Matcher: Ensure noconsume can be captured", "[parsing][matcher]")
{
static constexpr auto CAPTURE_NAME = 1;
MatchersTestsHelper test;
const TokenPos pos;
test.Tokens({
HeaderParserValue::Keyword(pos, HeaderParserValueType::NAMESPACE),
HeaderParserValue::Identifier(pos, new std::string("test_namespace")),
HeaderParserValue::Character(pos, '{'),
HeaderParserValue::Invalid(pos)
});
const auto create = test.Factory();
test.Matchers({
create.Type(HeaderParserValueType::NAMESPACE),
create.Identifier().NoConsume().Capture(CAPTURE_NAME)
});
test.MatchCallback([](sequence_result_t& result)
{
REQUIRE(result.HasNextCapture(CAPTURE_NAME));
{
const auto& capture = result.NextCapture(CAPTURE_NAME);
REQUIRE(capture.m_type == HeaderParserValueType::IDENTIFIER);
REQUIRE(capture.IdentifierValue() == "test_namespace");
}
});
REQUIRE(test.PerformTest());
REQUIRE(test.GetConsumedTokenCount() == 1);
}
} }