format_grammar_test.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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 carbon.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_table_tokens(self):
  130. self.assertEqual(
  131. format_grammar._parse_segments(
  132. "%tokens\n"
  133. " // Comment\n"
  134. " // table-begin\n"
  135. " VAR\n"
  136. " WHILE\n"
  137. " // table-end\n"
  138. " MORE\n",
  139. False,
  140. ),
  141. (
  142. [
  143. "%tokens\n" " // Comment\n" " // table-begin\n",
  144. None,
  145. "\n" " // table-end\n" " MORE\n",
  146. ],
  147. {},
  148. [format_grammar._Table(1, " VAR\n" " WHILE")],
  149. ),
  150. )
  151. def test_format_table_defines(self):
  152. text_segments = [None]
  153. format_grammar._format_table_segments(
  154. text_segments,
  155. [
  156. format_grammar._Table(
  157. 0,
  158. 'DEFAULT "default"\n'
  159. 'CONTINUE "continue"\n'
  160. 'DOUBLE_ARROW "=>"',
  161. )
  162. ],
  163. False,
  164. )
  165. self.assertEqual(
  166. text_segments,
  167. [
  168. 'CONTINUE "continue"\n'
  169. 'DEFAULT "default"\n'
  170. 'DOUBLE_ARROW "=>"'
  171. ],
  172. )
  173. def test_format_table_returns(self):
  174. text_segments = [None]
  175. format_grammar._format_table_segments(
  176. text_segments,
  177. [
  178. format_grammar._Table(
  179. 0,
  180. "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
  181. "{WHILE} { return SIMPLE_TOKEN(WHILE); }",
  182. )
  183. ],
  184. False,
  185. )
  186. self.assertEqual(
  187. text_segments,
  188. [
  189. "{VAR} { return SIMPLE_TOKEN(VAR); }\n"
  190. "{WHILE} { return SIMPLE_TOKEN(WHILE); }"
  191. ],
  192. )
  193. def test_format_table_tokens(self):
  194. text_segments = [None]
  195. format_grammar._format_table_segments(
  196. text_segments,
  197. [
  198. format_grammar._Table(
  199. 0,
  200. " AND\n" " CONTINUE\n" " BREAK",
  201. )
  202. ],
  203. False,
  204. )
  205. self.assertEqual(
  206. text_segments,
  207. [
  208. " AND\n" " BREAK\n" " CONTINUE",
  209. ],
  210. )
  211. if __name__ == "__main__":
  212. unittest.main()