blob: c2f8539ddbfcd3c87af45ba66f4e255ba5f25dc8 [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
Martin v. Löwis3bd071e2001-07-30 12:30:08 +00009
Samuele Pedronide9a0d32003-05-17 02:39:52 +000010if is_jython:
11 import sys
12 import cStringIO
13
14 def unify_callables(d):
15 for n,v in d.items():
16 if callable(v):
17 d[n] = callable
18 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 = {},{}
29 sys.stdout = cStringIO.StringIO()
30 try:
31 exec code in d
32 exec compile(str,"<input>","single") in r
33 finally:
34 sys.stdout = sys.__stdout__
35 elif symbol == 'eval':
36 ctx = {'a': 2}
37 d = { 'value': eval(code,ctx) }
38 r = { 'value': eval(str,ctx) }
39 self.assertEquals(unify_callables(r),unify_callables(d))
40 else:
41 expected = compile(str, "<input>", symbol, PyCF_DONT_IMPLY_DEDENT)
42 self.assertEquals( compile_command(str, "<input>", symbol), expected)
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000043
44 def assertIncomplete(self, str, symbol='single'):
45 '''succeed iff str is the start of a valid piece of code'''
46 self.assertEquals( compile_command(str, symbol=symbol), None)
47
48 def assertInvalid(self, str, symbol='single', is_syntax=1):
49 '''succeed iff str is the start of an invalid piece of code'''
50 try:
51 compile_command(str,symbol=symbol)
52 self.fail("No exception thrown for invalid code")
53 except SyntaxError:
54 self.assert_(is_syntax)
55 except OverflowError:
56 self.assert_(not is_syntax)
57
58 def test_valid(self):
59 av = self.assertValid
Samuele Pedronide9a0d32003-05-17 02:39:52 +000060
61 # special case
62 if not is_jython:
63 self.assertEquals(compile_command(""),
64 compile("pass", "<input>", 'single',
65 PyCF_DONT_IMPLY_DEDENT))
66 self.assertEquals(compile_command("\n"),
67 compile("pass", "<input>", 'single',
68 PyCF_DONT_IMPLY_DEDENT))
69 else:
70 av("")
71 av("\n")
72
73 av("a = 1")
74 av("\na = 1")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000075 av("a = 1\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000076 av("a = 1\n\n")
77 av("\n\na = 1\n\n")
78
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000079 av("def x():\n pass\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000080 av("if 1:\n pass\n")
81
82 av("\n\nif 1: pass\n")
83 av("\n\nif 1: pass\n\n")
84
85 av("def x():\n\n pass\n")
86 av("def x():\n pass\n \n")
87 av("def x():\n pass\n \n")
88
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000089 av("pass\n")
90 av("3**3\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000091
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000092 av("if 9==3:\n pass\nelse:\n pass\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000093 av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n")
94
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000095 av("#a\n#b\na = 3\n")
96 av("#a\n\n \na=3\n")
97 av("a=3\n\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000098 av("a = 9+ \\\n3")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000099
100 av("3**3","eval")
101 av("(lambda z: \n z**3)","eval")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000102
103 av("9+ \\\n3","eval")
104 av("9+ \\\n3\n","eval")
105
106 av("\n\na**3","eval")
107 av("\n \na**3","eval")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000108 av("#a\n#b\na**3","eval")
Tim Petersab9ba272001-08-09 21:40:30 +0000109
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000110 def test_incomplete(self):
111 ai = self.assertIncomplete
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000112
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000113 ai("(a **")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000114 ai("(a,b,")
115 ai("(a,b,(")
116 ai("(a,b,(")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000117 ai("a = (")
118 ai("a = {")
119 ai("b + {")
120
121 ai("if 9==3:\n pass\nelse:")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000122 ai("if 9==3:\n pass\nelse:\n")
123 ai("if 9==3:\n pass\nelse:\n pass")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000124 ai("if 1:")
125 ai("if 1:\n")
126 ai("if 1:\n pass\n if 1:\n pass\n else:")
127 ai("if 1:\n pass\n if 1:\n pass\n else:\n")
128 ai("if 1:\n pass\n if 1:\n pass\n else:\n pass")
129
130 ai("def x():")
131 ai("def x():\n")
132 ai("def x():\n\n")
Tim Petersab9ba272001-08-09 21:40:30 +0000133
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000134 ai("def x():\n pass")
135 ai("def x():\n pass\n ")
136 ai("def x():\n pass\n ")
137 ai("\n\ndef x():\n pass")
138
139 ai("a = 9+ \\")
140 ai("a = 'a\\")
141 ai("a = '''xy")
142
143 ai("","eval")
144 ai("\n","eval")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000145 ai("(","eval")
146 ai("(\n\n\n","eval")
147 ai("(9+","eval")
148 ai("9+ \\","eval")
149 ai("lambda z: \\","eval")
150
151 def test_invalid(self):
152 ai = self.assertInvalid
153 ai("a b")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000154
155 ai("a @")
156 ai("a b @")
157 ai("a ** @")
158
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000159 ai("a = ")
160 ai("a = 9 +")
161
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000162 ai("def x():\n\npass\n")
163
164 ai("\n\n if 1: pass\n\npass")
165
166 ai("a = 9+ \\\n")
167 ai("a = 'a\\ ")
168 ai("a = 'a\\\n")
169
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000170 ai("a = 1","eval")
171 ai("a = (","eval")
172 ai("]","eval")
173 ai("())","eval")
174 ai("[}","eval")
175 ai("9+","eval")
176 ai("lambda z:","eval")
177 ai("a b","eval")
178
179 def test_filename(self):
180 self.assertEquals(compile_command("a = 1\n", "abc").co_filename,
181 compile("a = 1\n", "abc", 'single').co_filename)
182 self.assertNotEquals(compile_command("a = 1\n", "abc").co_filename,
183 compile("a = 1\n", "def", 'single').co_filename)
184
Fred Drake2e2be372001-09-20 21:33:42 +0000185
186def test_main():
187 run_unittest(CodeopTests)
188
189
190if __name__ == "__main__":
191 test_main()