blob: 611667690fe3e2efe65e4141a2be2790dd6926c3 [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
Serhiy Storchaka607cb9c2014-09-05 11:00:56 +0300307 def test_encoding(self):
308 code = b'# -*- coding: badencoding -*-\npass\n'
309 self.assertRaises(SyntaxError, compile, code, 'tmp', 'exec')
310 code = '# -*- coding: badencoding -*-\n"\xc2\xa4"\n'
311 compile(code, 'tmp', 'exec')
312 self.assertEqual(eval(code), '\xc2\xa4')
313 code = '"\xc2\xa4"\n'
314 self.assertEqual(eval(code), '\xc2\xa4')
315 code = b'"\xc2\xa4"\n'
316 self.assertEqual(eval(code), '\xa4')
317 code = b'# -*- coding: latin1 -*-\n"\xc2\xa4"\n'
318 self.assertEqual(eval(code), '\xc2\xa4')
319 code = b'# -*- coding: utf-8 -*-\n"\xc2\xa4"\n'
320 self.assertEqual(eval(code), '\xa4')
321 code = b'# -*- coding: iso8859-15 -*-\n"\xc2\xa4"\n'
322 self.assertEqual(eval(code), '\xc2\u20ac')
323 code = '"""\\\n# -*- coding: iso8859-15 -*-\n\xc2\xa4"""\n'
324 self.assertEqual(eval(code), '# -*- coding: iso8859-15 -*-\n\xc2\xa4')
325 code = b'"""\\\n# -*- coding: iso8859-15 -*-\n\xc2\xa4"""\n'
326 self.assertEqual(eval(code), '# -*- coding: iso8859-15 -*-\n\xa4')
Benjamin Peterson5d2ad252010-03-17 20:57:32 +0000327
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000328 def test_subscripts(self):
329 # SF bug 1448804
330 # Class to make testing subscript results easy
331 class str_map(object):
332 def __init__(self):
333 self.data = {}
334 def __getitem__(self, key):
335 return self.data[str(key)]
336 def __setitem__(self, key, value):
337 self.data[str(key)] = value
338 def __delitem__(self, key):
339 del self.data[str(key)]
340 def __contains__(self, key):
341 return str(key) in self.data
342 d = str_map()
343 # Index
344 d[1] = 1
345 self.assertEqual(d[1], 1)
346 d[1] += 1
347 self.assertEqual(d[1], 2)
348 del d[1]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000349 self.assertNotIn(1, d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000350 # Tuple of indices
351 d[1, 1] = 1
352 self.assertEqual(d[1, 1], 1)
353 d[1, 1] += 1
354 self.assertEqual(d[1, 1], 2)
355 del d[1, 1]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000356 self.assertNotIn((1, 1), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000357 # Simple slice
358 d[1:2] = 1
359 self.assertEqual(d[1:2], 1)
360 d[1:2] += 1
361 self.assertEqual(d[1:2], 2)
362 del d[1:2]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000363 self.assertNotIn(slice(1, 2), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000364 # Tuple of simple slices
365 d[1:2, 1:2] = 1
366 self.assertEqual(d[1:2, 1:2], 1)
367 d[1:2, 1:2] += 1
368 self.assertEqual(d[1:2, 1:2], 2)
369 del d[1:2, 1:2]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000370 self.assertNotIn((slice(1, 2), slice(1, 2)), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000371 # Extended slice
372 d[1:2:3] = 1
373 self.assertEqual(d[1:2:3], 1)
374 d[1:2:3] += 1
375 self.assertEqual(d[1:2:3], 2)
376 del d[1:2:3]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000377 self.assertNotIn(slice(1, 2, 3), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000378 # Tuple of extended slices
379 d[1:2:3, 1:2:3] = 1
380 self.assertEqual(d[1:2:3, 1:2:3], 1)
381 d[1:2:3, 1:2:3] += 1
382 self.assertEqual(d[1:2:3, 1:2:3], 2)
383 del d[1:2:3, 1:2:3]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000384 self.assertNotIn((slice(1, 2, 3), slice(1, 2, 3)), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000385 # Ellipsis
386 d[...] = 1
387 self.assertEqual(d[...], 1)
388 d[...] += 1
389 self.assertEqual(d[...], 2)
390 del d[...]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000391 self.assertNotIn(Ellipsis, d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000392 # Tuple of Ellipses
393 d[..., ...] = 1
394 self.assertEqual(d[..., ...], 1)
395 d[..., ...] += 1
396 self.assertEqual(d[..., ...], 2)
397 del d[..., ...]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000398 self.assertNotIn((Ellipsis, Ellipsis), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000399
Guido van Rossum0240b922007-02-26 21:23:50 +0000400 def test_annotation_limit(self):
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000401 # 16 bits are available for # of annotations, but only 8 bits are
402 # available for the parameter count, hence 255
Guido van Rossum0240b922007-02-26 21:23:50 +0000403 # is the max. Ensure the result of too many annotations is a
404 # SyntaxError.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000405 s = "def f(%s): pass"
406 s %= ', '.join('a%d:%d' % (i,i) for i in range(256))
Guido van Rossum0240b922007-02-26 21:23:50 +0000407 self.assertRaises(SyntaxError, compile, s, '?', 'exec')
408 # Test that the max # of annotations compiles.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000409 s = "def f(%s): pass"
410 s %= ', '.join('a%d:%d' % (i,i) for i in range(255))
Guido van Rossum0240b922007-02-26 21:23:50 +0000411 compile(s, '?', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000412
413 def test_mangling(self):
414 class A:
415 def f():
416 __mangled = 1
417 __not_mangled__ = 2
418 import __mangled_mod
419 import __package__.module
420
Benjamin Peterson577473f2010-01-19 00:09:57 +0000421 self.assertIn("_A__mangled", A.f.__code__.co_varnames)
422 self.assertIn("__not_mangled__", A.f.__code__.co_varnames)
423 self.assertIn("_A__mangled_mod", A.f.__code__.co_varnames)
424 self.assertIn("__package__", A.f.__code__.co_varnames)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000425
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000426 def test_compile_ast(self):
427 fname = __file__
428 if fname.lower().endswith(('pyc', 'pyo')):
429 fname = fname[:-1]
430 with open(fname, 'r') as f:
431 fcontents = f.read()
432 sample_code = [
433 ['<assign>', 'x = 5'],
434 ['<ifblock>', """if True:\n pass\n"""],
435 ['<forblock>', """for n in [1, 2, 3]:\n print(n)\n"""],
436 ['<deffunc>', """def foo():\n pass\nfoo()\n"""],
437 [fname, fcontents],
438 ]
439
440 for fname, code in sample_code:
441 co1 = compile(code, '%s1' % fname, 'exec')
442 ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000443 self.assertTrue(type(ast) == _ast.Module)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000444 co2 = compile(ast, '%s3' % fname, 'exec')
445 self.assertEqual(co1, co2)
Neal Norwitzdb4115f2008-03-31 04:20:05 +0000446 # the code object's filename comes from the second compilation step
447 self.assertEqual(co2.co_filename, '%s3' % fname)
448
449 # raise exception when node type doesn't match with compile mode
450 co1 = compile('print(1)', '<string>', 'exec', _ast.PyCF_ONLY_AST)
451 self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')
452
453 # raise exception when node type is no start node
454 self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')
455
456 # raise exception when node has invalid children
457 ast = _ast.Module()
458 ast.body = [_ast.BoolOp()]
459 self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000460
Benjamin Peterson43b06862011-05-27 09:08:01 -0500461 @support.cpython_only
462 def test_same_filename_used(self):
463 s = """def f(): pass\ndef g(): pass"""
464 c = compile(s, "myfile", "exec")
465 for obj in c.co_consts:
466 if isinstance(obj, types.CodeType):
467 self.assertIs(obj.co_filename, c.co_filename)
468
Meador Ingefa21bf02012-01-19 01:08:41 -0600469 def test_single_statement(self):
470 self.compile_single("1 + 2")
471 self.compile_single("\n1 + 2")
472 self.compile_single("1 + 2\n")
473 self.compile_single("1 + 2\n\n")
474 self.compile_single("1 + 2\t\t\n")
475 self.compile_single("1 + 2\t\t\n ")
476 self.compile_single("1 + 2 # one plus two")
477 self.compile_single("1; 2")
478 self.compile_single("import sys; sys")
479 self.compile_single("def f():\n pass")
480 self.compile_single("while False:\n pass")
481 self.compile_single("if x:\n f(x)")
482 self.compile_single("if x:\n f(x)\nelse:\n g(x)")
483 self.compile_single("class T:\n pass")
484
485 def test_bad_single_statement(self):
486 self.assertInvalidSingle('1\n2')
487 self.assertInvalidSingle('def f(): pass')
488 self.assertInvalidSingle('a = 13\nb = 187')
489 self.assertInvalidSingle('del x\ndel y')
490 self.assertInvalidSingle('f()\ng()')
Benjamin Petersoncff92372012-01-19 17:46:13 -0500491 self.assertInvalidSingle('f()\n# blah\nblah()')
492 self.assertInvalidSingle('f()\nxy # blah\nblah()')
Benjamin Peterson77fc1f32012-01-20 11:01:06 -0500493 self.assertInvalidSingle('x = 5 # comment\nx = 6\n')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000494
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000495 @support.cpython_only
496 def test_compiler_recursion_limit(self):
497 # Expected limit is sys.getrecursionlimit() * the scaling factor
498 # in symtable.c (currently 3)
499 # We expect to fail *at* that limit, because we use up some of
500 # the stack depth limit in the test suite code
501 # So we check the expected limit and 75% of that
502 # XXX (ncoghlan): duplicating the scaling factor here is a little
503 # ugly. Perhaps it should be exposed somewhere...
504 fail_depth = sys.getrecursionlimit() * 3
505 success_depth = int(fail_depth * 0.75)
506
507 def check_limit(prefix, repeated):
508 expect_ok = prefix + repeated * success_depth
509 self.compile_single(expect_ok)
510 broken = prefix + repeated * fail_depth
511 details = "Compiling ({!r} + {!r} * {})".format(
512 prefix, repeated, fail_depth)
513 with self.assertRaises(RuntimeError, msg=details):
514 self.compile_single(broken)
515
516 check_limit("a", "()")
517 check_limit("a", ".b")
518 check_limit("a", "[0]")
519 check_limit("a", "*a")
520
521
Antoine Pitrou99614052014-05-23 11:46:03 +0200522class TestStackSize(unittest.TestCase):
523 # These tests check that the computed stack size for a code object
524 # stays within reasonable bounds (see issue #21523 for an example
525 # dysfunction).
526 N = 100
527
528 def check_stack_size(self, code):
529 # To assert that the alleged stack size is not O(N), we
530 # check that it is smaller than log(N).
531 if isinstance(code, str):
532 code = compile(code, "<foo>", "single")
533 max_size = math.ceil(math.log(len(code.co_code)))
534 self.assertLessEqual(code.co_stacksize, max_size)
535
536 def test_and(self):
537 self.check_stack_size("x and " * self.N + "x")
538
539 def test_or(self):
540 self.check_stack_size("x or " * self.N + "x")
541
542 def test_and_or(self):
543 self.check_stack_size("x and x or " * self.N + "x")
544
545 def test_chained_comparison(self):
546 self.check_stack_size("x < " * self.N + "x")
547
548 def test_if_else(self):
549 self.check_stack_size("x if x else " * self.N + "x")
550
551 def test_binop(self):
552 self.check_stack_size("x + " * self.N + "x")
553
554 def test_func_and(self):
555 code = "def f(x):\n"
556 code += " x and x\n" * self.N
557 self.check_stack_size(code)
558
Tim Petersd507dab2001-08-30 20:51:59 +0000559
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000560if __name__ == "__main__":
Antoine Pitrou99614052014-05-23 11:46:03 +0200561 unittest.main()