blob: 4e29eab0ef5f7ac0eb233b8fc285ddc26121b7d5 [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_argument_order(self):
128 try:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000129 exec('def f(a=1, b): pass')
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000130 self.fail("non-default args after default")
131 except SyntaxError:
132 pass
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000133
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000134 def test_float_literals(self):
135 # testing bad float literals
136 self.assertRaises(SyntaxError, eval, "2e")
137 self.assertRaises(SyntaxError, eval, "2.0e+")
138 self.assertRaises(SyntaxError, eval, "1e-")
139 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000140
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000141 def test_indentation(self):
142 # testing compile() of indented block w/o trailing newline"
143 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000144if 1:
145 if 2:
146 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000147 compile(s, "<string>", "exec")
148
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000149 # This test is probably specific to CPython and may not generalize
150 # to other implementations. We are trying to ensure that when
151 # the first line of code starts after 256, correct line numbers
152 # in tracebacks are still produced.
153 def test_leading_newlines(self):
154 s256 = "".join(["\n"] * 256 + ["spam"])
155 co = compile(s256, 'fn', 'exec')
156 self.assertEqual(co.co_firstlineno, 257)
157 self.assertEqual(co.co_lnotab, '')
158
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000159 def test_literals_with_leading_zeroes(self):
160 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
161 "080000000000000", "000000000000009", "000000000000008"]:
162 self.assertRaises(SyntaxError, eval, arg)
163
164 self.assertEqual(eval("0777"), 511)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000165 self.assertEqual(eval("000777"), 511)
166 self.assertEqual(eval("0xff"), 255)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000167 self.assertEqual(eval("0XfF"), 255)
168 self.assertEqual(eval("0777."), 777)
169 self.assertEqual(eval("0777.0"), 777)
170 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
171 self.assertEqual(eval("0777e1"), 7770)
172 self.assertEqual(eval("0e0"), 0)
173 self.assertEqual(eval("0000E-012"), 0)
174 self.assertEqual(eval("09.5"), 9.5)
175 self.assertEqual(eval("0777j"), 777j)
176 self.assertEqual(eval("00j"), 0j)
177 self.assertEqual(eval("00.0"), 0)
178 self.assertEqual(eval("0e3"), 0)
179 self.assertEqual(eval("090000000000000."), 90000000000000.)
180 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
181 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
182 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
183 self.assertEqual(eval("090000000000000j"), 90000000000000j)
184 self.assertEqual(eval("000000000000007"), 7)
185 self.assertEqual(eval("000000000000008."), 8.)
186 self.assertEqual(eval("000000000000009."), 9.)
187
188 def test_unary_minus(self):
189 # Verify treatment of unary minus on negative numbers SF bug #660455
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000190 if sys.maxint == 2147483647:
191 # 32-bit machine
192 all_one_bits = '0xffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000193 self.assertEqual(eval(all_one_bits), 4294967295)
194 self.assertEqual(eval("-" + all_one_bits), -4294967295)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000195 elif sys.maxint == 9223372036854775807:
196 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000197 all_one_bits = '0xffffffffffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000198 self.assertEqual(eval(all_one_bits), 18446744073709551615)
199 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000200 else:
201 self.fail("How many bits *does* this machine have???")
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000202 # Verify treatment of contant folding on -(sys.maxint+1)
203 # i.e. -2147483648 on 32 bit platforms. Should return int, not long.
204 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 1)), int))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000205 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 2)), int))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000206
207 if sys.maxint == 9223372036854775807:
208 def test_32_63_bit_values(self):
209 a = +4294967296 # 1 << 32
210 b = -4294967296 # 1 << 32
211 c = +281474976710656 # 1 << 48
212 d = -281474976710656 # 1 << 48
213 e = +4611686018427387904 # 1 << 62
214 f = -4611686018427387904 # 1 << 62
215 g = +9223372036854775807 # 1 << 63 - 1
216 h = -9223372036854775807 # 1 << 63 - 1
217
Neal Norwitz221085d2007-02-25 20:55:47 +0000218 for variable in self.test_32_63_bit_values.__code__.co_consts:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000219 if variable is not None:
220 self.assertTrue(isinstance(variable, int))
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000221
222 def test_sequence_unpacking_error(self):
223 # Verify sequence packing/unpacking with "or". SF bug #757818
224 i,j = (1, -1) or (-1, 1)
225 self.assertEqual(i, 1)
226 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000227
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000228 def test_none_assignment(self):
229 stmts = [
230 'None = 0',
231 'None += 0',
232 '__builtins__.None = 0',
233 'def None(): pass',
234 'class None: pass',
235 '(a, None) = 0, 0',
236 'for None in range(10): pass',
237 'def f(None): pass',
238 ]
239 for stmt in stmts:
240 stmt += "\n"
241 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
242 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000243
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000244 def test_import(self):
245 succeed = [
246 'import sys',
247 'import os, sys',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000248 'import os as bar',
249 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000250 'from __future__ import nested_scopes, generators',
251 'from __future__ import (nested_scopes,\ngenerators)',
252 'from __future__ import (nested_scopes,\ngenerators,)',
253 'from sys import stdin, stderr, stdout',
254 'from sys import (stdin, stderr,\nstdout)',
255 'from sys import (stdin, stderr,\nstdout,)',
256 'from sys import (stdin\n, stderr, stdout)',
257 'from sys import (stdin\n, stderr, stdout,)',
258 'from sys import stdin as si, stdout as so, stderr as se',
259 'from sys import (stdin as si, stdout as so, stderr as se)',
260 'from sys import (stdin as si, stdout as so, stderr as se,)',
261 ]
262 fail = [
263 'import (os, sys)',
264 'import (os), (sys)',
265 'import ((os), (sys))',
266 'import (sys',
267 'import sys)',
268 'import (os,)',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000269 'import os As bar',
270 'import os.path a bar',
271 'from sys import stdin As stdout',
272 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000273 'from (sys) import stdin',
274 'from __future__ import (nested_scopes',
275 'from __future__ import nested_scopes)',
276 'from __future__ import nested_scopes,\ngenerators',
277 'from sys import (stdin',
278 'from sys import stdin)',
279 'from sys import stdin, stdout,\nstderr',
280 'from sys import stdin si',
281 'from sys import stdin,'
282 'from sys import (*)',
283 'from sys import (stdin,, stdout, stderr)',
284 'from sys import (stdin, stdout),',
285 ]
286 for stmt in succeed:
287 compile(stmt, 'tmp', 'exec')
288 for stmt in fail:
289 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
290
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000291 def test_for_distinct_code_objects(self):
292 # SF bug 1048870
293 def f():
294 f1 = lambda x=1: x
295 f2 = lambda x=2: x
296 return f1, f2
297 f1, f2 = f()
Neal Norwitz221085d2007-02-25 20:55:47 +0000298 self.assertNotEqual(id(f1.__code__), id(f2.__code__))
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000299
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000300 def test_unicode_encoding(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000301 code = "# -*- coding: utf-8 -*-\npass\n"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000302 self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
303
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000304 def test_subscripts(self):
305 # SF bug 1448804
306 # Class to make testing subscript results easy
307 class str_map(object):
308 def __init__(self):
309 self.data = {}
310 def __getitem__(self, key):
311 return self.data[str(key)]
312 def __setitem__(self, key, value):
313 self.data[str(key)] = value
314 def __delitem__(self, key):
315 del self.data[str(key)]
316 def __contains__(self, key):
317 return str(key) in self.data
318 d = str_map()
319 # Index
320 d[1] = 1
321 self.assertEqual(d[1], 1)
322 d[1] += 1
323 self.assertEqual(d[1], 2)
324 del d[1]
325 self.assertEqual(1 in d, False)
326 # Tuple of indices
327 d[1, 1] = 1
328 self.assertEqual(d[1, 1], 1)
329 d[1, 1] += 1
330 self.assertEqual(d[1, 1], 2)
331 del d[1, 1]
332 self.assertEqual((1, 1) in d, False)
333 # Simple slice
334 d[1:2] = 1
335 self.assertEqual(d[1:2], 1)
336 d[1:2] += 1
337 self.assertEqual(d[1:2], 2)
338 del d[1:2]
339 self.assertEqual(slice(1, 2) in d, False)
340 # Tuple of simple slices
341 d[1:2, 1:2] = 1
342 self.assertEqual(d[1:2, 1:2], 1)
343 d[1:2, 1:2] += 1
344 self.assertEqual(d[1:2, 1:2], 2)
345 del d[1:2, 1:2]
346 self.assertEqual((slice(1, 2), slice(1, 2)) in d, False)
347 # Extended slice
348 d[1:2:3] = 1
349 self.assertEqual(d[1:2:3], 1)
350 d[1:2:3] += 1
351 self.assertEqual(d[1:2:3], 2)
352 del d[1:2:3]
353 self.assertEqual(slice(1, 2, 3) in d, False)
354 # Tuple of extended slices
355 d[1:2:3, 1:2:3] = 1
356 self.assertEqual(d[1:2:3, 1:2:3], 1)
357 d[1:2:3, 1:2:3] += 1
358 self.assertEqual(d[1:2:3, 1:2:3], 2)
359 del d[1:2:3, 1:2:3]
360 self.assertEqual((slice(1, 2, 3), slice(1, 2, 3)) in d, False)
361 # Ellipsis
362 d[...] = 1
363 self.assertEqual(d[...], 1)
364 d[...] += 1
365 self.assertEqual(d[...], 2)
366 del d[...]
367 self.assertEqual(Ellipsis in d, False)
368 # Tuple of Ellipses
369 d[..., ...] = 1
370 self.assertEqual(d[..., ...], 1)
371 d[..., ...] += 1
372 self.assertEqual(d[..., ...], 2)
373 del d[..., ...]
374 self.assertEqual((Ellipsis, Ellipsis) in d, False)
375
Guido van Rossum0240b922007-02-26 21:23:50 +0000376 def test_annotation_limit(self):
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000377 # 16 bits are available for # of annotations, but only 8 bits are
378 # available for the parameter count, hence 255
Guido van Rossum0240b922007-02-26 21:23:50 +0000379 # is the max. Ensure the result of too many annotations is a
380 # SyntaxError.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000381 s = "def f(%s): pass"
382 s %= ', '.join('a%d:%d' % (i,i) for i in range(256))
Guido van Rossum0240b922007-02-26 21:23:50 +0000383 self.assertRaises(SyntaxError, compile, s, '?', 'exec')
384 # Test that the max # of annotations compiles.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000385 s = "def f(%s): pass"
386 s %= ', '.join('a%d:%d' % (i,i) for i in range(255))
Guido van Rossum0240b922007-02-26 21:23:50 +0000387 compile(s, '?', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000388
389 def test_mangling(self):
390 class A:
391 def f():
392 __mangled = 1
393 __not_mangled__ = 2
394 import __mangled_mod
395 import __package__.module
396
397 self.assert_("_A__mangled" in A.f.__code__.co_varnames)
398 self.assert_("__not_mangled__" in A.f.__code__.co_varnames)
399 self.assert_("_A__mangled_mod" in A.f.__code__.co_varnames)
400 self.assert_("__package__" in A.f.__code__.co_varnames)
401
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000402def test_main():
403 test_support.run_unittest(TestSpecifics)
Tim Petersd507dab2001-08-30 20:51:59 +0000404
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000405if __name__ == "__main__":
406 test_main()