2013-11-14 21:25:58 -08:00
|
|
|
#include "spec_helper.h"
|
|
|
|
|
#include "rules.h"
|
|
|
|
|
#include "transition_map.h"
|
|
|
|
|
|
|
|
|
|
using namespace tree_sitter::rules;
|
|
|
|
|
|
2013-12-28 15:09:52 -08:00
|
|
|
START_TEST
|
|
|
|
|
|
|
|
|
|
describe("parsing pattern rules", []() {
|
|
|
|
|
it("parses simple strings", [&]() {
|
2013-12-19 20:05:57 -08:00
|
|
|
Pattern rule("abc");
|
2013-11-14 21:25:58 -08:00
|
|
|
AssertThat(
|
2013-12-28 18:42:00 -08:00
|
|
|
rule.to_rule_tree(),
|
|
|
|
|
EqualsPointer(seq({
|
2013-11-14 21:25:58 -08:00
|
|
|
character('a'),
|
|
|
|
|
character('b'),
|
|
|
|
|
character('c')
|
2013-12-28 18:42:00 -08:00
|
|
|
})));
|
2013-12-28 15:09:52 -08:00
|
|
|
});
|
2013-11-20 19:00:20 -08:00
|
|
|
|
2013-12-28 15:09:52 -08:00
|
|
|
it("parses character classes", []() {
|
2013-12-19 20:05:57 -08:00
|
|
|
Pattern rule("\\w-\\d");
|
2013-11-20 19:00:20 -08:00
|
|
|
AssertThat(
|
2013-12-28 18:42:00 -08:00
|
|
|
rule.to_rule_tree(),
|
|
|
|
|
EqualsPointer(seq({
|
2013-12-21 23:53:26 -08:00
|
|
|
character(CharClassWord),
|
2013-11-20 19:00:20 -08:00
|
|
|
character('-'),
|
2013-12-21 23:53:26 -08:00
|
|
|
character(CharClassDigit)
|
2013-12-28 18:42:00 -08:00
|
|
|
})));
|
2013-12-28 15:09:52 -08:00
|
|
|
});
|
2013-11-20 19:00:20 -08:00
|
|
|
|
2013-12-28 15:09:52 -08:00
|
|
|
it("parses choices", []() {
|
2013-12-19 20:05:57 -08:00
|
|
|
Pattern rule("ab|cd|ef");
|
2013-11-14 21:25:58 -08:00
|
|
|
AssertThat(
|
2013-12-28 18:42:00 -08:00
|
|
|
rule.to_rule_tree(),
|
|
|
|
|
EqualsPointer(choice({
|
2013-11-14 21:25:58 -08:00
|
|
|
seq({
|
|
|
|
|
character('a'),
|
|
|
|
|
character('b'),
|
|
|
|
|
}),
|
|
|
|
|
seq({
|
|
|
|
|
character('c'),
|
|
|
|
|
character('d')
|
|
|
|
|
}),
|
|
|
|
|
seq({
|
|
|
|
|
character('e'),
|
|
|
|
|
character('f')
|
|
|
|
|
})
|
2013-12-28 18:42:00 -08:00
|
|
|
})));
|
2013-12-28 15:09:52 -08:00
|
|
|
});
|
2013-11-14 21:25:58 -08:00
|
|
|
|
2013-12-28 15:09:52 -08:00
|
|
|
it("parses choices in sequences", []() {
|
2013-12-19 20:05:57 -08:00
|
|
|
Pattern rule("(a|b)cd");
|
2013-11-14 21:25:58 -08:00
|
|
|
AssertThat(
|
2013-12-28 18:42:00 -08:00
|
|
|
rule.to_rule_tree(),
|
|
|
|
|
EqualsPointer(seq({
|
2013-11-14 21:25:58 -08:00
|
|
|
choice({
|
|
|
|
|
character('a'),
|
|
|
|
|
character('b'),
|
|
|
|
|
}),
|
|
|
|
|
character('c'),
|
|
|
|
|
character('d')
|
2013-12-28 18:42:00 -08:00
|
|
|
})));
|
2013-12-28 15:09:52 -08:00
|
|
|
});
|
2013-11-14 21:25:58 -08:00
|
|
|
|
2013-12-28 15:09:52 -08:00
|
|
|
it("parses special characters when they are escaped", []() {
|
2013-12-19 20:05:57 -08:00
|
|
|
Pattern rule("a\\(b");
|
2013-11-14 21:25:58 -08:00
|
|
|
AssertThat(
|
2013-12-28 18:42:00 -08:00
|
|
|
rule.to_rule_tree(),
|
|
|
|
|
EqualsPointer(seq({
|
2013-11-14 21:25:58 -08:00
|
|
|
character('a'),
|
|
|
|
|
character('('),
|
|
|
|
|
character('b')
|
2013-12-28 18:42:00 -08:00
|
|
|
})));
|
2013-12-28 15:09:52 -08:00
|
|
|
});
|
2013-11-15 13:35:35 -08:00
|
|
|
|
2013-12-28 15:09:52 -08:00
|
|
|
it("parses repeating rules", []() {
|
2013-12-19 20:05:57 -08:00
|
|
|
Pattern rule("(ab)+(cd)+");
|
2013-11-15 13:35:35 -08:00
|
|
|
AssertThat(
|
2013-12-28 18:42:00 -08:00
|
|
|
rule.to_rule_tree(),
|
|
|
|
|
EqualsPointer(
|
2013-11-15 13:35:35 -08:00
|
|
|
seq({
|
|
|
|
|
repeat(seq({
|
|
|
|
|
character('a'),
|
|
|
|
|
character('b')
|
|
|
|
|
})),
|
|
|
|
|
repeat(seq({
|
|
|
|
|
character('c'),
|
|
|
|
|
character('d')
|
|
|
|
|
})),
|
2013-12-28 18:42:00 -08:00
|
|
|
})
|
2013-11-15 13:35:35 -08:00
|
|
|
));
|
2013-12-28 15:09:52 -08:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
END_TEST
|