blob: edea6011175413e2baf059450136dfbc56950dfa [file] [log] [blame]
Martin v. Löwis3bd071e2001-07-30 12:30:08 +00001"""
2 Test cases for codeop.py
3 Nick Mathewson
4"""
5import unittest
Samuele Pedronide9a0d32003-05-17 02:39:52 +00006from test.test_support import run_unittest, is_jython
Martin v. Löwis3bd071e2001-07-30 12:30:08 +00007
Guido van Rossum4b499dd32003-02-13 22:07:59 +00008from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT
Guido van Rossum34d19282007-08-09 01:03:29 +00009import io
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000010
Samuele Pedronide9a0d32003-05-17 02:39:52 +000011if is_jython:
12 import sys
Samuele Pedronide9a0d32003-05-17 02:39:52 +000013
14 def unify_callables(d):
15 for n,v in d.items():
Guido van Rossumd59da4b2007-05-22 18:11:13 +000016 if hasattr(v, '__call__'):
17 d[n] = True
Samuele Pedronide9a0d32003-05-17 02:39:52 +000018 return d
19
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000020class CodeopTests(unittest.TestCase):
21
22 def assertValid(self, str, symbol='single'):
23 '''succeed iff str is a valid piece of code'''
Samuele Pedronide9a0d32003-05-17 02:39:52 +000024 if is_jython:
25 code = compile_command(str, "<input>", symbol)
26 self.assert_(code)
27 if symbol == "single":
28 d,r = {},{}
Samuele Pedroni72c5c772003-05-17 12:51:10 +000029 saved_stdout = sys.stdout
Guido van Rossum34d19282007-08-09 01:03:29 +000030 sys.stdout = io.StringIO()
Samuele Pedronide9a0d32003-05-17 02:39:52 +000031 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000032 exec(code, d)
33 exec(compile(str,"<input>","single"), r)
Samuele Pedronide9a0d32003-05-17 02:39:52 +000034 finally:
Samuele Pedroni72c5c772003-05-17 12:51:10 +000035 sys.stdout = saved_stdout
Samuele Pedronide9a0d32003-05-17 02:39:52 +000036 elif symbol == 'eval':
37 ctx = {'a': 2}
38 d = { 'value': eval(code,ctx) }
39 r = { 'value': eval(str,ctx) }
40 self.assertEquals(unify_callables(r),unify_callables(d))
41 else:
42 expected = compile(str, "<input>", symbol, PyCF_DONT_IMPLY_DEDENT)
43 self.assertEquals( compile_command(str, "<input>", symbol), expected)
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000044
45 def assertIncomplete(self, str, symbol='single'):
46 '''succeed iff str is the start of a valid piece of code'''
47 self.assertEquals( compile_command(str, symbol=symbol), None)
48
49 def assertInvalid(self, str, symbol='single', is_syntax=1):
50 '''succeed iff str is the start of an invalid piece of code'''
51 try:
52 compile_command(str,symbol=symbol)
53 self.fail("No exception thrown for invalid code")
54 except SyntaxError:
55 self.assert_(is_syntax)
56 except OverflowError:
57 self.assert_(not is_syntax)
58
59 def test_valid(self):
60 av = self.assertValid
Samuele Pedronide9a0d32003-05-17 02:39:52 +000061
62 # special case
63 if not is_jython:
64 self.assertEquals(compile_command(""),
65 compile("pass", "<input>", 'single',
66 PyCF_DONT_IMPLY_DEDENT))
67 self.assertEquals(compile_command("\n"),
Tim Petersf545baa2003-06-15 23:26:30 +000068 compile("pass", "<input>", 'single',
Samuele Pedronide9a0d32003-05-17 02:39:52 +000069 PyCF_DONT_IMPLY_DEDENT))
70 else:
71 av("")
72 av("\n")
Tim Petersf545baa2003-06-15 23:26:30 +000073
Samuele Pedronide9a0d32003-05-17 02:39:52 +000074 av("a = 1")
75 av("\na = 1")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000076 av("a = 1\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000077 av("a = 1\n\n")
78 av("\n\na = 1\n\n")
79
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000080 av("def x():\n pass\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000081 av("if 1:\n pass\n")
82
83 av("\n\nif 1: pass\n")
84 av("\n\nif 1: pass\n\n")
85
86 av("def x():\n\n pass\n")
87 av("def x():\n pass\n \n")
88 av("def x():\n pass\n \n")
89
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000090 av("pass\n")
91 av("3**3\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000092
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000093 av("if 9==3:\n pass\nelse:\n pass\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000094 av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n")
95
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000096 av("#a\n#b\na = 3\n")
97 av("#a\n\n \na=3\n")
98 av("a=3\n\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000099 av("a = 9+ \\\n3")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000100
101 av("3**3","eval")
102 av("(lambda z: \n z**3)","eval")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000103
104 av("9+ \\\n3","eval")
105 av("9+ \\\n3\n","eval")
106
107 av("\n\na**3","eval")
108 av("\n \na**3","eval")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000109 av("#a\n#b\na**3","eval")
Tim Petersab9ba272001-08-09 21:40:30 +0000110
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000111 def test_incomplete(self):
112 ai = self.assertIncomplete
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000113
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000114 ai("(a **")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000115 ai("(a,b,")
116 ai("(a,b,(")
117 ai("(a,b,(")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000118 ai("a = (")
119 ai("a = {")
120 ai("b + {")
121
122 ai("if 9==3:\n pass\nelse:")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000123 ai("if 9==3:\n pass\nelse:\n")
124 ai("if 9==3:\n pass\nelse:\n pass")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000125 ai("if 1:")
126 ai("if 1:\n")
127 ai("if 1:\n pass\n if 1:\n pass\n else:")
Tim Petersf545baa2003-06-15 23:26:30 +0000128 ai("if 1:\n pass\n if 1:\n pass\n else:\n")
129 ai("if 1:\n pass\n if 1:\n pass\n else:\n pass")
130
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000131 ai("def x():")
132 ai("def x():\n")
133 ai("def x():\n\n")
Tim Petersab9ba272001-08-09 21:40:30 +0000134
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000135 ai("def x():\n pass")
136 ai("def x():\n pass\n ")
137 ai("def x():\n pass\n ")
138 ai("\n\ndef x():\n pass")
139
140 ai("a = 9+ \\")
141 ai("a = 'a\\")
142 ai("a = '''xy")
143
144 ai("","eval")
145 ai("\n","eval")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000146 ai("(","eval")
147 ai("(\n\n\n","eval")
148 ai("(9+","eval")
149 ai("9+ \\","eval")
150 ai("lambda z: \\","eval")
151
152 def test_invalid(self):
153 ai = self.assertInvalid
154 ai("a b")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000155
156 ai("a @")
157 ai("a b @")
158 ai("a ** @")
Tim Petersf545baa2003-06-15 23:26:30 +0000159
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000160 ai("a = ")
161 ai("a = 9 +")
162
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000163 ai("def x():\n\npass\n")
164
165 ai("\n\n if 1: pass\n\npass")
166
167 ai("a = 9+ \\\n")
168 ai("a = 'a\\ ")
169 ai("a = 'a\\\n")
170
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000171 ai("a = 1","eval")
172 ai("a = (","eval")
173 ai("]","eval")
174 ai("())","eval")
175 ai("[}","eval")
176 ai("9+","eval")
177 ai("lambda z:","eval")
178 ai("a b","eval")
179
180 def test_filename(self):
181 self.assertEquals(compile_command("a = 1\n", "abc").co_filename,
182 compile("a = 1\n", "abc", 'single').co_filename)
183 self.assertNotEquals(compile_command("a = 1\n", "abc").co_filename,
184 compile("a = 1\n", "def", 'single').co_filename)
185
Fred Drake2e2be372001-09-20 21:33:42 +0000186
187def test_main():
188 run_unittest(CodeopTests)
189
190
191if __name__ == "__main__":
192 test_main()