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