blob: 4979f9263c5618046004f84cbb25cfd32677981f [file] [log] [blame]
Raymond Hettinger8a99b502003-06-23 13:36:57 +00001import unittest
Raymond Hettinger8a99b502003-06-23 13:36:57 +00002import sys
3from test import test_support
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +00004
Raymond Hettinger8a99b502003-06-23 13:36:57 +00005class TestSpecifics(unittest.TestCase):
Jeremy Hylton778e2652001-11-09 19:50:08 +00006
Raymond Hettinger8a99b502003-06-23 13:36:57 +00007 def test_debug_assignment(self):
8 # catch assignments to __debug__
9 self.assertRaises(SyntaxError, compile, '__debug__ = 1', '?', 'single')
Georg Brandl1a3284e2007-12-02 09:40:06 +000010 import builtins
11 prev = builtins.__debug__
12 setattr(builtins, '__debug__', 'sure')
13 setattr(builtins, '__debug__', prev)
Jeremy Hylton778e2652001-11-09 19:50:08 +000014
Raymond Hettinger8a99b502003-06-23 13:36:57 +000015 def test_argument_handling(self):
16 # detect duplicate positional and keyword arguments
17 self.assertRaises(SyntaxError, eval, 'lambda a,a:0')
18 self.assertRaises(SyntaxError, eval, 'lambda a,a=1:0')
19 self.assertRaises(SyntaxError, eval, 'lambda a=1,a=1:0')
20 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000021 exec('def f(a, a): pass')
Raymond Hettinger8a99b502003-06-23 13:36:57 +000022 self.fail("duplicate arguments")
23 except SyntaxError:
24 pass
25 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000026 exec('def f(a = 0, a = 1): pass')
Raymond Hettinger8a99b502003-06-23 13:36:57 +000027 self.fail("duplicate keyword arguments")
28 except SyntaxError:
29 pass
30 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000031 exec('def f(a): global a; a = 1')
Raymond Hettinger8a99b502003-06-23 13:36:57 +000032 self.fail("variable is global and local")
33 except SyntaxError:
34 pass
Jeremy Hylton778e2652001-11-09 19:50:08 +000035
Raymond Hettinger8a99b502003-06-23 13:36:57 +000036 def test_syntax_error(self):
37 self.assertRaises(SyntaxError, compile, "1+*3", "filename", "exec")
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000038
Guido van Rossumcd16bf62007-06-13 18:07:49 +000039 def test_none_keyword_arg(self):
40 self.assertRaises(SyntaxError, compile, "f(None=1)", "<string>", "exec")
41
Raymond Hettinger8a99b502003-06-23 13:36:57 +000042 def test_duplicate_global_local(self):
43 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000044 exec('def f(a): global a; a = 1')
Raymond Hettinger8a99b502003-06-23 13:36:57 +000045 self.fail("variable is global and local")
46 except SyntaxError:
47 pass
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000048
Raymond Hettinger66bd2332004-08-02 08:30:07 +000049 def test_exec_with_general_mapping_for_locals(self):
50
51 class M:
52 "Test mapping interface versus possible calls from eval()."
53 def __getitem__(self, key):
54 if key == 'a':
55 return 12
56 raise KeyError
57 def __setitem__(self, key, value):
58 self.results = (key, value)
Guido van Rossum63eecc72007-02-22 23:55:25 +000059 def keys(self):
60 return list('xyz')
Raymond Hettinger66bd2332004-08-02 08:30:07 +000061
62 m = M()
63 g = globals()
Georg Brandl7cae87c2006-09-06 06:51:57 +000064 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000065 self.assertEqual(m.results, ('z', 12))
66 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000067 exec('z = b', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000068 except NameError:
69 pass
70 else:
71 self.fail('Did not detect a KeyError')
Georg Brandl7cae87c2006-09-06 06:51:57 +000072 exec('z = dir()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000073 self.assertEqual(m.results, ('z', list('xyz')))
Georg Brandl7cae87c2006-09-06 06:51:57 +000074 exec('z = globals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000075 self.assertEqual(m.results, ('z', g))
Georg Brandl7cae87c2006-09-06 06:51:57 +000076 exec('z = locals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000077 self.assertEqual(m.results, ('z', m))
78 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000079 exec('z = b', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000080 except TypeError:
81 pass
82 else:
83 self.fail('Did not validate globals as a real dict')
84
85 class A:
86 "Non-mapping"
87 pass
88 m = A()
89 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000090 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000091 except TypeError:
92 pass
93 else:
94 self.fail('Did not validate locals as a mapping')
95
96 # Verify that dict subclasses work as well
97 class D(dict):
98 def __getitem__(self, key):
99 if key == 'a':
100 return 12
101 return dict.__getitem__(self, key)
102 d = D()
Georg Brandl7cae87c2006-09-06 06:51:57 +0000103 exec('z = a', g, d)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000104 self.assertEqual(d['z'], 12)
105
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000106 def test_extended_arg(self):
107 longexpr = 'x = x or ' + '-x' * 2500
Georg Brandl7cae87c2006-09-06 06:51:57 +0000108 g = {}
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000109 code = '''
110def f(x):
111 %s
112 %s
113 %s
114 %s
115 %s
116 %s
117 %s
118 %s
119 %s
120 %s
121 # the expressions above have no effect, x == argument
122 while x:
123 x -= 1
124 # EXTENDED_ARG/JUMP_ABSOLUTE here
125 return x
126''' % ((longexpr,)*10)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000127 exec(code, g)
128 self.assertEqual(g['f'](5), 0)
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000129
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000130 def test_argument_order(self):
131 try:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000132 exec('def f(a=1, b): pass')
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000133 self.fail("non-default args after default")
134 except SyntaxError:
135 pass
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000136
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000137 def test_float_literals(self):
138 # testing bad float literals
139 self.assertRaises(SyntaxError, eval, "2e")
140 self.assertRaises(SyntaxError, eval, "2.0e+")
141 self.assertRaises(SyntaxError, eval, "1e-")
142 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000143
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000144 def test_indentation(self):
145 # testing compile() of indented block w/o trailing newline"
146 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000147if 1:
148 if 2:
149 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000150 compile(s, "<string>", "exec")
151
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000152 # This test is probably specific to CPython and may not generalize
153 # to other implementations. We are trying to ensure that when
154 # the first line of code starts after 256, correct line numbers
155 # in tracebacks are still produced.
156 def test_leading_newlines(self):
157 s256 = "".join(["\n"] * 256 + ["spam"])
158 co = compile(s256, 'fn', 'exec')
159 self.assertEqual(co.co_firstlineno, 257)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000160 self.assertEqual(co.co_lnotab, bytes())
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000161
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000162 def test_literals_with_leading_zeroes(self):
163 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000164 "080000000000000", "000000000000009", "000000000000008",
165 "0b42", "0BADCAFE", "0o123456789", "0b1.1", "0o4.2",
166 "0b101j2", "0o153j2", "0b100e1", "0o777e1", "0777",
167 "000777", "000000000000007"]:
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000168 self.assertRaises(SyntaxError, eval, arg)
169
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000170 self.assertEqual(eval("0xff"), 255)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000171 self.assertEqual(eval("0777."), 777)
172 self.assertEqual(eval("0777.0"), 777)
173 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
174 self.assertEqual(eval("0777e1"), 7770)
175 self.assertEqual(eval("0e0"), 0)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000176 self.assertEqual(eval("0000e-012"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000177 self.assertEqual(eval("09.5"), 9.5)
178 self.assertEqual(eval("0777j"), 777j)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000179 self.assertEqual(eval("000"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000180 self.assertEqual(eval("00j"), 0j)
181 self.assertEqual(eval("00.0"), 0)
182 self.assertEqual(eval("0e3"), 0)
183 self.assertEqual(eval("090000000000000."), 90000000000000.)
184 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
185 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
186 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
187 self.assertEqual(eval("090000000000000j"), 90000000000000j)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000188 self.assertEqual(eval("000000000000008."), 8.)
189 self.assertEqual(eval("000000000000009."), 9.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000190 self.assertEqual(eval("0b101010"), 42)
191 self.assertEqual(eval("-0b000000000010"), -2)
192 self.assertEqual(eval("0o777"), 511)
193 self.assertEqual(eval("-0o0000010"), -8)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000194
195 def test_unary_minus(self):
196 # Verify treatment of unary minus on negative numbers SF bug #660455
Christian Heimesa37d4c62007-12-04 23:02:19 +0000197 if sys.maxsize == 2147483647:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000198 # 32-bit machine
199 all_one_bits = '0xffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000200 self.assertEqual(eval(all_one_bits), 4294967295)
201 self.assertEqual(eval("-" + all_one_bits), -4294967295)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000202 elif sys.maxsize == 9223372036854775807:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000203 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000204 all_one_bits = '0xffffffffffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000205 self.assertEqual(eval(all_one_bits), 18446744073709551615)
206 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000207 else:
208 self.fail("How many bits *does* this machine have???")
Christian Heimesa37d4c62007-12-04 23:02:19 +0000209 # Verify treatment of contant folding on -(sys.maxsize+1)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000210 # i.e. -2147483648 on 32 bit platforms. Should return int, not long.
Christian Heimesa37d4c62007-12-04 23:02:19 +0000211 self.assertTrue(isinstance(eval("%s" % (-sys.maxsize - 1)), int))
212 self.assertTrue(isinstance(eval("%s" % (-sys.maxsize - 2)), int))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000213
Christian Heimesa37d4c62007-12-04 23:02:19 +0000214 if sys.maxsize == 9223372036854775807:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000215 def test_32_63_bit_values(self):
216 a = +4294967296 # 1 << 32
217 b = -4294967296 # 1 << 32
218 c = +281474976710656 # 1 << 48
219 d = -281474976710656 # 1 << 48
220 e = +4611686018427387904 # 1 << 62
221 f = -4611686018427387904 # 1 << 62
222 g = +9223372036854775807 # 1 << 63 - 1
223 h = -9223372036854775807 # 1 << 63 - 1
224
Neal Norwitz221085d2007-02-25 20:55:47 +0000225 for variable in self.test_32_63_bit_values.__code__.co_consts:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000226 if variable is not None:
227 self.assertTrue(isinstance(variable, int))
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000228
229 def test_sequence_unpacking_error(self):
230 # Verify sequence packing/unpacking with "or". SF bug #757818
231 i,j = (1, -1) or (-1, 1)
232 self.assertEqual(i, 1)
233 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000234
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000235 def test_none_assignment(self):
236 stmts = [
237 'None = 0',
238 'None += 0',
239 '__builtins__.None = 0',
240 'def None(): pass',
241 'class None: pass',
242 '(a, None) = 0, 0',
243 'for None in range(10): pass',
244 'def f(None): pass',
245 ]
246 for stmt in stmts:
247 stmt += "\n"
248 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
249 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000250
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000251 def test_import(self):
252 succeed = [
253 'import sys',
254 'import os, sys',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000255 'import os as bar',
256 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000257 'from __future__ import nested_scopes, generators',
258 'from __future__ import (nested_scopes,\ngenerators)',
259 'from __future__ import (nested_scopes,\ngenerators,)',
260 'from sys import stdin, stderr, stdout',
261 'from sys import (stdin, stderr,\nstdout)',
262 'from sys import (stdin, stderr,\nstdout,)',
263 'from sys import (stdin\n, stderr, stdout)',
264 'from sys import (stdin\n, stderr, stdout,)',
265 'from sys import stdin as si, stdout as so, stderr as se',
266 'from sys import (stdin as si, stdout as so, stderr as se)',
267 'from sys import (stdin as si, stdout as so, stderr as se,)',
268 ]
269 fail = [
270 'import (os, sys)',
271 'import (os), (sys)',
272 'import ((os), (sys))',
273 'import (sys',
274 'import sys)',
275 'import (os,)',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000276 'import os As bar',
277 'import os.path a bar',
278 'from sys import stdin As stdout',
279 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000280 'from (sys) import stdin',
281 'from __future__ import (nested_scopes',
282 'from __future__ import nested_scopes)',
283 'from __future__ import nested_scopes,\ngenerators',
284 'from sys import (stdin',
285 'from sys import stdin)',
286 'from sys import stdin, stdout,\nstderr',
287 'from sys import stdin si',
288 'from sys import stdin,'
289 'from sys import (*)',
290 'from sys import (stdin,, stdout, stderr)',
291 'from sys import (stdin, stdout),',
292 ]
293 for stmt in succeed:
294 compile(stmt, 'tmp', 'exec')
295 for stmt in fail:
296 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
297
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000298 def test_for_distinct_code_objects(self):
299 # SF bug 1048870
300 def f():
301 f1 = lambda x=1: x
302 f2 = lambda x=2: x
303 return f1, f2
304 f1, f2 = f()
Neal Norwitz221085d2007-02-25 20:55:47 +0000305 self.assertNotEqual(id(f1.__code__), id(f2.__code__))
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000306
Guido van Rossumf8761c72007-07-22 20:01:13 +0000307## def test_unicode_encoding(self):
308## code = "# -*- coding: utf-8 -*-\npass\n"
309## self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000310
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]
332 self.assertEqual(1 in d, False)
333 # 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]
339 self.assertEqual((1, 1) in d, False)
340 # 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]
346 self.assertEqual(slice(1, 2) in d, False)
347 # 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]
353 self.assertEqual((slice(1, 2), slice(1, 2)) in d, False)
354 # 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]
360 self.assertEqual(slice(1, 2, 3) in d, False)
361 # 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]
367 self.assertEqual((slice(1, 2, 3), slice(1, 2, 3)) in d, False)
368 # Ellipsis
369 d[...] = 1
370 self.assertEqual(d[...], 1)
371 d[...] += 1
372 self.assertEqual(d[...], 2)
373 del d[...]
374 self.assertEqual(Ellipsis in d, False)
375 # Tuple of Ellipses
376 d[..., ...] = 1
377 self.assertEqual(d[..., ...], 1)
378 d[..., ...] += 1
379 self.assertEqual(d[..., ...], 2)
380 del d[..., ...]
381 self.assertEqual((Ellipsis, Ellipsis) in d, False)
382
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
404 self.assert_("_A__mangled" in A.f.__code__.co_varnames)
405 self.assert_("__not_mangled__" in A.f.__code__.co_varnames)
406 self.assert_("_A__mangled_mod" in A.f.__code__.co_varnames)
407 self.assert_("__package__" in A.f.__code__.co_varnames)
408
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000409def test_main():
410 test_support.run_unittest(TestSpecifics)
Tim Petersd507dab2001-08-30 20:51:59 +0000411
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000412if __name__ == "__main__":
413 test_main()