blob: b1f55bb0403d27a2248ee64c90300531e5056a03 [file] [log] [blame]
Antoine Pitrou99614052014-05-23 11:46:03 +02001import math
Raymond Hettinger8a99b502003-06-23 13:36:57 +00002import unittest
Raymond Hettinger8a99b502003-06-23 13:36:57 +00003import sys
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00004import _ast
Benjamin Peterson43b06862011-05-27 09:08:01 -05005import types
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006from test import support
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +00007
Raymond Hettinger8a99b502003-06-23 13:36:57 +00008class TestSpecifics(unittest.TestCase):
Jeremy Hylton778e2652001-11-09 19:50:08 +00009
Meador Ingefa21bf02012-01-19 01:08:41 -060010 def compile_single(self, source):
11 compile(source, "<single>", "single")
12
13 def assertInvalidSingle(self, source):
14 self.assertRaises(SyntaxError, self.compile_single, source)
15
Benjamin Petersonaeaa5922009-11-13 00:17:59 +000016 def test_no_ending_newline(self):
17 compile("hi", "<test>", "exec")
18 compile("hi\r", "<test>", "exec")
19
20 def test_empty(self):
21 compile("", "<test>", "exec")
22
23 def test_other_newlines(self):
24 compile("\r\n", "<test>", "exec")
25 compile("\r", "<test>", "exec")
26 compile("hi\r\nstuff\r\ndef f():\n pass\r", "<test>", "exec")
27 compile("this_is\rreally_old_mac\rdef f():\n pass", "<test>", "exec")
28
Raymond Hettinger8a99b502003-06-23 13:36:57 +000029 def test_debug_assignment(self):
30 # catch assignments to __debug__
31 self.assertRaises(SyntaxError, compile, '__debug__ = 1', '?', 'single')
Georg Brandl1a3284e2007-12-02 09:40:06 +000032 import builtins
33 prev = builtins.__debug__
34 setattr(builtins, '__debug__', 'sure')
35 setattr(builtins, '__debug__', prev)
Jeremy Hylton778e2652001-11-09 19:50:08 +000036
Raymond Hettinger8a99b502003-06-23 13:36:57 +000037 def test_argument_handling(self):
38 # detect duplicate positional and keyword arguments
39 self.assertRaises(SyntaxError, eval, 'lambda a,a:0')
40 self.assertRaises(SyntaxError, eval, 'lambda a,a=1:0')
41 self.assertRaises(SyntaxError, eval, 'lambda a=1,a=1:0')
Benjamin Petersonec19d952008-06-30 15:01:21 +000042 self.assertRaises(SyntaxError, exec, 'def f(a, a): pass')
43 self.assertRaises(SyntaxError, exec, 'def f(a = 0, a = 1): pass')
44 self.assertRaises(SyntaxError, exec, 'def f(a): global a; a = 1')
Jeremy Hylton778e2652001-11-09 19:50:08 +000045
Raymond Hettinger8a99b502003-06-23 13:36:57 +000046 def test_syntax_error(self):
47 self.assertRaises(SyntaxError, compile, "1+*3", "filename", "exec")
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000048
Guido van Rossumcd16bf62007-06-13 18:07:49 +000049 def test_none_keyword_arg(self):
50 self.assertRaises(SyntaxError, compile, "f(None=1)", "<string>", "exec")
51
Raymond Hettinger8a99b502003-06-23 13:36:57 +000052 def test_duplicate_global_local(self):
Benjamin Petersonec19d952008-06-30 15:01:21 +000053 self.assertRaises(SyntaxError, exec, 'def f(a): global a; a = 1')
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000054
Raymond Hettinger66bd2332004-08-02 08:30:07 +000055 def test_exec_with_general_mapping_for_locals(self):
56
57 class M:
58 "Test mapping interface versus possible calls from eval()."
59 def __getitem__(self, key):
60 if key == 'a':
61 return 12
62 raise KeyError
63 def __setitem__(self, key, value):
64 self.results = (key, value)
Guido van Rossum63eecc72007-02-22 23:55:25 +000065 def keys(self):
66 return list('xyz')
Raymond Hettinger66bd2332004-08-02 08:30:07 +000067
68 m = M()
69 g = globals()
Georg Brandl7cae87c2006-09-06 06:51:57 +000070 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000071 self.assertEqual(m.results, ('z', 12))
72 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000073 exec('z = b', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000074 except NameError:
75 pass
76 else:
77 self.fail('Did not detect a KeyError')
Georg Brandl7cae87c2006-09-06 06:51:57 +000078 exec('z = dir()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000079 self.assertEqual(m.results, ('z', list('xyz')))
Georg Brandl7cae87c2006-09-06 06:51:57 +000080 exec('z = globals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000081 self.assertEqual(m.results, ('z', g))
Georg Brandl7cae87c2006-09-06 06:51:57 +000082 exec('z = locals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000083 self.assertEqual(m.results, ('z', m))
Benjamin Petersonec19d952008-06-30 15:01:21 +000084 self.assertRaises(TypeError, exec, 'z = b', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000085
86 class A:
87 "Non-mapping"
88 pass
89 m = A()
Benjamin Petersonec19d952008-06-30 15:01:21 +000090 self.assertRaises(TypeError, exec, 'z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000091
92 # Verify that dict subclasses work as well
93 class D(dict):
94 def __getitem__(self, key):
95 if key == 'a':
96 return 12
97 return dict.__getitem__(self, key)
98 d = D()
Georg Brandl7cae87c2006-09-06 06:51:57 +000099 exec('z = a', g, d)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000100 self.assertEqual(d['z'], 12)
101
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000102 def test_extended_arg(self):
103 longexpr = 'x = x or ' + '-x' * 2500
Georg Brandl7cae87c2006-09-06 06:51:57 +0000104 g = {}
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000105 code = '''
106def f(x):
107 %s
108 %s
109 %s
110 %s
111 %s
112 %s
113 %s
114 %s
115 %s
116 %s
117 # the expressions above have no effect, x == argument
118 while x:
119 x -= 1
120 # EXTENDED_ARG/JUMP_ABSOLUTE here
121 return x
122''' % ((longexpr,)*10)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000123 exec(code, g)
124 self.assertEqual(g['f'](5), 0)
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000125
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000126 def test_argument_order(self):
Benjamin Petersonec19d952008-06-30 15:01:21 +0000127 self.assertRaises(SyntaxError, exec, 'def f(a=1, b): pass')
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000128
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000129 def test_float_literals(self):
130 # testing bad float literals
131 self.assertRaises(SyntaxError, eval, "2e")
132 self.assertRaises(SyntaxError, eval, "2.0e+")
133 self.assertRaises(SyntaxError, eval, "1e-")
134 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000135
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000136 def test_indentation(self):
137 # testing compile() of indented block w/o trailing newline"
138 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000139if 1:
140 if 2:
141 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000142 compile(s, "<string>", "exec")
143
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000144 # This test is probably specific to CPython and may not generalize
145 # to other implementations. We are trying to ensure that when
146 # the first line of code starts after 256, correct line numbers
147 # in tracebacks are still produced.
148 def test_leading_newlines(self):
149 s256 = "".join(["\n"] * 256 + ["spam"])
150 co = compile(s256, 'fn', 'exec')
151 self.assertEqual(co.co_firstlineno, 257)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000152 self.assertEqual(co.co_lnotab, bytes())
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000153
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000154 def test_literals_with_leading_zeroes(self):
155 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000156 "080000000000000", "000000000000009", "000000000000008",
157 "0b42", "0BADCAFE", "0o123456789", "0b1.1", "0o4.2",
158 "0b101j2", "0o153j2", "0b100e1", "0o777e1", "0777",
159 "000777", "000000000000007"]:
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000160 self.assertRaises(SyntaxError, eval, arg)
161
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000162 self.assertEqual(eval("0xff"), 255)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000163 self.assertEqual(eval("0777."), 777)
164 self.assertEqual(eval("0777.0"), 777)
165 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
166 self.assertEqual(eval("0777e1"), 7770)
167 self.assertEqual(eval("0e0"), 0)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000168 self.assertEqual(eval("0000e-012"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000169 self.assertEqual(eval("09.5"), 9.5)
170 self.assertEqual(eval("0777j"), 777j)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000171 self.assertEqual(eval("000"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000172 self.assertEqual(eval("00j"), 0j)
173 self.assertEqual(eval("00.0"), 0)
174 self.assertEqual(eval("0e3"), 0)
175 self.assertEqual(eval("090000000000000."), 90000000000000.)
176 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
177 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
178 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
179 self.assertEqual(eval("090000000000000j"), 90000000000000j)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000180 self.assertEqual(eval("000000000000008."), 8.)
181 self.assertEqual(eval("000000000000009."), 9.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000182 self.assertEqual(eval("0b101010"), 42)
183 self.assertEqual(eval("-0b000000000010"), -2)
184 self.assertEqual(eval("0o777"), 511)
185 self.assertEqual(eval("-0o0000010"), -8)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000186
187 def test_unary_minus(self):
188 # Verify treatment of unary minus on negative numbers SF bug #660455
Christian Heimesa37d4c62007-12-04 23:02:19 +0000189 if sys.maxsize == 2147483647:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000190 # 32-bit machine
191 all_one_bits = '0xffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000192 self.assertEqual(eval(all_one_bits), 4294967295)
193 self.assertEqual(eval("-" + all_one_bits), -4294967295)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000194 elif sys.maxsize == 9223372036854775807:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000195 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000196 all_one_bits = '0xffffffffffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000197 self.assertEqual(eval(all_one_bits), 18446744073709551615)
198 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000199 else:
200 self.fail("How many bits *does* this machine have???")
Ezio Melotti42da6632011-03-15 05:18:48 +0200201 # Verify treatment of constant folding on -(sys.maxsize+1)
Serhiy Storchaka95949422013-08-27 19:40:23 +0300202 # i.e. -2147483648 on 32 bit platforms. Should return int.
Ezio Melottie9615932010-01-24 19:26:24 +0000203 self.assertIsInstance(eval("%s" % (-sys.maxsize - 1)), int)
204 self.assertIsInstance(eval("%s" % (-sys.maxsize - 2)), int)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000205
Christian Heimesa37d4c62007-12-04 23:02:19 +0000206 if sys.maxsize == 9223372036854775807:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000207 def test_32_63_bit_values(self):
208 a = +4294967296 # 1 << 32
209 b = -4294967296 # 1 << 32
210 c = +281474976710656 # 1 << 48
211 d = -281474976710656 # 1 << 48
212 e = +4611686018427387904 # 1 << 62
213 f = -4611686018427387904 # 1 << 62
214 g = +9223372036854775807 # 1 << 63 - 1
215 h = -9223372036854775807 # 1 << 63 - 1
216
Neal Norwitz221085d2007-02-25 20:55:47 +0000217 for variable in self.test_32_63_bit_values.__code__.co_consts:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000218 if variable is not None:
Ezio Melottie9615932010-01-24 19:26:24 +0000219 self.assertIsInstance(variable, int)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000220
221 def test_sequence_unpacking_error(self):
222 # Verify sequence packing/unpacking with "or". SF bug #757818
223 i,j = (1, -1) or (-1, 1)
224 self.assertEqual(i, 1)
225 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000226
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000227 def test_none_assignment(self):
228 stmts = [
229 'None = 0',
230 'None += 0',
231 '__builtins__.None = 0',
232 'def None(): pass',
233 'class None: pass',
234 '(a, None) = 0, 0',
235 'for None in range(10): pass',
236 'def f(None): pass',
Benjamin Peterson78565b22009-06-28 19:19:51 +0000237 'import None',
238 'import x as None',
239 'from x import None',
240 'from x import y as None'
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000241 ]
242 for stmt in stmts:
243 stmt += "\n"
244 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
245 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000246
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000247 def test_import(self):
248 succeed = [
249 'import sys',
250 'import os, sys',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000251 'import os as bar',
252 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000253 'from __future__ import nested_scopes, generators',
254 'from __future__ import (nested_scopes,\ngenerators)',
255 'from __future__ import (nested_scopes,\ngenerators,)',
256 'from sys import stdin, stderr, stdout',
257 'from sys import (stdin, stderr,\nstdout)',
258 'from sys import (stdin, stderr,\nstdout,)',
259 'from sys import (stdin\n, stderr, stdout)',
260 'from sys import (stdin\n, stderr, stdout,)',
261 'from sys import stdin as si, stdout as so, stderr as se',
262 'from sys import (stdin as si, stdout as so, stderr as se)',
263 'from sys import (stdin as si, stdout as so, stderr as se,)',
264 ]
265 fail = [
266 'import (os, sys)',
267 'import (os), (sys)',
268 'import ((os), (sys))',
269 'import (sys',
270 'import sys)',
271 'import (os,)',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000272 'import os As bar',
273 'import os.path a bar',
274 'from sys import stdin As stdout',
275 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000276 'from (sys) import stdin',
277 'from __future__ import (nested_scopes',
278 'from __future__ import nested_scopes)',
279 'from __future__ import nested_scopes,\ngenerators',
280 'from sys import (stdin',
281 'from sys import stdin)',
282 'from sys import stdin, stdout,\nstderr',
283 'from sys import stdin si',
284 'from sys import stdin,'
285 'from sys import (*)',
286 'from sys import (stdin,, stdout, stderr)',
287 'from sys import (stdin, stdout),',
288 ]
289 for stmt in succeed:
290 compile(stmt, 'tmp', 'exec')
291 for stmt in fail:
292 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
293
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000294 def test_for_distinct_code_objects(self):
295 # SF bug 1048870
296 def f():
297 f1 = lambda x=1: x
298 f2 = lambda x=2: x
299 return f1, f2
300 f1, f2 = f()
Neal Norwitz221085d2007-02-25 20:55:47 +0000301 self.assertNotEqual(id(f1.__code__), id(f2.__code__))
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000302
Benjamin Petersone6dd2cb2010-03-17 20:56:58 +0000303 def test_lambda_doc(self):
304 l = lambda: "foo"
305 self.assertIsNone(l.__doc__)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000306
Benjamin Peterson5d2ad252010-03-17 20:57:32 +0000307## def test_unicode_encoding(self):
308## code = "# -*- coding: utf-8 -*-\npass\n"
309## self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
310
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000311 def test_subscripts(self):
312 # SF bug 1448804
313 # Class to make testing subscript results easy
314 class str_map(object):
315 def __init__(self):
316 self.data = {}
317 def __getitem__(self, key):
318 return self.data[str(key)]
319 def __setitem__(self, key, value):
320 self.data[str(key)] = value
321 def __delitem__(self, key):
322 del self.data[str(key)]
323 def __contains__(self, key):
324 return str(key) in self.data
325 d = str_map()
326 # Index
327 d[1] = 1
328 self.assertEqual(d[1], 1)
329 d[1] += 1
330 self.assertEqual(d[1], 2)
331 del d[1]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000332 self.assertNotIn(1, d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000333 # Tuple of indices
334 d[1, 1] = 1
335 self.assertEqual(d[1, 1], 1)
336 d[1, 1] += 1
337 self.assertEqual(d[1, 1], 2)
338 del d[1, 1]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000339 self.assertNotIn((1, 1), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000340 # Simple slice
341 d[1:2] = 1
342 self.assertEqual(d[1:2], 1)
343 d[1:2] += 1
344 self.assertEqual(d[1:2], 2)
345 del d[1:2]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000346 self.assertNotIn(slice(1, 2), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000347 # Tuple of simple slices
348 d[1:2, 1:2] = 1
349 self.assertEqual(d[1:2, 1:2], 1)
350 d[1:2, 1:2] += 1
351 self.assertEqual(d[1:2, 1:2], 2)
352 del d[1:2, 1:2]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000353 self.assertNotIn((slice(1, 2), slice(1, 2)), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000354 # Extended slice
355 d[1:2:3] = 1
356 self.assertEqual(d[1:2:3], 1)
357 d[1:2:3] += 1
358 self.assertEqual(d[1:2:3], 2)
359 del d[1:2:3]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000360 self.assertNotIn(slice(1, 2, 3), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000361 # Tuple of extended slices
362 d[1:2:3, 1:2:3] = 1
363 self.assertEqual(d[1:2:3, 1:2:3], 1)
364 d[1:2:3, 1:2:3] += 1
365 self.assertEqual(d[1:2:3, 1:2:3], 2)
366 del d[1:2:3, 1:2:3]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000367 self.assertNotIn((slice(1, 2, 3), slice(1, 2, 3)), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000368 # Ellipsis
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, d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000375 # Tuple of Ellipses
376 d[..., ...] = 1
377 self.assertEqual(d[..., ...], 1)
378 d[..., ...] += 1
379 self.assertEqual(d[..., ...], 2)
380 del d[..., ...]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000381 self.assertNotIn((Ellipsis, Ellipsis), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000382
Guido van Rossum0240b922007-02-26 21:23:50 +0000383 def test_annotation_limit(self):
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000384 # 16 bits are available for # of annotations, but only 8 bits are
385 # available for the parameter count, hence 255
Guido van Rossum0240b922007-02-26 21:23:50 +0000386 # is the max. Ensure the result of too many annotations is a
387 # SyntaxError.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000388 s = "def f(%s): pass"
389 s %= ', '.join('a%d:%d' % (i,i) for i in range(256))
Guido van Rossum0240b922007-02-26 21:23:50 +0000390 self.assertRaises(SyntaxError, compile, s, '?', 'exec')
391 # Test that the max # of annotations compiles.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000392 s = "def f(%s): pass"
393 s %= ', '.join('a%d:%d' % (i,i) for i in range(255))
Guido van Rossum0240b922007-02-26 21:23:50 +0000394 compile(s, '?', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000395
396 def test_mangling(self):
397 class A:
398 def f():
399 __mangled = 1
400 __not_mangled__ = 2
401 import __mangled_mod
402 import __package__.module
403
Benjamin Peterson577473f2010-01-19 00:09:57 +0000404 self.assertIn("_A__mangled", A.f.__code__.co_varnames)
405 self.assertIn("__not_mangled__", A.f.__code__.co_varnames)
406 self.assertIn("_A__mangled_mod", A.f.__code__.co_varnames)
407 self.assertIn("__package__", A.f.__code__.co_varnames)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000408
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000409 def test_compile_ast(self):
410 fname = __file__
411 if fname.lower().endswith(('pyc', 'pyo')):
412 fname = fname[:-1]
413 with open(fname, 'r') as f:
414 fcontents = f.read()
415 sample_code = [
416 ['<assign>', 'x = 5'],
417 ['<ifblock>', """if True:\n pass\n"""],
418 ['<forblock>', """for n in [1, 2, 3]:\n print(n)\n"""],
419 ['<deffunc>', """def foo():\n pass\nfoo()\n"""],
420 [fname, fcontents],
421 ]
422
423 for fname, code in sample_code:
424 co1 = compile(code, '%s1' % fname, 'exec')
425 ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000426 self.assertTrue(type(ast) == _ast.Module)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000427 co2 = compile(ast, '%s3' % fname, 'exec')
428 self.assertEqual(co1, co2)
Neal Norwitzdb4115f2008-03-31 04:20:05 +0000429 # the code object's filename comes from the second compilation step
430 self.assertEqual(co2.co_filename, '%s3' % fname)
431
432 # raise exception when node type doesn't match with compile mode
433 co1 = compile('print(1)', '<string>', 'exec', _ast.PyCF_ONLY_AST)
434 self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')
435
436 # raise exception when node type is no start node
437 self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')
438
439 # raise exception when node has invalid children
440 ast = _ast.Module()
441 ast.body = [_ast.BoolOp()]
442 self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000443
Benjamin Peterson43b06862011-05-27 09:08:01 -0500444 @support.cpython_only
445 def test_same_filename_used(self):
446 s = """def f(): pass\ndef g(): pass"""
447 c = compile(s, "myfile", "exec")
448 for obj in c.co_consts:
449 if isinstance(obj, types.CodeType):
450 self.assertIs(obj.co_filename, c.co_filename)
451
Meador Ingefa21bf02012-01-19 01:08:41 -0600452 def test_single_statement(self):
453 self.compile_single("1 + 2")
454 self.compile_single("\n1 + 2")
455 self.compile_single("1 + 2\n")
456 self.compile_single("1 + 2\n\n")
457 self.compile_single("1 + 2\t\t\n")
458 self.compile_single("1 + 2\t\t\n ")
459 self.compile_single("1 + 2 # one plus two")
460 self.compile_single("1; 2")
461 self.compile_single("import sys; sys")
462 self.compile_single("def f():\n pass")
463 self.compile_single("while False:\n pass")
464 self.compile_single("if x:\n f(x)")
465 self.compile_single("if x:\n f(x)\nelse:\n g(x)")
466 self.compile_single("class T:\n pass")
467
468 def test_bad_single_statement(self):
469 self.assertInvalidSingle('1\n2')
470 self.assertInvalidSingle('def f(): pass')
471 self.assertInvalidSingle('a = 13\nb = 187')
472 self.assertInvalidSingle('del x\ndel y')
473 self.assertInvalidSingle('f()\ng()')
Benjamin Petersoncff92372012-01-19 17:46:13 -0500474 self.assertInvalidSingle('f()\n# blah\nblah()')
475 self.assertInvalidSingle('f()\nxy # blah\nblah()')
Benjamin Peterson77fc1f32012-01-20 11:01:06 -0500476 self.assertInvalidSingle('x = 5 # comment\nx = 6\n')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000477
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000478 @support.cpython_only
479 def test_compiler_recursion_limit(self):
480 # Expected limit is sys.getrecursionlimit() * the scaling factor
481 # in symtable.c (currently 3)
482 # We expect to fail *at* that limit, because we use up some of
483 # the stack depth limit in the test suite code
484 # So we check the expected limit and 75% of that
485 # XXX (ncoghlan): duplicating the scaling factor here is a little
486 # ugly. Perhaps it should be exposed somewhere...
487 fail_depth = sys.getrecursionlimit() * 3
488 success_depth = int(fail_depth * 0.75)
489
490 def check_limit(prefix, repeated):
491 expect_ok = prefix + repeated * success_depth
492 self.compile_single(expect_ok)
493 broken = prefix + repeated * fail_depth
494 details = "Compiling ({!r} + {!r} * {})".format(
495 prefix, repeated, fail_depth)
496 with self.assertRaises(RuntimeError, msg=details):
497 self.compile_single(broken)
498
499 check_limit("a", "()")
500 check_limit("a", ".b")
501 check_limit("a", "[0]")
502 check_limit("a", "*a")
503
504
Antoine Pitrou99614052014-05-23 11:46:03 +0200505class TestStackSize(unittest.TestCase):
506 # These tests check that the computed stack size for a code object
507 # stays within reasonable bounds (see issue #21523 for an example
508 # dysfunction).
509 N = 100
510
511 def check_stack_size(self, code):
512 # To assert that the alleged stack size is not O(N), we
513 # check that it is smaller than log(N).
514 if isinstance(code, str):
515 code = compile(code, "<foo>", "single")
516 max_size = math.ceil(math.log(len(code.co_code)))
517 self.assertLessEqual(code.co_stacksize, max_size)
518
519 def test_and(self):
520 self.check_stack_size("x and " * self.N + "x")
521
522 def test_or(self):
523 self.check_stack_size("x or " * self.N + "x")
524
525 def test_and_or(self):
526 self.check_stack_size("x and x or " * self.N + "x")
527
528 def test_chained_comparison(self):
529 self.check_stack_size("x < " * self.N + "x")
530
531 def test_if_else(self):
532 self.check_stack_size("x if x else " * self.N + "x")
533
534 def test_binop(self):
535 self.check_stack_size("x + " * self.N + "x")
536
537 def test_func_and(self):
538 code = "def f(x):\n"
539 code += " x and x\n" * self.N
540 self.check_stack_size(code)
541
Tim Petersd507dab2001-08-30 20:51:59 +0000542
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000543if __name__ == "__main__":
Antoine Pitrou99614052014-05-23 11:46:03 +0200544 unittest.main()