blob: 465a90c984a76df8ff51cac2ae1418bdf13e0204 [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:
21 exec 'def f(a, a): pass'
22 self.fail("duplicate arguments")
23 except SyntaxError:
24 pass
25 try:
26 exec 'def f(a = 0, a = 1): pass'
27 self.fail("duplicate keyword arguments")
28 except SyntaxError:
29 pass
30 try:
31 exec 'def f(a): global a; a = 1'
32 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
Georg Brandle06cf452007-06-07 13:23:24 +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:
44 exec 'def f(a): global a; a = 1'
45 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)
59 def keys(self):
60 return list('xyz')
61
62 m = M()
63 g = globals()
64 exec 'z = a' in g, m
65 self.assertEqual(m.results, ('z', 12))
66 try:
67 exec 'z = b' in g, m
68 except NameError:
69 pass
70 else:
71 self.fail('Did not detect a KeyError')
72 exec 'z = dir()' in g, m
73 self.assertEqual(m.results, ('z', list('xyz')))
74 exec 'z = globals()' in g, m
75 self.assertEqual(m.results, ('z', g))
76 exec 'z = locals()' in g, m
77 self.assertEqual(m.results, ('z', m))
78 try:
79 exec 'z = b' in m
80 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:
90 exec 'z = a' in g, m
91 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()
103 exec 'z = a' in g, d
104 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
108 code = '''
109def f(x):
110 %s
111 %s
112 %s
113 %s
114 %s
115 %s
116 %s
117 %s
118 %s
119 %s
120 # the expressions above have no effect, x == argument
121 while x:
122 x -= 1
123 # EXTENDED_ARG/JUMP_ABSOLUTE here
124 return x
125''' % ((longexpr,)*10)
126 exec code
127 self.assertEqual(f(5), 0)
128
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000129 def test_complex_args(self):
Thomas Heller6b17abf2002-07-09 09:23:27 +0000130
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000131 def comp_args((a, b)):
132 return a,b
133 self.assertEqual(comp_args((1, 2)), (1, 2))
Thomas Heller6b17abf2002-07-09 09:23:27 +0000134
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000135 def comp_args((a, b)=(3, 4)):
136 return a, b
137 self.assertEqual(comp_args((1, 2)), (1, 2))
138 self.assertEqual(comp_args(), (3, 4))
Jeremy Hylton047e2c92001-01-19 03:25:56 +0000139
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000140 def comp_args(a, (b, c)):
141 return a, b, c
142 self.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000143
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000144 def comp_args(a=2, (b, c)=(3, 4)):
145 return a, b, c
146 self.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
147 self.assertEqual(comp_args(), (2, 3, 4))
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000148
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000149 def test_argument_order(self):
150 try:
151 exec 'def f(a=1, (b, c)): pass'
152 self.fail("non-default args after default")
153 except SyntaxError:
154 pass
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000155
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000156 def test_float_literals(self):
157 # testing bad float literals
158 self.assertRaises(SyntaxError, eval, "2e")
159 self.assertRaises(SyntaxError, eval, "2.0e+")
160 self.assertRaises(SyntaxError, eval, "1e-")
161 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000162
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000163 def test_indentation(self):
164 # testing compile() of indented block w/o trailing newline"
165 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000166if 1:
167 if 2:
168 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000169 compile(s, "<string>", "exec")
170
Neal Norwitzed657552006-07-10 00:04:44 +0000171 # This test is probably specific to CPython and may not generalize
172 # to other implementations. We are trying to ensure that when
173 # the first line of code starts after 256, correct line numbers
174 # in tracebacks are still produced.
175 def test_leading_newlines(self):
176 s256 = "".join(["\n"] * 256 + ["spam"])
177 co = compile(s256, 'fn', 'exec')
178 self.assertEqual(co.co_firstlineno, 257)
179 self.assertEqual(co.co_lnotab, '')
180
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000181 def test_literals_with_leading_zeroes(self):
182 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
Eric Smith9ff19b52008-03-17 17:32:20 +0000183 "080000000000000", "000000000000009", "000000000000008",
184 "0b42", "0BADCAFE", "0o123456789", "0b1.1", "0o4.2",
185 "0b101j2", "0o153j2", "0b100e1", "0o777e1"]:
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000186 self.assertRaises(SyntaxError, eval, arg)
187
188 self.assertEqual(eval("0777"), 511)
189 self.assertEqual(eval("0777L"), 511)
190 self.assertEqual(eval("000777"), 511)
191 self.assertEqual(eval("0xff"), 255)
192 self.assertEqual(eval("0xffL"), 255)
193 self.assertEqual(eval("0XfF"), 255)
194 self.assertEqual(eval("0777."), 777)
195 self.assertEqual(eval("0777.0"), 777)
196 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
197 self.assertEqual(eval("0777e1"), 7770)
198 self.assertEqual(eval("0e0"), 0)
199 self.assertEqual(eval("0000E-012"), 0)
200 self.assertEqual(eval("09.5"), 9.5)
201 self.assertEqual(eval("0777j"), 777j)
202 self.assertEqual(eval("00j"), 0j)
203 self.assertEqual(eval("00.0"), 0)
204 self.assertEqual(eval("0e3"), 0)
205 self.assertEqual(eval("090000000000000."), 90000000000000.)
206 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
207 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
208 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
209 self.assertEqual(eval("090000000000000j"), 90000000000000j)
210 self.assertEqual(eval("000000000000007"), 7)
211 self.assertEqual(eval("000000000000008."), 8.)
212 self.assertEqual(eval("000000000000009."), 9.)
Eric Smith9ff19b52008-03-17 17:32:20 +0000213 self.assertEqual(eval("0b101010"), 42)
214 self.assertEqual(eval("-0b000000000010"), -2)
215 self.assertEqual(eval("0o777"), 511)
216 self.assertEqual(eval("-0o0000010"), -8)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000217
218 def test_unary_minus(self):
219 # Verify treatment of unary minus on negative numbers SF bug #660455
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000220 if sys.maxint == 2147483647:
221 # 32-bit machine
222 all_one_bits = '0xffffffff'
223 self.assertEqual(eval(all_one_bits), 4294967295L)
224 self.assertEqual(eval("-" + all_one_bits), -4294967295L)
225 elif sys.maxint == 9223372036854775807:
226 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000227 all_one_bits = '0xffffffffffffffff'
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000228 self.assertEqual(eval(all_one_bits), 18446744073709551615L)
229 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615L)
230 else:
231 self.fail("How many bits *does* this machine have???")
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +0000232 # Verify treatment of contant folding on -(sys.maxint+1)
233 # i.e. -2147483648 on 32 bit platforms. Should return int, not long.
234 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 1)), int))
235 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 2)), long))
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000236
Neal Norwitz28746ab2006-07-09 22:14:42 +0000237 if sys.maxint == 9223372036854775807:
238 def test_32_63_bit_values(self):
239 a = +4294967296 # 1 << 32
240 b = -4294967296 # 1 << 32
241 c = +281474976710656 # 1 << 48
242 d = -281474976710656 # 1 << 48
243 e = +4611686018427387904 # 1 << 62
244 f = -4611686018427387904 # 1 << 62
245 g = +9223372036854775807 # 1 << 63 - 1
246 h = -9223372036854775807 # 1 << 63 - 1
247
248 for variable in self.test_32_63_bit_values.func_code.co_consts:
249 if variable is not None:
250 self.assertTrue(isinstance(variable, int))
251
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000252 def test_sequence_unpacking_error(self):
253 # Verify sequence packing/unpacking with "or". SF bug #757818
254 i,j = (1, -1) or (-1, 1)
255 self.assertEqual(i, 1)
256 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000257
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000258 def test_none_assignment(self):
259 stmts = [
260 'None = 0',
261 'None += 0',
262 '__builtins__.None = 0',
263 'def None(): pass',
264 'class None: pass',
265 '(a, None) = 0, 0',
266 'for None in range(10): pass',
267 'def f(None): pass',
268 ]
269 for stmt in stmts:
270 stmt += "\n"
271 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
272 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000273
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000274 def test_import(self):
275 succeed = [
276 'import sys',
277 'import os, sys',
Neal Norwitzfb48afa2006-07-08 05:31:37 +0000278 'import os as bar',
279 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000280 'from __future__ import nested_scopes, generators',
281 'from __future__ import (nested_scopes,\ngenerators)',
282 'from __future__ import (nested_scopes,\ngenerators,)',
283 'from sys import stdin, stderr, stdout',
284 'from sys import (stdin, stderr,\nstdout)',
285 'from sys import (stdin, stderr,\nstdout,)',
286 'from sys import (stdin\n, stderr, stdout)',
287 'from sys import (stdin\n, stderr, stdout,)',
288 'from sys import stdin as si, stdout as so, stderr as se',
289 'from sys import (stdin as si, stdout as so, stderr as se)',
290 'from sys import (stdin as si, stdout as so, stderr as se,)',
291 ]
292 fail = [
293 'import (os, sys)',
294 'import (os), (sys)',
295 'import ((os), (sys))',
296 'import (sys',
297 'import sys)',
298 'import (os,)',
Neal Norwitzfb48afa2006-07-08 05:31:37 +0000299 'import os As bar',
300 'import os.path a bar',
Georg Brandl9575fb22006-07-08 12:15:27 +0000301 'from sys import stdin As stdout',
302 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000303 'from (sys) import stdin',
304 'from __future__ import (nested_scopes',
305 'from __future__ import nested_scopes)',
306 'from __future__ import nested_scopes,\ngenerators',
307 'from sys import (stdin',
308 'from sys import stdin)',
309 'from sys import stdin, stdout,\nstderr',
310 'from sys import stdin si',
311 'from sys import stdin,'
312 'from sys import (*)',
313 'from sys import (stdin,, stdout, stderr)',
314 'from sys import (stdin, stdout),',
315 ]
316 for stmt in succeed:
317 compile(stmt, 'tmp', 'exec')
318 for stmt in fail:
319 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
320
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000321 def test_for_distinct_code_objects(self):
322 # SF bug 1048870
323 def f():
324 f1 = lambda x=1: x
325 f2 = lambda x=2: x
326 return f1, f2
327 f1, f2 = f()
328 self.assertNotEqual(id(f1.func_code), id(f2.func_code))
329
Neal Norwitze98ccf62006-03-23 05:39:47 +0000330 def test_unicode_encoding(self):
331 code = u"# -*- coding: utf-8 -*-\npass\n"
332 self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
333
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000334 def test_subscripts(self):
335 # SF bug 1448804
336 # Class to make testing subscript results easy
337 class str_map(object):
338 def __init__(self):
339 self.data = {}
340 def __getitem__(self, key):
341 return self.data[str(key)]
342 def __setitem__(self, key, value):
343 self.data[str(key)] = value
344 def __delitem__(self, key):
345 del self.data[str(key)]
346 def __contains__(self, key):
347 return str(key) in self.data
348 d = str_map()
349 # Index
350 d[1] = 1
351 self.assertEqual(d[1], 1)
352 d[1] += 1
353 self.assertEqual(d[1], 2)
354 del d[1]
355 self.assertEqual(1 in d, False)
356 # Tuple of indices
357 d[1, 1] = 1
358 self.assertEqual(d[1, 1], 1)
359 d[1, 1] += 1
360 self.assertEqual(d[1, 1], 2)
361 del d[1, 1]
362 self.assertEqual((1, 1) in d, False)
363 # Simple slice
364 d[1:2] = 1
365 self.assertEqual(d[1:2], 1)
366 d[1:2] += 1
367 self.assertEqual(d[1:2], 2)
368 del d[1:2]
369 self.assertEqual(slice(1, 2) in d, False)
370 # Tuple of simple slices
371 d[1:2, 1:2] = 1
372 self.assertEqual(d[1:2, 1:2], 1)
373 d[1:2, 1:2] += 1
374 self.assertEqual(d[1:2, 1:2], 2)
375 del d[1:2, 1:2]
376 self.assertEqual((slice(1, 2), slice(1, 2)) in d, False)
377 # Extended slice
378 d[1:2:3] = 1
379 self.assertEqual(d[1:2:3], 1)
380 d[1:2:3] += 1
381 self.assertEqual(d[1:2:3], 2)
382 del d[1:2:3]
383 self.assertEqual(slice(1, 2, 3) in d, False)
384 # Tuple of extended slices
385 d[1:2:3, 1:2:3] = 1
386 self.assertEqual(d[1:2:3, 1:2:3], 1)
387 d[1:2:3, 1:2:3] += 1
388 self.assertEqual(d[1:2:3, 1:2:3], 2)
389 del d[1:2:3, 1:2:3]
390 self.assertEqual((slice(1, 2, 3), slice(1, 2, 3)) in d, False)
391 # Ellipsis
392 d[...] = 1
393 self.assertEqual(d[...], 1)
394 d[...] += 1
395 self.assertEqual(d[...], 2)
396 del d[...]
397 self.assertEqual(Ellipsis in d, False)
398 # Tuple of Ellipses
399 d[..., ...] = 1
400 self.assertEqual(d[..., ...], 1)
401 d[..., ...] += 1
402 self.assertEqual(d[..., ...], 2)
403 del d[..., ...]
404 self.assertEqual((Ellipsis, Ellipsis) in d, False)
405
Jeremy Hylton37075c52007-02-27 01:01:59 +0000406 def test_mangling(self):
407 class A:
408 def f():
409 __mangled = 1
410 __not_mangled__ = 2
411 import __mangled_mod
412 import __package__.module
413
414 self.assert_("_A__mangled" in A.f.func_code.co_varnames)
415 self.assert_("__not_mangled__" in A.f.func_code.co_varnames)
416 self.assert_("_A__mangled_mod" in A.f.func_code.co_varnames)
417 self.assert_("__package__" in A.f.func_code.co_varnames)
418
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000419def test_main():
420 test_support.run_unittest(TestSpecifics)
Tim Petersd507dab2001-08-30 20:51:59 +0000421
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000422if __name__ == "__main__":
423 test_main()