blob: c5f9189fcc0f38483776e51d12d2d028179760b7 [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 Peterson43b06862011-05-27 09:08:01 -05004import types
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test import support
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +00006
Raymond Hettinger8a99b502003-06-23 13:36:57 +00007class TestSpecifics(unittest.TestCase):
Jeremy Hylton778e2652001-11-09 19:50:08 +00008
Benjamin Petersonaeaa5922009-11-13 00:17:59 +00009 def test_no_ending_newline(self):
10 compile("hi", "<test>", "exec")
11 compile("hi\r", "<test>", "exec")
12
13 def test_empty(self):
14 compile("", "<test>", "exec")
15
16 def test_other_newlines(self):
17 compile("\r\n", "<test>", "exec")
18 compile("\r", "<test>", "exec")
19 compile("hi\r\nstuff\r\ndef f():\n pass\r", "<test>", "exec")
20 compile("this_is\rreally_old_mac\rdef f():\n pass", "<test>", "exec")
21
Raymond Hettinger8a99b502003-06-23 13:36:57 +000022 def test_debug_assignment(self):
23 # catch assignments to __debug__
24 self.assertRaises(SyntaxError, compile, '__debug__ = 1', '?', 'single')
Georg Brandl1a3284e2007-12-02 09:40:06 +000025 import builtins
26 prev = builtins.__debug__
27 setattr(builtins, '__debug__', 'sure')
28 setattr(builtins, '__debug__', prev)
Jeremy Hylton778e2652001-11-09 19:50:08 +000029
Raymond Hettinger8a99b502003-06-23 13:36:57 +000030 def test_argument_handling(self):
31 # detect duplicate positional and keyword arguments
32 self.assertRaises(SyntaxError, eval, 'lambda a,a:0')
33 self.assertRaises(SyntaxError, eval, 'lambda a,a=1:0')
34 self.assertRaises(SyntaxError, eval, 'lambda a=1,a=1:0')
Benjamin Petersonec19d952008-06-30 15:01:21 +000035 self.assertRaises(SyntaxError, exec, 'def f(a, a): pass')
36 self.assertRaises(SyntaxError, exec, 'def f(a = 0, a = 1): pass')
37 self.assertRaises(SyntaxError, exec, 'def f(a): global a; a = 1')
Jeremy Hylton778e2652001-11-09 19:50:08 +000038
Raymond Hettinger8a99b502003-06-23 13:36:57 +000039 def test_syntax_error(self):
40 self.assertRaises(SyntaxError, compile, "1+*3", "filename", "exec")
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000041
Guido van Rossumcd16bf62007-06-13 18:07:49 +000042 def test_none_keyword_arg(self):
43 self.assertRaises(SyntaxError, compile, "f(None=1)", "<string>", "exec")
44
Raymond Hettinger8a99b502003-06-23 13:36:57 +000045 def test_duplicate_global_local(self):
Benjamin Petersonec19d952008-06-30 15:01:21 +000046 self.assertRaises(SyntaxError, exec, 'def f(a): global a; a = 1')
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000047
Raymond Hettinger66bd2332004-08-02 08:30:07 +000048 def test_exec_with_general_mapping_for_locals(self):
49
50 class M:
51 "Test mapping interface versus possible calls from eval()."
52 def __getitem__(self, key):
53 if key == 'a':
54 return 12
55 raise KeyError
56 def __setitem__(self, key, value):
57 self.results = (key, value)
Guido van Rossum63eecc72007-02-22 23:55:25 +000058 def keys(self):
59 return list('xyz')
Raymond Hettinger66bd2332004-08-02 08:30:07 +000060
61 m = M()
62 g = globals()
Georg Brandl7cae87c2006-09-06 06:51:57 +000063 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000064 self.assertEqual(m.results, ('z', 12))
65 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000066 exec('z = b', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000067 except NameError:
68 pass
69 else:
70 self.fail('Did not detect a KeyError')
Georg Brandl7cae87c2006-09-06 06:51:57 +000071 exec('z = dir()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000072 self.assertEqual(m.results, ('z', list('xyz')))
Georg Brandl7cae87c2006-09-06 06:51:57 +000073 exec('z = globals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000074 self.assertEqual(m.results, ('z', g))
Georg Brandl7cae87c2006-09-06 06:51:57 +000075 exec('z = locals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000076 self.assertEqual(m.results, ('z', m))
Benjamin Petersonec19d952008-06-30 15:01:21 +000077 self.assertRaises(TypeError, exec, 'z = b', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000078
79 class A:
80 "Non-mapping"
81 pass
82 m = A()
Benjamin Petersonec19d952008-06-30 15:01:21 +000083 self.assertRaises(TypeError, exec, 'z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000084
85 # Verify that dict subclasses work as well
86 class D(dict):
87 def __getitem__(self, key):
88 if key == 'a':
89 return 12
90 return dict.__getitem__(self, key)
91 d = D()
Georg Brandl7cae87c2006-09-06 06:51:57 +000092 exec('z = a', g, d)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000093 self.assertEqual(d['z'], 12)
94
Neal Norwitz6ab080c2005-10-24 00:08:10 +000095 def test_extended_arg(self):
96 longexpr = 'x = x or ' + '-x' * 2500
Georg Brandl7cae87c2006-09-06 06:51:57 +000097 g = {}
Neal Norwitz6ab080c2005-10-24 00:08:10 +000098 code = '''
99def f(x):
100 %s
101 %s
102 %s
103 %s
104 %s
105 %s
106 %s
107 %s
108 %s
109 %s
110 # the expressions above have no effect, x == argument
111 while x:
112 x -= 1
113 # EXTENDED_ARG/JUMP_ABSOLUTE here
114 return x
115''' % ((longexpr,)*10)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000116 exec(code, g)
117 self.assertEqual(g['f'](5), 0)
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000118
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000119 def test_argument_order(self):
Benjamin Petersonec19d952008-06-30 15:01:21 +0000120 self.assertRaises(SyntaxError, exec, 'def f(a=1, b): pass')
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000121
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000122 def test_float_literals(self):
123 # testing bad float literals
124 self.assertRaises(SyntaxError, eval, "2e")
125 self.assertRaises(SyntaxError, eval, "2.0e+")
126 self.assertRaises(SyntaxError, eval, "1e-")
127 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000128
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000129 def test_indentation(self):
130 # testing compile() of indented block w/o trailing newline"
131 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000132if 1:
133 if 2:
134 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000135 compile(s, "<string>", "exec")
136
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000137 # This test is probably specific to CPython and may not generalize
138 # to other implementations. We are trying to ensure that when
139 # the first line of code starts after 256, correct line numbers
140 # in tracebacks are still produced.
141 def test_leading_newlines(self):
142 s256 = "".join(["\n"] * 256 + ["spam"])
143 co = compile(s256, 'fn', 'exec')
144 self.assertEqual(co.co_firstlineno, 257)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000145 self.assertEqual(co.co_lnotab, bytes())
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000146
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000147 def test_literals_with_leading_zeroes(self):
148 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000149 "080000000000000", "000000000000009", "000000000000008",
150 "0b42", "0BADCAFE", "0o123456789", "0b1.1", "0o4.2",
151 "0b101j2", "0o153j2", "0b100e1", "0o777e1", "0777",
152 "000777", "000000000000007"]:
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000153 self.assertRaises(SyntaxError, eval, arg)
154
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000155 self.assertEqual(eval("0xff"), 255)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000156 self.assertEqual(eval("0777."), 777)
157 self.assertEqual(eval("0777.0"), 777)
158 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
159 self.assertEqual(eval("0777e1"), 7770)
160 self.assertEqual(eval("0e0"), 0)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000161 self.assertEqual(eval("0000e-012"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000162 self.assertEqual(eval("09.5"), 9.5)
163 self.assertEqual(eval("0777j"), 777j)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000164 self.assertEqual(eval("000"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000165 self.assertEqual(eval("00j"), 0j)
166 self.assertEqual(eval("00.0"), 0)
167 self.assertEqual(eval("0e3"), 0)
168 self.assertEqual(eval("090000000000000."), 90000000000000.)
169 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
170 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
171 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
172 self.assertEqual(eval("090000000000000j"), 90000000000000j)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000173 self.assertEqual(eval("000000000000008."), 8.)
174 self.assertEqual(eval("000000000000009."), 9.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000175 self.assertEqual(eval("0b101010"), 42)
176 self.assertEqual(eval("-0b000000000010"), -2)
177 self.assertEqual(eval("0o777"), 511)
178 self.assertEqual(eval("-0o0000010"), -8)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000179
180 def test_unary_minus(self):
181 # Verify treatment of unary minus on negative numbers SF bug #660455
Christian Heimesa37d4c62007-12-04 23:02:19 +0000182 if sys.maxsize == 2147483647:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000183 # 32-bit machine
184 all_one_bits = '0xffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000185 self.assertEqual(eval(all_one_bits), 4294967295)
186 self.assertEqual(eval("-" + all_one_bits), -4294967295)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000187 elif sys.maxsize == 9223372036854775807:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000188 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000189 all_one_bits = '0xffffffffffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000190 self.assertEqual(eval(all_one_bits), 18446744073709551615)
191 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000192 else:
193 self.fail("How many bits *does* this machine have???")
Ezio Melotti42da6632011-03-15 05:18:48 +0200194 # Verify treatment of constant folding on -(sys.maxsize+1)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000195 # i.e. -2147483648 on 32 bit platforms. Should return int, not long.
Ezio Melottie9615932010-01-24 19:26:24 +0000196 self.assertIsInstance(eval("%s" % (-sys.maxsize - 1)), int)
197 self.assertIsInstance(eval("%s" % (-sys.maxsize - 2)), int)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000198
Christian Heimesa37d4c62007-12-04 23:02:19 +0000199 if sys.maxsize == 9223372036854775807:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000200 def test_32_63_bit_values(self):
201 a = +4294967296 # 1 << 32
202 b = -4294967296 # 1 << 32
203 c = +281474976710656 # 1 << 48
204 d = -281474976710656 # 1 << 48
205 e = +4611686018427387904 # 1 << 62
206 f = -4611686018427387904 # 1 << 62
207 g = +9223372036854775807 # 1 << 63 - 1
208 h = -9223372036854775807 # 1 << 63 - 1
209
Neal Norwitz221085d2007-02-25 20:55:47 +0000210 for variable in self.test_32_63_bit_values.__code__.co_consts:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000211 if variable is not None:
Ezio Melottie9615932010-01-24 19:26:24 +0000212 self.assertIsInstance(variable, int)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000213
214 def test_sequence_unpacking_error(self):
215 # Verify sequence packing/unpacking with "or". SF bug #757818
216 i,j = (1, -1) or (-1, 1)
217 self.assertEqual(i, 1)
218 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000219
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000220 def test_none_assignment(self):
221 stmts = [
222 'None = 0',
223 'None += 0',
224 '__builtins__.None = 0',
225 'def None(): pass',
226 'class None: pass',
227 '(a, None) = 0, 0',
228 'for None in range(10): pass',
229 'def f(None): pass',
Benjamin Peterson78565b22009-06-28 19:19:51 +0000230 'import None',
231 'import x as None',
232 'from x import None',
233 'from x import y as None'
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000234 ]
235 for stmt in stmts:
236 stmt += "\n"
237 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
238 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000239
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000240 def test_import(self):
241 succeed = [
242 'import sys',
243 'import os, sys',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000244 'import os as bar',
245 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000246 'from __future__ import nested_scopes, generators',
247 'from __future__ import (nested_scopes,\ngenerators)',
248 'from __future__ import (nested_scopes,\ngenerators,)',
249 'from sys import stdin, stderr, stdout',
250 'from sys import (stdin, stderr,\nstdout)',
251 'from sys import (stdin, stderr,\nstdout,)',
252 'from sys import (stdin\n, stderr, stdout)',
253 'from sys import (stdin\n, stderr, stdout,)',
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 'from sys import (stdin as si, stdout as so, stderr as se,)',
257 ]
258 fail = [
259 'import (os, sys)',
260 'import (os), (sys)',
261 'import ((os), (sys))',
262 'import (sys',
263 'import sys)',
264 'import (os,)',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000265 'import os As bar',
266 'import os.path a bar',
267 'from sys import stdin As stdout',
268 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000269 'from (sys) import stdin',
270 'from __future__ import (nested_scopes',
271 'from __future__ import nested_scopes)',
272 'from __future__ import nested_scopes,\ngenerators',
273 'from sys import (stdin',
274 'from sys import stdin)',
275 'from sys import stdin, stdout,\nstderr',
276 'from sys import stdin si',
277 'from sys import stdin,'
278 'from sys import (*)',
279 'from sys import (stdin,, stdout, stderr)',
280 'from sys import (stdin, stdout),',
281 ]
282 for stmt in succeed:
283 compile(stmt, 'tmp', 'exec')
284 for stmt in fail:
285 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
286
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000287 def test_for_distinct_code_objects(self):
288 # SF bug 1048870
289 def f():
290 f1 = lambda x=1: x
291 f2 = lambda x=2: x
292 return f1, f2
293 f1, f2 = f()
Neal Norwitz221085d2007-02-25 20:55:47 +0000294 self.assertNotEqual(id(f1.__code__), id(f2.__code__))
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000295
Benjamin Petersone6dd2cb2010-03-17 20:56:58 +0000296 def test_lambda_doc(self):
297 l = lambda: "foo"
298 self.assertIsNone(l.__doc__)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000299
Benjamin Peterson5d2ad252010-03-17 20:57:32 +0000300## def test_unicode_encoding(self):
301## code = "# -*- coding: utf-8 -*-\npass\n"
302## self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
303
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000304 def test_subscripts(self):
305 # SF bug 1448804
306 # Class to make testing subscript results easy
307 class str_map(object):
308 def __init__(self):
309 self.data = {}
310 def __getitem__(self, key):
311 return self.data[str(key)]
312 def __setitem__(self, key, value):
313 self.data[str(key)] = value
314 def __delitem__(self, key):
315 del self.data[str(key)]
316 def __contains__(self, key):
317 return str(key) in self.data
318 d = str_map()
319 # Index
320 d[1] = 1
321 self.assertEqual(d[1], 1)
322 d[1] += 1
323 self.assertEqual(d[1], 2)
324 del d[1]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000325 self.assertNotIn(1, d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000326 # Tuple of indices
327 d[1, 1] = 1
328 self.assertEqual(d[1, 1], 1)
329 d[1, 1] += 1
330 self.assertEqual(d[1, 1], 2)
331 del d[1, 1]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000332 self.assertNotIn((1, 1), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000333 # Simple slice
334 d[1:2] = 1
335 self.assertEqual(d[1:2], 1)
336 d[1:2] += 1
337 self.assertEqual(d[1:2], 2)
338 del d[1:2]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000339 self.assertNotIn(slice(1, 2), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000340 # Tuple of simple slices
341 d[1:2, 1:2] = 1
342 self.assertEqual(d[1:2, 1:2], 1)
343 d[1:2, 1:2] += 1
344 self.assertEqual(d[1:2, 1:2], 2)
345 del d[1:2, 1:2]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000346 self.assertNotIn((slice(1, 2), slice(1, 2)), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000347 # Extended slice
348 d[1:2:3] = 1
349 self.assertEqual(d[1:2:3], 1)
350 d[1:2:3] += 1
351 self.assertEqual(d[1:2:3], 2)
352 del d[1:2:3]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000353 self.assertNotIn(slice(1, 2, 3), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000354 # Tuple of extended slices
355 d[1:2:3, 1:2:3] = 1
356 self.assertEqual(d[1:2:3, 1:2:3], 1)
357 d[1:2:3, 1:2:3] += 1
358 self.assertEqual(d[1:2:3, 1:2:3], 2)
359 del d[1:2:3, 1:2:3]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000360 self.assertNotIn((slice(1, 2, 3), slice(1, 2, 3)), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000361 # Ellipsis
362 d[...] = 1
363 self.assertEqual(d[...], 1)
364 d[...] += 1
365 self.assertEqual(d[...], 2)
366 del d[...]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000367 self.assertNotIn(Ellipsis, d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000368 # Tuple of Ellipses
369 d[..., ...] = 1
370 self.assertEqual(d[..., ...], 1)
371 d[..., ...] += 1
372 self.assertEqual(d[..., ...], 2)
373 del d[..., ...]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000374 self.assertNotIn((Ellipsis, Ellipsis), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000375
Guido van Rossum0240b922007-02-26 21:23:50 +0000376 def test_annotation_limit(self):
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000377 # 16 bits are available for # of annotations, but only 8 bits are
378 # available for the parameter count, hence 255
Guido van Rossum0240b922007-02-26 21:23:50 +0000379 # is the max. Ensure the result of too many annotations is a
380 # SyntaxError.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000381 s = "def f(%s): pass"
382 s %= ', '.join('a%d:%d' % (i,i) for i in range(256))
Guido van Rossum0240b922007-02-26 21:23:50 +0000383 self.assertRaises(SyntaxError, compile, s, '?', 'exec')
384 # Test that the max # of annotations compiles.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000385 s = "def f(%s): pass"
386 s %= ', '.join('a%d:%d' % (i,i) for i in range(255))
Guido van Rossum0240b922007-02-26 21:23:50 +0000387 compile(s, '?', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000388
389 def test_mangling(self):
390 class A:
391 def f():
392 __mangled = 1
393 __not_mangled__ = 2
394 import __mangled_mod
395 import __package__.module
396
Benjamin Peterson577473f2010-01-19 00:09:57 +0000397 self.assertIn("_A__mangled", A.f.__code__.co_varnames)
398 self.assertIn("__not_mangled__", A.f.__code__.co_varnames)
399 self.assertIn("_A__mangled_mod", A.f.__code__.co_varnames)
400 self.assertIn("__package__", A.f.__code__.co_varnames)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000401
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000402 def test_compile_ast(self):
403 fname = __file__
404 if fname.lower().endswith(('pyc', 'pyo')):
405 fname = fname[:-1]
406 with open(fname, 'r') as f:
407 fcontents = f.read()
408 sample_code = [
409 ['<assign>', 'x = 5'],
410 ['<ifblock>', """if True:\n pass\n"""],
411 ['<forblock>', """for n in [1, 2, 3]:\n print(n)\n"""],
412 ['<deffunc>', """def foo():\n pass\nfoo()\n"""],
413 [fname, fcontents],
414 ]
415
416 for fname, code in sample_code:
417 co1 = compile(code, '%s1' % fname, 'exec')
418 ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000419 self.assertTrue(type(ast) == _ast.Module)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000420 co2 = compile(ast, '%s3' % fname, 'exec')
421 self.assertEqual(co1, co2)
Neal Norwitzdb4115f2008-03-31 04:20:05 +0000422 # the code object's filename comes from the second compilation step
423 self.assertEqual(co2.co_filename, '%s3' % fname)
424
425 # raise exception when node type doesn't match with compile mode
426 co1 = compile('print(1)', '<string>', 'exec', _ast.PyCF_ONLY_AST)
427 self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')
428
429 # raise exception when node type is no start node
430 self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')
431
432 # raise exception when node has invalid children
433 ast = _ast.Module()
434 ast.body = [_ast.BoolOp()]
435 self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000436
Benjamin Peterson43b06862011-05-27 09:08:01 -0500437 @support.cpython_only
438 def test_same_filename_used(self):
439 s = """def f(): pass\ndef g(): pass"""
440 c = compile(s, "myfile", "exec")
441 for obj in c.co_consts:
442 if isinstance(obj, types.CodeType):
443 self.assertIs(obj.co_filename, c.co_filename)
444
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000445
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000446def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000447 support.run_unittest(TestSpecifics)
Tim Petersd507dab2001-08-30 20:51:59 +0000448
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000449if __name__ == "__main__":
450 test_main()