| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- """Tests for format_grammar.py."""
- __copyright__ = """
- Part of the Carbon Language project, under the Apache License v2.0 with LLVM
- Exceptions. See /LICENSE for license information.
- SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- """
- import unittest
- from executable_semantics.syntax import format_grammar
- class TestFormatGrammar(unittest.TestCase):
- def test_empty(self):
- self.assertEqual(
- format_grammar._parse_segments("", False), ([""], {}, [])
- )
- def test_text(self):
- self.assertEqual(
- format_grammar._parse_segments("text", False),
- (["text"], {}, []),
- )
- def test_cpp(self):
- self.assertEqual(
- format_grammar._parse_segments("{ code; }", False),
- (
- ["", None, ""],
- {0: [format_grammar._CppCode(1, "code;", 0, 0, False)]},
- [],
- ),
- )
- def test_word_in_braces(self):
- self.assertEqual(
- format_grammar._parse_segments("{AND}", False),
- (["{AND}"], {}, []),
- )
- def test_cpp_str(self):
- self.assertEqual(
- format_grammar._parse_segments('{ "\\x {"; }', False),
- (
- ["", None, ""],
- {0: [format_grammar._CppCode(1, '"\\x {";', 0, 0, False)]},
- [],
- ),
- )
- def test_brace_in_str(self):
- self.assertEqual(
- format_grammar._parse_segments('"{" not code }', False),
- (['"{" not code }'], {}, []),
- )
- def test_quote_regex(self):
- self.assertEqual(
- format_grammar._parse_segments('\\"', False),
- (['\\"'], {}, []),
- )
- def test_block_comment_quote(self):
- self.assertEqual(
- format_grammar._parse_segments('/* " */', False),
- (['/* " */'], {}, []),
- )
- def test_cpp_after_block_comment(self):
- self.assertEqual(
- format_grammar._parse_segments("/* */{ code; }", False),
- (
- ["/* */", None, ""],
- {0: [format_grammar._CppCode(1, "code;", 5, 0, False)]},
- [],
- ),
- )
- def test_line_comment_quote(self):
- self.assertEqual(
- format_grammar._parse_segments('{\n// "\n}', False),
- (
- ["", None, ""],
- {0: [format_grammar._CppCode(1, '// "', 0, 0, False)]},
- [],
- ),
- )
- def test_table(self):
- self.assertEqual(
- format_grammar._parse_segments(
- "content\n"
- "/* table-begin */\n"
- "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
- "{WHILE} { return SIMPLE_TOKEN(WHILE); }\n"
- "/* table-end */\n"
- "more content\n",
- False,
- ),
- (
- [
- "content\n" "/* table-begin */\n",
- None,
- "\n" "/* table-end */\n" "more content\n",
- ],
- {},
- [
- format_grammar._Table(
- 1,
- "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
- "{WHILE} { return SIMPLE_TOKEN(WHILE); }",
- )
- ],
- ),
- )
- def test_table_with_space(self):
- self.assertEqual(
- format_grammar._parse_segments(
- "content\n"
- " /* table-begin */\n"
- "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
- "{WHILE} { return SIMPLE_TOKEN(WHILE); }\n"
- " /* table-end */\n"
- "more content\n",
- False,
- ),
- (
- [
- "content\n /* table-begin */\n",
- None,
- "\n /* table-end */\nmore content\n",
- ],
- {},
- [
- format_grammar._Table(
- 1,
- "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
- "{WHILE} { return SIMPLE_TOKEN(WHILE); }",
- )
- ],
- ),
- )
- def test_table_tokens(self):
- self.assertEqual(
- format_grammar._parse_segments(
- "%tokens\n"
- " // Comment\n"
- " // table-begin\n"
- " VAR\n"
- " WHILE\n"
- " // table-end\n"
- " MORE\n",
- False,
- ),
- (
- [
- "%tokens\n" " // Comment\n" " // table-begin\n",
- None,
- "\n" " // table-end\n" " MORE\n",
- ],
- {},
- [format_grammar._Table(1, " VAR\n" " WHILE")],
- ),
- )
- def test_format_table_defines(self):
- text_segments = [None]
- format_grammar._format_table_segments(
- text_segments,
- [
- format_grammar._Table(
- 0,
- 'DEFAULT "default"\n'
- 'CONTINUE "continue"\n'
- 'DOUBLE_ARROW "=>"',
- )
- ],
- False,
- )
- self.assertEqual(
- text_segments,
- [
- 'CONTINUE "continue"\n'
- 'DEFAULT "default"\n'
- 'DOUBLE_ARROW "=>"'
- ],
- )
- def test_format_table_returns(self):
- text_segments = [None]
- format_grammar._format_table_segments(
- text_segments,
- [
- format_grammar._Table(
- 0,
- "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
- "{WHILE} { return SIMPLE_TOKEN(WHILE); }",
- )
- ],
- False,
- )
- self.assertEqual(
- text_segments,
- [
- "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
- "{WHILE} { return SIMPLE_TOKEN(WHILE); }"
- ],
- )
- def test_format_table_tokens(self):
- text_segments = [None]
- format_grammar._format_table_segments(
- text_segments,
- [
- format_grammar._Table(
- 0,
- " AND\n" " CONTINUE\n" " BREAK",
- )
- ],
- False,
- )
- self.assertEqual(
- text_segments,
- [
- " AND\n" " BREAK\n" " CONTINUE",
- ],
- )
- if __name__ == "__main__":
- unittest.main()
|