(root)/
Python-3.11.7/
Lib/
test/
test_peg_generator/
test_grammar_validator.py
       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)