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