tree-sitter/spec/compiler/prepare_grammar_spec.cpp

59 lines
1.6 KiB
C++
Raw Normal View History

2014-01-03 01:02:24 -08:00
#include "spec_helper.h"
2014-01-11 15:14:17 -08:00
#include "prepare_grammar/perform.h"
2014-01-03 01:02:24 -08:00
START_TEST
2014-01-11 17:08:32 -08:00
using prepare_grammar::perform;
using namespace rules;
2014-01-03 01:02:24 -08:00
describe("preparing a grammar", []() {
it("extracts character-based subtrees into a separate grammar", [&]() {
2014-01-11 15:14:17 -08:00
pair<Grammar, Grammar> result = perform(Grammar({
2014-01-03 01:02:24 -08:00
{ "rule1", seq({
character('a'),
character('b'),
seq({
sym("rule2"),
sym("rule3") }),
seq({
character('a'),
character('b') }) }) }
2014-01-03 01:02:24 -08:00
}));
AssertThat(result.first, Equals(Grammar({
{ "rule1", seq({
sym("1"),
2014-01-03 01:02:24 -08:00
seq({
sym("rule2"),
sym("rule3") }),
sym("1") }) }
2014-01-03 01:02:24 -08:00
})));
AssertThat(result.second, Equals(Grammar("", {
{ "1", rules::seq({
rules::character('a'),
rules::character('b') }) }
})));
});
it("turns entire rules into tokens when they contain no symbols", [&]() {
2014-01-11 15:14:17 -08:00
auto result = perform(Grammar({
{ "rule1", sym("rule2") },
{ "rule2", seq({
character('a'),
character('b') }) }
}));
AssertThat(result.first, Equals(Grammar({
{ "rule1", sym("rule2") }
})));
AssertThat(result.second, Equals(Grammar("", {
{ "rule2", seq({
character('a'),
character('b') }) }
})));
});
2014-01-03 01:02:24 -08:00
});
END_TEST