4 from test
import test_support
6 class TestSpecifics(unittest
.TestCase
):
8 def test_debug_assignment(self
):
9 # catch assignments to __debug__
10 self
.assertRaises(SyntaxError, compile, '__debug__ = 1', '?', 'single')
12 prev
= __builtin__
.__debug
__
13 setattr(__builtin__
, '__debug__', 'sure')
14 setattr(__builtin__
, '__debug__', prev
)
16 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')
22 exec 'def f(a, a): pass'
23 self
.fail("duplicate arguments")
27 exec 'def f(a = 0, a = 1): pass'
28 self
.fail("duplicate keyword arguments")
32 exec 'def f(a): global a; a = 1'
33 self
.fail("variable is global and local")
37 def test_syntax_error(self
):
38 self
.assertRaises(SyntaxError, compile, "1+*3", "filename", "exec")
40 def test_duplicate_global_local(self
):
42 exec 'def f(a): global a; a = 1'
43 self
.fail("variable is global and local")
47 def test_exec_with_general_mapping_for_locals(self
):
50 "Test mapping interface versus possible calls from eval()."
51 def __getitem__(self
, key
):
55 def __setitem__(self
, key
, value
):
56 self
.results
= (key
, value
)
63 self
.assertEqual(m
.results
, ('z', 12))
69 self
.fail('Did not detect a KeyError')
70 exec 'z = dir()' in g
, m
71 self
.assertEqual(m
.results
, ('z', list('xyz')))
72 exec 'z = globals()' in g
, m
73 self
.assertEqual(m
.results
, ('z', g
))
74 exec 'z = locals()' in g
, m
75 self
.assertEqual(m
.results
, ('z', m
))
81 self
.fail('Did not validate globals as a real dict')
92 self
.fail('Did not validate locals as a mapping')
94 # Verify that dict subclasses work as well
96 def __getitem__(self
, key
):
99 return dict.__getitem
__(self
, key
)
102 self
.assertEqual(d
['z'], 12)
104 def test_extended_arg(self
):
105 longexpr
= 'x = x or ' + '-x' * 2500
118 # the expressions above have no effect, x == argument
121 # EXTENDED_ARG/JUMP_ABSOLUTE here
123 ''' % ((longexpr
,)*10)
125 self
.assertEqual(f(5), 0)
127 def test_complex_args(self
):
129 def comp_args((a
, b
)):
131 self
.assertEqual(comp_args((1, 2)), (1, 2))
133 def comp_args((a
, b
)=(3, 4)):
135 self
.assertEqual(comp_args((1, 2)), (1, 2))
136 self
.assertEqual(comp_args(), (3, 4))
138 def comp_args(a
, (b
, c
)):
140 self
.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
142 def comp_args(a
=2, (b
, c
)=(3, 4)):
144 self
.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
145 self
.assertEqual(comp_args(), (2, 3, 4))
147 def test_argument_order(self
):
149 exec 'def f(a=1, (b, c)): pass'
150 self
.fail("non-default args after default")
154 def test_float_literals(self
):
155 # testing bad float literals
156 self
.assertRaises(SyntaxError, eval, "2e")
157 self
.assertRaises(SyntaxError, eval, "2.0e+")
158 self
.assertRaises(SyntaxError, eval, "1e-")
159 self
.assertRaises(SyntaxError, eval, "3-4e/21")
161 def test_indentation(self
):
162 # testing compile() of indented block w/o trailing newline"
167 compile(s
, "<string>", "exec")
169 def test_literals_with_leading_zeroes(self
):
170 for arg
in ["077787", "0xj", "0x.", "0e", "090000000000000",
171 "080000000000000", "000000000000009", "000000000000008"]:
172 self
.assertRaises(SyntaxError, eval, arg
)
174 self
.assertEqual(eval("0777"), 511)
175 self
.assertEqual(eval("0777L"), 511)
176 self
.assertEqual(eval("000777"), 511)
177 self
.assertEqual(eval("0xff"), 255)
178 self
.assertEqual(eval("0xffL"), 255)
179 self
.assertEqual(eval("0XfF"), 255)
180 self
.assertEqual(eval("0777."), 777)
181 self
.assertEqual(eval("0777.0"), 777)
182 self
.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
183 self
.assertEqual(eval("0777e1"), 7770)
184 self
.assertEqual(eval("0e0"), 0)
185 self
.assertEqual(eval("0000E-012"), 0)
186 self
.assertEqual(eval("09.5"), 9.5)
187 self
.assertEqual(eval("0777j"), 777j
)
188 self
.assertEqual(eval("00j"), 0j
)
189 self
.assertEqual(eval("00.0"), 0)
190 self
.assertEqual(eval("0e3"), 0)
191 self
.assertEqual(eval("090000000000000."), 90000000000000.)
192 self
.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
193 self
.assertEqual(eval("090000000000000e0"), 90000000000000.)
194 self
.assertEqual(eval("090000000000000e-0"), 90000000000000.)
195 self
.assertEqual(eval("090000000000000j"), 90000000000000j
)
196 self
.assertEqual(eval("000000000000007"), 7)
197 self
.assertEqual(eval("000000000000008."), 8.)
198 self
.assertEqual(eval("000000000000009."), 9.)
200 def test_unary_minus(self
):
201 # Verify treatment of unary minus on negative numbers SF bug #660455
202 if sys
.maxint
== 2147483647:
204 all_one_bits
= '0xffffffff'
205 self
.assertEqual(eval(all_one_bits
), 4294967295L)
206 self
.assertEqual(eval("-" + all_one_bits
), -4294967295L)
207 elif sys
.maxint
== 9223372036854775807:
209 all_one_bits
= '0xffffffffffffffff'
210 self
.assertEqual(eval(all_one_bits
), 18446744073709551615L)
211 self
.assertEqual(eval("-" + all_one_bits
), -18446744073709551615L)
213 self
.fail("How many bits *does* this machine have???")
215 def test_sequence_unpacking_error(self
):
216 # Verify sequence packing/unpacking with "or". SF bug #757818
217 i
,j
= (1, -1) or (-1, 1)
218 self
.assertEqual(i
, 1)
219 self
.assertEqual(j
, -1)
221 def test_none_assignment(self
):
225 '__builtins__.None = 0',
229 'for None in range(10): pass',
234 self
.assertRaises(SyntaxError, compile, stmt
, 'tmp', 'single')
235 self
.assertRaises(SyntaxError, compile, stmt
, 'tmp', 'exec')
237 def test_import(self
):
241 'from __future__ import nested_scopes, generators',
242 'from __future__ import (nested_scopes,\ngenerators)',
243 'from __future__ import (nested_scopes,\ngenerators,)',
244 'from sys import stdin, stderr, stdout',
245 'from sys import (stdin, stderr,\nstdout)',
246 'from sys import (stdin, stderr,\nstdout,)',
247 'from sys import (stdin\n, stderr, stdout)',
248 'from sys import (stdin\n, stderr, stdout,)',
249 'from sys import stdin as si, stdout as so, stderr as se',
250 'from sys import (stdin as si, stdout as so, stderr as se)',
251 'from sys import (stdin as si, stdout as so, stderr as se,)',
255 'import (os), (sys)',
256 'import ((os), (sys))',
260 'from (sys) import stdin',
261 'from __future__ import (nested_scopes',
262 'from __future__ import nested_scopes)',
263 'from __future__ import nested_scopes,\ngenerators',
264 'from sys import (stdin',
265 'from sys import stdin)',
266 'from sys import stdin, stdout,\nstderr',
267 'from sys import stdin si',
268 'from sys import stdin,'
269 'from sys import (*)',
270 'from sys import (stdin,, stdout, stderr)',
271 'from sys import (stdin, stdout),',
274 compile(stmt
, 'tmp', 'exec')
276 self
.assertRaises(SyntaxError, compile, stmt
, 'tmp', 'exec')
278 def test_for_distinct_code_objects(self
):
285 self
.assertNotEqual(id(f1
.func_code
), id(f2
.func_code
))
288 test_support
.run_unittest(TestSpecifics
)
290 if __name__
== "__main__":