blob: 3325785c73c5cd63b90197665f6a7eac67fff1a5 [file] [log] [blame]
Raymond Hettinger8a99b502003-06-23 13:36:57 +00001import unittest
Raymond Hettinger8a99b502003-06-23 13:36:57 +00002import sys
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003import _ast
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +00005
Raymond Hettinger8a99b502003-06-23 13:36:57 +00006class TestSpecifics(unittest.TestCase):
Jeremy Hylton778e2652001-11-09 19:50:08 +00007
Benjamin Petersonaeaa5922009-11-13 00:17:59 +00008 def test_no_ending_newline(self):
9 compile("hi", "<test>", "exec")
10 compile("hi\r", "<test>", "exec")
11
12 def test_empty(self):
13 compile("", "<test>", "exec")
14
15 def test_other_newlines(self):
16 compile("\r\n", "<test>", "exec")
17 compile("\r", "<test>", "exec")
18 compile("hi\r\nstuff\r\ndef f():\n pass\r", "<test>", "exec")
19 compile("this_is\rreally_old_mac\rdef f():\n pass", "<test>", "exec")
20
Raymond Hettinger8a99b502003-06-23 13:36:57 +000021 def test_debug_assignment(self):
22 # catch assignments to __debug__
23 self.assertRaises(SyntaxError, compile, '__debug__ = 1', '?', 'single')
Georg Brandl1a3284e2007-12-02 09:40:06 +000024 import builtins
25 prev = builtins.__debug__
26 setattr(builtins, '__debug__', 'sure')
27 setattr(builtins, '__debug__', prev)
Jeremy Hylton778e2652001-11-09 19:50:08 +000028
Raymond Hettinger8a99b502003-06-23 13:36:57 +000029 def test_argument_handling(self):
30 # detect duplicate positional and keyword arguments
31 self.assertRaises(SyntaxError, eval, 'lambda a,a:0')
32 self.assertRaises(SyntaxError, eval, 'lambda a,a=1:0')
33 self.assertRaises(SyntaxError, eval, 'lambda a=1,a=1:0')
Benjamin Petersonec19d952008-06-30 15:01:21 +000034 self.assertRaises(SyntaxError, exec, 'def f(a, a): pass')
35 self.assertRaises(SyntaxError, exec, 'def f(a = 0, a = 1): pass')
36 self.assertRaises(SyntaxError, exec, 'def f(a): global a; a = 1')
Jeremy Hylton778e2652001-11-09 19:50:08 +000037
Raymond Hettinger8a99b502003-06-23 13:36:57 +000038 def test_syntax_error(self):
39 self.assertRaises(SyntaxError, compile, "1+*3", "filename", "exec")
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000040
Guido van Rossumcd16bf62007-06-13 18:07:49 +000041 def test_none_keyword_arg(self):
42 self.assertRaises(SyntaxError, compile, "f(None=1)", "<string>", "exec")
43
Raymond Hettinger8a99b502003-06-23 13:36:57 +000044 def test_duplicate_global_local(self):
Benjamin Petersonec19d952008-06-30 15:01:21 +000045 self.assertRaises(SyntaxError, exec, 'def f(a): global a; a = 1')
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000046
Raymond Hettinger66bd2332004-08-02 08:30:07 +000047 def test_exec_with_general_mapping_for_locals(self):
48
49 class M:
50 "Test mapping interface versus possible calls from eval()."
51 def __getitem__(self, key):
52 if key == 'a':
53 return 12
54 raise KeyError
55 def __setitem__(self, key, value):
56 self.results = (key, value)
Guido van Rossum63eecc72007-02-22 23:55:25 +000057 def keys(self):
58 return list('xyz')
Raymond Hettinger66bd2332004-08-02 08:30:07 +000059
60 m = M()
61 g = globals()
Georg Brandl7cae87c2006-09-06 06:51:57 +000062 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000063 self.assertEqual(m.results, ('z', 12))
64 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000065 exec('z = b', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000066 except NameError:
67 pass
68 else:
69 self.fail('Did not detect a KeyError')
Georg Brandl7cae87c2006-09-06 06:51:57 +000070 exec('z = dir()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000071 self.assertEqual(m.results, ('z', list('xyz')))
Georg Brandl7cae87c2006-09-06 06:51:57 +000072 exec('z = globals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000073 self.assertEqual(m.results, ('z', g))
Georg Brandl7cae87c2006-09-06 06:51:57 +000074 exec('z = locals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000075 self.assertEqual(m.results, ('z', m))
Benjamin Petersonec19d952008-06-30 15:01:21 +000076 self.assertRaises(TypeError, exec, 'z = b', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000077
78 class A:
79 "Non-mapping"
80 pass
81 m = A()
Benjamin Petersonec19d952008-06-30 15:01:21 +000082 self.assertRaises(TypeError, exec, 'z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000083
84 # Verify that dict subclasses work as well
85 class D(dict):
86 def __getitem__(self, key):
87 if key == 'a':
88 return 12
89 return dict.__getitem__(self, key)
90 d = D()
Georg Brandl7cae87c2006-09-06 06:51:57 +000091 exec('z = a', g, d)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000092 self.assertEqual(d['z'], 12)
93
Neal Norwitz6ab080c2005-10-24 00:08:10 +000094 def test_extended_arg(self):
95 longexpr = 'x = x or ' + '-x' * 2500
Georg Brandl7cae87c2006-09-06 06:51:57 +000096 g = {}
Neal Norwitz6ab080c2005-10-24 00:08:10 +000097 code = '''
98def f(x):
99 %s
100 %s
101 %s
102 %s
103 %s
104 %s
105 %s
106 %s
107 %s
108 %s
109 # the expressions above have no effect, x == argument
110 while x:
111 x -= 1
112 # EXTENDED_ARG/JUMP_ABSOLUTE here
113 return x
114''' % ((longexpr,)*10)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000115 exec(code, g)
116 self.assertEqual(g['f'](5), 0)
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000117
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000118 def test_argument_order(self):
Benjamin Petersonec19d952008-06-30 15:01:21 +0000119 self.assertRaises(SyntaxError, exec, 'def f(a=1, b): pass')
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000120
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000121 def test_float_literals(self):
122 # testing bad float literals
123 self.assertRaises(SyntaxError, eval, "2e")
124 self.assertRaises(SyntaxError, eval, "2.0e+")
125 self.assertRaises(SyntaxError, eval, "1e-")
126 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000127
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000128 def test_indentation(self):
129 # testing compile() of indented block w/o trailing newline"
130 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000131if 1:
132 if 2:
133 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000134 compile(s, "<string>", "exec")
135
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000136 # This test is probably specific to CPython and may not generalize
137 # to other implementations. We are trying to ensure that when
138 # the first line of code starts after 256, correct line numbers
139 # in tracebacks are still produced.
140 def test_leading_newlines(self):
141 s256 = "".join(["\n"] * 256 + ["spam"])
142 co = compile(s256, 'fn', 'exec')
143 self.assertEqual(co.co_firstlineno, 257)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000144 self.assertEqual(co.co_lnotab, bytes())
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000145
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000146 def test_literals_with_leading_zeroes(self):
147 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000148 "080000000000000", "000000000000009", "000000000000008",
149 "0b42", "0BADCAFE", "0o123456789", "0b1.1", "0o4.2",
150 "0b101j2", "0o153j2", "0b100e1", "0o777e1", "0777",
151 "000777", "000000000000007"]:
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000152 self.assertRaises(SyntaxError, eval, arg)
153
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000154 self.assertEqual(eval("0xff"), 255)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000155 self.assertEqual(eval("0777."), 777)
156 self.assertEqual(eval("0777.0"), 777)
157 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
158 self.assertEqual(eval("0777e1"), 7770)
159 self.assertEqual(eval("0e0"), 0)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000160 self.assertEqual(eval("0000e-012"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000161 self.assertEqual(eval("09.5"), 9.5)
162 self.assertEqual(eval("0777j"), 777j)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000163 self.assertEqual(eval("000"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000164 self.assertEqual(eval("00j"), 0j)
165 self.assertEqual(eval("00.0"), 0)
166 self.assertEqual(eval("0e3"), 0)
167 self.assertEqual(eval("090000000000000."), 90000000000000.)
168 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
169 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
170 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
171 self.assertEqual(eval("090000000000000j"), 90000000000000j)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000172 self.assertEqual(eval("000000000000008."), 8.)
173 self.assertEqual(eval("000000000000009."), 9.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000174 self.assertEqual(eval("0b101010"), 42)
175 self.assertEqual(eval("-0b000000000010"), -2)
176 self.assertEqual(eval("0o777"), 511)
177 self.assertEqual(eval("-0o0000010"), -8)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000178
179 def test_unary_minus(self):
180 # Verify treatment of unary minus on negative numbers SF bug #660455
Christian Heimesa37d4c62007-12-04 23:02:19 +0000181 if sys.maxsize == 2147483647:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000182 # 32-bit machine
183 all_one_bits = '0xffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000184 self.assertEqual(eval(all_one_bits), 4294967295)
185 self.assertEqual(eval("-" + all_one_bits), -4294967295)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000186 elif sys.maxsize == 9223372036854775807:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000187 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000188 all_one_bits = '0xffffffffffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000189 self.assertEqual(eval(all_one_bits), 18446744073709551615)
190 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000191 else:
192 self.fail("How many bits *does* this machine have???")
Christian Heimesa37d4c62007-12-04 23:02:19 +0000193 # Verify treatment of contant folding on -(sys.maxsize+1)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000194 # i.e. -2147483648 on 32 bit platforms. Should return int, not long.
Ezio Melottie9615932010-01-24 19:26:24 +0000195 self.assertIsInstance(eval("%s" % (-sys.maxsize - 1)), int)
196 self.assertIsInstance(eval("%s" % (-sys.maxsize - 2)), int)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000197
Christian Heimesa37d4c62007-12-04 23:02:19 +0000198 if sys.maxsize == 9223372036854775807:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000199 def test_32_63_bit_values(self):
200 a = +4294967296 # 1 << 32
201 b = -4294967296 # 1 << 32
202 c = +281474976710656 # 1 << 48
203 d = -281474976710656 # 1 << 48
204 e = +4611686018427387904 # 1 << 62
205 f = -4611686018427387904 # 1 << 62
206 g = +9223372036854775807 # 1 << 63 - 1
207 h = -9223372036854775807 # 1 << 63 - 1
208
Neal Norwitz221085d2007-02-25 20:55:47 +0000209 for variable in self.test_32_63_bit_values.__code__.co_consts:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000210 if variable is not None:
Ezio Melottie9615932010-01-24 19:26:24 +0000211 self.assertIsInstance(variable, int)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000212
213 def test_sequence_unpacking_error(self):
214 # Verify sequence packing/unpacking with "or". SF bug #757818
215 i,j = (1, -1) or (-1, 1)
216 self.assertEqual(i, 1)
217 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000218
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000219 def test_none_assignment(self):
220 stmts = [
221 'None = 0',
222 'None += 0',
223 '__builtins__.None = 0',
224 'def None(): pass',
225 'class None: pass',
226 '(a, None) = 0, 0',
227 'for None in range(10): pass',
228 'def f(None): pass',
Benjamin Peterson78565b22009-06-28 19:19:51 +0000229 'import None',
230 'import x as None',
231 'from x import None',
232 'from x import y as None'
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000233 ]
234 for stmt in stmts:
235 stmt += "\n"
236 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
237 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000238
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000239 def test_import(self):
240 succeed = [
241 'import sys',
242 'import os, sys',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000243 'import os as bar',
244 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000245 'from __future__ import nested_scopes, generators',
246 'from __future__ import (nested_scopes,\ngenerators)',
247 'from __future__ import (nested_scopes,\ngenerators,)',
248 'from sys import stdin, stderr, stdout',
249 'from sys import (stdin, stderr,\nstdout)',
250 'from sys import (stdin, stderr,\nstdout,)',
251 'from sys import (stdin\n, stderr, stdout)',
252 'from sys import (stdin\n, stderr, stdout,)',
253 'from sys import stdin as si, stdout as so, stderr as se',
254 'from sys import (stdin as si, stdout as so, stderr as se)',
255 'from sys import (stdin as si, stdout as so, stderr as se,)',
256 ]
257 fail = [
258 'import (os, sys)',
259 'import (os), (sys)',
260 'import ((os), (sys))',
261 'import (sys',
262 'import sys)',
263 'import (os,)',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000264 'import os As bar',
265 'import os.path a bar',
266 'from sys import stdin As stdout',
267 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000268 'from (sys) import stdin',
269 'from __future__ import (nested_scopes',
270 'from __future__ import nested_scopes)',
271 'from __future__ import nested_scopes,\ngenerators',
272 'from sys import (stdin',
273 'from sys import stdin)',
274 'from sys import stdin, stdout,\nstderr',
275 'from sys import stdin si',
276 'from sys import stdin,'
277 'from sys import (*)',
278 'from sys import (stdin,, stdout, stderr)',
279 'from sys import (stdin, stdout),',
280 ]
281 for stmt in succeed:
282 compile(stmt, 'tmp', 'exec')
283 for stmt in fail:
284 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
285
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000286 def test_for_distinct_code_objects(self):
287 # SF bug 1048870
288 def f():
289 f1 = lambda x=1: x
290 f2 = lambda x=2: x
291 return f1, f2
292 f1, f2 = f()
Neal Norwitz221085d2007-02-25 20:55:47 +0000293 self.assertNotEqual(id(f1.__code__), id(f2.__code__))
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000294
Benjamin Petersone6dd2cb2010-03-17 20:56:58 +0000295 def test_lambda_doc(self):
296 l = lambda: "foo"
297 self.assertIsNone(l.__doc__)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000298
Benjamin Peterson5d2ad252010-03-17 20:57:32 +0000299## def test_unicode_encoding(self):
300## code = "# -*- coding: utf-8 -*-\npass\n"
301## self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
302
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000303 def test_subscripts(self):
304 # SF bug 1448804
305 # Class to make testing subscript results easy
306 class str_map(object):
307 def __init__(self):
308 self.data = {}
309 def __getitem__(self, key):
310 return self.data[str(key)]
311 def __setitem__(self, key, value):
312 self.data[str(key)] = value
313 def __delitem__(self, key):
314 del self.data[str(key)]
315 def __contains__(self, key):
316 return str(key) in self.data
317 d = str_map()
318 # Index
319 d[1] = 1
320 self.assertEqual(d[1], 1)
321 d[1] += 1
322 self.assertEqual(d[1], 2)
323 del d[1]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000324 self.assertNotIn(1, d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000325 # Tuple of indices
326 d[1, 1] = 1
327 self.assertEqual(d[1, 1], 1)
328 d[1, 1] += 1
329 self.assertEqual(d[1, 1], 2)
330 del d[1, 1]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000331 self.assertNotIn((1, 1), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000332 # Simple slice
333 d[1:2] = 1
334 self.assertEqual(d[1:2], 1)
335 d[1:2] += 1
336 self.assertEqual(d[1:2], 2)
337 del d[1:2]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000338 self.assertNotIn(slice(1, 2), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000339 # Tuple of simple slices
340 d[1:2, 1:2] = 1
341 self.assertEqual(d[1:2, 1:2], 1)
342 d[1:2, 1:2] += 1
343 self.assertEqual(d[1:2, 1:2], 2)
344 del d[1:2, 1:2]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000345 self.assertNotIn((slice(1, 2), slice(1, 2)), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000346 # Extended slice
347 d[1:2:3] = 1
348 self.assertEqual(d[1:2:3], 1)
349 d[1:2:3] += 1
350 self.assertEqual(d[1:2:3], 2)
351 del d[1:2:3]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000352 self.assertNotIn(slice(1, 2, 3), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000353 # Tuple of extended slices
354 d[1:2:3, 1:2:3] = 1
355 self.assertEqual(d[1:2:3, 1:2:3], 1)
356 d[1:2:3, 1:2:3] += 1
357 self.assertEqual(d[1:2:3, 1:2:3], 2)
358 del d[1:2:3, 1:2:3]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000359 self.assertNotIn((slice(1, 2, 3), slice(1, 2, 3)), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000360 # Ellipsis
361 d[...] = 1
362 self.assertEqual(d[...], 1)
363 d[...] += 1
364 self.assertEqual(d[...], 2)
365 del d[...]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000366 self.assertNotIn(Ellipsis, d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000367 # Tuple of Ellipses
368 d[..., ...] = 1
369 self.assertEqual(d[..., ...], 1)
370 d[..., ...] += 1
371 self.assertEqual(d[..., ...], 2)
372 del d[..., ...]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000373 self.assertNotIn((Ellipsis, Ellipsis), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000374
Guido van Rossum0240b922007-02-26 21:23:50 +0000375 def test_annotation_limit(self):
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000376 # 16 bits are available for # of annotations, but only 8 bits are
377 # available for the parameter count, hence 255
Guido van Rossum0240b922007-02-26 21:23:50 +0000378 # is the max. Ensure the result of too many annotations is a
379 # SyntaxError.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000380 s = "def f(%s): pass"
381 s %= ', '.join('a%d:%d' % (i,i) for i in range(256))
Guido van Rossum0240b922007-02-26 21:23:50 +0000382 self.assertRaises(SyntaxError, compile, s, '?', 'exec')
383 # Test that the max # of annotations compiles.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000384 s = "def f(%s): pass"
385 s %= ', '.join('a%d:%d' % (i,i) for i in range(255))
Guido van Rossum0240b922007-02-26 21:23:50 +0000386 compile(s, '?', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000387
388 def test_mangling(self):
389 class A:
390 def f():
391 __mangled = 1
392 __not_mangled__ = 2
393 import __mangled_mod
394 import __package__.module
395
Benjamin Peterson577473f2010-01-19 00:09:57 +0000396 self.assertIn("_A__mangled", A.f.__code__.co_varnames)
397 self.assertIn("__not_mangled__", A.f.__code__.co_varnames)
398 self.assertIn("_A__mangled_mod", A.f.__code__.co_varnames)
399 self.assertIn("__package__", A.f.__code__.co_varnames)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000400
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000401 def test_compile_ast(self):
402 fname = __file__
403 if fname.lower().endswith(('pyc', 'pyo')):
404 fname = fname[:-1]
405 with open(fname, 'r') as f:
406 fcontents = f.read()
407 sample_code = [
408 ['<assign>', 'x = 5'],
409 ['<ifblock>', """if True:\n pass\n"""],
410 ['<forblock>', """for n in [1, 2, 3]:\n print(n)\n"""],
411 ['<deffunc>', """def foo():\n pass\nfoo()\n"""],
412 [fname, fcontents],
413 ]
414
415 for fname, code in sample_code:
416 co1 = compile(code, '%s1' % fname, 'exec')
417 ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000418 self.assertTrue(type(ast) == _ast.Module)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000419 co2 = compile(ast, '%s3' % fname, 'exec')
420 self.assertEqual(co1, co2)
Neal Norwitzdb4115f2008-03-31 04:20:05 +0000421 # the code object's filename comes from the second compilation step
422 self.assertEqual(co2.co_filename, '%s3' % fname)
423
424 # raise exception when node type doesn't match with compile mode
425 co1 = compile('print(1)', '<string>', 'exec', _ast.PyCF_ONLY_AST)
426 self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')
427
428 # raise exception when node type is no start node
429 self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')
430
431 # raise exception when node has invalid children
432 ast = _ast.Module()
433 ast.body = [_ast.BoolOp()]
434 self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000435
436
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000437def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000438 support.run_unittest(TestSpecifics)
Tim Petersd507dab2001-08-30 20:51:59 +0000439
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000440if __name__ == "__main__":
441 test_main()