blob: 4cb619d338cb086376db84cf196aef7a8ae5fc21 [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
Raymond Hettinger8a99b502003-06-23 13:36:57 +000039 def test_duplicate_global_local(self):
40 try:
41 exec 'def f(a): global a; a = 1'
42 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)
56 def keys(self):
57 return list('xyz')
58
59 m = M()
60 g = globals()
61 exec 'z = a' in g, m
62 self.assertEqual(m.results, ('z', 12))
63 try:
64 exec 'z = b' in g, m
65 except NameError:
66 pass
67 else:
68 self.fail('Did not detect a KeyError')
69 exec 'z = dir()' in g, m
70 self.assertEqual(m.results, ('z', list('xyz')))
71 exec 'z = globals()' in g, m
72 self.assertEqual(m.results, ('z', g))
73 exec 'z = locals()' in g, m
74 self.assertEqual(m.results, ('z', m))
75 try:
76 exec 'z = b' in m
77 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:
87 exec 'z = a' in g, m
88 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()
100 exec 'z = a' in g, d
101 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
105 code = '''
106def f(x):
107 %s
108 %s
109 %s
110 %s
111 %s
112 %s
113 %s
114 %s
115 %s
116 %s
117 # the expressions above have no effect, x == argument
118 while x:
119 x -= 1
120 # EXTENDED_ARG/JUMP_ABSOLUTE here
121 return x
122''' % ((longexpr,)*10)
123 exec code
124 self.assertEqual(f(5), 0)
125
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000126 def test_complex_args(self):
Thomas Heller6b17abf2002-07-09 09:23:27 +0000127
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000128 def comp_args((a, b)):
129 return a,b
130 self.assertEqual(comp_args((1, 2)), (1, 2))
Thomas Heller6b17abf2002-07-09 09:23:27 +0000131
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000132 def comp_args((a, b)=(3, 4)):
133 return a, b
134 self.assertEqual(comp_args((1, 2)), (1, 2))
135 self.assertEqual(comp_args(), (3, 4))
Jeremy Hylton047e2c92001-01-19 03:25:56 +0000136
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000137 def comp_args(a, (b, c)):
138 return a, b, c
139 self.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000140
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000141 def comp_args(a=2, (b, c)=(3, 4)):
142 return a, b, c
143 self.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
144 self.assertEqual(comp_args(), (2, 3, 4))
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000145
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000146 def test_argument_order(self):
147 try:
148 exec 'def f(a=1, (b, c)): pass'
149 self.fail("non-default args after default")
150 except SyntaxError:
151 pass
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000152
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000153 def test_float_literals(self):
154 # testing bad float literals
155 self.assertRaises(SyntaxError, eval, "2e")
156 self.assertRaises(SyntaxError, eval, "2.0e+")
157 self.assertRaises(SyntaxError, eval, "1e-")
158 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000159
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000160 def test_indentation(self):
161 # testing compile() of indented block w/o trailing newline"
162 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000163if 1:
164 if 2:
165 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000166 compile(s, "<string>", "exec")
167
Neal Norwitzed657552006-07-10 00:04:44 +0000168 # This test is probably specific to CPython and may not generalize
169 # to other implementations. We are trying to ensure that when
170 # the first line of code starts after 256, correct line numbers
171 # in tracebacks are still produced.
172 def test_leading_newlines(self):
173 s256 = "".join(["\n"] * 256 + ["spam"])
174 co = compile(s256, 'fn', 'exec')
175 self.assertEqual(co.co_firstlineno, 257)
176 self.assertEqual(co.co_lnotab, '')
177
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000178 def test_literals_with_leading_zeroes(self):
179 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
180 "080000000000000", "000000000000009", "000000000000008"]:
181 self.assertRaises(SyntaxError, eval, arg)
182
183 self.assertEqual(eval("0777"), 511)
184 self.assertEqual(eval("0777L"), 511)
185 self.assertEqual(eval("000777"), 511)
186 self.assertEqual(eval("0xff"), 255)
187 self.assertEqual(eval("0xffL"), 255)
188 self.assertEqual(eval("0XfF"), 255)
189 self.assertEqual(eval("0777."), 777)
190 self.assertEqual(eval("0777.0"), 777)
191 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
192 self.assertEqual(eval("0777e1"), 7770)
193 self.assertEqual(eval("0e0"), 0)
194 self.assertEqual(eval("0000E-012"), 0)
195 self.assertEqual(eval("09.5"), 9.5)
196 self.assertEqual(eval("0777j"), 777j)
197 self.assertEqual(eval("00j"), 0j)
198 self.assertEqual(eval("00.0"), 0)
199 self.assertEqual(eval("0e3"), 0)
200 self.assertEqual(eval("090000000000000."), 90000000000000.)
201 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
202 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
203 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
204 self.assertEqual(eval("090000000000000j"), 90000000000000j)
205 self.assertEqual(eval("000000000000007"), 7)
206 self.assertEqual(eval("000000000000008."), 8.)
207 self.assertEqual(eval("000000000000009."), 9.)
208
209 def test_unary_minus(self):
210 # Verify treatment of unary minus on negative numbers SF bug #660455
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000211 if sys.maxint == 2147483647:
212 # 32-bit machine
213 all_one_bits = '0xffffffff'
214 self.assertEqual(eval(all_one_bits), 4294967295L)
215 self.assertEqual(eval("-" + all_one_bits), -4294967295L)
216 elif sys.maxint == 9223372036854775807:
217 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000218 all_one_bits = '0xffffffffffffffff'
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000219 self.assertEqual(eval(all_one_bits), 18446744073709551615L)
220 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615L)
221 else:
222 self.fail("How many bits *does* this machine have???")
Neil Schemenauer6ec6ab02006-07-09 21:19:29 +0000223 # Verify treatment of contant folding on -(sys.maxint+1)
224 # i.e. -2147483648 on 32 bit platforms. Should return int, not long.
225 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 1)), int))
226 self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 2)), long))
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000227
Neal Norwitz28746ab2006-07-09 22:14:42 +0000228 if sys.maxint == 9223372036854775807:
229 def test_32_63_bit_values(self):
230 a = +4294967296 # 1 << 32
231 b = -4294967296 # 1 << 32
232 c = +281474976710656 # 1 << 48
233 d = -281474976710656 # 1 << 48
234 e = +4611686018427387904 # 1 << 62
235 f = -4611686018427387904 # 1 << 62
236 g = +9223372036854775807 # 1 << 63 - 1
237 h = -9223372036854775807 # 1 << 63 - 1
238
239 for variable in self.test_32_63_bit_values.func_code.co_consts:
240 if variable is not None:
241 self.assertTrue(isinstance(variable, int))
242
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000243 def test_sequence_unpacking_error(self):
244 # Verify sequence packing/unpacking with "or". SF bug #757818
245 i,j = (1, -1) or (-1, 1)
246 self.assertEqual(i, 1)
247 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000248
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000249 def test_none_assignment(self):
250 stmts = [
251 'None = 0',
252 'None += 0',
253 '__builtins__.None = 0',
254 'def None(): pass',
255 'class None: pass',
256 '(a, None) = 0, 0',
257 'for None in range(10): pass',
258 'def f(None): pass',
259 ]
260 for stmt in stmts:
261 stmt += "\n"
262 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
263 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000264
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000265 def test_import(self):
266 succeed = [
267 'import sys',
268 'import os, sys',
Neal Norwitzfb48afa2006-07-08 05:31:37 +0000269 'import os as bar',
270 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000271 'from __future__ import nested_scopes, generators',
272 'from __future__ import (nested_scopes,\ngenerators)',
273 'from __future__ import (nested_scopes,\ngenerators,)',
274 'from sys import stdin, stderr, stdout',
275 'from sys import (stdin, stderr,\nstdout)',
276 'from sys import (stdin, stderr,\nstdout,)',
277 'from sys import (stdin\n, stderr, stdout)',
278 'from sys import (stdin\n, stderr, stdout,)',
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 'from sys import (stdin as si, stdout as so, stderr as se,)',
282 ]
283 fail = [
284 'import (os, sys)',
285 'import (os), (sys)',
286 'import ((os), (sys))',
287 'import (sys',
288 'import sys)',
289 'import (os,)',
Neal Norwitzfb48afa2006-07-08 05:31:37 +0000290 'import os As bar',
291 'import os.path a bar',
Georg Brandl9575fb22006-07-08 12:15:27 +0000292 'from sys import stdin As stdout',
293 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000294 'from (sys) import stdin',
295 'from __future__ import (nested_scopes',
296 'from __future__ import nested_scopes)',
297 'from __future__ import nested_scopes,\ngenerators',
298 'from sys import (stdin',
299 'from sys import stdin)',
300 'from sys import stdin, stdout,\nstderr',
301 'from sys import stdin si',
302 'from sys import stdin,'
303 'from sys import (*)',
304 'from sys import (stdin,, stdout, stderr)',
305 'from sys import (stdin, stdout),',
306 ]
307 for stmt in succeed:
308 compile(stmt, 'tmp', 'exec')
309 for stmt in fail:
310 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
311
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000312 def test_for_distinct_code_objects(self):
313 # SF bug 1048870
314 def f():
315 f1 = lambda x=1: x
316 f2 = lambda x=2: x
317 return f1, f2
318 f1, f2 = f()
319 self.assertNotEqual(id(f1.func_code), id(f2.func_code))
320
Neal Norwitze98ccf62006-03-23 05:39:47 +0000321 def test_unicode_encoding(self):
322 code = u"# -*- coding: utf-8 -*-\npass\n"
323 self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
324
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000325 def test_subscripts(self):
326 # SF bug 1448804
327 # Class to make testing subscript results easy
328 class str_map(object):
329 def __init__(self):
330 self.data = {}
331 def __getitem__(self, key):
332 return self.data[str(key)]
333 def __setitem__(self, key, value):
334 self.data[str(key)] = value
335 def __delitem__(self, key):
336 del self.data[str(key)]
337 def __contains__(self, key):
338 return str(key) in self.data
339 d = str_map()
340 # Index
341 d[1] = 1
342 self.assertEqual(d[1], 1)
343 d[1] += 1
344 self.assertEqual(d[1], 2)
345 del d[1]
346 self.assertEqual(1 in d, False)
347 # Tuple of indices
348 d[1, 1] = 1
349 self.assertEqual(d[1, 1], 1)
350 d[1, 1] += 1
351 self.assertEqual(d[1, 1], 2)
352 del d[1, 1]
353 self.assertEqual((1, 1) in d, False)
354 # Simple slice
355 d[1:2] = 1
356 self.assertEqual(d[1:2], 1)
357 d[1:2] += 1
358 self.assertEqual(d[1:2], 2)
359 del d[1:2]
360 self.assertEqual(slice(1, 2) in d, False)
361 # Tuple of simple slices
362 d[1:2, 1:2] = 1
363 self.assertEqual(d[1:2, 1:2], 1)
364 d[1:2, 1:2] += 1
365 self.assertEqual(d[1:2, 1:2], 2)
366 del d[1:2, 1:2]
367 self.assertEqual((slice(1, 2), slice(1, 2)) in d, False)
368 # Extended slice
369 d[1:2:3] = 1
370 self.assertEqual(d[1:2:3], 1)
371 d[1:2:3] += 1
372 self.assertEqual(d[1:2:3], 2)
373 del d[1:2:3]
374 self.assertEqual(slice(1, 2, 3) in d, False)
375 # Tuple of extended slices
376 d[1:2:3, 1:2:3] = 1
377 self.assertEqual(d[1:2:3, 1:2:3], 1)
378 d[1:2:3, 1:2:3] += 1
379 self.assertEqual(d[1:2:3, 1:2:3], 2)
380 del d[1:2:3, 1:2:3]
381 self.assertEqual((slice(1, 2, 3), slice(1, 2, 3)) in d, False)
382 # Ellipsis
383 d[...] = 1
384 self.assertEqual(d[...], 1)
385 d[...] += 1
386 self.assertEqual(d[...], 2)
387 del d[...]
388 self.assertEqual(Ellipsis in d, False)
389 # Tuple of Ellipses
390 d[..., ...] = 1
391 self.assertEqual(d[..., ...], 1)
392 d[..., ...] += 1
393 self.assertEqual(d[..., ...], 2)
394 del d[..., ...]
395 self.assertEqual((Ellipsis, Ellipsis) in d, False)
396
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000397def test_main():
398 test_support.run_unittest(TestSpecifics)
Tim Petersd507dab2001-08-30 20:51:59 +0000399
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000400if __name__ == "__main__":
401 test_main()