blob: ae55485c5cb4ec429f702e7730e08c32ec9ac6f6 [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')
10 import __builtin__
11 prev = __builtin__.__debug__
12 setattr(__builtin__, '__debug__', 'sure')
13 setattr(__builtin__, '__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
Raymond Hettinger8a99b502003-06-23 13:36:57 +000039 def test_duplicate_global_local(self):
40 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000041 exec('def f(a): global a; a = 1')
Raymond Hettinger8a99b502003-06-23 13:36:57 +000042 self.fail("variable is global and local")
43 except SyntaxError:
44 pass
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000045
Raymond Hettinger66bd2332004-08-02 08:30:07 +000046 def test_exec_with_general_mapping_for_locals(self):
47
48 class M:
49 "Test mapping interface versus possible calls from eval()."
50 def __getitem__(self, key):
51 if key == 'a':
52 return 12
53 raise KeyError
54 def __setitem__(self, key, value):
55 self.results = (key, value)
Guido van Rossum63eecc72007-02-22 23:55:25 +000056 def keys(self):
57 return list('xyz')
Raymond Hettinger66bd2332004-08-02 08:30:07 +000058
59 m = M()
60 g = globals()
Georg Brandl7cae87c2006-09-06 06:51:57 +000061 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000062 self.assertEqual(m.results, ('z', 12))
63 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000064 exec('z = b', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000065 except NameError:
66 pass
67 else:
68 self.fail('Did not detect a KeyError')
Georg Brandl7cae87c2006-09-06 06:51:57 +000069 exec('z = dir()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000070 self.assertEqual(m.results, ('z', list('xyz')))
Georg Brandl7cae87c2006-09-06 06:51:57 +000071 exec('z = globals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000072 self.assertEqual(m.results, ('z', g))
Georg Brandl7cae87c2006-09-06 06:51:57 +000073 exec('z = locals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000074 self.assertEqual(m.results, ('z', m))
75 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000076 exec('z = b', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000077 except TypeError:
78 pass
79 else:
80 self.fail('Did not validate globals as a real dict')
81
82 class A:
83 "Non-mapping"
84 pass
85 m = A()
86 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000087 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000088 except TypeError:
89 pass
90 else:
91 self.fail('Did not validate locals as a mapping')
92
93 # Verify that dict subclasses work as well
94 class D(dict):
95 def __getitem__(self, key):
96 if key == 'a':
97 return 12
98 return dict.__getitem__(self, key)
99 d = D()
Georg Brandl7cae87c2006-09-06 06:51:57 +0000100 exec('z = a', g, d)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000101 self.assertEqual(d['z'], 12)
102
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000103 def test_extended_arg(self):
104 longexpr = 'x = x or ' + '-x' * 2500
Georg Brandl7cae87c2006-09-06 06:51:57 +0000105 g = {}
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000106 code = '''
107def f(x):
108 %s
109 %s
110 %s
111 %s
112 %s
113 %s
114 %s
115 %s
116 %s
117 %s
118 # the expressions above have no effect, x == argument
119 while x:
120 x -= 1
121 # EXTENDED_ARG/JUMP_ABSOLUTE here
122 return x
123''' % ((longexpr,)*10)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000124 exec(code, g)
125 self.assertEqual(g['f'](5), 0)
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000126
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000127 def test_complex_args(self):
Thomas Heller6b17abf2002-07-09 09:23:27 +0000128
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000129 def comp_args((a, b)):
130 return a,b
131 self.assertEqual(comp_args((1, 2)), (1, 2))
Thomas Heller6b17abf2002-07-09 09:23:27 +0000132
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000133 def comp_args((a, b)=(3, 4)):
134 return a, b
135 self.assertEqual(comp_args((1, 2)), (1, 2))
136 self.assertEqual(comp_args(), (3, 4))
Jeremy Hylton047e2c92001-01-19 03:25:56 +0000137
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000138 def comp_args(a, (b, c)):
139 return a, b, c
140 self.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000141
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000142 def comp_args(a=2, (b, c)=(3, 4)):
143 return a, b, c
144 self.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
145 self.assertEqual(comp_args(), (2, 3, 4))
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000146
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000147 def test_argument_order(self):
148 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000149 exec('def f(a=1, (b, c)): pass')
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000150 self.fail("non-default args after default")
151 except SyntaxError:
152 pass
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000153
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000154 def test_float_literals(self):
155 # testing bad float literals
156 self.assertRaises(SyntaxError, eval, "2e")
157 self.assertRaises(SyntaxError, eval, "2.0e+")
158 self.assertRaises(SyntaxError, eval, "1e-")
159 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000160
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000161 def test_indentation(self):
162 # testing compile() of indented block w/o trailing newline"
163 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000164if 1:
165 if 2:
166 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000167 compile(s, "<string>", "exec")
168
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000169 # This test is probably specific to CPython and may not generalize
170 # to other implementations. We are trying to ensure that when
171 # the first line of code starts after 256, correct line numbers
172 # in tracebacks are still produced.
173 def test_leading_newlines(self):
174 s256 = "".join(["\n"] * 256 + ["spam"])
175 co = compile(s256, 'fn', 'exec')
176 self.assertEqual(co.co_firstlineno, 257)
177 self.assertEqual(co.co_lnotab, '')
178
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000179 def test_literals_with_leading_zeroes(self):
180 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
181 "080000000000000", "000000000000009", "000000000000008"]:
182 self.assertRaises(SyntaxError, eval, arg)
183
184 self.assertEqual(eval("0777"), 511)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000185 self.assertEqual(eval("000777"), 511)
186 self.assertEqual(eval("0xff"), 255)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000187 self.assertEqual(eval("0XfF"), 255)
188 self.assertEqual(eval("0777."), 777)
189 self.assertEqual(eval("0777.0"), 777)
190 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
191 self.assertEqual(eval("0777e1"), 7770)
192 self.assertEqual(eval("0e0"), 0)
193 self.assertEqual(eval("0000E-012"), 0)
194 self.assertEqual(eval("09.5"), 9.5)
195 self.assertEqual(eval("0777j"), 777j)
196 self.assertEqual(eval("00j"), 0j)
197 self.assertEqual(eval("00.0"), 0)
198 self.assertEqual(eval("0e3"), 0)
199 self.assertEqual(eval("090000000000000."), 90000000000000.)
200 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
201 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
202 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
203 self.assertEqual(eval("090000000000000j"), 90000000000000j)
204 self.assertEqual(eval("000000000000007"), 7)
205 self.assertEqual(eval("000000000000008."), 8.)
206 self.assertEqual(eval("000000000000009."), 9.)
207
208 def test_unary_minus(self):
209 # Verify treatment of unary minus on negative numbers SF bug #660455
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000210 if sys.maxint == 2147483647:
211 # 32-bit machine
212 all_one_bits = '0xffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000213 self.assertEqual(eval(all_one_bits), 4294967295)
214 self.assertEqual(eval("-" + all_one_bits), -4294967295)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000215 elif sys.maxint == 9223372036854775807:
216 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000217 all_one_bits = '0xffffffffffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000218 self.assertEqual(eval(all_one_bits), 18446744073709551615)
219 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000220 else:
221 self.fail("How many bits *does* this machine have???")
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000222 # Verify treatment of contant folding on -(sys.maxint+1)
223 # i.e. -2147483648 on 32 bit platforms. Should return int, not long.
224 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 1)), int))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000225 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 2)), int))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000226
227 if sys.maxint == 9223372036854775807:
228 def test_32_63_bit_values(self):
229 a = +4294967296 # 1 << 32
230 b = -4294967296 # 1 << 32
231 c = +281474976710656 # 1 << 48
232 d = -281474976710656 # 1 << 48
233 e = +4611686018427387904 # 1 << 62
234 f = -4611686018427387904 # 1 << 62
235 g = +9223372036854775807 # 1 << 63 - 1
236 h = -9223372036854775807 # 1 << 63 - 1
237
Neal Norwitz221085d2007-02-25 20:55:47 +0000238 for variable in self.test_32_63_bit_values.__code__.co_consts:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000239 if variable is not None:
240 self.assertTrue(isinstance(variable, int))
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000241
242 def test_sequence_unpacking_error(self):
243 # Verify sequence packing/unpacking with "or". SF bug #757818
244 i,j = (1, -1) or (-1, 1)
245 self.assertEqual(i, 1)
246 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000247
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000248 def test_none_assignment(self):
249 stmts = [
250 'None = 0',
251 'None += 0',
252 '__builtins__.None = 0',
253 'def None(): pass',
254 'class None: pass',
255 '(a, None) = 0, 0',
256 'for None in range(10): pass',
257 'def f(None): pass',
258 ]
259 for stmt in stmts:
260 stmt += "\n"
261 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
262 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000263
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000264 def test_import(self):
265 succeed = [
266 'import sys',
267 'import os, sys',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000268 'import os as bar',
269 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000270 'from __future__ import nested_scopes, generators',
271 'from __future__ import (nested_scopes,\ngenerators)',
272 'from __future__ import (nested_scopes,\ngenerators,)',
273 'from sys import stdin, stderr, stdout',
274 'from sys import (stdin, stderr,\nstdout)',
275 'from sys import (stdin, stderr,\nstdout,)',
276 'from sys import (stdin\n, stderr, stdout)',
277 'from sys import (stdin\n, stderr, stdout,)',
278 'from sys import stdin as si, stdout as so, stderr as se',
279 'from sys import (stdin as si, stdout as so, stderr as se)',
280 'from sys import (stdin as si, stdout as so, stderr as se,)',
281 ]
282 fail = [
283 'import (os, sys)',
284 'import (os), (sys)',
285 'import ((os), (sys))',
286 'import (sys',
287 'import sys)',
288 'import (os,)',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000289 'import os As bar',
290 'import os.path a bar',
291 'from sys import stdin As stdout',
292 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000293 'from (sys) import stdin',
294 'from __future__ import (nested_scopes',
295 'from __future__ import nested_scopes)',
296 'from __future__ import nested_scopes,\ngenerators',
297 'from sys import (stdin',
298 'from sys import stdin)',
299 'from sys import stdin, stdout,\nstderr',
300 'from sys import stdin si',
301 'from sys import stdin,'
302 'from sys import (*)',
303 'from sys import (stdin,, stdout, stderr)',
304 'from sys import (stdin, stdout),',
305 ]
306 for stmt in succeed:
307 compile(stmt, 'tmp', 'exec')
308 for stmt in fail:
309 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
310
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000311 def test_for_distinct_code_objects(self):
312 # SF bug 1048870
313 def f():
314 f1 = lambda x=1: x
315 f2 = lambda x=2: x
316 return f1, f2
317 f1, f2 = f()
Neal Norwitz221085d2007-02-25 20:55:47 +0000318 self.assertNotEqual(id(f1.__code__), id(f2.__code__))
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000319
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000320 def test_unicode_encoding(self):
321 code = u"# -*- coding: utf-8 -*-\npass\n"
322 self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
323
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000324 def test_subscripts(self):
325 # SF bug 1448804
326 # Class to make testing subscript results easy
327 class str_map(object):
328 def __init__(self):
329 self.data = {}
330 def __getitem__(self, key):
331 return self.data[str(key)]
332 def __setitem__(self, key, value):
333 self.data[str(key)] = value
334 def __delitem__(self, key):
335 del self.data[str(key)]
336 def __contains__(self, key):
337 return str(key) in self.data
338 d = str_map()
339 # Index
340 d[1] = 1
341 self.assertEqual(d[1], 1)
342 d[1] += 1
343 self.assertEqual(d[1], 2)
344 del d[1]
345 self.assertEqual(1 in d, False)
346 # Tuple of indices
347 d[1, 1] = 1
348 self.assertEqual(d[1, 1], 1)
349 d[1, 1] += 1
350 self.assertEqual(d[1, 1], 2)
351 del d[1, 1]
352 self.assertEqual((1, 1) in d, False)
353 # Simple slice
354 d[1:2] = 1
355 self.assertEqual(d[1:2], 1)
356 d[1:2] += 1
357 self.assertEqual(d[1:2], 2)
358 del d[1:2]
359 self.assertEqual(slice(1, 2) in d, False)
360 # Tuple of simple slices
361 d[1:2, 1:2] = 1
362 self.assertEqual(d[1:2, 1:2], 1)
363 d[1:2, 1:2] += 1
364 self.assertEqual(d[1:2, 1:2], 2)
365 del d[1:2, 1:2]
366 self.assertEqual((slice(1, 2), slice(1, 2)) in d, False)
367 # Extended slice
368 d[1:2:3] = 1
369 self.assertEqual(d[1:2:3], 1)
370 d[1:2:3] += 1
371 self.assertEqual(d[1:2:3], 2)
372 del d[1:2:3]
373 self.assertEqual(slice(1, 2, 3) in d, False)
374 # Tuple of extended slices
375 d[1:2:3, 1:2:3] = 1
376 self.assertEqual(d[1:2:3, 1:2:3], 1)
377 d[1:2:3, 1:2:3] += 1
378 self.assertEqual(d[1:2:3, 1:2:3], 2)
379 del d[1:2:3, 1:2:3]
380 self.assertEqual((slice(1, 2, 3), slice(1, 2, 3)) in d, False)
381 # Ellipsis
382 d[...] = 1
383 self.assertEqual(d[...], 1)
384 d[...] += 1
385 self.assertEqual(d[...], 2)
386 del d[...]
387 self.assertEqual(Ellipsis in d, False)
388 # Tuple of Ellipses
389 d[..., ...] = 1
390 self.assertEqual(d[..., ...], 1)
391 d[..., ...] += 1
392 self.assertEqual(d[..., ...], 2)
393 del d[..., ...]
394 self.assertEqual((Ellipsis, Ellipsis) in d, False)
395
Guido van Rossum0240b922007-02-26 21:23:50 +0000396 def test_annotation_limit(self):
397 # 16 bits are available for # of annotations, and the
398 # tuple of annotations names is counted, hence 65534
399 # is the max. Ensure the result of too many annotations is a
400 # SyntaxError.
401 s = "def f((%s)): pass"
Guido van Rossumd8faa362007-04-27 19:54:29 +0000402 s %= ', '.join('a%d:%d' % (i,i) for i in xrange(65535))
Guido van Rossum0240b922007-02-26 21:23:50 +0000403 self.assertRaises(SyntaxError, compile, s, '?', 'exec')
404 # Test that the max # of annotations compiles.
405 s = "def f((%s)): pass"
406 s %= ', '.join('a%d:%d' % (i,i) for i in xrange(65534))
407 compile(s, '?', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000408
409 def test_mangling(self):
410 class A:
411 def f():
412 __mangled = 1
413 __not_mangled__ = 2
414 import __mangled_mod
415 import __package__.module
416
417 self.assert_("_A__mangled" in A.f.__code__.co_varnames)
418 self.assert_("__not_mangled__" in A.f.__code__.co_varnames)
419 self.assert_("_A__mangled_mod" in A.f.__code__.co_varnames)
420 self.assert_("__package__" in A.f.__code__.co_varnames)
421
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000422def test_main():
423 test_support.run_unittest(TestSpecifics)
Tim Petersd507dab2001-08-30 20:51:59 +0000424
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000425if __name__ == "__main__":
426 test_main()