blob: efc54e514aef1b174dc41fee93c9a08fbabb26ac [file] [log] [blame]
Raymond Hettinger8a99b502003-06-23 13:36:57 +00001import unittest
Raymond Hettinger8a99b502003-06-23 13:36:57 +00002import sys
Georg Brandlfc8eef32008-03-28 12:11:56 +00003import _ast
Raymond Hettinger8a99b502003-06-23 13:36:57 +00004from test import test_support
Senthil Kumaran3ddc4352010-01-08 18:41:40 +00005import textwrap
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 Petersone36199b2009-11-12 23:39:44 +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')
25 import __builtin__
26 prev = __builtin__.__debug__
27 setattr(__builtin__, '__debug__', 'sure')
28 setattr(__builtin__, '__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')
35 try:
36 exec 'def f(a, a): pass'
37 self.fail("duplicate arguments")
38 except SyntaxError:
39 pass
40 try:
41 exec 'def f(a = 0, a = 1): pass'
42 self.fail("duplicate keyword arguments")
43 except SyntaxError:
44 pass
45 try:
46 exec 'def f(a): global a; a = 1'
47 self.fail("variable is global and local")
48 except SyntaxError:
49 pass
Jeremy Hylton778e2652001-11-09 19:50:08 +000050
Raymond Hettinger8a99b502003-06-23 13:36:57 +000051 def test_syntax_error(self):
52 self.assertRaises(SyntaxError, compile, "1+*3", "filename", "exec")
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000053
Georg Brandle06cf452007-06-07 13:23:24 +000054 def test_none_keyword_arg(self):
55 self.assertRaises(SyntaxError, compile, "f(None=1)", "<string>", "exec")
56
Raymond Hettinger8a99b502003-06-23 13:36:57 +000057 def test_duplicate_global_local(self):
58 try:
59 exec 'def f(a): global a; a = 1'
60 self.fail("variable is global and local")
61 except SyntaxError:
62 pass
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000063
Raymond Hettinger66bd2332004-08-02 08:30:07 +000064 def test_exec_with_general_mapping_for_locals(self):
65
66 class M:
67 "Test mapping interface versus possible calls from eval()."
68 def __getitem__(self, key):
69 if key == 'a':
70 return 12
71 raise KeyError
72 def __setitem__(self, key, value):
73 self.results = (key, value)
74 def keys(self):
75 return list('xyz')
76
77 m = M()
78 g = globals()
79 exec 'z = a' in g, m
80 self.assertEqual(m.results, ('z', 12))
81 try:
82 exec 'z = b' in g, m
83 except NameError:
84 pass
85 else:
86 self.fail('Did not detect a KeyError')
87 exec 'z = dir()' in g, m
88 self.assertEqual(m.results, ('z', list('xyz')))
89 exec 'z = globals()' in g, m
90 self.assertEqual(m.results, ('z', g))
91 exec 'z = locals()' in g, m
92 self.assertEqual(m.results, ('z', m))
93 try:
94 exec 'z = b' in m
95 except TypeError:
96 pass
97 else:
98 self.fail('Did not validate globals as a real dict')
99
100 class A:
101 "Non-mapping"
102 pass
103 m = A()
104 try:
105 exec 'z = a' in g, m
106 except TypeError:
107 pass
108 else:
109 self.fail('Did not validate locals as a mapping')
110
111 # Verify that dict subclasses work as well
112 class D(dict):
113 def __getitem__(self, key):
114 if key == 'a':
115 return 12
116 return dict.__getitem__(self, key)
117 d = D()
118 exec 'z = a' in g, d
119 self.assertEqual(d['z'], 12)
120
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000121 def test_extended_arg(self):
122 longexpr = 'x = x or ' + '-x' * 2500
123 code = '''
124def f(x):
125 %s
126 %s
127 %s
128 %s
129 %s
130 %s
131 %s
132 %s
133 %s
134 %s
135 # the expressions above have no effect, x == argument
136 while x:
137 x -= 1
138 # EXTENDED_ARG/JUMP_ABSOLUTE here
139 return x
140''' % ((longexpr,)*10)
141 exec code
142 self.assertEqual(f(5), 0)
143
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000144 def test_complex_args(self):
Senthil Kumaran3ddc4352010-01-08 18:41:40 +0000145 # Silence Py3k warning
146 with test_support.check_warnings():
147 exec textwrap.dedent('''
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000148 def comp_args((a, b)):
149 return a,b
150 self.assertEqual(comp_args((1, 2)), (1, 2))
Thomas Heller6b17abf2002-07-09 09:23:27 +0000151
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000152 def comp_args((a, b)=(3, 4)):
153 return a, b
154 self.assertEqual(comp_args((1, 2)), (1, 2))
155 self.assertEqual(comp_args(), (3, 4))
Jeremy Hylton047e2c92001-01-19 03:25:56 +0000156
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000157 def comp_args(a, (b, c)):
158 return a, b, c
159 self.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000160
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000161 def comp_args(a=2, (b, c)=(3, 4)):
162 return a, b, c
163 self.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
164 self.assertEqual(comp_args(), (2, 3, 4))
Senthil Kumaran3ddc4352010-01-08 18:41:40 +0000165 ''')
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000166
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000167 def test_argument_order(self):
168 try:
169 exec 'def f(a=1, (b, c)): pass'
170 self.fail("non-default args after default")
171 except SyntaxError:
172 pass
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000173
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000174 def test_float_literals(self):
175 # testing bad float literals
176 self.assertRaises(SyntaxError, eval, "2e")
177 self.assertRaises(SyntaxError, eval, "2.0e+")
178 self.assertRaises(SyntaxError, eval, "1e-")
179 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000180
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000181 def test_indentation(self):
182 # testing compile() of indented block w/o trailing newline"
183 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000184if 1:
185 if 2:
186 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000187 compile(s, "<string>", "exec")
188
Neal Norwitzed657552006-07-10 00:04:44 +0000189 # This test is probably specific to CPython and may not generalize
190 # to other implementations. We are trying to ensure that when
191 # the first line of code starts after 256, correct line numbers
192 # in tracebacks are still produced.
193 def test_leading_newlines(self):
194 s256 = "".join(["\n"] * 256 + ["spam"])
195 co = compile(s256, 'fn', 'exec')
196 self.assertEqual(co.co_firstlineno, 257)
197 self.assertEqual(co.co_lnotab, '')
198
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000199 def test_literals_with_leading_zeroes(self):
200 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
Eric Smith9ff19b52008-03-17 17:32:20 +0000201 "080000000000000", "000000000000009", "000000000000008",
202 "0b42", "0BADCAFE", "0o123456789", "0b1.1", "0o4.2",
Amaury Forgeot d'Arc52167212008-04-24 18:07:05 +0000203 "0b101j2", "0o153j2", "0b100e1", "0o777e1", "0o8", "0o78"]:
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000204 self.assertRaises(SyntaxError, eval, arg)
205
206 self.assertEqual(eval("0777"), 511)
207 self.assertEqual(eval("0777L"), 511)
208 self.assertEqual(eval("000777"), 511)
209 self.assertEqual(eval("0xff"), 255)
210 self.assertEqual(eval("0xffL"), 255)
211 self.assertEqual(eval("0XfF"), 255)
212 self.assertEqual(eval("0777."), 777)
213 self.assertEqual(eval("0777.0"), 777)
214 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
215 self.assertEqual(eval("0777e1"), 7770)
216 self.assertEqual(eval("0e0"), 0)
217 self.assertEqual(eval("0000E-012"), 0)
218 self.assertEqual(eval("09.5"), 9.5)
219 self.assertEqual(eval("0777j"), 777j)
220 self.assertEqual(eval("00j"), 0j)
221 self.assertEqual(eval("00.0"), 0)
222 self.assertEqual(eval("0e3"), 0)
223 self.assertEqual(eval("090000000000000."), 90000000000000.)
224 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
225 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
226 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
227 self.assertEqual(eval("090000000000000j"), 90000000000000j)
228 self.assertEqual(eval("000000000000007"), 7)
229 self.assertEqual(eval("000000000000008."), 8.)
230 self.assertEqual(eval("000000000000009."), 9.)
Eric Smith9ff19b52008-03-17 17:32:20 +0000231 self.assertEqual(eval("0b101010"), 42)
232 self.assertEqual(eval("-0b000000000010"), -2)
233 self.assertEqual(eval("0o777"), 511)
234 self.assertEqual(eval("-0o0000010"), -8)
Mark Dickinson64b7e502008-07-16 09:40:03 +0000235 self.assertEqual(eval("020000000000.0"), 20000000000.0)
236 self.assertEqual(eval("037777777777e0"), 37777777777.0)
237 self.assertEqual(eval("01000000000000000000000.0"),
238 1000000000000000000000.0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000239
240 def test_unary_minus(self):
241 # Verify treatment of unary minus on negative numbers SF bug #660455
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000242 if sys.maxint == 2147483647:
243 # 32-bit machine
244 all_one_bits = '0xffffffff'
245 self.assertEqual(eval(all_one_bits), 4294967295L)
246 self.assertEqual(eval("-" + all_one_bits), -4294967295L)
247 elif sys.maxint == 9223372036854775807:
248 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000249 all_one_bits = '0xffffffffffffffff'
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000250 self.assertEqual(eval(all_one_bits), 18446744073709551615L)
251 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615L)
252 else:
253 self.fail("How many bits *does* this machine have???")
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +0000254 # Verify treatment of contant folding on -(sys.maxint+1)
255 # i.e. -2147483648 on 32 bit platforms. Should return int, not long.
256 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 1)), int))
257 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 2)), long))
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000258
Neal Norwitz28746ab2006-07-09 22:14:42 +0000259 if sys.maxint == 9223372036854775807:
260 def test_32_63_bit_values(self):
261 a = +4294967296 # 1 << 32
262 b = -4294967296 # 1 << 32
263 c = +281474976710656 # 1 << 48
264 d = -281474976710656 # 1 << 48
265 e = +4611686018427387904 # 1 << 62
266 f = -4611686018427387904 # 1 << 62
267 g = +9223372036854775807 # 1 << 63 - 1
268 h = -9223372036854775807 # 1 << 63 - 1
269
270 for variable in self.test_32_63_bit_values.func_code.co_consts:
271 if variable is not None:
272 self.assertTrue(isinstance(variable, int))
273
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000274 def test_sequence_unpacking_error(self):
275 # Verify sequence packing/unpacking with "or". SF bug #757818
276 i,j = (1, -1) or (-1, 1)
277 self.assertEqual(i, 1)
278 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000279
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000280 def test_none_assignment(self):
281 stmts = [
282 'None = 0',
283 'None += 0',
284 '__builtins__.None = 0',
285 'def None(): pass',
286 'class None: pass',
287 '(a, None) = 0, 0',
288 'for None in range(10): pass',
289 'def f(None): pass',
Benjamin Peterson565e1b62009-06-13 03:46:30 +0000290 'import None',
291 'import x as None',
292 'from x import None',
293 'from x import y as None'
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000294 ]
295 for stmt in stmts:
296 stmt += "\n"
297 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
298 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Benjamin Peterson565e1b62009-06-13 03:46:30 +0000299 # This is ok.
300 compile("from None import x", "tmp", "exec")
Benjamin Petersond1f5a592009-06-13 13:06:21 +0000301 compile("from x import None as y", "tmp", "exec")
302 compile("import None as x", "tmp", "exec")
Tim Petersd507dab2001-08-30 20:51:59 +0000303
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000304 def test_import(self):
305 succeed = [
306 'import sys',
307 'import os, sys',
Neal Norwitzfb48afa2006-07-08 05:31:37 +0000308 'import os as bar',
309 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000310 'from __future__ import nested_scopes, generators',
311 'from __future__ import (nested_scopes,\ngenerators)',
312 'from __future__ import (nested_scopes,\ngenerators,)',
313 'from sys import stdin, stderr, stdout',
314 'from sys import (stdin, stderr,\nstdout)',
315 'from sys import (stdin, stderr,\nstdout,)',
316 'from sys import (stdin\n, stderr, stdout)',
317 'from sys import (stdin\n, stderr, stdout,)',
318 'from sys import stdin as si, stdout as so, stderr as se',
319 'from sys import (stdin as si, stdout as so, stderr as se)',
320 'from sys import (stdin as si, stdout as so, stderr as se,)',
321 ]
322 fail = [
323 'import (os, sys)',
324 'import (os), (sys)',
325 'import ((os), (sys))',
326 'import (sys',
327 'import sys)',
328 'import (os,)',
Neal Norwitzfb48afa2006-07-08 05:31:37 +0000329 'import os As bar',
330 'import os.path a bar',
Georg Brandl9575fb22006-07-08 12:15:27 +0000331 'from sys import stdin As stdout',
332 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000333 'from (sys) import stdin',
334 'from __future__ import (nested_scopes',
335 'from __future__ import nested_scopes)',
336 'from __future__ import nested_scopes,\ngenerators',
337 'from sys import (stdin',
338 'from sys import stdin)',
339 'from sys import stdin, stdout,\nstderr',
340 'from sys import stdin si',
341 'from sys import stdin,'
342 'from sys import (*)',
343 'from sys import (stdin,, stdout, stderr)',
344 'from sys import (stdin, stdout),',
345 ]
346 for stmt in succeed:
347 compile(stmt, 'tmp', 'exec')
348 for stmt in fail:
349 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
350
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000351 def test_for_distinct_code_objects(self):
352 # SF bug 1048870
353 def f():
354 f1 = lambda x=1: x
355 f2 = lambda x=2: x
356 return f1, f2
357 f1, f2 = f()
358 self.assertNotEqual(id(f1.func_code), id(f2.func_code))
359
Neal Norwitze98ccf62006-03-23 05:39:47 +0000360 def test_unicode_encoding(self):
361 code = u"# -*- coding: utf-8 -*-\npass\n"
362 self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
363
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000364 def test_subscripts(self):
365 # SF bug 1448804
366 # Class to make testing subscript results easy
367 class str_map(object):
368 def __init__(self):
369 self.data = {}
370 def __getitem__(self, key):
371 return self.data[str(key)]
372 def __setitem__(self, key, value):
373 self.data[str(key)] = value
374 def __delitem__(self, key):
375 del self.data[str(key)]
376 def __contains__(self, key):
377 return str(key) in self.data
378 d = str_map()
379 # Index
380 d[1] = 1
381 self.assertEqual(d[1], 1)
382 d[1] += 1
383 self.assertEqual(d[1], 2)
384 del d[1]
385 self.assertEqual(1 in d, False)
386 # Tuple of indices
387 d[1, 1] = 1
388 self.assertEqual(d[1, 1], 1)
389 d[1, 1] += 1
390 self.assertEqual(d[1, 1], 2)
391 del d[1, 1]
392 self.assertEqual((1, 1) in d, False)
393 # Simple slice
394 d[1:2] = 1
395 self.assertEqual(d[1:2], 1)
396 d[1:2] += 1
397 self.assertEqual(d[1:2], 2)
398 del d[1:2]
399 self.assertEqual(slice(1, 2) in d, False)
400 # Tuple of simple slices
401 d[1:2, 1:2] = 1
402 self.assertEqual(d[1:2, 1:2], 1)
403 d[1:2, 1:2] += 1
404 self.assertEqual(d[1:2, 1:2], 2)
405 del d[1:2, 1:2]
406 self.assertEqual((slice(1, 2), slice(1, 2)) in d, False)
407 # Extended slice
408 d[1:2:3] = 1
409 self.assertEqual(d[1:2:3], 1)
410 d[1:2:3] += 1
411 self.assertEqual(d[1:2:3], 2)
412 del d[1:2:3]
413 self.assertEqual(slice(1, 2, 3) in d, False)
414 # Tuple of extended slices
415 d[1:2:3, 1:2:3] = 1
416 self.assertEqual(d[1:2:3, 1:2:3], 1)
417 d[1:2:3, 1:2:3] += 1
418 self.assertEqual(d[1:2:3, 1:2:3], 2)
419 del d[1:2:3, 1:2:3]
420 self.assertEqual((slice(1, 2, 3), slice(1, 2, 3)) in d, False)
421 # Ellipsis
422 d[...] = 1
423 self.assertEqual(d[...], 1)
424 d[...] += 1
425 self.assertEqual(d[...], 2)
426 del d[...]
427 self.assertEqual(Ellipsis in d, False)
428 # Tuple of Ellipses
429 d[..., ...] = 1
430 self.assertEqual(d[..., ...], 1)
431 d[..., ...] += 1
432 self.assertEqual(d[..., ...], 2)
433 del d[..., ...]
434 self.assertEqual((Ellipsis, Ellipsis) in d, False)
435
Jeremy Hylton37075c52007-02-27 01:01:59 +0000436 def test_mangling(self):
437 class A:
438 def f():
439 __mangled = 1
440 __not_mangled__ = 2
441 import __mangled_mod
442 import __package__.module
443
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000444 self.assertTrue("_A__mangled" in A.f.func_code.co_varnames)
445 self.assertTrue("__not_mangled__" in A.f.func_code.co_varnames)
446 self.assertTrue("_A__mangled_mod" in A.f.func_code.co_varnames)
447 self.assertTrue("__package__" in A.f.func_code.co_varnames)
Jeremy Hylton37075c52007-02-27 01:01:59 +0000448
Georg Brandlfc8eef32008-03-28 12:11:56 +0000449 def test_compile_ast(self):
450 fname = __file__
451 if fname.lower().endswith(('pyc', 'pyo')):
452 fname = fname[:-1]
453 with open(fname, 'r') as f:
454 fcontents = f.read()
455 sample_code = [
456 ['<assign>', 'x = 5'],
457 ['<print1>', 'print 1'],
458 ['<printv>', 'print v'],
459 ['<printTrue>', 'print True'],
460 ['<printList>', 'print []'],
461 ['<ifblock>', """if True:\n pass\n"""],
462 ['<forblock>', """for n in [1, 2, 3]:\n print n\n"""],
463 ['<deffunc>', """def foo():\n pass\nfoo()\n"""],
464 [fname, fcontents],
465 ]
466
467 for fname, code in sample_code:
468 co1 = compile(code, '%s1' % fname, 'exec')
469 ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000470 self.assertTrue(type(ast) == _ast.Module)
Georg Brandlfc8eef32008-03-28 12:11:56 +0000471 co2 = compile(ast, '%s3' % fname, 'exec')
472 self.assertEqual(co1, co2)
Georg Brandlf2bfd542008-03-29 13:24:23 +0000473 # the code object's filename comes from the second compilation step
474 self.assertEqual(co2.co_filename, '%s3' % fname)
475
476 # raise exception when node type doesn't match with compile mode
477 co1 = compile('print 1', '<string>', 'exec', _ast.PyCF_ONLY_AST)
478 self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')
479
480 # raise exception when node type is no start node
481 self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')
482
483 # raise exception when node has invalid children
484 ast = _ast.Module()
485 ast.body = [_ast.BoolOp()]
486 self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
Georg Brandlfc8eef32008-03-28 12:11:56 +0000487
488
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000489def test_main():
490 test_support.run_unittest(TestSpecifics)
Tim Petersd507dab2001-08-30 20:51:59 +0000491
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000492if __name__ == "__main__":
493 test_main()