1# Python test set -- part 1, grammar.
2# This just tests whether the parser accepts them all.
3
4# 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
11from test.support import run_unittest, check_syntax_error
12import unittest
13import sys
14# testing import *
15from sys import *
16
17class TokenTests(unittest.TestCase):
18
19    def testBackslash(self):
20        # Backslash means line continuation:
21        x = 1 \
22        + 1
23        self.assertEquals(x, 2, 'backslash for line continuation')
24
25        # Backslash does not means continuation in comments :\
26        x = 0
27        self.assertEquals(x, 0, 'backslash ending comment')
28
29    def testPlainIntegers(self):
30        self.assertEquals(type(000), type(0))
31        self.assertEquals(0xff, 255)
32        self.assertEquals(0o377, 255)
33        self.assertEquals(2147483647, 0o17777777777)
34        self.assertEquals(0b1001, 9)
35        # "0x" is not a valid literal
36        self.assertRaises(SyntaxError, eval, "0x")
37        from sys import maxsize
38        if maxsize == 2147483647:
39            self.assertEquals(-2147483647-1, -0o20000000000)
40            # XXX -2147483648
41            self.assert_(0o37777777777 > 0)
42            self.assert_(0xffffffff > 0)
43            self.assert_(0b1111111111111111111111111111111 > 0)
44            for s in ('2147483648', '0o40000000000', '0x100000000',
45                      '0b10000000000000000000000000000000'):
46                try:
47                    x = eval(s)
48                except OverflowError:
49                    self.fail("OverflowError on huge integer literal %r" % s)
50        elif maxsize == 9223372036854775807:
51            self.assertEquals(-9223372036854775807-1, -0o1000000000000000000000)
52            self.assert_(0o1777777777777777777777 > 0)
53            self.assert_(0xffffffffffffffff > 0)
54            self.assert_(0b11111111111111111111111111111111111111111111111111111111111111 > 0)
55            for s in '9223372036854775808', '0o2000000000000000000000', \
56                     '0x10000000000000000', \
57                     '0b100000000000000000000000000000000000000000000000000000000000000':
58                try:
59                    x = eval(s)
60                except OverflowError:
61                    self.fail("OverflowError on huge integer literal %r" % s)
62        else:
63            self.fail('Weird maxsize value %r' % maxsize)
64
65    def testLongIntegers(self):
66        x = 0
67        x = 0xffffffffffffffff
68        x = 0Xffffffffffffffff
69        x = 0o77777777777777777
70        x = 0O77777777777777777
71        x = 123456789012345678901234567890
72        x = 0b100000000000000000000000000000000000000000000000000000000000000000000
73        x = 0B111111111111111111111111111111111111111111111111111111111111111111111
74
75    def testFloats(self):
76        x = 3.14
77        x = 314.
78        x = 0.314
79        # XXX x = 000.314
80        x = .314
81        x = 3e14
82        x = 3E14
83        x = 3e-14
84        x = 3e+14
85        x = 3.e14
86        x = .3e14
87        x = 3.1e4
88
89    def testStringLiterals(self):
90        x = ''; y = ""; self.assert_(len(x) == 0 and x == y)
91        x = '\''; y = "'"; self.assert_(len(x) == 1 and x == y and ord(x) == 39)
92        x = '"'; y = "\""; self.assert_(len(x) == 1 and x == y and ord(x) == 34)
93        x = "doesn't \"shrink\" does it"
94        y = 'doesn\'t "shrink" does it'
95        self.assert_(len(x) == 24 and x == y)
96        x = "does \"shrink\" doesn't it"
97        y = 'does "shrink" doesn\'t it'
98        self.assert_(len(x) == 24 and x == y)
99        x = """
100The "quick"
101brown fox
102jumps over
103the 'lazy' dog.
104"""
105        y = '\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n'
106        self.assertEquals(x, y)
107        y = '''
108The "quick"
109brown fox
110jumps over
111the 'lazy' dog.
112'''
113        self.assertEquals(x, y)
114        y = "\n\
115The \"quick\"\n\
116brown fox\n\
117jumps over\n\
118the 'lazy' dog.\n\
119"
120        self.assertEquals(x, y)
121        y = '\n\
122The \"quick\"\n\
123brown fox\n\
124jumps over\n\
125the \'lazy\' dog.\n\
126'
127        self.assertEquals(x, y)
128
129    def testEllipsis(self):
130        x = ...
131        self.assert_(x is Ellipsis)
132        self.assertRaises(SyntaxError, eval, ".. .")
133
134class GrammarTests(unittest.TestCase):
135
136    # single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
137    # XXX can't test in a script -- this rule is only used when interactive
138
139    # file_input: (NEWLINE | stmt)* ENDMARKER
140    # Being tested as this very moment this very module
141
142    # expr_input: testlist NEWLINE
143    # XXX Hard to test -- used only in calls to input()
144
145    def testEvalInput(self):
146        # testlist ENDMARKER
147        x = eval('1, 0 or 1')
148
149    def testFuncdef(self):
150        ### [decorators] 'def' NAME parameters ['->' test] ':' suite
151        ### decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
152        ### decorators: decorator+
153        ### parameters: '(' [typedargslist] ')'
154        ### typedargslist: ((tfpdef ['=' test] ',')*
155        ###                ('*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef)
156        ###                | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
157        ### tfpdef: NAME [':' test]
158        ### varargslist: ((vfpdef ['=' test] ',')*
159        ###              ('*' [vfpdef] (',' vfpdef ['=' test])*  [',' '**' vfpdef] | '**' vfpdef)
160        ###              | vfpdef ['=' test] (',' vfpdef ['=' test])* [','])
161        ### vfpdef: NAME
162        def f1(): pass
163        f1()
164        f1(*())
165        f1(*(), **{})
166        def f2(one_argument): pass
167        def f3(two, arguments): pass
168        self.assertEquals(f2.__code__.co_varnames, ('one_argument',))
169        self.assertEquals(f3.__code__.co_varnames, ('two', 'arguments'))
170        def a1(one_arg,): pass
171        def a2(two, args,): pass
172        def v0(*rest): pass
173        def v1(a, *rest): pass
174        def v2(a, b, *rest): pass
175
176        f1()
177        f2(1)
178        f2(1,)
179        f3(1, 2)
180        f3(1, 2,)
181        v0()
182        v0(1)
183        v0(1,)
184        v0(1,2)
185        v0(1,2,3,4,5,6,7,8,9,0)
186        v1(1)
187        v1(1,)
188        v1(1,2)
189        v1(1,2,3)
190        v1(1,2,3,4,5,6,7,8,9,0)
191        v2(1,2)
192        v2(1,2,3)
193        v2(1,2,3,4)
194        v2(1,2,3,4,5,6,7,8,9,0)
195
196        def d01(a=1): pass
197        d01()
198        d01(1)
199        d01(*(1,))
200        d01(**{'a':2})
201        def d11(a, b=1): pass
202        d11(1)
203        d11(1, 2)
204        d11(1, **{'b':2})
205        def d21(a, b, c=1): pass
206        d21(1, 2)
207        d21(1, 2, 3)
208        d21(*(1, 2, 3))
209        d21(1, *(2, 3))
210        d21(1, 2, *(3,))
211        d21(1, 2, **{'c':3})
212        def d02(a=1, b=2): pass
213        d02()
214        d02(1)
215        d02(1, 2)
216        d02(*(1, 2))
217        d02(1, *(2,))
218        d02(1, **{'b':2})
219        d02(**{'a': 1, 'b': 2})
220        def d12(a, b=1, c=2): pass
221        d12(1)
222        d12(1, 2)
223        d12(1, 2, 3)
224        def d22(a, b, c=1, d=2): pass
225        d22(1, 2)
226        d22(1, 2, 3)
227        d22(1, 2, 3, 4)
228        def d01v(a=1, *rest): pass
229        d01v()
230        d01v(1)
231        d01v(1, 2)
232        d01v(*(1, 2, 3, 4))
233        d01v(*(1,))
234        d01v(**{'a':2})
235        def d11v(a, b=1, *rest): pass
236        d11v(1)
237        d11v(1, 2)
238        d11v(1, 2, 3)
239        def d21v(a, b, c=1, *rest): pass
240        d21v(1, 2)
241        d21v(1, 2, 3)
242        d21v(1, 2, 3, 4)
243        d21v(*(1, 2, 3, 4))
244        d21v(1, 2, **{'c': 3})
245        def d02v(a=1, b=2, *rest): pass
246        d02v()
247        d02v(1)
248        d02v(1, 2)
249        d02v(1, 2, 3)
250        d02v(1, *(2, 3, 4))
251        d02v(**{'a': 1, 'b': 2})
252        def d12v(a, b=1, c=2, *rest): pass
253        d12v(1)
254        d12v(1, 2)
255        d12v(1, 2, 3)
256        d12v(1, 2, 3, 4)
257        d12v(*(1, 2, 3, 4))
258        d12v(1, 2, *(3, 4, 5))
259        d12v(1, *(2,), **{'c': 3})
260        def d22v(a, b, c=1, d=2, *rest): pass
261        d22v(1, 2)
262        d22v(1, 2, 3)
263        d22v(1, 2, 3, 4)
264        d22v(1, 2, 3, 4, 5)
265        d22v(*(1, 2, 3, 4))
266        d22v(1, 2, *(3, 4, 5))
267        d22v(1, *(2, 3), **{'d': 4})
268
269        # keyword argument type tests
270        try:
271            str('x', **{b'foo':1 })
272        except TypeError:
273            pass
274        else:
275            self.fail('Bytes should not work as keyword argument names')
276        # keyword only argument tests
277        def pos0key1(*, key): return key
278        pos0key1(key=100)
279        def pos2key2(p1, p2, *, k1, k2=100): return p1,p2,k1,k2
280        pos2key2(1, 2, k1=100)
281        pos2key2(1, 2, k1=100, k2=200)
282        pos2key2(1, 2, k2=100, k1=200)
283        def pos2key2dict(p1, p2, *, k1=100, k2, **kwarg): return p1,p2,k1,k2,kwarg
284        pos2key2dict(1,2,k2=100,tokwarg1=100,tokwarg2=200)
285        pos2key2dict(1,2,tokwarg1=100,tokwarg2=200, k2=100)
286
287        # keyword arguments after *arglist
288        def f(*args, **kwargs):
289            return args, kwargs
290        self.assertEquals(f(1, x=2, *[3, 4], y=5), ((1, 3, 4),
291                                                    {'x':2, 'y':5}))
292        self.assertRaises(SyntaxError, eval, "f(1, *(2,3), 4)")
293        self.assertRaises(SyntaxError, eval, "f(1, x=2, *(3,4), x=5)")
294
295        # argument annotation tests
296        def f(x) -> list: pass
297        self.assertEquals(f.__annotations__, {'return': list})
298        def f(x:int): pass
299        self.assertEquals(f.__annotations__, {'x': int})
300        def f(*x:str): pass
301        self.assertEquals(f.__annotations__, {'x': str})
302        def f(**x:float): pass
303        self.assertEquals(f.__annotations__, {'x': float})
304        def f(x, y:1+2): pass
305        self.assertEquals(f.__annotations__, {'y': 3})
306        def f(a, b:1, c:2, d): pass
307        self.assertEquals(f.__annotations__, {'b': 1, 'c': 2})
308        def f(a, b:1, c:2, d, e:3=4, f=5, *g:6): pass
309        self.assertEquals(f.__annotations__,
310                          {'b': 1, 'c': 2, 'e': 3, 'g': 6})
311        def f(a, b:1, c:2, d, e:3=4, f=5, *g:6, h:7, i=8, j:9=10,
312              **k:11) -> 12: pass
313        self.assertEquals(f.__annotations__,
314                          {'b': 1, 'c': 2, 'e': 3, 'g': 6, 'h': 7, 'j': 9,
315                           'k': 11, 'return': 12})
316        # Check for SF Bug #1697248 - mixing decorators and a return annotation
317        def null(x): return x
318        @null
319        def f(x) -> list: pass
320        self.assertEquals(f.__annotations__, {'return': list})
321
322        # test MAKE_CLOSURE with a variety of oparg's
323        closure = 1
324        def f(): return closure
325        def f(x=1): return closure
326        def f(*, k=1): return closure
327        def f() -> int: return closure
328
329        # Check ast errors in *args and *kwargs
330        check_syntax_error(self, "f(*g(1=2))")
331        check_syntax_error(self, "f(**g(1=2))")
332
333    def testLambdef(self):
334        ### lambdef: 'lambda' [varargslist] ':' test
335        l1 = lambda : 0
336        self.assertEquals(l1(), 0)
337        l2 = lambda : a[d] # XXX just testing the expression
338        l3 = lambda : [2 < x for x in [-1, 3, 0]]
339        self.assertEquals(l3(), [0, 1, 0])
340        l4 = lambda x = lambda y = lambda z=1 : z : y() : x()
341        self.assertEquals(l4(), 1)
342        l5 = lambda x, y, z=2: x + y + z
343        self.assertEquals(l5(1, 2), 5)
344        self.assertEquals(l5(1, 2, 3), 6)
345        check_syntax_error(self, "lambda x: x = 2")
346        check_syntax_error(self, "lambda (None,): None")
347        l6 = lambda x, y, *, k=20: x+y+k
348        self.assertEquals(l6(1,2), 1+2+20)
349        self.assertEquals(l6(1,2,k=10), 1+2+10)
350
351
352    ### stmt: simple_stmt | compound_stmt
353    # Tested below
354
355    def testSimpleStmt(self):
356        ### simple_stmt: small_stmt (';' small_stmt)* [';']
357        x = 1; pass; del x
358        def foo():
359            # verify statements that end with semi-colons
360            x = 1; pass; del x;
361        foo()
362
363    ### small_stmt: expr_stmt | pass_stmt | del_stmt | flow_stmt | import_stmt | global_stmt | access_stmt
364    # Tested below
365
366    def testExprStmt(self):
367        # (exprlist '=')* exprlist
368        1
369        1, 2, 3
370        x = 1
371        x = 1, 2, 3
372        x = y = z = 1, 2, 3
373        x, y, z = 1, 2, 3
374        abc = a, b, c = x, y, z = xyz = 1, 2, (3, 4)
375
376        check_syntax_error(self, "x + 1 = 1")
377        check_syntax_error(self, "a + 1 = b + 2")
378
379    def testDelStmt(self):
380        # 'del' exprlist
381        abc = [1,2,3]
382        x, y, z = abc
383        xyz = x, y, z
384
385        del abc
386        del x, y, (z, xyz)
387
388    def testPassStmt(self):
389        # 'pass'
390        pass
391
392    # flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
393    # Tested below
394
395    def testBreakStmt(self):
396        # 'break'
397        while 1: break
398
399    def testContinueStmt(self):
400        # 'continue'
401        i = 1
402        while i: i = 0; continue
403
404        msg = ""
405        while not msg:
406            msg = "ok"
407            try:
408                continue
409                msg = "continue failed to continue inside try"
410            except:
411                msg = "continue inside try called except block"
412        if msg != "ok":
413            self.fail(msg)
414
415        msg = ""
416        while not msg:
417            msg = "finally block not called"
418            try:
419                continue
420            finally:
421                msg = "ok"
422        if msg != "ok":
423            self.fail(msg)
424
425    def test_break_continue_loop(self):
426        # This test warrants an explanation. It is a test specifically for SF bugs
427        # #463359 and #462937. The bug is that a 'break' statement executed or
428        # exception raised inside a try/except inside a loop, *after* a continue
429        # statement has been executed in that loop, will cause the wrong number of
430        # arguments to be popped off the stack and the instruction pointer reset to
431        # a very small number (usually 0.) Because of this, the following test
432        # *must* written as a function, and the tracking vars *must* be function
433        # arguments with default values. Otherwise, the test will loop and loop.
434
435        def test_inner(extra_burning_oil = 1, count=0):
436            big_hippo = 2
437            while big_hippo:
438                count += 1
439                try:
440                    if extra_burning_oil and big_hippo == 1:
441                        extra_burning_oil -= 1
442                        break
443                    big_hippo -= 1
444                    continue
445                except:
446                    raise
447            if count > 2 or big_hippo != 1:
448                self.fail("continue then break in try/except in loop broken!")
449        test_inner()
450
451    def testReturn(self):
452        # 'return' [testlist]
453        def g1(): return
454        def g2(): return 1
455        g1()
456        x = g2()
457        check_syntax_error(self, "class foo:return 1")
458
459    def testYield(self):
460        check_syntax_error(self, "class foo:yield 1")
461
462    def testRaise(self):
463        # 'raise' test [',' test]
464        try: raise RuntimeError('just testing')
465        except RuntimeError: pass
466        try: raise KeyboardInterrupt
467        except KeyboardInterrupt: pass
468
469    def testImport(self):
470        # 'import' dotted_as_names
471        import sys
472        import time, sys
473        # 'from' dotted_name 'import' ('*' | '(' import_as_names ')' | import_as_names)
474        from time import time
475        from time import (time)
476        # not testable inside a function, but already done at top of the module
477        # from sys import *
478        from sys import path, argv
479        from sys import (path, argv)
480        from sys import (path, argv,)
481
482    def testGlobal(self):
483        # 'global' NAME (',' NAME)*
484        global a
485        global a, b
486        global one, two, three, four, five, six, seven, eight, nine, ten
487
488    def testNonlocal(self):
489        # 'nonlocal' NAME (',' NAME)*
490        x = 0
491        y = 0
492        def f():
493            nonlocal x
494            nonlocal x, y
495
496    def testAssert(self):
497        # assert_stmt: 'assert' test [',' test]
498        assert 1
499        assert 1, 1
500        assert lambda x:x
501        assert 1, lambda x:x+1
502        try:
503            assert 0, "msg"
504        except AssertionError as e:
505            self.assertEquals(e.args[0], "msg")
506        else:
507            if __debug__:
508                self.fail("AssertionError not raised by assert 0")
509
510    ### compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef
511    # Tested below
512
513    def testIf(self):
514        # 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
515        if 1: pass
516        if 1: pass
517        else: pass
518        if 0: pass
519        elif 0: pass
520        if 0: pass
521        elif 0: pass
522        elif 0: pass
523        elif 0: pass
524        else: pass
525
526    def testWhile(self):
527        # 'while' test ':' suite ['else' ':' suite]
528        while 0: pass
529        while 0: pass
530        else: pass
531
532        # Issue1920: "while 0" is optimized away,
533        # ensure that the "else" clause is still present.
534        x = 0
535        while 0:
536            x = 1
537        else:
538            x = 2
539        self.assertEquals(x, 2)
540
541    def testFor(self):
542        # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite]
543        for i in 1, 2, 3: pass
544        for i, j, k in (): pass
545        else: pass
546        class Squares:
547            def __init__(self, max):
548                self.max = max
549                self.sofar = []
550            def __len__(self): return len(self.sofar)
551            def __getitem__(self, i):
552                if not 0 <= i < self.max: raise IndexError
553                n = len(self.sofar)
554                while n <= i:
555                    self.sofar.append(n*n)
556                    n = n+1
557                return self.sofar[i]
558        n = 0
559        for x in Squares(10): n = n+x
560        if n != 285:
561            self.fail('for over growing sequence')
562
563        result = []
564        for x, in [(1,), (2,), (3,)]:
565            result.append(x)
566        self.assertEqual(result, [1, 2, 3])
567
568    def testTry(self):
569        ### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
570        ###         | 'try' ':' suite 'finally' ':' suite
571        ### except_clause: 'except' [expr ['as' expr]]
572        try:
573            1/0
574        except ZeroDivisionError:
575            pass
576        else:
577            pass
578        try: 1/0
579        except EOFError: pass
580        except TypeError as msg: pass
581        except RuntimeError as msg: pass
582        except: pass
583        else: pass
584        try: 1/0
585        except (EOFError, TypeError, ZeroDivisionError): pass
586        try: 1/0
587        except (EOFError, TypeError, ZeroDivisionError) as msg: pass
588        try: pass
589        finally: pass
590
591    def testSuite(self):
592        # simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT
593        if 1: pass
594        if 1:
595            pass
596        if 1:
597            #
598            #
599            #
600            pass
601            pass
602            #
603            pass
604            #
605
606    def testTest(self):
607        ### and_test ('or' and_test)*
608        ### and_test: not_test ('and' not_test)*
609        ### not_test: 'not' not_test | comparison
610        if not 1: pass
611        if 1 and 1: pass
612        if 1 or 1: pass
613        if not not not 1: pass
614        if not 1 and 1 and 1: pass
615        if 1 and 1 or 1 and 1 and 1 or not 1 and 1: pass
616
617    def testComparison(self):
618        ### comparison: expr (comp_op expr)*
619        ### comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'|'is' 'not'
620        if 1: pass
621        x = (1 == 1)
622        if 1 == 1: pass
623        if 1 != 1: pass
624        if 1 < 1: pass
625        if 1 > 1: pass
626        if 1 <= 1: pass
627        if 1 >= 1: pass
628        if 1 is 1: pass
629        if 1 is not 1: pass
630        if 1 in (): pass
631        if 1 not in (): pass
632        if 1 < 1 > 1 == 1 >= 1 <= 1 != 1 in 1 not in 1 is 1 is not 1: pass
633
634    def testBinaryMaskOps(self):
635        x = 1 & 1
636        x = 1 ^ 1
637        x = 1 | 1
638
639    def testShiftOps(self):
640        x = 1 << 1
641        x = 1 >> 1
642        x = 1 << 1 >> 1
643
644    def testAdditiveOps(self):
645        x = 1
646        x = 1 + 1
647        x = 1 - 1 - 1
648        x = 1 - 1 + 1 - 1 + 1
649
650    def testMultiplicativeOps(self):
651        x = 1 * 1
652        x = 1 / 1
653        x = 1 % 1
654        x = 1 / 1 * 1 % 1
655
656    def testUnaryOps(self):
657        x = +1
658        x = -1
659        x = ~1
660        x = ~1 ^ 1 & 1 | 1 & 1 ^ -1
661        x = -1*1/1 + 1*1 - ---1*1
662
663    def testSelectors(self):
664        ### trailer: '(' [testlist] ')' | '[' subscript ']' | '.' NAME
665        ### subscript: expr | [expr] ':' [expr]
666
667        import sys, time
668        c = sys.path[0]
669        x = time.time()
670        x = sys.modules['time'].time()
671        a = '01234'
672        c = a[0]
673        c = a[-1]
674        s = a[0:5]
675        s = a[:5]
676        s = a[0:]
677        s = a[:]
678        s = a[-5:]
679        s = a[:-1]
680        s = a[-4:-3]
681        # A rough test of SF bug 1333982.  http://python.org/sf/1333982
682        # The testing here is fairly incomplete.
683        # Test cases should include: commas with 1 and 2 colons
684        d = {}
685        d[1] = 1
686        d[1,] = 2
687        d[1,2] = 3
688        d[1,2,3] = 4
689        L = list(d)
690        L.sort(key=lambda x: x if isinstance(x, tuple) else ())
691        self.assertEquals(str(L), '[1, (1,), (1, 2), (1, 2, 3)]')
692
693    def testAtoms(self):
694        ### atom: '(' [testlist] ')' | '[' [testlist] ']' | '{' [dictsetmaker] '}' | NAME | NUMBER | STRING
695        ### dictsetmaker: (test ':' test (',' test ':' test)* [',']) | (test (',' test)* [','])
696
697        x = (1)
698        x = (1 or 2 or 3)
699        x = (1 or 2 or 3, 2, 3)
700
701        x = []
702        x = [1]
703        x = [1 or 2 or 3]
704        x = [1 or 2 or 3, 2, 3]
705        x = []
706
707        x = {}
708        x = {'one': 1}
709        x = {'one': 1,}
710        x = {'one' or 'two': 1 or 2}
711        x = {'one': 1, 'two': 2}
712        x = {'one': 1, 'two': 2,}
713        x = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6}
714
715        x = {'one'}
716        x = {'one', 1,}
717        x = {'one', 'two', 'three'}
718        x = {2, 3, 4,}
719
720        x = x
721        x = 'x'
722        x = 123
723
724    ### exprlist: expr (',' expr)* [',']
725    ### testlist: test (',' test)* [',']
726    # These have been exercised enough above
727
728    def testClassdef(self):
729        # 'class' NAME ['(' [testlist] ')'] ':' suite
730        class B: pass
731        class B2(): pass
732        class C1(B): pass
733        class C2(B): pass
734        class D(C1, C2, B): pass
735        class C:
736            def meth1(self): pass
737            def meth2(self, arg): pass
738            def meth3(self, a1, a2): pass
739
740        # decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
741        # decorators: decorator+
742        # decorated: decorators (classdef | funcdef)
743        def class_decorator(x): return x
744        @class_decorator
745        class G: pass
746
747    def testDictcomps(self):
748        # dictorsetmaker: ( (test ':' test (comp_for |
749        #                                   (',' test ':' test)* [','])) |
750        #                   (test (comp_for | (',' test)* [','])) )
751        nums = [1, 2, 3]
752        self.assertEqual({i:i+1 for i in nums}, {1: 2, 2: 3, 3: 4})
753
754    def testListcomps(self):
755        # list comprehension tests
756        nums = [1, 2, 3, 4, 5]
757        strs = ["Apple", "Banana", "Coconut"]
758        spcs = ["  Apple", " Banana ", "Coco  nut  "]
759
760        self.assertEqual([s.strip() for s in spcs], ['Apple', 'Banana', 'Coco  nut'])
761        self.assertEqual([3 * x for x in nums], [3, 6, 9, 12, 15])
762        self.assertEqual([x for x in nums if x > 2], [3, 4, 5])
763        self.assertEqual([(i, s) for i in nums for s in strs],
764                         [(1, 'Apple'), (1, 'Banana'), (1, 'Coconut'),
765                          (2, 'Apple'), (2, 'Banana'), (2, 'Coconut'),
766                          (3, 'Apple'), (3, 'Banana'), (3, 'Coconut'),
767                          (4, 'Apple'), (4, 'Banana'), (4, 'Coconut'),
768                          (5, 'Apple'), (5, 'Banana'), (5, 'Coconut')])
769        self.assertEqual([(i, s) for i in nums for s in [f for f in strs if "n" in f]],
770                         [(1, 'Banana'), (1, 'Coconut'), (2, 'Banana'), (2, 'Coconut'),
771                          (3, 'Banana'), (3, 'Coconut'), (4, 'Banana'), (4, 'Coconut'),
772                          (5, 'Banana'), (5, 'Coconut')])
773        self.assertEqual([(lambda a:[a**i for i in range(a+1)])(j) for j in range(5)],
774                         [[1], [1, 1], [1, 2, 4], [1, 3, 9, 27], [1, 4, 16, 64, 256]])
775
776        def test_in_func(l):
777            return [0 < x < 3 for x in l if x > 2]
778
779        self.assertEqual(test_in_func(nums), [False, False, False])
780
781        def test_nested_front():
782            self.assertEqual([[y for y in [x, x + 1]] for x in [1,3,5]],
783                             [[1, 2], [3, 4], [5, 6]])
784
785        test_nested_front()
786
787        check_syntax_error(self, "[i, s for i in nums for s in strs]")
788        check_syntax_error(self, "[x if y]")
789
790        suppliers = [
791          (1, "Boeing"),
792          (2, "Ford"),
793          (3, "Macdonalds")
794        ]
795
796        parts = [
797          (10, "Airliner"),
798          (20, "Engine"),
799          (30, "Cheeseburger")
800        ]
801
802        suppart = [
803          (1, 10), (1, 20), (2, 20), (3, 30)
804        ]
805
806        x = [
807          (sname, pname)
808            for (sno, sname) in suppliers
809              for (pno, pname) in parts
810                for (sp_sno, sp_pno) in suppart
811                  if sno == sp_sno and pno == sp_pno
812        ]
813
814        self.assertEqual(x, [('Boeing', 'Airliner'), ('Boeing', 'Engine'), ('Ford', 'Engine'),
815                             ('Macdonalds', 'Cheeseburger')])
816
817    def testGenexps(self):
818        # generator expression tests
819        g = ([x for x in range(10)] for x in range(1))
820        self.assertEqual(next(g), [x for x in range(10)])
821        try:
822            next(g)
823            self.fail('should produce StopIteration exception')
824        except StopIteration:
825            pass
826
827        a = 1
828        try:
829            g = (a for d in a)
830            next(g)
831            self.fail('should produce TypeError')
832        except TypeError:
833            pass
834
835        self.assertEqual(list((x, y) for x in 'abcd' for y in 'abcd'), [(x, y) for x in 'abcd' for y in 'abcd'])
836        self.assertEqual(list((x, y) for x in 'ab' for y in 'xy'), [(x, y) for x in 'ab' for y in 'xy'])
837
838        a = [x for x in range(10)]
839        b = (x for x in (y for y in a))
840        self.assertEqual(sum(b), sum([x for x in range(10)]))
841
842        self.assertEqual(sum(x**2 for x in range(10)), sum([x**2 for x in range(10)]))
843        self.assertEqual(sum(x*x for x in range(10) if x%2), sum([x*x for x in range(10) if x%2]))
844        self.assertEqual(sum(x for x in (y for y in range(10))), sum([x for x in range(10)]))
845        self.assertEqual(sum(x for x in (y for y in (z for z in range(10)))), sum([x for x in range(10)]))
846        self.assertEqual(sum(x for x in [y for y in (z for z in range(10))]), sum([x for x in range(10)]))
847        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)]))
848        self.assertEqual(sum(x for x in (y for y in (z for z in range(10) if True) if False) if True), 0)
849        check_syntax_error(self, "foo(x for x in range(10), 100)")
850        check_syntax_error(self, "foo(100, x for x in range(10))")
851
852    def testComprehensionSpecials(self):
853        # test for outmost iterable precomputation
854        x = 10; g = (i for i in range(x)); x = 5
855        self.assertEqual(len(list(g)), 10)
856
857        # This should hold, since we're only precomputing outmost iterable.
858        x = 10; t = False; g = ((i,j) for i in range(x) if t for j in range(x))
859        x = 5; t = True;
860        self.assertEqual([(i,j) for i in range(10) for j in range(5)], list(g))
861
862        # Grammar allows multiple adjacent 'if's in listcomps and genexps,
863        # even though it's silly. Make sure it works (ifelse broke this.)
864        self.assertEqual([ x for x in range(10) if x % 2 if x % 3 ], [1, 5, 7])
865        self.assertEqual(list(x for x in range(10) if x % 2 if x % 3), [1, 5, 7])
866
867        # verify unpacking single element tuples in listcomp/genexp.
868        self.assertEqual([x for x, in [(4,), (5,), (6,)]], [4, 5, 6])
869        self.assertEqual(list(x for x, in [(7,), (8,), (9,)]), [7, 8, 9])
870
871    def test_with_statement(self):
872        class manager(object):
873            def __enter__(self):
874                return (1, 2)
875            def __exit__(self, *args):
876                pass
877
878        with manager():
879            pass
880        with manager() as x:
881            pass
882        with manager() as (x, y):
883            pass
884        with manager(), manager():
885            pass
886        with manager() as x, manager() as y:
887            pass
888        with manager() as x, manager():
889            pass
890
891    def testIfElseExpr(self):
892        # Test ifelse expressions in various cases
893        def _checkeval(msg, ret):
894            "helper to check that evaluation of expressions is done correctly"
895            print(x)
896            return ret
897
898        # the next line is not allowed anymore
899        #self.assertEqual([ x() for x in lambda: True, lambda: False if x() ], [True])
900        self.assertEqual([ x() for x in (lambda: True, lambda: False) if x() ], [True])
901        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])
902        self.assertEqual((5 if 1 else _checkeval("check 1", 0)), 5)
903        self.assertEqual((_checkeval("check 2", 0) if 0 else 5), 5)
904        self.assertEqual((5 and 6 if 0 else 1), 1)
905        self.assertEqual(((5 and 6) if 0 else 1), 1)
906        self.assertEqual((5 and (6 if 1 else 1)), 6)
907        self.assertEqual((0 or _checkeval("check 3", 2) if 0 else 3), 3)
908        self.assertEqual((1 or _checkeval("check 4", 2) if 1 else _checkeval("check 5", 3)), 1)
909        self.assertEqual((0 or 5 if 1 else _checkeval("check 6", 3)), 5)
910        self.assertEqual((not 5 if 1 else 1), False)
911        self.assertEqual((not 5 if 0 else 1), 1)
912        self.assertEqual((6 + 1 if 1 else 2), 7)
913        self.assertEqual((6 - 1 if 1 else 2), 5)
914        self.assertEqual((6 * 2 if 1 else 4), 12)
915        self.assertEqual((6 / 2 if 1 else 3), 3)
916        self.assertEqual((6 < 4 if 0 else 2), 2)
917
918
919def test_main():
920    run_unittest(TokenTests, GrammarTests)
921
922if __name__ == '__main__':
923    test_main()
924