format_grammar_test.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. """Tests for format_grammar.py."""
  2. __copyright__ = """
  3. Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  4. Exceptions. See /LICENSE for license information.
  5. SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. """
  7. import unittest
  8. from executable_semantics.syntax import format_grammar
  9. class TestFormatGrammar(unittest.TestCase):
  10. def test_empty(self):
  11. self.assertEqual(
  12. format_grammar._parse_segments("", False), ([""], {}, [])
  13. )
  14. def test_text(self):
  15. self.assertEqual(
  16. format_grammar._parse_segments("text", False),
  17. (["text"], {}, []),
  18. )
  19. def test_cpp(self):
  20. self.assertEqual(
  21. format_grammar._parse_segments("{ code; }", False),
  22. (
  23. ["", None, ""],
  24. {0: [format_grammar._CppCode(1, "code;", 0, 0, False)]},
  25. [],
  26. ),
  27. )
  28. def test_word_in_braces(self):
  29. self.assertEqual(
  30. format_grammar._parse_segments("{AND}", False),
  31. (["{AND}"], {}, []),
  32. )
  33. def test_cpp_str(self):
  34. self.assertEqual(
  35. format_grammar._parse_segments('{ "\\x {"; }', False),
  36. (
  37. ["", None, ""],
  38. {0: [format_grammar._CppCode(1, '"\\x {";', 0, 0, False)]},
  39. [],
  40. ),
  41. )
  42. def test_brace_in_str(self):
  43. self.assertEqual(
  44. format_grammar._parse_segments('"{" not code }', False),
  45. (['"{" not code }'], {}, []),
  46. )
  47. def test_quote_regex(self):
  48. self.assertEqual(
  49. format_grammar._parse_segments('\\"', False),
  50. (['\\"'], {}, []),
  51. )
  52. def test_block_comment_quote(self):
  53. self.assertEqual(
  54. format_grammar._parse_segments('/* " */', False),
  55. (['/* " */'], {}, []),
  56. )
  57. def test_cpp_after_block_comment(self):
  58. self.assertEqual(
  59. format_grammar._parse_segments("/* */{ code; }", False),
  60. (
  61. ["/* */", None, ""],
  62. {0: [format_grammar._CppCode(1, "code;", 5, 0, False)]},
  63. [],
  64. ),
  65. )
  66. def test_line_comment_quote(self):
  67. self.assertEqual(
  68. format_grammar._parse_segments('{\n// "\n}', False),
  69. (
  70. ["", None, ""],
  71. {0: [format_grammar._CppCode(1, '// "', 0, 0, False)]},
  72. [],
  73. ),
  74. )
  75. def test_table(self):
  76. self.assertEqual(
  77. format_grammar._parse_segments(
  78. "content\n"
  79. "/* Table begin. */\n"
  80. "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
  81. "{WHILE} { return SIMPLE_TOKEN(WHILE); }\n"
  82. "/* Table end. */\n"
  83. "more content\n",
  84. False,
  85. ),
  86. (
  87. [
  88. "content\n" "/* Table begin. */\n",
  89. None,
  90. "\n" "/* Table end. */\n" "more content\n",
  91. ],
  92. {},
  93. [
  94. format_grammar._Table(
  95. 1,
  96. "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
  97. "{WHILE} { return SIMPLE_TOKEN(WHILE); }",
  98. )
  99. ],
  100. ),
  101. )
  102. def test_table_with_space(self):
  103. self.assertEqual(
  104. format_grammar._parse_segments(
  105. "content\n"
  106. " /* Table begin. */\n"
  107. "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
  108. "{WHILE} { return SIMPLE_TOKEN(WHILE); }\n"
  109. " /* Table end. */\n"
  110. "more content\n",
  111. False,
  112. ),
  113. (
  114. [
  115. "content\n /* Table begin. */\n",
  116. None,
  117. "\n /* Table end. */\nmore content\n",
  118. ],
  119. {},
  120. [
  121. format_grammar._Table(
  122. 1,
  123. "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
  124. "{WHILE} { return SIMPLE_TOKEN(WHILE); }",
  125. )
  126. ],
  127. ),
  128. )
  129. def test_format_table_defines(self):
  130. text_segments = [None]
  131. format_grammar._format_table_segments(
  132. text_segments,
  133. [
  134. format_grammar._Table(
  135. 0,
  136. 'CONTINUE "continue"\n'
  137. 'DEFAULT "default"\n'
  138. 'DOUBLE_ARROW "=>"',
  139. )
  140. ],
  141. False,
  142. )
  143. self.assertEqual(
  144. text_segments,
  145. [
  146. 'CONTINUE "continue"\n'
  147. 'DEFAULT "default"\n'
  148. 'DOUBLE_ARROW "=>"'
  149. ],
  150. )
  151. def test_format_table_returns(self):
  152. text_segments = [None]
  153. format_grammar._format_table_segments(
  154. text_segments,
  155. [
  156. format_grammar._Table(
  157. 0,
  158. "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
  159. "{WHILE} { return SIMPLE_TOKEN(WHILE); }",
  160. )
  161. ],
  162. False,
  163. )
  164. self.assertEqual(
  165. text_segments,
  166. [
  167. "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
  168. "{WHILE} { return SIMPLE_TOKEN(WHILE); }"
  169. ],
  170. )
  171. if __name__ == "__main__":
  172. unittest.main()