1 import unittest
2 from test import test_tools
3
4 test_tools.skip_if_missing("peg_generator")
5 with test_tools.imports_under_tool("peg_generator"):
6 from pegen.grammar_parser import GeneratedParser as GrammarParser
7 from pegen.validator import SubRuleValidator, ValidationError
8 from pegen.testutil import parse_string
9 from pegen.grammar import Grammar
10
11
12 class ESC[4;38;5;81mTestPegen(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
13 def test_rule_with_no_collision(self) -> None:
14 grammar_source = """
15 start: bad_rule
16 sum:
17 | NAME '-' NAME
18 | NAME '+' NAME
19 """
20 grammar: Grammar = parse_string(grammar_source, GrammarParser)
21 validator = SubRuleValidator(grammar)
22 for rule_name, rule in grammar.rules.items():
23 validator.validate_rule(rule_name, rule)
24
25 def test_rule_with_simple_collision(self) -> None:
26 grammar_source = """
27 start: bad_rule
28 sum:
29 | NAME '+' NAME
30 | NAME '+' NAME ';'
31 """
32 grammar: Grammar = parse_string(grammar_source, GrammarParser)
33 validator = SubRuleValidator(grammar)
34 with self.assertRaises(ValidationError):
35 for rule_name, rule in grammar.rules.items():
36 validator.validate_rule(rule_name, rule)
37
38 def test_rule_with_collision_after_some_other_rules(self) -> None:
39 grammar_source = """
40 start: bad_rule
41 sum:
42 | NAME '+' NAME
43 | NAME '*' NAME ';'
44 | NAME '-' NAME
45 | NAME '+' NAME ';'
46 """
47 grammar: Grammar = parse_string(grammar_source, GrammarParser)
48 validator = SubRuleValidator(grammar)
49 with self.assertRaises(ValidationError):
50 for rule_name, rule in grammar.rules.items():
51 validator.validate_rule(rule_name, rule)