blob: 5a069d36073028b75d5b0ef882078a24353c5595 [file] [log] [blame]
Raymond Hettinger8a99b502003-06-23 13:36:57 +00001import unittest
Raymond Hettinger8a99b502003-06-23 13:36:57 +00002import sys
Martin v. Löwis618dc5e2008-03-30 20:03:44 +00003import _ast
Raymond Hettinger8a99b502003-06-23 13:36:57 +00004from 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')
Georg Brandl1a3284e2007-12-02 09:40:06 +000011 import builtins
12 prev = builtins.__debug__
13 setattr(builtins, '__debug__', 'sure')
14 setattr(builtins, '__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
Guido van Rossumcd16bf62007-06-13 18:07:49 +000040 def test_none_keyword_arg(self):
41 self.assertRaises(SyntaxError, compile, "f(None=1)", "<string>", "exec")
42
Raymond Hettinger8a99b502003-06-23 13:36:57 +000043 def test_duplicate_global_local(self):
44 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000045 exec('def f(a): global a; a = 1')
Raymond Hettinger8a99b502003-06-23 13:36:57 +000046 self.fail("variable is global and local")
47 except SyntaxError:
48 pass
Peter Schneider-Kampfdee0f02000-07-25 22:15:45 +000049
Raymond Hettinger66bd2332004-08-02 08:30:07 +000050 def test_exec_with_general_mapping_for_locals(self):
51
52 class M:
53 "Test mapping interface versus possible calls from eval()."
54 def __getitem__(self, key):
55 if key == 'a':
56 return 12
57 raise KeyError
58 def __setitem__(self, key, value):
59 self.results = (key, value)
Guido van Rossum63eecc72007-02-22 23:55:25 +000060 def keys(self):
61 return list('xyz')
Raymond Hettinger66bd2332004-08-02 08:30:07 +000062
63 m = M()
64 g = globals()
Georg Brandl7cae87c2006-09-06 06:51:57 +000065 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000066 self.assertEqual(m.results, ('z', 12))
67 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000068 exec('z = b', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000069 except NameError:
70 pass
71 else:
72 self.fail('Did not detect a KeyError')
Georg Brandl7cae87c2006-09-06 06:51:57 +000073 exec('z = dir()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000074 self.assertEqual(m.results, ('z', list('xyz')))
Georg Brandl7cae87c2006-09-06 06:51:57 +000075 exec('z = globals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000076 self.assertEqual(m.results, ('z', g))
Georg Brandl7cae87c2006-09-06 06:51:57 +000077 exec('z = locals()', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000078 self.assertEqual(m.results, ('z', m))
79 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000080 exec('z = b', m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000081 except TypeError:
82 pass
83 else:
84 self.fail('Did not validate globals as a real dict')
85
86 class A:
87 "Non-mapping"
88 pass
89 m = A()
90 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000091 exec('z = a', g, m)
Raymond Hettinger66bd2332004-08-02 08:30:07 +000092 except TypeError:
93 pass
94 else:
95 self.fail('Did not validate locals as a mapping')
96
97 # Verify that dict subclasses work as well
98 class D(dict):
99 def __getitem__(self, key):
100 if key == 'a':
101 return 12
102 return dict.__getitem__(self, key)
103 d = D()
Georg Brandl7cae87c2006-09-06 06:51:57 +0000104 exec('z = a', g, d)
Raymond Hettinger66bd2332004-08-02 08:30:07 +0000105 self.assertEqual(d['z'], 12)
106
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000107 def test_extended_arg(self):
108 longexpr = 'x = x or ' + '-x' * 2500
Georg Brandl7cae87c2006-09-06 06:51:57 +0000109 g = {}
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000110 code = '''
111def f(x):
112 %s
113 %s
114 %s
115 %s
116 %s
117 %s
118 %s
119 %s
120 %s
121 %s
122 # the expressions above have no effect, x == argument
123 while x:
124 x -= 1
125 # EXTENDED_ARG/JUMP_ABSOLUTE here
126 return x
127''' % ((longexpr,)*10)
Georg Brandl7cae87c2006-09-06 06:51:57 +0000128 exec(code, g)
129 self.assertEqual(g['f'](5), 0)
Neal Norwitz6ab080c2005-10-24 00:08:10 +0000130
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000131 def test_argument_order(self):
132 try:
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000133 exec('def f(a=1, b): pass')
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000134 self.fail("non-default args after default")
135 except SyntaxError:
136 pass
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000137
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000138 def test_float_literals(self):
139 # testing bad float literals
140 self.assertRaises(SyntaxError, eval, "2e")
141 self.assertRaises(SyntaxError, eval, "2.0e+")
142 self.assertRaises(SyntaxError, eval, "1e-")
143 self.assertRaises(SyntaxError, eval, "3-4e/21")
Jeremy Hylton121b6eb2001-02-19 23:53:42 +0000144
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000145 def test_indentation(self):
146 # testing compile() of indented block w/o trailing newline"
147 s = """
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000148if 1:
149 if 2:
150 pass"""
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000151 compile(s, "<string>", "exec")
152
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000153 # This test is probably specific to CPython and may not generalize
154 # to other implementations. We are trying to ensure that when
155 # the first line of code starts after 256, correct line numbers
156 # in tracebacks are still produced.
157 def test_leading_newlines(self):
158 s256 = "".join(["\n"] * 256 + ["spam"])
159 co = compile(s256, 'fn', 'exec')
160 self.assertEqual(co.co_firstlineno, 257)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000161 self.assertEqual(co.co_lnotab, bytes())
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000162
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000163 def test_literals_with_leading_zeroes(self):
164 for arg in ["077787", "0xj", "0x.", "0e", "090000000000000",
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000165 "080000000000000", "000000000000009", "000000000000008",
166 "0b42", "0BADCAFE", "0o123456789", "0b1.1", "0o4.2",
167 "0b101j2", "0o153j2", "0b100e1", "0o777e1", "0777",
168 "000777", "000000000000007"]:
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000169 self.assertRaises(SyntaxError, eval, arg)
170
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000171 self.assertEqual(eval("0xff"), 255)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000172 self.assertEqual(eval("0777."), 777)
173 self.assertEqual(eval("0777.0"), 777)
174 self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
175 self.assertEqual(eval("0777e1"), 7770)
176 self.assertEqual(eval("0e0"), 0)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000177 self.assertEqual(eval("0000e-012"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000178 self.assertEqual(eval("09.5"), 9.5)
179 self.assertEqual(eval("0777j"), 777j)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000180 self.assertEqual(eval("000"), 0)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000181 self.assertEqual(eval("00j"), 0j)
182 self.assertEqual(eval("00.0"), 0)
183 self.assertEqual(eval("0e3"), 0)
184 self.assertEqual(eval("090000000000000."), 90000000000000.)
185 self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
186 self.assertEqual(eval("090000000000000e0"), 90000000000000.)
187 self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
188 self.assertEqual(eval("090000000000000j"), 90000000000000j)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000189 self.assertEqual(eval("000000000000008."), 8.)
190 self.assertEqual(eval("000000000000009."), 9.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000191 self.assertEqual(eval("0b101010"), 42)
192 self.assertEqual(eval("-0b000000000010"), -2)
193 self.assertEqual(eval("0o777"), 511)
194 self.assertEqual(eval("-0o0000010"), -8)
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000195
196 def test_unary_minus(self):
197 # Verify treatment of unary minus on negative numbers SF bug #660455
Christian Heimesa37d4c62007-12-04 23:02:19 +0000198 if sys.maxsize == 2147483647:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000199 # 32-bit machine
200 all_one_bits = '0xffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000201 self.assertEqual(eval(all_one_bits), 4294967295)
202 self.assertEqual(eval("-" + all_one_bits), -4294967295)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000203 elif sys.maxsize == 9223372036854775807:
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000204 # 64-bit machine
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000205 all_one_bits = '0xffffffffffffffff'
Guido van Rossume2a383d2007-01-15 16:59:06 +0000206 self.assertEqual(eval(all_one_bits), 18446744073709551615)
207 self.assertEqual(eval("-" + all_one_bits), -18446744073709551615)
Guido van Rossum6c9e1302003-11-29 23:52:13 +0000208 else:
209 self.fail("How many bits *does* this machine have???")
Christian Heimesa37d4c62007-12-04 23:02:19 +0000210 # Verify treatment of contant folding on -(sys.maxsize+1)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000211 # i.e. -2147483648 on 32 bit platforms. Should return int, not long.
Christian Heimesa37d4c62007-12-04 23:02:19 +0000212 self.assertTrue(isinstance(eval("%s" % (-sys.maxsize - 1)), int))
213 self.assertTrue(isinstance(eval("%s" % (-sys.maxsize - 2)), int))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000214
Christian Heimesa37d4c62007-12-04 23:02:19 +0000215 if sys.maxsize == 9223372036854775807:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000216 def test_32_63_bit_values(self):
217 a = +4294967296 # 1 << 32
218 b = -4294967296 # 1 << 32
219 c = +281474976710656 # 1 << 48
220 d = -281474976710656 # 1 << 48
221 e = +4611686018427387904 # 1 << 62
222 f = -4611686018427387904 # 1 << 62
223 g = +9223372036854775807 # 1 << 63 - 1
224 h = -9223372036854775807 # 1 << 63 - 1
225
Neal Norwitz221085d2007-02-25 20:55:47 +0000226 for variable in self.test_32_63_bit_values.__code__.co_consts:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000227 if variable is not None:
228 self.assertTrue(isinstance(variable, int))
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000229
230 def test_sequence_unpacking_error(self):
231 # Verify sequence packing/unpacking with "or". SF bug #757818
232 i,j = (1, -1) or (-1, 1)
233 self.assertEqual(i, 1)
234 self.assertEqual(j, -1)
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000235
Raymond Hettinger11a70c72004-07-17 21:46:25 +0000236 def test_none_assignment(self):
237 stmts = [
238 'None = 0',
239 'None += 0',
240 '__builtins__.None = 0',
241 'def None(): pass',
242 'class None: pass',
243 '(a, None) = 0, 0',
244 'for None in range(10): pass',
245 'def f(None): pass',
246 ]
247 for stmt in stmts:
248 stmt += "\n"
249 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
250 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
Tim Petersd507dab2001-08-30 20:51:59 +0000251
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000252 def test_import(self):
253 succeed = [
254 'import sys',
255 'import os, sys',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000256 'import os as bar',
257 'import os.path as bar',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000258 'from __future__ import nested_scopes, generators',
259 'from __future__ import (nested_scopes,\ngenerators)',
260 'from __future__ import (nested_scopes,\ngenerators,)',
261 'from sys import stdin, stderr, stdout',
262 'from sys import (stdin, stderr,\nstdout)',
263 'from sys import (stdin, stderr,\nstdout,)',
264 'from sys import (stdin\n, stderr, stdout)',
265 'from sys import (stdin\n, stderr, stdout,)',
266 'from sys import stdin as si, stdout as so, stderr as se',
267 'from sys import (stdin as si, stdout as so, stderr as se)',
268 'from sys import (stdin as si, stdout as so, stderr as se,)',
269 ]
270 fail = [
271 'import (os, sys)',
272 'import (os), (sys)',
273 'import ((os), (sys))',
274 'import (sys',
275 'import sys)',
276 'import (os,)',
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000277 'import os As bar',
278 'import os.path a bar',
279 'from sys import stdin As stdout',
280 'from sys import stdin a stdout',
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000281 'from (sys) import stdin',
282 'from __future__ import (nested_scopes',
283 'from __future__ import nested_scopes)',
284 'from __future__ import nested_scopes,\ngenerators',
285 'from sys import (stdin',
286 'from sys import stdin)',
287 'from sys import stdin, stdout,\nstderr',
288 'from sys import stdin si',
289 'from sys import stdin,'
290 'from sys import (*)',
291 'from sys import (stdin,, stdout, stderr)',
292 'from sys import (stdin, stdout),',
293 ]
294 for stmt in succeed:
295 compile(stmt, 'tmp', 'exec')
296 for stmt in fail:
297 self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
298
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000299 def test_for_distinct_code_objects(self):
300 # SF bug 1048870
301 def f():
302 f1 = lambda x=1: x
303 f2 = lambda x=2: x
304 return f1, f2
305 f1, f2 = f()
Neal Norwitz221085d2007-02-25 20:55:47 +0000306 self.assertNotEqual(id(f1.__code__), id(f2.__code__))
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000307
Guido van Rossumf8761c72007-07-22 20:01:13 +0000308## def test_unicode_encoding(self):
309## code = "# -*- coding: utf-8 -*-\npass\n"
310## self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000311
Nick Coghlaneadee9a2006-03-13 12:31:58 +0000312 def test_subscripts(self):
313 # SF bug 1448804
314 # Class to make testing subscript results easy
315 class str_map(object):
316 def __init__(self):
317 self.data = {}
318 def __getitem__(self, key):
319 return self.data[str(key)]
320 def __setitem__(self, key, value):
321 self.data[str(key)] = value
322 def __delitem__(self, key):
323 del self.data[str(key)]
324 def __contains__(self, key):
325 return str(key) in self.data
326 d = str_map()
327 # Index
328 d[1] = 1
329 self.assertEqual(d[1], 1)
330 d[1] += 1
331 self.assertEqual(d[1], 2)
332 del d[1]
333 self.assertEqual(1 in d, False)
334 # Tuple of indices
335 d[1, 1] = 1
336 self.assertEqual(d[1, 1], 1)
337 d[1, 1] += 1
338 self.assertEqual(d[1, 1], 2)
339 del d[1, 1]
340 self.assertEqual((1, 1) in d, False)
341 # Simple slice
342 d[1:2] = 1
343 self.assertEqual(d[1:2], 1)
344 d[1:2] += 1
345 self.assertEqual(d[1:2], 2)
346 del d[1:2]
347 self.assertEqual(slice(1, 2) in d, False)
348 # Tuple of simple slices
349 d[1:2, 1:2] = 1
350 self.assertEqual(d[1:2, 1:2], 1)
351 d[1:2, 1:2] += 1
352 self.assertEqual(d[1:2, 1:2], 2)
353 del d[1:2, 1:2]
354 self.assertEqual((slice(1, 2), slice(1, 2)) in d, False)
355 # Extended slice
356 d[1:2:3] = 1
357 self.assertEqual(d[1:2:3], 1)
358 d[1:2:3] += 1
359 self.assertEqual(d[1:2:3], 2)
360 del d[1:2:3]
361 self.assertEqual(slice(1, 2, 3) in d, False)
362 # Tuple of extended slices
363 d[1:2:3, 1:2:3] = 1
364 self.assertEqual(d[1:2:3, 1:2:3], 1)
365 d[1:2:3, 1:2:3] += 1
366 self.assertEqual(d[1:2:3, 1:2:3], 2)
367 del d[1:2:3, 1:2:3]
368 self.assertEqual((slice(1, 2, 3), slice(1, 2, 3)) in d, False)
369 # Ellipsis
370 d[...] = 1
371 self.assertEqual(d[...], 1)
372 d[...] += 1
373 self.assertEqual(d[...], 2)
374 del d[...]
375 self.assertEqual(Ellipsis in d, False)
376 # Tuple of Ellipses
377 d[..., ...] = 1
378 self.assertEqual(d[..., ...], 1)
379 d[..., ...] += 1
380 self.assertEqual(d[..., ...], 2)
381 del d[..., ...]
382 self.assertEqual((Ellipsis, Ellipsis) in d, False)
383
Guido van Rossum0240b922007-02-26 21:23:50 +0000384 def test_annotation_limit(self):
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000385 # 16 bits are available for # of annotations, but only 8 bits are
386 # available for the parameter count, hence 255
Guido van Rossum0240b922007-02-26 21:23:50 +0000387 # is the max. Ensure the result of too many annotations is a
388 # SyntaxError.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000389 s = "def f(%s): pass"
390 s %= ', '.join('a%d:%d' % (i,i) for i in range(256))
Guido van Rossum0240b922007-02-26 21:23:50 +0000391 self.assertRaises(SyntaxError, compile, s, '?', 'exec')
392 # Test that the max # of annotations compiles.
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000393 s = "def f(%s): pass"
394 s %= ', '.join('a%d:%d' % (i,i) for i in range(255))
Guido van Rossum0240b922007-02-26 21:23:50 +0000395 compile(s, '?', 'exec')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000396
397 def test_mangling(self):
398 class A:
399 def f():
400 __mangled = 1
401 __not_mangled__ = 2
402 import __mangled_mod
403 import __package__.module
404
405 self.assert_("_A__mangled" in A.f.__code__.co_varnames)
406 self.assert_("__not_mangled__" in A.f.__code__.co_varnames)
407 self.assert_("_A__mangled_mod" in A.f.__code__.co_varnames)
408 self.assert_("__package__" in A.f.__code__.co_varnames)
409
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000410 def test_compile_ast(self):
411 fname = __file__
412 if fname.lower().endswith(('pyc', 'pyo')):
413 fname = fname[:-1]
414 with open(fname, 'r') as f:
415 fcontents = f.read()
416 sample_code = [
417 ['<assign>', 'x = 5'],
418 ['<ifblock>', """if True:\n pass\n"""],
419 ['<forblock>', """for n in [1, 2, 3]:\n print(n)\n"""],
420 ['<deffunc>', """def foo():\n pass\nfoo()\n"""],
421 [fname, fcontents],
422 ]
423
424 for fname, code in sample_code:
425 co1 = compile(code, '%s1' % fname, 'exec')
426 ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
427 self.assert_(type(ast) == _ast.Module)
428 co2 = compile(ast, '%s3' % fname, 'exec')
429 self.assertEqual(co1, co2)
Neal Norwitzdb4115f2008-03-31 04:20:05 +0000430 # the code object's filename comes from the second compilation step
431 self.assertEqual(co2.co_filename, '%s3' % fname)
432
433 # raise exception when node type doesn't match with compile mode
434 co1 = compile('print(1)', '<string>', 'exec', _ast.PyCF_ONLY_AST)
435 self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')
436
437 # raise exception when node type is no start node
438 self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')
439
440 # raise exception when node has invalid children
441 ast = _ast.Module()
442 ast.body = [_ast.BoolOp()]
443 self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
Martin v. Löwis618dc5e2008-03-30 20:03:44 +0000444
445
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000446def test_main():
447 test_support.run_unittest(TestSpecifics)
Tim Petersd507dab2001-08-30 20:51:59 +0000448
Raymond Hettinger8a99b502003-06-23 13:36:57 +0000449if __name__ == "__main__":
450 test_main()