blob: 367a6945188da05d7131b09ded6e15650953047f [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",
183 "080000000000000", "000000000000009", "000000000000008"]:
184 self.assertRaises(SyntaxError, eval, arg)
185
186 self.assertEqual(eval("0777"), 511)
187 self.assertEqual(eval("0777L"), 511)
188 self.assertEqual(eval("000777"), 511)
189 self.assertEqual(eval("0xff"), 255)
190 self.assertEqual(eval("0xffL"), 255)
191 self.assertEqual(eval("0XfF"), 255)
192 self.assertEqual(eval("0777."), 777)
193 self.assertEqual(eval("0777.0"), 777)
194 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
195 self.assertEqual(eval("0777e1"), 7770)
196 self.assertEqual(eval("0e0"), 0)
197 self.assertEqual(eval("0000E-012"), 0)
198 self.assertEqual(eval("09.5"), 9.5)
199 self.assertEqual(eval("0777j"), 777j)
200 self.assertEqual(eval("00j"), 0j)
201 self.assertEqual(eval("00.0"), 0)
202 self.assertEqual(eval("0e3"), 0)
203 self.assertEqual(eval("090000000000000."), 90000000000000.)
204 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
205 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
206 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
207 self.assertEqual(eval("090000000000000j"), 90000000000000j)
208 self.assertEqual(eval("000000000000007"), 7)
209 self.assertEqual(eval("000000000000008."), 8.)
210 self.assertEqual(eval("000000000000009."), 9.)
211
212 def test_unary_minus(self):
213 # Verify treatment of unary minus on negative numbers SF bug #660455
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000214 if sys.maxint == 2147483647:
215 # 32-bit machine
216 all_one_bits = '0xffffffff'
217 self.assertEqual(eval(all_one_bits), 4294967295L)
218 self.assertEqual(eval("-" + all_one_bits), -4294967295L)
219 elif sys.maxint == 9223372036854775807:
220 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000221 all_one_bits = '0xffffffffffffffff'
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000222 self.assertEqual(eval(all_one_bits), 18446744073709551615L)
223 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615L)
224 else:
225 self.fail("How many bits *does* this machine have???")
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +0000226 # Verify treatment of contant folding on -(sys.maxint+1)
227 # i.e. -2147483648 on 32 bit platforms. Should return int, not long.
228 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 1)), int))
229 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 2)), long))
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000230
Neal Norwitz28746ab2006-07-09 22:14:42 +0000231 if sys.maxint == 9223372036854775807:
232 def test_32_63_bit_values(self):
233 a = +4294967296 # 1 << 32
234 b = -4294967296 # 1 << 32
235 c = +281474976710656 # 1 << 48
236 d = -281474976710656 # 1 << 48
237 e = +4611686018427387904 # 1 << 62
238 f = -4611686018427387904 # 1 << 62
239 g = +9223372036854775807 # 1 << 63 - 1
240 h = -9223372036854775807 # 1 << 63 - 1
241
242 for variable in self.test_32_63_bit_values.func_code.co_consts:
243 if variable is not None:
244 self.assertTrue(isinstance(variable, int))
245
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000246 def test_sequence_unpacking_error(self):
247 # Verify sequence packing/unpacking with "or". SF bug #757818
248 i,j = (1, -1) or (-1, 1)
249 self.assertEqual(i, 1)
250 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000251
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000252 def test_none_assignment(self):
253 stmts = [
254 'None = 0',
255 'None += 0',
256 '__builtins__.None = 0',
257 'def None(): pass',
258 'class None: pass',
259 '(a, None) = 0, 0',
260 'for None in range(10): pass',
261 'def f(None): pass',
262 ]
263 for stmt in stmts:
264 stmt += "\n"
265 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
266 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000267
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000268 def test_import(self):
269 succeed = [
270 'import sys',
271 'import os, sys',
Neal Norwitzfb48afa2006-07-08 05:31:37 +0000272 'import os as bar',
273 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000274 'from __future__ import nested_scopes, generators',
275 'from __future__ import (nested_scopes,\ngenerators)',
276 'from __future__ import (nested_scopes,\ngenerators,)',
277 'from sys import stdin, stderr, stdout',
278 'from sys import (stdin, stderr,\nstdout)',
279 'from sys import (stdin, stderr,\nstdout,)',
280 'from sys import (stdin\n, stderr, stdout)',
281 'from sys import (stdin\n, stderr, stdout,)',
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 'from sys import (stdin as si, stdout as so, stderr as se,)',
285 ]
286 fail = [
287 'import (os, sys)',
288 'import (os), (sys)',
289 'import ((os), (sys))',
290 'import (sys',
291 'import sys)',
292 'import (os,)',
Neal Norwitzfb48afa2006-07-08 05:31:37 +0000293 'import os As bar',
294 'import os.path a bar',
Georg Brandl9575fb22006-07-08 12:15:27 +0000295 'from sys import stdin As stdout',
296 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000297 'from (sys) import stdin',
298 'from __future__ import (nested_scopes',
299 'from __future__ import nested_scopes)',
300 'from __future__ import nested_scopes,\ngenerators',
301 'from sys import (stdin',
302 'from sys import stdin)',
303 'from sys import stdin, stdout,\nstderr',
304 'from sys import stdin si',
305 'from sys import stdin,'
306 'from sys import (*)',
307 'from sys import (stdin,, stdout, stderr)',
308 'from sys import (stdin, stdout),',
309 ]
310 for stmt in succeed:
311 compile(stmt, 'tmp', 'exec')
312 for stmt in fail:
313 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
314
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000315 def test_for_distinct_code_objects(self):
316 # SF bug 1048870
317 def f():
318 f1 = lambda x=1: x
319 f2 = lambda x=2: x
320 return f1, f2
321 f1, f2 = f()
322 self.assertNotEqual(id(f1.func_code), id(f2.func_code))
323
Neal Norwitze98ccf62006-03-23 05:39:47 +0000324 def test_unicode_encoding(self):
325 code = u"# -*- coding: utf-8 -*-\npass\n"
326 self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
327
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000328 def test_subscripts(self):
329 # SF bug 1448804
330 # Class to make testing subscript results easy
331 class str_map(object):
332 def __init__(self):
333 self.data = {}
334 def __getitem__(self, key):
335 return self.data[str(key)]
336 def __setitem__(self, key, value):
337 self.data[str(key)] = value
338 def __delitem__(self, key):
339 del self.data[str(key)]
340 def __contains__(self, key):
341 return str(key) in self.data
342 d = str_map()
343 # Index
344 d[1] = 1
345 self.assertEqual(d[1], 1)
346 d[1] += 1
347 self.assertEqual(d[1], 2)
348 del d[1]
349 self.assertEqual(1 in d, False)
350 # Tuple of indices
351 d[1, 1] = 1
352 self.assertEqual(d[1, 1], 1)
353 d[1, 1] += 1
354 self.assertEqual(d[1, 1], 2)
355 del d[1, 1]
356 self.assertEqual((1, 1) in d, False)
357 # Simple slice
358 d[1:2] = 1
359 self.assertEqual(d[1:2], 1)
360 d[1:2] += 1
361 self.assertEqual(d[1:2], 2)
362 del d[1:2]
363 self.assertEqual(slice(1, 2) in d, False)
364 # Tuple of simple slices
365 d[1:2, 1:2] = 1
366 self.assertEqual(d[1:2, 1:2], 1)
367 d[1:2, 1:2] += 1
368 self.assertEqual(d[1:2, 1:2], 2)
369 del d[1:2, 1:2]
370 self.assertEqual((slice(1, 2), slice(1, 2)) in d, False)
371 # Extended slice
372 d[1:2:3] = 1
373 self.assertEqual(d[1:2:3], 1)
374 d[1:2:3] += 1
375 self.assertEqual(d[1:2:3], 2)
376 del d[1:2:3]
377 self.assertEqual(slice(1, 2, 3) in d, False)
378 # Tuple of extended slices
379 d[1:2:3, 1:2:3] = 1
380 self.assertEqual(d[1:2:3, 1:2:3], 1)
381 d[1:2:3, 1:2:3] += 1
382 self.assertEqual(d[1:2:3, 1:2:3], 2)
383 del d[1:2:3, 1:2:3]
384 self.assertEqual((slice(1, 2, 3), slice(1, 2, 3)) in d, False)
385 # Ellipsis
386 d[...] = 1
387 self.assertEqual(d[...], 1)
388 d[...] += 1
389 self.assertEqual(d[...], 2)
390 del d[...]
391 self.assertEqual(Ellipsis in d, False)
392 # Tuple of Ellipses
393 d[..., ...] = 1
394 self.assertEqual(d[..., ...], 1)
395 d[..., ...] += 1
396 self.assertEqual(d[..., ...], 2)
397 del d[..., ...]
398 self.assertEqual((Ellipsis, Ellipsis) in d, False)
399
Jeremy Hylton37075c52007-02-27 01:01:59 +0000400 def test_mangling(self):
401 class A:
402 def f():
403 __mangled = 1
404 __not_mangled__ = 2
405 import __mangled_mod
406 import __package__.module
407
408 self.assert_("_A__mangled" in A.f.func_code.co_varnames)
409 self.assert_("__not_mangled__" in A.f.func_code.co_varnames)
410 self.assert_("_A__mangled_mod" in A.f.func_code.co_varnames)
411 self.assert_("__package__" in A.f.func_code.co_varnames)
412
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000413def test_main():
414 test_support.run_unittest(TestSpecifics)
Tim Petersd507dab2001-08-30 20:51:59 +0000415
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000416if __name__ == "__main__":
417 test_main()