tree-sitter/spec/compiler/rules/pattern_spec.cc

178 lines
5 KiB
C++
Raw Normal View History

#include "compiler_spec_helper.h"
2014-03-09 21:37:21 -07:00
#include "compiler/rules/pattern.h"
#include "compiler/rules/character_set.h"
2014-01-11 17:08:32 -08:00
using namespace rules;
START_TEST
2014-04-24 13:02:01 -07:00
describe("parsing regex pattern rules", []() {
it("parses simple strings", [&]() {
Pattern rule("abc");
AssertThat(
rule.to_rule_tree(),
EqualsPointer(seq({
character({ 'a' }),
character({ 'b' }),
character({ 'c' })
})));
});
2014-04-24 13:02:01 -07:00
it("parses wildcard '.' characters", [&]() {
Pattern rule(".");
AssertThat(
rule.to_rule_tree(),
EqualsPointer(CharacterSet({'\n'}).complement().copy()));
});
2013-11-20 19:00:20 -08:00
it("parses character classes", []() {
Pattern rule("\\w-\\d");
2013-11-20 19:00:20 -08:00
AssertThat(
rule.to_rule_tree(),
EqualsPointer(seq({
character({ {'a', 'z'}, {'A', 'Z'}, {'0', '9'} }),
character({ '-' }),
character({ {'0', '9'} })
})));
});
2013-11-20 19:00:20 -08:00
it("parses choices", []() {
Pattern rule("ab|cd|ef");
AssertThat(
rule.to_rule_tree(),
EqualsPointer(choice({
seq({
character({ 'a' }),
character({ 'b' }),
}),
seq({
character({ 'c' }),
character({ 'd' })
}),
seq({
character({ 'e' }),
character({ 'f' })
})
})));
});
2014-03-09 19:49:35 -07:00
it("parses character sets", []() {
Pattern rule("[aAeE]");
AssertThat(
rule.to_rule_tree(),
EqualsPointer(character({ 'a', 'A', 'e', 'E' })));
});
2014-03-09 19:49:35 -07:00
it("parses character ranges", []() {
Pattern rule("[12a-dA-D3]");
AssertThat(
rule.to_rule_tree(),
EqualsPointer(character({ {'1', '3'}, {'a', 'd'}, { 'A', 'D' }, })));
});
2014-03-09 19:49:35 -07:00
it("parses negated characters", []() {
Pattern rule("[^a\\d]");
AssertThat(
rule.to_rule_tree(),
EqualsPointer(character({ {'a'}, {'0', '9'} }, false)));
});
2014-03-09 19:49:35 -07:00
it("parses backslashes", []() {
Pattern rule("\\\\");
AssertThat(
rule.to_rule_tree(),
EqualsPointer(character({ '\\' })));
});
2014-03-09 19:49:35 -07:00
it("parses character groups in sequences", []() {
2014-03-22 20:08:11 -07:00
Pattern rule("\"([^\"]|\\\\\")*\"");
AssertThat(
rule.to_rule_tree(),
EqualsPointer(seq({
character({ '"' }),
repeat(choice({
character({ '"' }, false),
seq({ character({ '\\' }), character({ '"' }) })
})),
character({ '"' })
})));
});
2014-03-09 19:49:35 -07:00
it("parses choices in sequences", []() {
Pattern rule("(a|b)cd");
AssertThat(
rule.to_rule_tree(),
EqualsPointer(seq({
choice({
character({ 'a' }),
character({ 'b' }),
}),
character({ 'c' }),
character({ 'd' })
})));
});
2014-03-09 19:49:35 -07:00
it("parses special characters when they are escaped", []() {
Pattern rule("a\\(b");
AssertThat(
rule.to_rule_tree(),
EqualsPointer(seq({
character({ 'a' }),
character({ '(' }),
character({ 'b' })
})));
2014-04-24 13:02:01 -07:00
Pattern rule2("a\\.");
AssertThat(
rule2.to_rule_tree(),
EqualsPointer(seq({
character({ 'a' }),
character({ '.' }),
})));
});
2014-03-09 19:49:35 -07:00
it("parses repeating rules", []() {
Pattern rule("(ab)+(cd)+");
2013-11-15 13:35:35 -08:00
AssertThat(
rule.to_rule_tree(),
EqualsPointer(
2013-11-15 13:35:35 -08:00
seq({
2014-03-22 20:08:11 -07:00
seq({
seq({ character({ 'a' }), character({ 'b' }) }),
repeat(seq({ character({ 'a' }), character({ 'b' }) })),
}),
seq({
seq({ character({ 'c' }), character({ 'd' }) }),
repeat(seq({ character({ 'c' }), character({ 'd' }) })),
}),
})
));
Pattern rule2("(ab)*(cd)*");
AssertThat(
rule2.to_rule_tree(),
EqualsPointer(
seq({
repeat(seq({ character({ 'a' }), character({ 'b' }) })),
repeat(seq({ character({ 'c' }), character({ 'd' }) })),
})
2013-11-15 13:35:35 -08:00
));
});
2014-03-22 20:08:11 -07:00
it("parses optional rules", []() {
Pattern rule("a(bc)?");
AssertThat(
rule.to_rule_tree(),
EqualsPointer(seq({
character({ 'a' }),
choice({
seq({ character({ 'b' }), character({ 'c' }) }),
blank()
})
})));
});
});
END_TEST