test_codeop.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. """
  2. Test cases for codeop.py
  3. Nick Mathewson
  4. """
  5. import unittest
  6. from test.test_support import run_unittest, is_jython
  7. from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT
  8. if is_jython:
  9. import sys
  10. import cStringIO
  11. def unify_callables(d):
  12. for n,v in d.items():
  13. if callable(v):
  14. d[n] = callable
  15. return d
  16. class CodeopTests(unittest.TestCase):
  17. def assertValid(self, str, symbol='single'):
  18. '''succeed iff str is a valid piece of code'''
  19. if is_jython:
  20. code = compile_command(str, "<input>", symbol)
  21. self.assertTrue(code)
  22. if symbol == "single":
  23. d,r = {},{}
  24. saved_stdout = sys.stdout
  25. sys.stdout = cStringIO.StringIO()
  26. try:
  27. exec code in d
  28. exec compile(str,"<input>","single") in r
  29. finally:
  30. sys.stdout = saved_stdout
  31. elif symbol == 'eval':
  32. ctx = {'a': 2}
  33. d = { 'value': eval(code,ctx) }
  34. r = { 'value': eval(str,ctx) }
  35. self.assertEqual(unify_callables(r),unify_callables(d))
  36. else:
  37. expected = compile(str, "<input>", symbol, PyCF_DONT_IMPLY_DEDENT)
  38. self.assertEqual(compile_command(str, "<input>", symbol), expected)
  39. def assertIncomplete(self, str, symbol='single'):
  40. '''succeed iff str is the start of a valid piece of code'''
  41. self.assertEqual(compile_command(str, symbol=symbol), None)
  42. def assertInvalid(self, str, symbol='single', is_syntax=1):
  43. '''succeed iff str is the start of an invalid piece of code'''
  44. try:
  45. compile_command(str,symbol=symbol)
  46. self.fail("No exception raised for invalid code")
  47. except SyntaxError:
  48. self.assertTrue(is_syntax)
  49. except OverflowError:
  50. self.assertTrue(not is_syntax)
  51. def test_valid(self):
  52. av = self.assertValid
  53. # special case
  54. if not is_jython:
  55. self.assertEqual(compile_command(""),
  56. compile("pass", "<input>", 'single',
  57. PyCF_DONT_IMPLY_DEDENT))
  58. self.assertEqual(compile_command("\n"),
  59. compile("pass", "<input>", 'single',
  60. PyCF_DONT_IMPLY_DEDENT))
  61. else:
  62. av("")
  63. av("\n")
  64. av("a = 1")
  65. av("\na = 1")
  66. av("a = 1\n")
  67. av("a = 1\n\n")
  68. av("\n\na = 1\n\n")
  69. av("def x():\n pass\n")
  70. av("if 1:\n pass\n")
  71. av("\n\nif 1: pass\n")
  72. av("\n\nif 1: pass\n\n")
  73. av("def x():\n\n pass\n")
  74. av("def x():\n pass\n \n")
  75. av("def x():\n pass\n \n")
  76. av("pass\n")
  77. av("3**3\n")
  78. av("if 9==3:\n pass\nelse:\n pass\n")
  79. av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n")
  80. av("#a\n#b\na = 3\n")
  81. av("#a\n\n \na=3\n")
  82. av("a=3\n\n")
  83. av("a = 9+ \\\n3")
  84. av("3**3","eval")
  85. av("(lambda z: \n z**3)","eval")
  86. av("9+ \\\n3","eval")
  87. av("9+ \\\n3\n","eval")
  88. av("\n\na**3","eval")
  89. av("\n \na**3","eval")
  90. av("#a\n#b\na**3","eval")
  91. av("\n\na = 1\n\n")
  92. av("\n\nif 1: a=1\n\n")
  93. av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n")
  94. av("#a\n\n \na=3\n\n")
  95. av("\n\na**3","eval")
  96. av("\n \na**3","eval")
  97. av("#a\n#b\na**3","eval")
  98. av("def f():\n try: pass\n finally: [x for x in (1,2)]\n")
  99. av("def f():\n pass\n#foo\n")
  100. av("@a.b.c\ndef f():\n pass\n")
  101. def test_incomplete(self):
  102. ai = self.assertIncomplete
  103. ai("(a **")
  104. ai("(a,b,")
  105. ai("(a,b,(")
  106. ai("(a,b,(")
  107. ai("a = (")
  108. ai("a = {")
  109. ai("b + {")
  110. ai("if 9==3:\n pass\nelse:")
  111. ai("if 9==3:\n pass\nelse:\n")
  112. ai("if 9==3:\n pass\nelse:\n pass")
  113. ai("if 1:")
  114. ai("if 1:\n")
  115. ai("if 1:\n pass\n if 1:\n pass\n else:")
  116. ai("if 1:\n pass\n if 1:\n pass\n else:\n")
  117. ai("if 1:\n pass\n if 1:\n pass\n else:\n pass")
  118. ai("def x():")
  119. ai("def x():\n")
  120. ai("def x():\n\n")
  121. ai("def x():\n pass")
  122. ai("def x():\n pass\n ")
  123. ai("def x():\n pass\n ")
  124. ai("\n\ndef x():\n pass")
  125. ai("a = 9+ \\")
  126. ai("a = 'a\\")
  127. ai("a = '''xy")
  128. ai("","eval")
  129. ai("\n","eval")
  130. ai("(","eval")
  131. ai("(\n\n\n","eval")
  132. ai("(9+","eval")
  133. ai("9+ \\","eval")
  134. ai("lambda z: \\","eval")
  135. ai("if True:\n if True:\n if True: \n")
  136. ai("@a(")
  137. ai("@a(b")
  138. ai("@a(b,")
  139. ai("@a(b,c")
  140. ai("@a(b,c,")
  141. ai("from a import (")
  142. ai("from a import (b")
  143. ai("from a import (b,")
  144. ai("from a import (b,c")
  145. ai("from a import (b,c,")
  146. ai("[");
  147. ai("[a");
  148. ai("[a,");
  149. ai("[a,b");
  150. ai("[a,b,");
  151. ai("{");
  152. ai("{a");
  153. ai("{a:");
  154. ai("{a:b");
  155. ai("{a:b,");
  156. ai("{a:b,c");
  157. ai("{a:b,c:");
  158. ai("{a:b,c:d");
  159. ai("{a:b,c:d,");
  160. ai("a(")
  161. ai("a(b")
  162. ai("a(b,")
  163. ai("a(b,c")
  164. ai("a(b,c,")
  165. ai("a[")
  166. ai("a[b")
  167. ai("a[b,")
  168. ai("a[b:")
  169. ai("a[b:c")
  170. ai("a[b:c:")
  171. ai("a[b:c:d")
  172. ai("def a(")
  173. ai("def a(b")
  174. ai("def a(b,")
  175. ai("def a(b,c")
  176. ai("def a(b,c,")
  177. ai("(")
  178. ai("(a")
  179. ai("(a,")
  180. ai("(a,b")
  181. ai("(a,b,")
  182. ai("if a:\n pass\nelif b:")
  183. ai("if a:\n pass\nelif b:\n pass\nelse:")
  184. ai("while a:")
  185. ai("while a:\n pass\nelse:")
  186. ai("for a in b:")
  187. ai("for a in b:\n pass\nelse:")
  188. ai("try:")
  189. ai("try:\n pass\nexcept:")
  190. ai("try:\n pass\nfinally:")
  191. ai("try:\n pass\nexcept:\n pass\nfinally:")
  192. ai("with a:")
  193. ai("with a as b:")
  194. ai("class a:")
  195. ai("class a(")
  196. ai("class a(b")
  197. ai("class a(b,")
  198. ai("class a():")
  199. ai("[x for")
  200. ai("[x for x in")
  201. ai("[x for x in (")
  202. ai("(x for")
  203. ai("(x for x in")
  204. ai("(x for x in (")
  205. def test_invalid(self):
  206. ai = self.assertInvalid
  207. ai("a b")
  208. ai("a @")
  209. ai("a b @")
  210. ai("a ** @")
  211. ai("a = ")
  212. ai("a = 9 +")
  213. ai("def x():\n\npass\n")
  214. ai("\n\n if 1: pass\n\npass")
  215. ai("a = 9+ \\\n")
  216. ai("a = 'a\\ ")
  217. ai("a = 'a\\\n")
  218. ai("a = 1","eval")
  219. ai("a = (","eval")
  220. ai("]","eval")
  221. ai("())","eval")
  222. ai("[}","eval")
  223. ai("9+","eval")
  224. ai("lambda z:","eval")
  225. ai("a b","eval")
  226. ai("return 2.3")
  227. ai("if (a == 1 and b = 2): pass")
  228. ai("del 1")
  229. ai("del ()")
  230. ai("del (1,)")
  231. ai("del [1]")
  232. ai("del '1'")
  233. ai("[i for i in range(10)] = (1, 2, 3)")
  234. def test_filename(self):
  235. self.assertEqual(compile_command("a = 1\n", "abc").co_filename,
  236. compile("a = 1\n", "abc", 'single').co_filename)
  237. self.assertNotEqual(compile_command("a = 1\n", "abc").co_filename,
  238. compile("a = 1\n", "def", 'single').co_filename)
  239. def test_main():
  240. run_unittest(CodeopTests)
  241. if __name__ == "__main__":
  242. test_main()