blob: cb3702189118b2ae6a949bf6c7f8fed58643c48f [file] [log] [blame]
Guido van Rossum3bead091992-01-27 17:00:37 +00001# Python test set -- part 1, grammar.
2# This just tests whether the parser accepts them all.
3
Guido van Rossumf0253f22002-08-29 14:57:26 +00004# NOTE: When you run this test as a script from the command line, you
5# get warnings about certain hex/oct constants. Since those are
6# issued by the parser, you can't suppress them by adding a
7# filterwarnings() call to this module. Therefore, to shut up the
8# regression test, the filterwarnings() call has been added to
9# regrtest.py.
10
Thomas Wouters89f507f2006-12-13 04:49:30 +000011from test.test_support import run_unittest, check_syntax_error
12import unittest
Jeremy Hylton7d3dff22001-10-10 01:45:02 +000013import sys
Thomas Wouters89f507f2006-12-13 04:49:30 +000014# testing import *
15from sys import *
Guido van Rossum3bead091992-01-27 17:00:37 +000016
Thomas Wouters89f507f2006-12-13 04:49:30 +000017class TokenTests(unittest.TestCase):
Guido van Rossum3bead091992-01-27 17:00:37 +000018
Thomas Wouters89f507f2006-12-13 04:49:30 +000019 def testBackslash(self):
20 # Backslash means line continuation:
21 x = 1 \
22 + 1
23 self.assertEquals(x, 2, 'backslash for line continuation')
Guido van Rossum3bead091992-01-27 17:00:37 +000024
Thomas Wouters89f507f2006-12-13 04:49:30 +000025 # Backslash does not means continuation in comments :\
26 x = 0
27 self.assertEquals(x, 0, 'backslash ending comment')
Guido van Rossum3bead091992-01-27 17:00:37 +000028
Thomas Wouters89f507f2006-12-13 04:49:30 +000029 def testPlainIntegers(self):
30 self.assertEquals(0xff, 255)
31 self.assertEquals(0377, 255)
32 self.assertEquals(2147483647, 017777777777)
33 from sys import maxint
34 if maxint == 2147483647:
35 self.assertEquals(-2147483647-1, -020000000000)
36 # XXX -2147483648
37 self.assert_(037777777777 > 0)
38 self.assert_(0xffffffff > 0)
39 for s in '2147483648', '040000000000', '0x100000000':
40 try:
41 x = eval(s)
42 except OverflowError:
43 self.fail("OverflowError on huge integer literal %r" % s)
44 elif maxint == 9223372036854775807:
45 self.assertEquals(-9223372036854775807-1, -01000000000000000000000)
46 self.assert_(01777777777777777777777 > 0)
47 self.assert_(0xffffffffffffffff > 0)
48 for s in '9223372036854775808', '02000000000000000000000', \
49 '0x10000000000000000':
50 try:
51 x = eval(s)
52 except OverflowError:
53 self.fail("OverflowError on huge integer literal %r" % s)
54 else:
55 self.fail('Weird maxint value %r' % maxint)
Guido van Rossum3bead091992-01-27 17:00:37 +000056
Thomas Wouters89f507f2006-12-13 04:49:30 +000057 def testLongIntegers(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +000058 x = 0
59 x = 0
60 x = 0xffffffffffffffff
61 x = 0xffffffffffffffff
62 x = 077777777777777777
63 x = 077777777777777777
64 x = 123456789012345678901234567890
65 x = 123456789012345678901234567890
Guido van Rossum3bead091992-01-27 17:00:37 +000066
Thomas Wouters89f507f2006-12-13 04:49:30 +000067 def testFloats(self):
68 x = 3.14
69 x = 314.
70 x = 0.314
71 # XXX x = 000.314
72 x = .314
73 x = 3e14
74 x = 3E14
75 x = 3e-14
76 x = 3e+14
77 x = 3.e14
78 x = .3e14
79 x = 3.1e4
Guido van Rossum3bead091992-01-27 17:00:37 +000080
Thomas Wouters89f507f2006-12-13 04:49:30 +000081 def testStringLiterals(self):
82 x = ''; y = ""; self.assert_(len(x) == 0 and x == y)
83 x = '\''; y = "'"; self.assert_(len(x) == 1 and x == y and ord(x) == 39)
84 x = '"'; y = "\""; self.assert_(len(x) == 1 and x == y and ord(x) == 34)
85 x = "doesn't \"shrink\" does it"
86 y = 'doesn\'t "shrink" does it'
87 self.assert_(len(x) == 24 and x == y)
88 x = "does \"shrink\" doesn't it"
89 y = 'does "shrink" doesn\'t it'
90 self.assert_(len(x) == 24 and x == y)
91 x = """
Guido van Rossumb6775db1994-08-01 11:34:53 +000092The "quick"
93brown fox
94jumps over
95the 'lazy' dog.
96"""
Thomas Wouters89f507f2006-12-13 04:49:30 +000097 y = '\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n'
98 self.assertEquals(x, y)
99 y = '''
Guido van Rossumb6775db1994-08-01 11:34:53 +0000100The "quick"
101brown fox
102jumps over
103the 'lazy' dog.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000104'''
105 self.assertEquals(x, y)
106 y = "\n\
Guido van Rossumb6775db1994-08-01 11:34:53 +0000107The \"quick\"\n\
108brown fox\n\
109jumps over\n\
110the 'lazy' dog.\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +0000111"
112 self.assertEquals(x, y)
113 y = '\n\
Guido van Rossumb6775db1994-08-01 11:34:53 +0000114The \"quick\"\n\
115brown fox\n\
116jumps over\n\
117the \'lazy\' dog.\n\
Thomas Wouters89f507f2006-12-13 04:49:30 +0000118'
119 self.assertEquals(x, y)
120
121 def testEllipsis(self):
122 x = ...
123 self.assert_(x is Ellipsis)
124
125class GrammarTests(unittest.TestCase):
126
127 # single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
128 # XXX can't test in a script -- this rule is only used when interactive
129
130 # file_input: (NEWLINE | stmt)* ENDMARKER
131 # Being tested as this very moment this very module
132
133 # expr_input: testlist NEWLINE
134 # XXX Hard to test -- used only in calls to input()
135
136 def testEvalInput(self):
137 # testlist ENDMARKER
138 x = eval('1, 0 or 1')
139
140 def testFuncdef(self):
Neal Norwitzc1505362006-12-28 06:47:50 +0000141 ### [decorators] 'def' NAME parameters ['->' test] ':' suite
142 ### decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
143 ### decorators: decorator+
144 ### parameters: '(' [typedargslist] ')'
145 ### typedargslist: ((tfpdef ['=' test] ',')*
146 ### ('*' [tname] (',' tname ['=' test])* [',' '**' tname] | '**' tname)
147 ### | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
148 ### tname: NAME [':' test]
149 ### tfpdef: tname | '(' tfplist ')'
150 ### tfplist: tfpdef (',' tfpdef)* [',']
151 ### varargslist: ((vfpdef ['=' test] ',')*
152 ### ('*' [vname] (',' vname ['=' test])* [',' '**' vname] | '**' vname)
153 ### | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
154 ### vname: NAME
155 ### vfpdef: vname | '(' vfplist ')'
156 ### vfplist: vfpdef (',' vfpdef)* [',']
Thomas Wouters89f507f2006-12-13 04:49:30 +0000157 def f1(): pass
158 f1()
159 f1(*())
160 f1(*(), **{})
161 def f2(one_argument): pass
162 def f3(two, arguments): pass
163 def f4(two, (compound, (argument, list))): pass
164 def f5((compound, first), two): pass
Neal Norwitz221085d2007-02-25 20:55:47 +0000165 self.assertEquals(f2.__code__.co_varnames, ('one_argument',))
166 self.assertEquals(f3.__code__.co_varnames, ('two', 'arguments'))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000167 if sys.platform.startswith('java'):
Neal Norwitz221085d2007-02-25 20:55:47 +0000168 self.assertEquals(f4.__code__.co_varnames,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000169 ('two', '(compound, (argument, list))', 'compound', 'argument',
170 'list',))
Neal Norwitz221085d2007-02-25 20:55:47 +0000171 self.assertEquals(f5.__code__.co_varnames,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000172 ('(compound, first)', 'two', 'compound', 'first'))
173 else:
Neal Norwitz221085d2007-02-25 20:55:47 +0000174 self.assertEquals(f4.__code__.co_varnames,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000175 ('two', '.1', 'compound', 'argument', 'list'))
Neal Norwitz221085d2007-02-25 20:55:47 +0000176 self.assertEquals(f5.__code__.co_varnames,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000177 ('.0', 'two', 'compound', 'first'))
178 def a1(one_arg,): pass
179 def a2(two, args,): pass
180 def v0(*rest): pass
181 def v1(a, *rest): pass
182 def v2(a, b, *rest): pass
183 def v3(a, (b, c), *rest): return a, b, c, rest
184
185 f1()
186 f2(1)
187 f2(1,)
188 f3(1, 2)
189 f3(1, 2,)
190 f4(1, (2, (3, 4)))
191 v0()
192 v0(1)
193 v0(1,)
194 v0(1,2)
195 v0(1,2,3,4,5,6,7,8,9,0)
196 v1(1)
197 v1(1,)
198 v1(1,2)
199 v1(1,2,3)
200 v1(1,2,3,4,5,6,7,8,9,0)
201 v2(1,2)
202 v2(1,2,3)
203 v2(1,2,3,4)
204 v2(1,2,3,4,5,6,7,8,9,0)
205 v3(1,(2,3))
206 v3(1,(2,3),4)
207 v3(1,(2,3),4,5,6,7,8,9,0)
208
209 # ceval unpacks the formal arguments into the first argcount names;
210 # thus, the names nested inside tuples must appear after these names.
211 if sys.platform.startswith('java'):
Neal Norwitz221085d2007-02-25 20:55:47 +0000212 self.assertEquals(v3.__code__.co_varnames, ('a', '(b, c)', 'rest', 'b', 'c'))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000213 else:
Neal Norwitz221085d2007-02-25 20:55:47 +0000214 self.assertEquals(v3.__code__.co_varnames, ('a', '.1', 'rest', 'b', 'c'))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000215 self.assertEquals(v3(1, (2, 3), 4), (1, 2, 3, (4,)))
216 def d01(a=1): pass
217 d01()
218 d01(1)
219 d01(*(1,))
220 d01(**{'a':2})
221 def d11(a, b=1): pass
222 d11(1)
223 d11(1, 2)
224 d11(1, **{'b':2})
225 def d21(a, b, c=1): pass
226 d21(1, 2)
227 d21(1, 2, 3)
228 d21(*(1, 2, 3))
229 d21(1, *(2, 3))
230 d21(1, 2, *(3,))
231 d21(1, 2, **{'c':3})
232 def d02(a=1, b=2): pass
233 d02()
234 d02(1)
235 d02(1, 2)
236 d02(*(1, 2))
237 d02(1, *(2,))
238 d02(1, **{'b':2})
239 d02(**{'a': 1, 'b': 2})
240 def d12(a, b=1, c=2): pass
241 d12(1)
242 d12(1, 2)
243 d12(1, 2, 3)
244 def d22(a, b, c=1, d=2): pass
245 d22(1, 2)
246 d22(1, 2, 3)
247 d22(1, 2, 3, 4)
248 def d01v(a=1, *rest): pass
249 d01v()
250 d01v(1)
251 d01v(1, 2)
252 d01v(*(1, 2, 3, 4))
253 d01v(*(1,))
254 d01v(**{'a':2})
255 def d11v(a, b=1, *rest): pass
256 d11v(1)
257 d11v(1, 2)
258 d11v(1, 2, 3)
259 def d21v(a, b, c=1, *rest): pass
260 d21v(1, 2)
261 d21v(1, 2, 3)
262 d21v(1, 2, 3, 4)
263 d21v(*(1, 2, 3, 4))
264 d21v(1, 2, **{'c': 3})
265 def d02v(a=1, b=2, *rest): pass
266 d02v()
267 d02v(1)
268 d02v(1, 2)
269 d02v(1, 2, 3)
270 d02v(1, *(2, 3, 4))
271 d02v(**{'a': 1, 'b': 2})
272 def d12v(a, b=1, c=2, *rest): pass
273 d12v(1)
274 d12v(1, 2)
275 d12v(1, 2, 3)
276 d12v(1, 2, 3, 4)
277 d12v(*(1, 2, 3, 4))
278 d12v(1, 2, *(3, 4, 5))
279 d12v(1, *(2,), **{'c': 3})
280 def d22v(a, b, c=1, d=2, *rest): pass
281 d22v(1, 2)
282 d22v(1, 2, 3)
283 d22v(1, 2, 3, 4)
284 d22v(1, 2, 3, 4, 5)
285 d22v(*(1, 2, 3, 4))
286 d22v(1, 2, *(3, 4, 5))
287 d22v(1, *(2, 3), **{'d': 4})
288 def d31v((x)): pass
289 d31v(1)
290 def d32v((x,)): pass
291 d32v((1,))
292 # keyword only argument tests
293 def pos0key1(*, key): return key
294 pos0key1(key=100)
295 def pos2key2(p1, p2, *, k1, k2=100): return p1,p2,k1,k2
296 pos2key2(1, 2, k1=100)
297 pos2key2(1, 2, k1=100, k2=200)
298 pos2key2(1, 2, k2=100, k1=200)
299 def pos2key2dict(p1, p2, *, k1=100, k2, **kwarg): return p1,p2,k1,k2,kwarg
300 pos2key2dict(1,2,k2=100,tokwarg1=100,tokwarg2=200)
301 pos2key2dict(1,2,tokwarg1=100,tokwarg2=200, k2=100)
302
Neal Norwitzc1505362006-12-28 06:47:50 +0000303 # argument annotation tests
304 def f(x) -> list: pass
Neal Norwitz221085d2007-02-25 20:55:47 +0000305 self.assertEquals(f.__annotations__, {'return': list})
Neal Norwitzc1505362006-12-28 06:47:50 +0000306 def f(x:int): pass
Neal Norwitz221085d2007-02-25 20:55:47 +0000307 self.assertEquals(f.__annotations__, {'x': int})
Neal Norwitzc1505362006-12-28 06:47:50 +0000308 def f(*x:str): pass
Neal Norwitz221085d2007-02-25 20:55:47 +0000309 self.assertEquals(f.__annotations__, {'x': str})
Neal Norwitzc1505362006-12-28 06:47:50 +0000310 def f(**x:float): pass
Neal Norwitz221085d2007-02-25 20:55:47 +0000311 self.assertEquals(f.__annotations__, {'x': float})
Neal Norwitzc1505362006-12-28 06:47:50 +0000312 def f(x, y:1+2): pass
Neal Norwitz221085d2007-02-25 20:55:47 +0000313 self.assertEquals(f.__annotations__, {'y': 3})
Neal Norwitzc1505362006-12-28 06:47:50 +0000314 def f(a, (b:1, c:2, d)): pass
Neal Norwitz221085d2007-02-25 20:55:47 +0000315 self.assertEquals(f.__annotations__, {'b': 1, 'c': 2})
Neal Norwitzc1505362006-12-28 06:47:50 +0000316 def f(a, (b:1, c:2, d), e:3=4, f=5, *g:6): pass
Neal Norwitz221085d2007-02-25 20:55:47 +0000317 self.assertEquals(f.__annotations__,
Neal Norwitzc1505362006-12-28 06:47:50 +0000318 {'b': 1, 'c': 2, 'e': 3, 'g': 6})
319 def f(a, (b:1, c:2, d), e:3=4, f=5, *g:6, h:7, i=8, j:9=10,
320 **k:11) -> 12: pass
Neal Norwitz221085d2007-02-25 20:55:47 +0000321 self.assertEquals(f.__annotations__,
Neal Norwitzc1505362006-12-28 06:47:50 +0000322 {'b': 1, 'c': 2, 'e': 3, 'g': 6, 'h': 7, 'j': 9,
323 'k': 11, 'return': 12})
324
Thomas Wouters89f507f2006-12-13 04:49:30 +0000325 def testLambdef(self):
326 ### lambdef: 'lambda' [varargslist] ':' test
327 l1 = lambda : 0
328 self.assertEquals(l1(), 0)
329 l2 = lambda : a[d] # XXX just testing the expression
Guido van Rossume2a383d2007-01-15 16:59:06 +0000330 l3 = lambda : [2 < x for x in [-1, 3, 0]]
Thomas Wouters89f507f2006-12-13 04:49:30 +0000331 self.assertEquals(l3(), [0, 1, 0])
332 l4 = lambda x = lambda y = lambda z=1 : z : y() : x()
333 self.assertEquals(l4(), 1)
334 l5 = lambda x, y, z=2: x + y + z
335 self.assertEquals(l5(1, 2), 5)
336 self.assertEquals(l5(1, 2, 3), 6)
337 check_syntax_error(self, "lambda x: x = 2")
338 l6 = lambda x, y, *, k=20: x+y+k
339 self.assertEquals(l6(1,2), 1+2+20)
340 self.assertEquals(l6(1,2,k=10), 1+2+10)
Guido van Rossumb31c7f71993-11-11 10:31:23 +0000341
342
Thomas Wouters89f507f2006-12-13 04:49:30 +0000343 ### stmt: simple_stmt | compound_stmt
344 # Tested below
Georg Brandl52318d62006-09-06 07:06:08 +0000345
Thomas Wouters89f507f2006-12-13 04:49:30 +0000346 def testSimpleStmt(self):
347 ### simple_stmt: small_stmt (';' small_stmt)* [';']
348 x = 1; pass; del x
349 def foo():
350 # verify statments that end with semi-colons
351 x = 1; pass; del x;
352 foo()
Georg Brandl52318d62006-09-06 07:06:08 +0000353
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000354 ### small_stmt: expr_stmt | pass_stmt | del_stmt | flow_stmt | import_stmt | global_stmt | access_stmt
Thomas Wouters89f507f2006-12-13 04:49:30 +0000355 # Tested below
Georg Brandl52318d62006-09-06 07:06:08 +0000356
Thomas Wouters89f507f2006-12-13 04:49:30 +0000357 def testExprStmt(self):
358 # (exprlist '=')* exprlist
359 1
360 1, 2, 3
361 x = 1
362 x = 1, 2, 3
363 x = y = z = 1, 2, 3
364 x, y, z = 1, 2, 3
365 abc = a, b, c = x, y, z = xyz = 1, 2, (3, 4)
Guido van Rossum3bead091992-01-27 17:00:37 +0000366
Thomas Wouters89f507f2006-12-13 04:49:30 +0000367 check_syntax_error(self, "x + 1 = 1")
368 check_syntax_error(self, "a + 1 = b + 2")
Guido van Rossum3bead091992-01-27 17:00:37 +0000369
Thomas Wouters89f507f2006-12-13 04:49:30 +0000370 def testDelStmt(self):
371 # 'del' exprlist
372 abc = [1,2,3]
373 x, y, z = abc
374 xyz = x, y, z
Barry Warsaw7e3e1c12000-10-11 21:26:03 +0000375
Thomas Wouters89f507f2006-12-13 04:49:30 +0000376 del abc
377 del x, y, (z, xyz)
Barry Warsaw9182b452000-08-29 04:57:10 +0000378
Thomas Wouters89f507f2006-12-13 04:49:30 +0000379 def testPassStmt(self):
380 # 'pass'
381 pass
Barry Warsaw9182b452000-08-29 04:57:10 +0000382
Thomas Wouters89f507f2006-12-13 04:49:30 +0000383 # flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
384 # Tested below
Barry Warsaw9182b452000-08-29 04:57:10 +0000385
Thomas Wouters89f507f2006-12-13 04:49:30 +0000386 def testBreakStmt(self):
387 # 'break'
388 while 1: break
Barry Warsaw9182b452000-08-29 04:57:10 +0000389
Thomas Wouters89f507f2006-12-13 04:49:30 +0000390 def testContinueStmt(self):
391 # 'continue'
392 i = 1
393 while i: i = 0; continue
Barry Warsaw9182b452000-08-29 04:57:10 +0000394
Thomas Wouters89f507f2006-12-13 04:49:30 +0000395 msg = ""
396 while not msg:
397 msg = "ok"
398 try:
399 continue
400 msg = "continue failed to continue inside try"
401 except:
402 msg = "continue inside try called except block"
403 if msg != "ok":
404 self.fail(msg)
Barry Warsawefc92ee2000-08-21 15:46:50 +0000405
Thomas Wouters89f507f2006-12-13 04:49:30 +0000406 msg = ""
407 while not msg:
408 msg = "finally block not called"
409 try:
410 continue
411 finally:
412 msg = "ok"
413 if msg != "ok":
414 self.fail(msg)
Guido van Rossum3bead091992-01-27 17:00:37 +0000415
Thomas Wouters89f507f2006-12-13 04:49:30 +0000416 def test_break_continue_loop(self):
417 # This test warrants an explanation. It is a test specifically for SF bugs
418 # #463359 and #462937. The bug is that a 'break' statement executed or
419 # exception raised inside a try/except inside a loop, *after* a continue
420 # statement has been executed in that loop, will cause the wrong number of
421 # arguments to be popped off the stack and the instruction pointer reset to
422 # a very small number (usually 0.) Because of this, the following test
423 # *must* written as a function, and the tracking vars *must* be function
424 # arguments with default values. Otherwise, the test will loop and loop.
Guido van Rossum3bead091992-01-27 17:00:37 +0000425
Thomas Wouters89f507f2006-12-13 04:49:30 +0000426 def test_inner(extra_burning_oil = 1, count=0):
427 big_hippo = 2
428 while big_hippo:
429 count += 1
430 try:
431 if extra_burning_oil and big_hippo == 1:
432 extra_burning_oil -= 1
433 break
434 big_hippo -= 1
435 continue
436 except:
437 raise
438 if count > 2 or big_hippo != 1:
439 self.fail("continue then break in try/except in loop broken!")
440 test_inner()
Guido van Rossum3bead091992-01-27 17:00:37 +0000441
Thomas Wouters89f507f2006-12-13 04:49:30 +0000442 def testReturn(self):
443 # 'return' [testlist]
444 def g1(): return
445 def g2(): return 1
446 g1()
447 x = g2()
448 check_syntax_error(self, "class foo:return 1")
Guido van Rossum3bead091992-01-27 17:00:37 +0000449
Thomas Wouters89f507f2006-12-13 04:49:30 +0000450 def testYield(self):
451 check_syntax_error(self, "class foo:yield 1")
Guido van Rossum3bead091992-01-27 17:00:37 +0000452
Thomas Wouters89f507f2006-12-13 04:49:30 +0000453 def testRaise(self):
454 # 'raise' test [',' test]
455 try: raise RuntimeError, 'just testing'
456 except RuntimeError: pass
457 try: raise KeyboardInterrupt
458 except KeyboardInterrupt: pass
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000459
Thomas Wouters89f507f2006-12-13 04:49:30 +0000460 def testImport(self):
461 # 'import' dotted_as_names
462 import sys
463 import time, sys
464 # 'from' dotted_name 'import' ('*' | '(' import_as_names ')' | import_as_names)
465 from time import time
466 from time import (time)
467 # not testable inside a function, but already done at top of the module
468 # from sys import *
469 from sys import path, argv
470 from sys import (path, argv)
471 from sys import (path, argv,)
Tim Peters10fb3862001-02-09 20:17:14 +0000472
Thomas Wouters89f507f2006-12-13 04:49:30 +0000473 def testGlobal(self):
474 # 'global' NAME (',' NAME)*
475 global a
476 global a, b
477 global one, two, three, four, five, six, seven, eight, nine, ten
Thomas Wouters80d373c2001-09-26 12:43:39 +0000478
Thomas Wouters89f507f2006-12-13 04:49:30 +0000479 def testAssert(self):
480 # assert_stmt: 'assert' test [',' test]
481 assert 1
482 assert 1, 1
483 assert lambda x:x
484 assert 1, lambda x:x+1
Thomas Wouters80d373c2001-09-26 12:43:39 +0000485 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000486 assert 0, "msg"
Guido van Rossumb940e112007-01-10 16:19:56 +0000487 except AssertionError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000488 self.assertEquals(e.args[0], "msg")
489 else:
490 if __debug__:
491 self.fail("AssertionError not raised by assert 0")
Thomas Wouters80d373c2001-09-26 12:43:39 +0000492
Thomas Wouters89f507f2006-12-13 04:49:30 +0000493 ### compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef
494 # Tested below
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000495
Thomas Wouters89f507f2006-12-13 04:49:30 +0000496 def testIf(self):
497 # 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
498 if 1: pass
499 if 1: pass
500 else: pass
501 if 0: pass
502 elif 0: pass
503 if 0: pass
504 elif 0: pass
505 elif 0: pass
506 elif 0: pass
507 else: pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000508
Thomas Wouters89f507f2006-12-13 04:49:30 +0000509 def testWhile(self):
510 # 'while' test ':' suite ['else' ':' suite]
511 while 0: pass
512 while 0: pass
513 else: pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000514
Thomas Wouters89f507f2006-12-13 04:49:30 +0000515 def testFor(self):
516 # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite]
517 for i in 1, 2, 3: pass
518 for i, j, k in (): pass
519 else: pass
520 class Squares:
521 def __init__(self, max):
522 self.max = max
523 self.sofar = []
524 def __len__(self): return len(self.sofar)
525 def __getitem__(self, i):
526 if not 0 <= i < self.max: raise IndexError
527 n = len(self.sofar)
528 while n <= i:
529 self.sofar.append(n*n)
530 n = n+1
531 return self.sofar[i]
532 n = 0
533 for x in Squares(10): n = n+x
534 if n != 285:
535 self.fail('for over growing sequence')
Guido van Rossum3bead091992-01-27 17:00:37 +0000536
Thomas Wouters89f507f2006-12-13 04:49:30 +0000537 result = []
538 for x, in [(1,), (2,), (3,)]:
539 result.append(x)
540 self.assertEqual(result, [1, 2, 3])
Guido van Rossum3bead091992-01-27 17:00:37 +0000541
Thomas Wouters89f507f2006-12-13 04:49:30 +0000542 def testTry(self):
543 ### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
544 ### | 'try' ':' suite 'finally' ':' suite
Guido van Rossumb940e112007-01-10 16:19:56 +0000545 ### except_clause: 'except' [expr ['as' expr]]
Thomas Wouters89f507f2006-12-13 04:49:30 +0000546 try:
547 1/0
548 except ZeroDivisionError:
549 pass
550 else:
551 pass
552 try: 1/0
553 except EOFError: pass
Guido van Rossumb940e112007-01-10 16:19:56 +0000554 except TypeError as msg: pass
555 except RuntimeError as msg: pass
Thomas Wouters89f507f2006-12-13 04:49:30 +0000556 except: pass
557 else: pass
558 try: 1/0
559 except (EOFError, TypeError, ZeroDivisionError): pass
560 try: 1/0
Guido van Rossumb940e112007-01-10 16:19:56 +0000561 except (EOFError, TypeError, ZeroDivisionError) as msg: pass
Thomas Wouters89f507f2006-12-13 04:49:30 +0000562 try: pass
563 finally: pass
Jeremy Hyltonf828e2d2001-02-19 15:54:52 +0000564
Thomas Wouters89f507f2006-12-13 04:49:30 +0000565 def testSuite(self):
566 # simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT
567 if 1: pass
568 if 1:
569 pass
570 if 1:
571 #
572 #
573 #
574 pass
575 pass
576 #
577 pass
578 #
Guido van Rossum3bead091992-01-27 17:00:37 +0000579
Thomas Wouters89f507f2006-12-13 04:49:30 +0000580 def testTest(self):
581 ### and_test ('or' and_test)*
582 ### and_test: not_test ('and' not_test)*
583 ### not_test: 'not' not_test | comparison
584 if not 1: pass
585 if 1 and 1: pass
586 if 1 or 1: pass
587 if not not not 1: pass
588 if not 1 and 1 and 1: pass
589 if 1 and 1 or 1 and 1 and 1 or not 1 and 1: pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000590
Thomas Wouters89f507f2006-12-13 04:49:30 +0000591 def testComparison(self):
592 ### comparison: expr (comp_op expr)*
593 ### comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'|'is' 'not'
594 if 1: pass
595 x = (1 == 1)
596 if 1 == 1: pass
597 if 1 != 1: pass
598 if 1 < 1: pass
599 if 1 > 1: pass
600 if 1 <= 1: pass
601 if 1 >= 1: pass
602 if 1 is 1: pass
603 if 1 is not 1: pass
604 if 1 in (): pass
605 if 1 not in (): pass
606 if 1 < 1 > 1 == 1 >= 1 <= 1 != 1 in 1 not in 1 is 1 is not 1: pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000607
Thomas Wouters89f507f2006-12-13 04:49:30 +0000608 def testBinaryMaskOps(self):
609 x = 1 & 1
610 x = 1 ^ 1
611 x = 1 | 1
Guido van Rossum3bead091992-01-27 17:00:37 +0000612
Thomas Wouters89f507f2006-12-13 04:49:30 +0000613 def testShiftOps(self):
614 x = 1 << 1
615 x = 1 >> 1
616 x = 1 << 1 >> 1
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000617
Thomas Wouters89f507f2006-12-13 04:49:30 +0000618 def testAdditiveOps(self):
619 x = 1
620 x = 1 + 1
621 x = 1 - 1 - 1
622 x = 1 - 1 + 1 - 1 + 1
Guido van Rossum3bead091992-01-27 17:00:37 +0000623
Thomas Wouters89f507f2006-12-13 04:49:30 +0000624 def testMultiplicativeOps(self):
625 x = 1 * 1
626 x = 1 / 1
627 x = 1 % 1
628 x = 1 / 1 * 1 % 1
Guido van Rossum3bead091992-01-27 17:00:37 +0000629
Thomas Wouters89f507f2006-12-13 04:49:30 +0000630 def testUnaryOps(self):
631 x = +1
632 x = -1
633 x = ~1
634 x = ~1 ^ 1 & 1 | 1 & 1 ^ -1
635 x = -1*1/1 + 1*1 - ---1*1
Guido van Rossum3bead091992-01-27 17:00:37 +0000636
Thomas Wouters89f507f2006-12-13 04:49:30 +0000637 def testSelectors(self):
638 ### trailer: '(' [testlist] ')' | '[' subscript ']' | '.' NAME
639 ### subscript: expr | [expr] ':' [expr]
Guido van Rossum3bead091992-01-27 17:00:37 +0000640
Thomas Wouters89f507f2006-12-13 04:49:30 +0000641 import sys, time
642 c = sys.path[0]
643 x = time.time()
644 x = sys.modules['time'].time()
645 a = '01234'
646 c = a[0]
647 c = a[-1]
648 s = a[0:5]
649 s = a[:5]
650 s = a[0:]
651 s = a[:]
652 s = a[-5:]
653 s = a[:-1]
654 s = a[-4:-3]
655 # A rough test of SF bug 1333982. http://python.org/sf/1333982
656 # The testing here is fairly incomplete.
657 # Test cases should include: commas with 1 and 2 colons
658 d = {}
659 d[1] = 1
660 d[1,] = 2
661 d[1,2] = 3
662 d[1,2,3] = 4
663 L = list(d)
664 L.sort(key=lambda x: x if isinstance(x, tuple) else ())
665 self.assertEquals(str(L), '[1, (1,), (1, 2), (1, 2, 3)]')
Guido van Rossum3bead091992-01-27 17:00:37 +0000666
Thomas Wouters89f507f2006-12-13 04:49:30 +0000667 def testAtoms(self):
668 ### atom: '(' [testlist] ')' | '[' [testlist] ']' | '{' [dictsetmaker] '}' | NAME | NUMBER | STRING
669 ### dictsetmaker: (test ':' test (',' test ':' test)* [',']) | (test (',' test)* [','])
Guido van Rossum3bead091992-01-27 17:00:37 +0000670
Thomas Wouters89f507f2006-12-13 04:49:30 +0000671 x = (1)
672 x = (1 or 2 or 3)
673 x = (1 or 2 or 3, 2, 3)
Guido van Rossum3bead091992-01-27 17:00:37 +0000674
Thomas Wouters89f507f2006-12-13 04:49:30 +0000675 x = []
676 x = [1]
677 x = [1 or 2 or 3]
678 x = [1 or 2 or 3, 2, 3]
679 x = []
Guido van Rossum3bead091992-01-27 17:00:37 +0000680
Thomas Wouters89f507f2006-12-13 04:49:30 +0000681 x = {}
682 x = {'one': 1}
683 x = {'one': 1,}
684 x = {'one' or 'two': 1 or 2}
685 x = {'one': 1, 'two': 2}
686 x = {'one': 1, 'two': 2,}
687 x = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6}
Guido van Rossum3bead091992-01-27 17:00:37 +0000688
Thomas Wouters89f507f2006-12-13 04:49:30 +0000689 x = {'one'}
690 x = {'one', 1,}
691 x = {'one', 'two', 'three'}
692 x = {2, 3, 4,}
693
694 x = x
695 x = 'x'
696 x = 123
697
698 ### exprlist: expr (',' expr)* [',']
699 ### testlist: test (',' test)* [',']
700 # These have been exercised enough above
701
702 def testClassdef(self):
703 # 'class' NAME ['(' [testlist] ')'] ':' suite
704 class B: pass
705 class B2(): pass
706 class C1(B): pass
707 class C2(B): pass
708 class D(C1, C2, B): pass
709 class C:
710 def meth1(self): pass
711 def meth2(self, arg): pass
712 def meth3(self, a1, a2): pass
713
714 def testListcomps(self):
715 # list comprehension tests
716 nums = [1, 2, 3, 4, 5]
717 strs = ["Apple", "Banana", "Coconut"]
718 spcs = [" Apple", " Banana ", "Coco nut "]
719
720 self.assertEqual([s.strip() for s in spcs], ['Apple', 'Banana', 'Coco nut'])
721 self.assertEqual([3 * x for x in nums], [3, 6, 9, 12, 15])
722 self.assertEqual([x for x in nums if x > 2], [3, 4, 5])
723 self.assertEqual([(i, s) for i in nums for s in strs],
724 [(1, 'Apple'), (1, 'Banana'), (1, 'Coconut'),
725 (2, 'Apple'), (2, 'Banana'), (2, 'Coconut'),
726 (3, 'Apple'), (3, 'Banana'), (3, 'Coconut'),
727 (4, 'Apple'), (4, 'Banana'), (4, 'Coconut'),
728 (5, 'Apple'), (5, 'Banana'), (5, 'Coconut')])
729 self.assertEqual([(i, s) for i in nums for s in [f for f in strs if "n" in f]],
730 [(1, 'Banana'), (1, 'Coconut'), (2, 'Banana'), (2, 'Coconut'),
731 (3, 'Banana'), (3, 'Coconut'), (4, 'Banana'), (4, 'Coconut'),
732 (5, 'Banana'), (5, 'Coconut')])
733 self.assertEqual([(lambda a:[a**i for i in range(a+1)])(j) for j in range(5)],
734 [[1], [1, 1], [1, 2, 4], [1, 3, 9, 27], [1, 4, 16, 64, 256]])
735
736 def test_in_func(l):
737 return [0 < x < 3 for x in l if x > 2]
738
739 self.assertEqual(test_in_func(nums), [False, False, False])
740
741 def test_nested_front():
742 self.assertEqual([[y for y in [x, x + 1]] for x in [1,3,5]],
743 [[1, 2], [3, 4], [5, 6]])
744
745 test_nested_front()
746
747 check_syntax_error(self, "[i, s for i in nums for s in strs]")
748 check_syntax_error(self, "[x if y]")
749
750 suppliers = [
751 (1, "Boeing"),
752 (2, "Ford"),
753 (3, "Macdonalds")
754 ]
755
756 parts = [
757 (10, "Airliner"),
758 (20, "Engine"),
759 (30, "Cheeseburger")
760 ]
761
762 suppart = [
763 (1, 10), (1, 20), (2, 20), (3, 30)
764 ]
765
766 x = [
767 (sname, pname)
768 for (sno, sname) in suppliers
769 for (pno, pname) in parts
770 for (sp_sno, sp_pno) in suppart
771 if sno == sp_sno and pno == sp_pno
772 ]
773
774 self.assertEqual(x, [('Boeing', 'Airliner'), ('Boeing', 'Engine'), ('Ford', 'Engine'),
775 ('Macdonalds', 'Cheeseburger')])
776
777 def testGenexps(self):
778 # generator expression tests
779 g = ([x for x in range(10)] for x in range(1))
780 self.assertEqual(g.next(), [x for x in range(10)])
781 try:
782 g.next()
783 self.fail('should produce StopIteration exception')
784 except StopIteration:
785 pass
786
787 a = 1
788 try:
789 g = (a for d in a)
790 g.next()
791 self.fail('should produce TypeError')
792 except TypeError:
793 pass
794
795 self.assertEqual(list((x, y) for x in 'abcd' for y in 'abcd'), [(x, y) for x in 'abcd' for y in 'abcd'])
796 self.assertEqual(list((x, y) for x in 'ab' for y in 'xy'), [(x, y) for x in 'ab' for y in 'xy'])
797
798 a = [x for x in range(10)]
799 b = (x for x in (y for y in a))
800 self.assertEqual(sum(b), sum([x for x in range(10)]))
801
802 self.assertEqual(sum(x**2 for x in range(10)), sum([x**2 for x in range(10)]))
803 self.assertEqual(sum(x*x for x in range(10) if x%2), sum([x*x for x in range(10) if x%2]))
804 self.assertEqual(sum(x for x in (y for y in range(10))), sum([x for x in range(10)]))
805 self.assertEqual(sum(x for x in (y for y in (z for z in range(10)))), sum([x for x in range(10)]))
806 self.assertEqual(sum(x for x in [y for y in (z for z in range(10))]), sum([x for x in range(10)]))
807 self.assertEqual(sum(x for x in (y for y in (z for z in range(10) if True)) if True), sum([x for x in range(10)]))
808 self.assertEqual(sum(x for x in (y for y in (z for z in range(10) if True) if False) if True), 0)
809 check_syntax_error(self, "foo(x for x in range(10), 100)")
810 check_syntax_error(self, "foo(100, x for x in range(10))")
811
812 def testComprehensionSpecials(self):
813 # test for outmost iterable precomputation
814 x = 10; g = (i for i in range(x)); x = 5
815 self.assertEqual(len(list(g)), 10)
816
817 # This should hold, since we're only precomputing outmost iterable.
818 x = 10; t = False; g = ((i,j) for i in range(x) if t for j in range(x))
819 x = 5; t = True;
820 self.assertEqual([(i,j) for i in range(10) for j in range(5)], list(g))
821
822 # Grammar allows multiple adjacent 'if's in listcomps and genexps,
823 # even though it's silly. Make sure it works (ifelse broke this.)
824 self.assertEqual([ x for x in range(10) if x % 2 if x % 3 ], [1, 5, 7])
825 self.assertEqual(list(x for x in range(10) if x % 2 if x % 3), [1, 5, 7])
826
827 # verify unpacking single element tuples in listcomp/genexp.
828 self.assertEqual([x for x, in [(4,), (5,), (6,)]], [4, 5, 6])
829 self.assertEqual(list(x for x, in [(7,), (8,), (9,)]), [7, 8, 9])
830
831 def testIfElseExpr(self):
832 # Test ifelse expressions in various cases
833 def _checkeval(msg, ret):
834 "helper to check that evaluation of expressions is done correctly"
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000835 print(x)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000836 return ret
837
838 self.assertEqual([ x() for x in lambda: True, lambda: False if x() ], [True])
839 self.assertEqual([ x() for x in (lambda: True, lambda: False) if x() ], [True])
840 self.assertEqual([ x(False) for x in (lambda x: False if x else True, lambda x: True if x else False) if x(False) ], [True])
841 self.assertEqual((5 if 1 else _checkeval("check 1", 0)), 5)
842 self.assertEqual((_checkeval("check 2", 0) if 0 else 5), 5)
843 self.assertEqual((5 and 6 if 0 else 1), 1)
844 self.assertEqual(((5 and 6) if 0 else 1), 1)
845 self.assertEqual((5 and (6 if 1 else 1)), 6)
846 self.assertEqual((0 or _checkeval("check 3", 2) if 0 else 3), 3)
847 self.assertEqual((1 or _checkeval("check 4", 2) if 1 else _checkeval("check 5", 3)), 1)
848 self.assertEqual((0 or 5 if 1 else _checkeval("check 6", 3)), 5)
849 self.assertEqual((not 5 if 1 else 1), False)
850 self.assertEqual((not 5 if 0 else 1), 1)
851 self.assertEqual((6 + 1 if 1 else 2), 7)
852 self.assertEqual((6 - 1 if 1 else 2), 5)
853 self.assertEqual((6 * 2 if 1 else 4), 12)
854 self.assertEqual((6 / 2 if 1 else 3), 3)
855 self.assertEqual((6 < 4 if 0 else 2), 2)
Jeremy Hylton7b03bad2006-02-28 17:46:23 +0000856
Guido van Rossum3bead091992-01-27 17:00:37 +0000857
Thomas Wouters89f507f2006-12-13 04:49:30 +0000858def test_main():
859 run_unittest(TokenTests, GrammarTests)
Guido van Rossum3bead091992-01-27 17:00:37 +0000860
Thomas Wouters89f507f2006-12-13 04:49:30 +0000861if __name__ == '__main__':
862 test_main()