tree-sitter/spec/compiler/build_tables/item_set_closure_spec.cpp
2014-01-21 23:45:02 -08:00

53 lines
No EOL
1.6 KiB
C++

#include "spec_helper.h"
#include "build_tables/item_set_closure.h"
#include "build_tables/item_set_transitions.h"
#include "grammar.h"
#include "rules.h"
using namespace build_tables;
using namespace rules;
START_TEST
describe("computing closures of item sets", []() {
Grammar grammar({
{ "E", choice({
seq({
sym("T"),
sym("+"),
sym("T") }),
sym("T") }) },
{ "T", choice({
seq({
sym("F"),
sym("*"),
sym("F") }),
sym("F") }) },
{ "F", choice({
sym("v"),
sym("n") }) }
});
it("computes the item set closure", [&]() {
ParseItemSet item_set = item_set_closure(ParseItemSet({
ParseItem("E", grammar.rule("E"), 0, "__END__")
}), grammar);
AssertThat(item_set, Equals(ParseItemSet({
ParseItem("F", grammar.rule("F"), 0, "__END__"),
ParseItem("F", grammar.rule("F"), 0, "+"),
ParseItem("F", grammar.rule("F"), 0, "*"),
ParseItem("T", grammar.rule("T"), 0, "__END__"),
ParseItem("T", grammar.rule("T"), 0, "+"),
ParseItem("E", grammar.rule("E"), 0, "__END__"),
})));
ParseItemSet next_item_set = *sym_transitions(item_set, grammar)[rules::Symbol("v")];
AssertThat(next_item_set, Equals(ParseItemSet({
ParseItem("F", rules::blank(), 1, "__END__"),
ParseItem("F", rules::blank(), 1, "*"),
ParseItem("F", rules::blank(), 1, "+"),
})));
});
});
END_TEST