blob: 73ef2d444e00f159535fa4a6de007c026fbca1b2 [file] [log] [blame]
Raymond Hettinger8a99b502003-06-23 13:36:57 +00001import unittest
2import warnings
3import sys
4from test import test_support
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +00005
Raymond Hettinger8a99b502003-06-23 13:36:57 +00006class TestSpecifics(unittest.TestCase):
Jeremy Hylton778e2652001-11-09 19:50:08 +00007
Raymond Hettinger8a99b502003-06-23 13:36:57 +00008 def test_debug_assignment(self):
9 # catch assignments to __debug__
10 self.assertRaises(SyntaxError, compile, '__debug__ = 1', '?', 'single')
11 import __builtin__
12 prev = __builtin__.__debug__
13 setattr(__builtin__, '__debug__', 'sure')
14 setattr(__builtin__, '__debug__', prev)
Jeremy Hylton778e2652001-11-09 19:50:08 +000015
Raymond Hettinger8a99b502003-06-23 13:36:57 +000016 def test_argument_handling(self):
17 # detect duplicate positional and keyword arguments
18 self.assertRaises(SyntaxError, eval, 'lambda a,a:0')
19 self.assertRaises(SyntaxError, eval, 'lambda a,a=1:0')
20 self.assertRaises(SyntaxError, eval, 'lambda a=1,a=1:0')
21 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000022 exec('def f(a, a): pass')
Raymond Hettinger8a99b502003-06-23 13:36:57 +000023 self.fail("duplicate arguments")
24 except SyntaxError:
25 pass
26 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000027 exec('def f(a = 0, a = 1): pass')
Raymond Hettinger8a99b502003-06-23 13:36:57 +000028 self.fail("duplicate keyword arguments")
29 except SyntaxError:
30 pass
31 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000032 exec('def f(a): global a; a = 1')
Raymond Hettinger8a99b502003-06-23 13:36:57 +000033 self.fail("variable is global and local")
34 except SyntaxError:
35 pass
Jeremy Hylton778e2652001-11-09 19:50:08 +000036
Raymond Hettinger8a99b502003-06-23 13:36:57 +000037 def test_syntax_error(self):
38 self.assertRaises(SyntaxError, compile, "1+*3", "filename", "exec")
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000039
Raymond Hettinger8a99b502003-06-23 13:36:57 +000040 def test_duplicate_global_local(self):
41 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000042 exec('def f(a): global a; a = 1')
Raymond Hettinger8a99b502003-06-23 13:36:57 +000043 self.fail("variable is global and local")
44 except SyntaxError:
45 pass
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000046
Raymond Hettinger66bd2332004-08-02 08:30:07 +000047 def test_exec_with_general_mapping_for_locals(self):
48
49 class M:
50 "Test mapping interface versus possible calls from eval()."
51 def __getitem__(self, key):
52 if key == 'a':
53 return 12
54 raise KeyError
55 def __setitem__(self, key, value):
56 self.results = (key, value)
57 def keys(self):
58 return list('xyz')
59
60 m = M()
61 g = globals()
Georg Brandl7cae87c2006-09-06 06:51:57 +000062 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000063 self.assertEqual(m.results, ('z', 12))
64 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000065 exec('z = b', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000066 except NameError:
67 pass
68 else:
69 self.fail('Did not detect a KeyError')
Georg Brandl7cae87c2006-09-06 06:51:57 +000070 exec('z = dir()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000071 self.assertEqual(m.results, ('z', list('xyz')))
Georg Brandl7cae87c2006-09-06 06:51:57 +000072 exec('z = globals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000073 self.assertEqual(m.results, ('z', g))
Georg Brandl7cae87c2006-09-06 06:51:57 +000074 exec('z = locals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000075 self.assertEqual(m.results, ('z', m))
76 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000077 exec('z = b', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000078 except TypeError:
79 pass
80 else:
81 self.fail('Did not validate globals as a real dict')
82
83 class A:
84 "Non-mapping"
85 pass
86 m = A()
87 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000088 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000089 except TypeError:
90 pass
91 else:
92 self.fail('Did not validate locals as a mapping')
93
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_complex_args(self):
Thomas Heller6b17abf2002-07-09 09:23:27 +0000129
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000130 def comp_args((a, b)):
131 return a,b
132 self.assertEqual(comp_args((1, 2)), (1, 2))
Thomas Heller6b17abf2002-07-09 09:23:27 +0000133
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000134 def comp_args((a, b)=(3, 4)):
135 return a, b
136 self.assertEqual(comp_args((1, 2)), (1, 2))
137 self.assertEqual(comp_args(), (3, 4))
Jeremy Hylton047e2c92001-01-19 03:25:56 +0000138
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000139 def comp_args(a, (b, c)):
140 return a, b, c
141 self.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000142
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000143 def comp_args(a=2, (b, c)=(3, 4)):
144 return a, b, c
145 self.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
146 self.assertEqual(comp_args(), (2, 3, 4))
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000147
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000148 def test_argument_order(self):
149 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000150 exec('def f(a=1, (b, c)): pass')
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000151 self.fail("non-default args after default")
152 except SyntaxError:
153 pass
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000154
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000155 def test_float_literals(self):
156 # testing bad float literals
157 self.assertRaises(SyntaxError, eval, "2e")
158 self.assertRaises(SyntaxError, eval, "2.0e+")
159 self.assertRaises(SyntaxError, eval, "1e-")
160 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000161
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000162 def test_indentation(self):
163 # testing compile() of indented block w/o trailing newline"
164 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000165if 1:
166 if 2:
167 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000168 compile(s, "<string>", "exec")
169
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000170 # This test is probably specific to CPython and may not generalize
171 # to other implementations. We are trying to ensure that when
172 # the first line of code starts after 256, correct line numbers
173 # in tracebacks are still produced.
174 def test_leading_newlines(self):
175 s256 = "".join(["\n"] * 256 + ["spam"])
176 co = compile(s256, 'fn', 'exec')
177 self.assertEqual(co.co_firstlineno, 257)
178 self.assertEqual(co.co_lnotab, '')
179
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000180 def test_literals_with_leading_zeroes(self):
181 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
182 "080000000000000", "000000000000009", "000000000000008"]:
183 self.assertRaises(SyntaxError, eval, arg)
184
185 self.assertEqual(eval("0777"), 511)
186 self.assertEqual(eval("0777L"), 511)
187 self.assertEqual(eval("000777"), 511)
188 self.assertEqual(eval("0xff"), 255)
189 self.assertEqual(eval("0xffL"), 255)
190 self.assertEqual(eval("0XfF"), 255)
191 self.assertEqual(eval("0777."), 777)
192 self.assertEqual(eval("0777.0"), 777)
193 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
194 self.assertEqual(eval("0777e1"), 7770)
195 self.assertEqual(eval("0e0"), 0)
196 self.assertEqual(eval("0000E-012"), 0)
197 self.assertEqual(eval("09.5"), 9.5)
198 self.assertEqual(eval("0777j"), 777j)
199 self.assertEqual(eval("00j"), 0j)
200 self.assertEqual(eval("00.0"), 0)
201 self.assertEqual(eval("0e3"), 0)
202 self.assertEqual(eval("090000000000000."), 90000000000000.)
203 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
204 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
205 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
206 self.assertEqual(eval("090000000000000j"), 90000000000000j)
207 self.assertEqual(eval("000000000000007"), 7)
208 self.assertEqual(eval("000000000000008."), 8.)
209 self.assertEqual(eval("000000000000009."), 9.)
210
211 def test_unary_minus(self):
212 # Verify treatment of unary minus on negative numbers SF bug #660455
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000213 if sys.maxint == 2147483647:
214 # 32-bit machine
215 all_one_bits = '0xffffffff'
216 self.assertEqual(eval(all_one_bits), 4294967295L)
217 self.assertEqual(eval("-" + all_one_bits), -4294967295L)
218 elif sys.maxint == 9223372036854775807:
219 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000220 all_one_bits = '0xffffffffffffffff'
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000221 self.assertEqual(eval(all_one_bits), 18446744073709551615L)
222 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615L)
223 else:
224 self.fail("How many bits *does* this machine have???")
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000225 # Verify treatment of contant folding on -(sys.maxint+1)
226 # i.e. -2147483648 on 32 bit platforms. Should return int, not long.
227 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 1)), int))
228 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 2)), long))
229
230 if sys.maxint == 9223372036854775807:
231 def test_32_63_bit_values(self):
232 a = +4294967296 # 1 << 32
233 b = -4294967296 # 1 << 32
234 c = +281474976710656 # 1 << 48
235 d = -281474976710656 # 1 << 48
236 e = +4611686018427387904 # 1 << 62
237 f = -4611686018427387904 # 1 << 62
238 g = +9223372036854775807 # 1 << 63 - 1
239 h = -9223372036854775807 # 1 << 63 - 1
240
241 for variable in self.test_32_63_bit_values.func_code.co_consts:
242 if variable is not None:
243 self.assertTrue(isinstance(variable, int))
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000244
245 def test_sequence_unpacking_error(self):
246 # Verify sequence packing/unpacking with "or". SF bug #757818
247 i,j = (1, -1) or (-1, 1)
248 self.assertEqual(i, 1)
249 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000250
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000251 def test_none_assignment(self):
252 stmts = [
253 'None = 0',
254 'None += 0',
255 '__builtins__.None = 0',
256 'def None(): pass',
257 'class None: pass',
258 '(a, None) = 0, 0',
259 'for None in range(10): pass',
260 'def f(None): pass',
261 ]
262 for stmt in stmts:
263 stmt += "\n"
264 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
265 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000266
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000267 def test_import(self):
268 succeed = [
269 'import sys',
270 'import os, sys',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000271 'import os as bar',
272 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000273 'from __future__ import nested_scopes, generators',
274 'from __future__ import (nested_scopes,\ngenerators)',
275 'from __future__ import (nested_scopes,\ngenerators,)',
276 'from sys import stdin, stderr, stdout',
277 'from sys import (stdin, stderr,\nstdout)',
278 'from sys import (stdin, stderr,\nstdout,)',
279 'from sys import (stdin\n, stderr, stdout)',
280 'from sys import (stdin\n, stderr, stdout,)',
281 'from sys import stdin as si, stdout as so, stderr as se',
282 'from sys import (stdin as si, stdout as so, stderr as se)',
283 'from sys import (stdin as si, stdout as so, stderr as se,)',
284 ]
285 fail = [
286 'import (os, sys)',
287 'import (os), (sys)',
288 'import ((os), (sys))',
289 'import (sys',
290 'import sys)',
291 'import (os,)',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000292 'import os As bar',
293 'import os.path a bar',
294 'from sys import stdin As stdout',
295 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000296 'from (sys) import stdin',
297 'from __future__ import (nested_scopes',
298 'from __future__ import nested_scopes)',
299 'from __future__ import nested_scopes,\ngenerators',
300 'from sys import (stdin',
301 'from sys import stdin)',
302 'from sys import stdin, stdout,\nstderr',
303 'from sys import stdin si',
304 'from sys import stdin,'
305 'from sys import (*)',
306 'from sys import (stdin,, stdout, stderr)',
307 'from sys import (stdin, stdout),',
308 ]
309 for stmt in succeed:
310 compile(stmt, 'tmp', 'exec')
311 for stmt in fail:
312 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
313
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000314 def test_for_distinct_code_objects(self):
315 # SF bug 1048870
316 def f():
317 f1 = lambda x=1: x
318 f2 = lambda x=2: x
319 return f1, f2
320 f1, f2 = f()
321 self.assertNotEqual(id(f1.func_code), id(f2.func_code))
322
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000323 def test_unicode_encoding(self):
324 code = u"# -*- coding: utf-8 -*-\npass\n"
325 self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
326
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000327 def test_subscripts(self):
328 # SF bug 1448804
329 # Class to make testing subscript results easy
330 class str_map(object):
331 def __init__(self):
332 self.data = {}
333 def __getitem__(self, key):
334 return self.data[str(key)]
335 def __setitem__(self, key, value):
336 self.data[str(key)] = value
337 def __delitem__(self, key):
338 del self.data[str(key)]
339 def __contains__(self, key):
340 return str(key) in self.data
341 d = str_map()
342 # Index
343 d[1] = 1
344 self.assertEqual(d[1], 1)
345 d[1] += 1
346 self.assertEqual(d[1], 2)
347 del d[1]
348 self.assertEqual(1 in d, False)
349 # Tuple of indices
350 d[1, 1] = 1
351 self.assertEqual(d[1, 1], 1)
352 d[1, 1] += 1
353 self.assertEqual(d[1, 1], 2)
354 del d[1, 1]
355 self.assertEqual((1, 1) in d, False)
356 # Simple slice
357 d[1:2] = 1
358 self.assertEqual(d[1:2], 1)
359 d[1:2] += 1
360 self.assertEqual(d[1:2], 2)
361 del d[1:2]
362 self.assertEqual(slice(1, 2) in d, False)
363 # Tuple of simple slices
364 d[1:2, 1:2] = 1
365 self.assertEqual(d[1:2, 1:2], 1)
366 d[1:2, 1:2] += 1
367 self.assertEqual(d[1:2, 1:2], 2)
368 del d[1:2, 1:2]
369 self.assertEqual((slice(1, 2), slice(1, 2)) in d, False)
370 # Extended slice
371 d[1:2:3] = 1
372 self.assertEqual(d[1:2:3], 1)
373 d[1:2:3] += 1
374 self.assertEqual(d[1:2:3], 2)
375 del d[1:2:3]
376 self.assertEqual(slice(1, 2, 3) in d, False)
377 # Tuple of extended slices
378 d[1:2:3, 1:2:3] = 1
379 self.assertEqual(d[1:2:3, 1:2:3], 1)
380 d[1:2:3, 1:2:3] += 1
381 self.assertEqual(d[1:2:3, 1:2:3], 2)
382 del d[1:2:3, 1:2:3]
383 self.assertEqual((slice(1, 2, 3), slice(1, 2, 3)) in d, False)
384 # Ellipsis
385 d[...] = 1
386 self.assertEqual(d[...], 1)
387 d[...] += 1
388 self.assertEqual(d[...], 2)
389 del d[...]
390 self.assertEqual(Ellipsis in d, False)
391 # Tuple of Ellipses
392 d[..., ...] = 1
393 self.assertEqual(d[..., ...], 1)
394 d[..., ...] += 1
395 self.assertEqual(d[..., ...], 2)
396 del d[..., ...]
397 self.assertEqual((Ellipsis, Ellipsis) in d, False)
398
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000399def test_main():
400 test_support.run_unittest(TestSpecifics)
Tim Petersd507dab2001-08-30 20:51:59 +0000401
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000402if __name__ == "__main__":
403 test_main()