blob: cff3c9ea0b5ed6f141c4ea6b2fdd583dcb9db3ba [file] [log] [blame]
Antoine Pitrou99614052014-05-23 11:46:03 +02001import math
Benjamin Petersond73aca72015-04-21 12:05:19 -04002import os
Raymond Hettinger8a99b502003-06-23 13:36:57 +00003import unittest
Raymond Hettinger8a99b502003-06-23 13:36:57 +00004import sys
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00005import _ast
Benjamin Petersond73aca72015-04-21 12:05:19 -04006import tempfile
Benjamin Peterson43b06862011-05-27 09:08:01 -05007import types
Benjamin Petersond73aca72015-04-21 12:05:19 -04008from test import support, script_helper
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +00009
Raymond Hettinger8a99b502003-06-23 13:36:57 +000010class TestSpecifics(unittest.TestCase):
Jeremy Hylton778e2652001-11-09 19:50:08 +000011
Meador Ingefa21bf02012-01-19 01:08:41 -060012 def compile_single(self, source):
13 compile(source, "<single>", "single")
14
15 def assertInvalidSingle(self, source):
16 self.assertRaises(SyntaxError, self.compile_single, source)
17
Benjamin Petersonaeaa5922009-11-13 00:17:59 +000018 def test_no_ending_newline(self):
19 compile("hi", "<test>", "exec")
20 compile("hi\r", "<test>", "exec")
21
22 def test_empty(self):
23 compile("", "<test>", "exec")
24
25 def test_other_newlines(self):
26 compile("\r\n", "<test>", "exec")
27 compile("\r", "<test>", "exec")
28 compile("hi\r\nstuff\r\ndef f():\n pass\r", "<test>", "exec")
29 compile("this_is\rreally_old_mac\rdef f():\n pass", "<test>", "exec")
30
Raymond Hettinger8a99b502003-06-23 13:36:57 +000031 def test_debug_assignment(self):
32 # catch assignments to __debug__
33 self.assertRaises(SyntaxError, compile, '__debug__ = 1', '?', 'single')
Georg Brandl1a3284e2007-12-02 09:40:06 +000034 import builtins
35 prev = builtins.__debug__
36 setattr(builtins, '__debug__', 'sure')
37 setattr(builtins, '__debug__', prev)
Jeremy Hylton778e2652001-11-09 19:50:08 +000038
Raymond Hettinger8a99b502003-06-23 13:36:57 +000039 def test_argument_handling(self):
40 # detect duplicate positional and keyword arguments
41 self.assertRaises(SyntaxError, eval, 'lambda a,a:0')
42 self.assertRaises(SyntaxError, eval, 'lambda a,a=1:0')
43 self.assertRaises(SyntaxError, eval, 'lambda a=1,a=1:0')
Benjamin Petersonec19d952008-06-30 15:01:21 +000044 self.assertRaises(SyntaxError, exec, 'def f(a, a): pass')
45 self.assertRaises(SyntaxError, exec, 'def f(a = 0, a = 1): pass')
46 self.assertRaises(SyntaxError, exec, 'def f(a): global a; a = 1')
Jeremy Hylton778e2652001-11-09 19:50:08 +000047
Raymond Hettinger8a99b502003-06-23 13:36:57 +000048 def test_syntax_error(self):
49 self.assertRaises(SyntaxError, compile, "1+*3", "filename", "exec")
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000050
Guido van Rossumcd16bf62007-06-13 18:07:49 +000051 def test_none_keyword_arg(self):
52 self.assertRaises(SyntaxError, compile, "f(None=1)", "<string>", "exec")
53
Raymond Hettinger8a99b502003-06-23 13:36:57 +000054 def test_duplicate_global_local(self):
Benjamin Petersonec19d952008-06-30 15:01:21 +000055 self.assertRaises(SyntaxError, exec, 'def f(a): global a; a = 1')
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000056
Raymond Hettinger66bd2332004-08-02 08:30:07 +000057 def test_exec_with_general_mapping_for_locals(self):
58
59 class M:
60 "Test mapping interface versus possible calls from eval()."
61 def __getitem__(self, key):
62 if key == 'a':
63 return 12
64 raise KeyError
65 def __setitem__(self, key, value):
66 self.results = (key, value)
Guido van Rossum63eecc72007-02-22 23:55:25 +000067 def keys(self):
68 return list('xyz')
Raymond Hettinger66bd2332004-08-02 08:30:07 +000069
70 m = M()
71 g = globals()
Georg Brandl7cae87c2006-09-06 06:51:57 +000072 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000073 self.assertEqual(m.results, ('z', 12))
74 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000075 exec('z = b', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000076 except NameError:
77 pass
78 else:
79 self.fail('Did not detect a KeyError')
Georg Brandl7cae87c2006-09-06 06:51:57 +000080 exec('z = dir()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000081 self.assertEqual(m.results, ('z', list('xyz')))
Georg Brandl7cae87c2006-09-06 06:51:57 +000082 exec('z = globals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000083 self.assertEqual(m.results, ('z', g))
Georg Brandl7cae87c2006-09-06 06:51:57 +000084 exec('z = locals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000085 self.assertEqual(m.results, ('z', m))
Benjamin Petersonec19d952008-06-30 15:01:21 +000086 self.assertRaises(TypeError, exec, 'z = b', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000087
88 class A:
89 "Non-mapping"
90 pass
91 m = A()
Benjamin Petersonec19d952008-06-30 15:01:21 +000092 self.assertRaises(TypeError, exec, 'z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000093
94 # Verify that dict subclasses work as well
95 class D(dict):
96 def __getitem__(self, key):
97 if key == 'a':
98 return 12
99 return dict.__getitem__(self, key)
100 d = D()
Georg Brandl7cae87c2006-09-06 06:51:57 +0000101 exec('z = a', g, d)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000102 self.assertEqual(d['z'], 12)
103
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000104 def test_extended_arg(self):
105 longexpr = 'x = x or ' + '-x' * 2500
Georg Brandl7cae87c2006-09-06 06:51:57 +0000106 g = {}
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000107 code = '''
108def f(x):
109 %s
110 %s
111 %s
112 %s
113 %s
114 %s
115 %s
116 %s
117 %s
118 %s
119 # the expressions above have no effect, x == argument
120 while x:
121 x -= 1
122 # EXTENDED_ARG/JUMP_ABSOLUTE here
123 return x
124''' % ((longexpr,)*10)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000125 exec(code, g)
126 self.assertEqual(g['f'](5), 0)
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000127
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000128 def test_argument_order(self):
Benjamin Petersonec19d952008-06-30 15:01:21 +0000129 self.assertRaises(SyntaxError, exec, 'def f(a=1, b): pass')
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000130
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000131 def test_float_literals(self):
132 # testing bad float literals
133 self.assertRaises(SyntaxError, eval, "2e")
134 self.assertRaises(SyntaxError, eval, "2.0e+")
135 self.assertRaises(SyntaxError, eval, "1e-")
136 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000137
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000138 def test_indentation(self):
139 # testing compile() of indented block w/o trailing newline"
140 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000141if 1:
142 if 2:
143 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000144 compile(s, "<string>", "exec")
145
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000146 # This test is probably specific to CPython and may not generalize
147 # to other implementations. We are trying to ensure that when
148 # the first line of code starts after 256, correct line numbers
149 # in tracebacks are still produced.
150 def test_leading_newlines(self):
151 s256 = "".join(["\n"] * 256 + ["spam"])
152 co = compile(s256, 'fn', 'exec')
153 self.assertEqual(co.co_firstlineno, 257)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000154 self.assertEqual(co.co_lnotab, bytes())
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000155
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000156 def test_literals_with_leading_zeroes(self):
157 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000158 "080000000000000", "000000000000009", "000000000000008",
159 "0b42", "0BADCAFE", "0o123456789", "0b1.1", "0o4.2",
160 "0b101j2", "0o153j2", "0b100e1", "0o777e1", "0777",
161 "000777", "000000000000007"]:
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000162 self.assertRaises(SyntaxError, eval, arg)
163
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000164 self.assertEqual(eval("0xff"), 255)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000165 self.assertEqual(eval("0777."), 777)
166 self.assertEqual(eval("0777.0"), 777)
167 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
168 self.assertEqual(eval("0777e1"), 7770)
169 self.assertEqual(eval("0e0"), 0)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000170 self.assertEqual(eval("0000e-012"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000171 self.assertEqual(eval("09.5"), 9.5)
172 self.assertEqual(eval("0777j"), 777j)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000173 self.assertEqual(eval("000"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000174 self.assertEqual(eval("00j"), 0j)
175 self.assertEqual(eval("00.0"), 0)
176 self.assertEqual(eval("0e3"), 0)
177 self.assertEqual(eval("090000000000000."), 90000000000000.)
178 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
179 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
180 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
181 self.assertEqual(eval("090000000000000j"), 90000000000000j)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000182 self.assertEqual(eval("000000000000008."), 8.)
183 self.assertEqual(eval("000000000000009."), 9.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000184 self.assertEqual(eval("0b101010"), 42)
185 self.assertEqual(eval("-0b000000000010"), -2)
186 self.assertEqual(eval("0o777"), 511)
187 self.assertEqual(eval("-0o0000010"), -8)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000188
189 def test_unary_minus(self):
190 # Verify treatment of unary minus on negative numbers SF bug #660455
Christian Heimesa37d4c62007-12-04 23:02:19 +0000191 if sys.maxsize == 2147483647:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000192 # 32-bit machine
193 all_one_bits = '0xffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000194 self.assertEqual(eval(all_one_bits), 4294967295)
195 self.assertEqual(eval("-" + all_one_bits), -4294967295)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000196 elif sys.maxsize == 9223372036854775807:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000197 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000198 all_one_bits = '0xffffffffffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000199 self.assertEqual(eval(all_one_bits), 18446744073709551615)
200 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000201 else:
202 self.fail("How many bits *does* this machine have???")
Ezio Melotti42da6632011-03-15 05:18:48 +0200203 # Verify treatment of constant folding on -(sys.maxsize+1)
Serhiy Storchaka95949422013-08-27 19:40:23 +0300204 # i.e. -2147483648 on 32 bit platforms. Should return int.
Ezio Melottie9615932010-01-24 19:26:24 +0000205 self.assertIsInstance(eval("%s" % (-sys.maxsize - 1)), int)
206 self.assertIsInstance(eval("%s" % (-sys.maxsize - 2)), int)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000207
Christian Heimesa37d4c62007-12-04 23:02:19 +0000208 if sys.maxsize == 9223372036854775807:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000209 def test_32_63_bit_values(self):
210 a = +4294967296 # 1 << 32
211 b = -4294967296 # 1 << 32
212 c = +281474976710656 # 1 << 48
213 d = -281474976710656 # 1 << 48
214 e = +4611686018427387904 # 1 << 62
215 f = -4611686018427387904 # 1 << 62
216 g = +9223372036854775807 # 1 << 63 - 1
217 h = -9223372036854775807 # 1 << 63 - 1
218
Neal Norwitz221085d2007-02-25 20:55:47 +0000219 for variable in self.test_32_63_bit_values.__code__.co_consts:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000220 if variable is not None:
Ezio Melottie9615932010-01-24 19:26:24 +0000221 self.assertIsInstance(variable, int)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000222
223 def test_sequence_unpacking_error(self):
224 # Verify sequence packing/unpacking with "or". SF bug #757818
225 i,j = (1, -1) or (-1, 1)
226 self.assertEqual(i, 1)
227 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000228
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000229 def test_none_assignment(self):
230 stmts = [
231 'None = 0',
232 'None += 0',
233 '__builtins__.None = 0',
234 'def None(): pass',
235 'class None: pass',
236 '(a, None) = 0, 0',
237 'for None in range(10): pass',
238 'def f(None): pass',
Benjamin Peterson78565b22009-06-28 19:19:51 +0000239 'import None',
240 'import x as None',
241 'from x import None',
242 'from x import y as None'
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000243 ]
244 for stmt in stmts:
245 stmt += "\n"
246 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
247 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000248
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000249 def test_import(self):
250 succeed = [
251 'import sys',
252 'import os, sys',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000253 'import os as bar',
254 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000255 'from __future__ import nested_scopes, generators',
256 'from __future__ import (nested_scopes,\ngenerators)',
257 'from __future__ import (nested_scopes,\ngenerators,)',
258 'from sys import stdin, stderr, stdout',
259 'from sys import (stdin, stderr,\nstdout)',
260 'from sys import (stdin, stderr,\nstdout,)',
261 'from sys import (stdin\n, stderr, stdout)',
262 'from sys import (stdin\n, stderr, stdout,)',
263 'from sys import stdin as si, stdout as so, stderr as se',
264 'from sys import (stdin as si, stdout as so, stderr as se)',
265 'from sys import (stdin as si, stdout as so, stderr as se,)',
266 ]
267 fail = [
268 'import (os, sys)',
269 'import (os), (sys)',
270 'import ((os), (sys))',
271 'import (sys',
272 'import sys)',
273 'import (os,)',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000274 'import os As bar',
275 'import os.path a bar',
276 'from sys import stdin As stdout',
277 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000278 'from (sys) import stdin',
279 'from __future__ import (nested_scopes',
280 'from __future__ import nested_scopes)',
281 'from __future__ import nested_scopes,\ngenerators',
282 'from sys import (stdin',
283 'from sys import stdin)',
284 'from sys import stdin, stdout,\nstderr',
285 'from sys import stdin si',
286 'from sys import stdin,'
287 'from sys import (*)',
288 'from sys import (stdin,, stdout, stderr)',
289 'from sys import (stdin, stdout),',
290 ]
291 for stmt in succeed:
292 compile(stmt, 'tmp', 'exec')
293 for stmt in fail:
294 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
295
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000296 def test_for_distinct_code_objects(self):
297 # SF bug 1048870
298 def f():
299 f1 = lambda x=1: x
300 f2 = lambda x=2: x
301 return f1, f2
302 f1, f2 = f()
Neal Norwitz221085d2007-02-25 20:55:47 +0000303 self.assertNotEqual(id(f1.__code__), id(f2.__code__))
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000304
Benjamin Petersone6dd2cb2010-03-17 20:56:58 +0000305 def test_lambda_doc(self):
306 l = lambda: "foo"
307 self.assertIsNone(l.__doc__)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000308
Serhiy Storchaka607cb9c2014-09-05 11:00:56 +0300309 def test_encoding(self):
310 code = b'# -*- coding: badencoding -*-\npass\n'
311 self.assertRaises(SyntaxError, compile, code, 'tmp', 'exec')
312 code = '# -*- coding: badencoding -*-\n"\xc2\xa4"\n'
313 compile(code, 'tmp', 'exec')
314 self.assertEqual(eval(code), '\xc2\xa4')
315 code = '"\xc2\xa4"\n'
316 self.assertEqual(eval(code), '\xc2\xa4')
317 code = b'"\xc2\xa4"\n'
318 self.assertEqual(eval(code), '\xa4')
319 code = b'# -*- coding: latin1 -*-\n"\xc2\xa4"\n'
320 self.assertEqual(eval(code), '\xc2\xa4')
321 code = b'# -*- coding: utf-8 -*-\n"\xc2\xa4"\n'
322 self.assertEqual(eval(code), '\xa4')
323 code = b'# -*- coding: iso8859-15 -*-\n"\xc2\xa4"\n'
324 self.assertEqual(eval(code), '\xc2\u20ac')
325 code = '"""\\\n# -*- coding: iso8859-15 -*-\n\xc2\xa4"""\n'
326 self.assertEqual(eval(code), '# -*- coding: iso8859-15 -*-\n\xc2\xa4')
327 code = b'"""\\\n# -*- coding: iso8859-15 -*-\n\xc2\xa4"""\n'
328 self.assertEqual(eval(code), '# -*- coding: iso8859-15 -*-\n\xa4')
Benjamin Peterson5d2ad252010-03-17 20:57:32 +0000329
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000330 def test_subscripts(self):
331 # SF bug 1448804
332 # Class to make testing subscript results easy
333 class str_map(object):
334 def __init__(self):
335 self.data = {}
336 def __getitem__(self, key):
337 return self.data[str(key)]
338 def __setitem__(self, key, value):
339 self.data[str(key)] = value
340 def __delitem__(self, key):
341 del self.data[str(key)]
342 def __contains__(self, key):
343 return str(key) in self.data
344 d = str_map()
345 # Index
346 d[1] = 1
347 self.assertEqual(d[1], 1)
348 d[1] += 1
349 self.assertEqual(d[1], 2)
350 del d[1]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000351 self.assertNotIn(1, d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000352 # Tuple of indices
353 d[1, 1] = 1
354 self.assertEqual(d[1, 1], 1)
355 d[1, 1] += 1
356 self.assertEqual(d[1, 1], 2)
357 del d[1, 1]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000358 self.assertNotIn((1, 1), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000359 # Simple slice
360 d[1:2] = 1
361 self.assertEqual(d[1:2], 1)
362 d[1:2] += 1
363 self.assertEqual(d[1:2], 2)
364 del d[1:2]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000365 self.assertNotIn(slice(1, 2), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000366 # Tuple of simple slices
367 d[1:2, 1:2] = 1
368 self.assertEqual(d[1:2, 1:2], 1)
369 d[1:2, 1:2] += 1
370 self.assertEqual(d[1:2, 1:2], 2)
371 del d[1:2, 1:2]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000372 self.assertNotIn((slice(1, 2), slice(1, 2)), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000373 # Extended slice
374 d[1:2:3] = 1
375 self.assertEqual(d[1:2:3], 1)
376 d[1:2:3] += 1
377 self.assertEqual(d[1:2:3], 2)
378 del d[1:2:3]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000379 self.assertNotIn(slice(1, 2, 3), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000380 # Tuple of extended slices
381 d[1:2:3, 1:2:3] = 1
382 self.assertEqual(d[1:2:3, 1:2:3], 1)
383 d[1:2:3, 1:2:3] += 1
384 self.assertEqual(d[1:2:3, 1:2:3], 2)
385 del d[1:2:3, 1:2:3]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000386 self.assertNotIn((slice(1, 2, 3), slice(1, 2, 3)), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000387 # Ellipsis
388 d[...] = 1
389 self.assertEqual(d[...], 1)
390 d[...] += 1
391 self.assertEqual(d[...], 2)
392 del d[...]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000393 self.assertNotIn(Ellipsis, d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000394 # Tuple of Ellipses
395 d[..., ...] = 1
396 self.assertEqual(d[..., ...], 1)
397 d[..., ...] += 1
398 self.assertEqual(d[..., ...], 2)
399 del d[..., ...]
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000400 self.assertNotIn((Ellipsis, Ellipsis), d)
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000401
Guido van Rossum0240b922007-02-26 21:23:50 +0000402 def test_annotation_limit(self):
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000403 # 16 bits are available for # of annotations, but only 8 bits are
404 # available for the parameter count, hence 255
Guido van Rossum0240b922007-02-26 21:23:50 +0000405 # is the max. Ensure the result of too many annotations is a
406 # SyntaxError.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000407 s = "def f(%s): pass"
408 s %= ', '.join('a%d:%d' % (i,i) for i in range(256))
Guido van Rossum0240b922007-02-26 21:23:50 +0000409 self.assertRaises(SyntaxError, compile, s, '?', 'exec')
410 # Test that the max # of annotations compiles.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000411 s = "def f(%s): pass"
412 s %= ', '.join('a%d:%d' % (i,i) for i in range(255))
Guido van Rossum0240b922007-02-26 21:23:50 +0000413 compile(s, '?', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000414
415 def test_mangling(self):
416 class A:
417 def f():
418 __mangled = 1
419 __not_mangled__ = 2
420 import __mangled_mod
421 import __package__.module
422
Benjamin Peterson577473f2010-01-19 00:09:57 +0000423 self.assertIn("_A__mangled", A.f.__code__.co_varnames)
424 self.assertIn("__not_mangled__", A.f.__code__.co_varnames)
425 self.assertIn("_A__mangled_mod", A.f.__code__.co_varnames)
426 self.assertIn("__package__", A.f.__code__.co_varnames)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000427
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000428 def test_compile_ast(self):
429 fname = __file__
430 if fname.lower().endswith(('pyc', 'pyo')):
431 fname = fname[:-1]
432 with open(fname, 'r') as f:
433 fcontents = f.read()
434 sample_code = [
435 ['<assign>', 'x = 5'],
436 ['<ifblock>', """if True:\n pass\n"""],
437 ['<forblock>', """for n in [1, 2, 3]:\n print(n)\n"""],
438 ['<deffunc>', """def foo():\n pass\nfoo()\n"""],
439 [fname, fcontents],
440 ]
441
442 for fname, code in sample_code:
443 co1 = compile(code, '%s1' % fname, 'exec')
444 ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000445 self.assertTrue(type(ast) == _ast.Module)
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000446 co2 = compile(ast, '%s3' % fname, 'exec')
447 self.assertEqual(co1, co2)
Neal Norwitzdb4115f2008-03-31 04:20:05 +0000448 # the code object's filename comes from the second compilation step
449 self.assertEqual(co2.co_filename, '%s3' % fname)
450
451 # raise exception when node type doesn't match with compile mode
452 co1 = compile('print(1)', '<string>', 'exec', _ast.PyCF_ONLY_AST)
453 self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')
454
455 # raise exception when node type is no start node
456 self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')
457
458 # raise exception when node has invalid children
459 ast = _ast.Module()
460 ast.body = [_ast.BoolOp()]
461 self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000462
Benjamin Peterson43b06862011-05-27 09:08:01 -0500463 @support.cpython_only
464 def test_same_filename_used(self):
465 s = """def f(): pass\ndef g(): pass"""
466 c = compile(s, "myfile", "exec")
467 for obj in c.co_consts:
468 if isinstance(obj, types.CodeType):
469 self.assertIs(obj.co_filename, c.co_filename)
470
Meador Ingefa21bf02012-01-19 01:08:41 -0600471 def test_single_statement(self):
472 self.compile_single("1 + 2")
473 self.compile_single("\n1 + 2")
474 self.compile_single("1 + 2\n")
475 self.compile_single("1 + 2\n\n")
476 self.compile_single("1 + 2\t\t\n")
477 self.compile_single("1 + 2\t\t\n ")
478 self.compile_single("1 + 2 # one plus two")
479 self.compile_single("1; 2")
480 self.compile_single("import sys; sys")
481 self.compile_single("def f():\n pass")
482 self.compile_single("while False:\n pass")
483 self.compile_single("if x:\n f(x)")
484 self.compile_single("if x:\n f(x)\nelse:\n g(x)")
485 self.compile_single("class T:\n pass")
486
487 def test_bad_single_statement(self):
488 self.assertInvalidSingle('1\n2')
489 self.assertInvalidSingle('def f(): pass')
490 self.assertInvalidSingle('a = 13\nb = 187')
491 self.assertInvalidSingle('del x\ndel y')
492 self.assertInvalidSingle('f()\ng()')
Benjamin Petersoncff92372012-01-19 17:46:13 -0500493 self.assertInvalidSingle('f()\n# blah\nblah()')
494 self.assertInvalidSingle('f()\nxy # blah\nblah()')
Benjamin Peterson77fc1f32012-01-20 11:01:06 -0500495 self.assertInvalidSingle('x = 5 # comment\nx = 6\n')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000496
Benjamin Petersond73aca72015-04-21 12:05:19 -0400497 def test_particularly_evil_undecodable(self):
498 # Issue 24022
499 src = b'0000\x00\n00000000000\n\x00\n\x9e\n'
500 with tempfile.TemporaryDirectory() as tmpd:
501 fn = os.path.join(tmpd, "bad.py")
502 with open(fn, "wb") as fp:
503 fp.write(src)
504 res = script_helper.run_python_until_end(fn)[0]
505 self.assertIn(b"Non-UTF-8", res.err)
506
Nick Coghlanaab9c2b2012-11-04 23:14:34 +1000507 @support.cpython_only
508 def test_compiler_recursion_limit(self):
509 # Expected limit is sys.getrecursionlimit() * the scaling factor
510 # in symtable.c (currently 3)
511 # We expect to fail *at* that limit, because we use up some of
512 # the stack depth limit in the test suite code
513 # So we check the expected limit and 75% of that
514 # XXX (ncoghlan): duplicating the scaling factor here is a little
515 # ugly. Perhaps it should be exposed somewhere...
516 fail_depth = sys.getrecursionlimit() * 3
517 success_depth = int(fail_depth * 0.75)
518
519 def check_limit(prefix, repeated):
520 expect_ok = prefix + repeated * success_depth
521 self.compile_single(expect_ok)
522 broken = prefix + repeated * fail_depth
523 details = "Compiling ({!r} + {!r} * {})".format(
524 prefix, repeated, fail_depth)
525 with self.assertRaises(RuntimeError, msg=details):
526 self.compile_single(broken)
527
528 check_limit("a", "()")
529 check_limit("a", ".b")
530 check_limit("a", "[0]")
531 check_limit("a", "*a")
532
533
Antoine Pitrou99614052014-05-23 11:46:03 +0200534class TestStackSize(unittest.TestCase):
535 # These tests check that the computed stack size for a code object
536 # stays within reasonable bounds (see issue #21523 for an example
537 # dysfunction).
538 N = 100
539
540 def check_stack_size(self, code):
541 # To assert that the alleged stack size is not O(N), we
542 # check that it is smaller than log(N).
543 if isinstance(code, str):
544 code = compile(code, "<foo>", "single")
545 max_size = math.ceil(math.log(len(code.co_code)))
546 self.assertLessEqual(code.co_stacksize, max_size)
547
548 def test_and(self):
549 self.check_stack_size("x and " * self.N + "x")
550
551 def test_or(self):
552 self.check_stack_size("x or " * self.N + "x")
553
554 def test_and_or(self):
555 self.check_stack_size("x and x or " * self.N + "x")
556
557 def test_chained_comparison(self):
558 self.check_stack_size("x < " * self.N + "x")
559
560 def test_if_else(self):
561 self.check_stack_size("x if x else " * self.N + "x")
562
563 def test_binop(self):
564 self.check_stack_size("x + " * self.N + "x")
565
566 def test_func_and(self):
567 code = "def f(x):\n"
568 code += " x and x\n" * self.N
569 self.check_stack_size(code)
570
Tim Petersd507dab2001-08-30 20:51:59 +0000571
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000572if __name__ == "__main__":
Antoine Pitrou99614052014-05-23 11:46:03 +0200573 unittest.main()