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"),
|
2014-01-04 13:38:03 -08:00
|
|
|
sym("rule3") }),
|
|
|
|
|
seq({
|
|
|
|
|
character('a'),
|
|
|
|
|
character('b') }) }) }
|
2014-01-03 01:02:24 -08:00
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
AssertThat(result.first, Equals(Grammar({
|
|
|
|
|
{ "rule1", seq({
|
2014-01-04 15:01:06 -08:00
|
|
|
sym("1"),
|
2014-01-03 01:02:24 -08:00
|
|
|
seq({
|
|
|
|
|
sym("rule2"),
|
2014-01-04 13:38:03 -08:00
|
|
|
sym("rule3") }),
|
2014-01-04 15:01:06 -08:00
|
|
|
sym("1") }) }
|
2014-01-03 01:02:24 -08:00
|
|
|
})));
|
|
|
|
|
|
|
|
|
|
AssertThat(result.second, Equals(Grammar("", {
|
|
|
|
|
{ "1", rules::seq({
|
|
|
|
|
rules::character('a'),
|
|
|
|
|
rules::character('b') }) }
|
|
|
|
|
})));
|
|
|
|
|
});
|
2014-01-05 01:19:32 -08:00
|
|
|
|
|
|
|
|
it("turns entire rules into tokens when they contain no symbols", [&]() {
|
2014-01-11 15:14:17 -08:00
|
|
|
auto result = perform(Grammar({
|
2014-01-05 01:19:32 -08:00
|
|
|
{ "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
|