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 check_syntax_error
      12  import unittest
      13  import sys
      14  # testing import *
      15  from sys import *
      16  
      17  class ESC[4;38;5;81mTokenTests(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
      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 ESC[4;38;5;81mGrammarTests(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     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 statements 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 ESC[4;38;5;81mGulp:
     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 ESC[4;38;5;81mSquares:
     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.  https://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 ESC[4;38;5;81mB: pass
     787          class ESC[4;38;5;81mB2(): pass
     788          class ESC[4;38;5;81mC1(ESC[4;38;5;149mB): pass
     789          class ESC[4;38;5;81mC2(ESC[4;38;5;149mB): pass
     790          class ESC[4;38;5;81mD(ESC[4;38;5;149mC1, ESC[4;38;5;149mC2, ESC[4;38;5;149mB): pass
     791          class ESC[4;38;5;81mC:
     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 ESC[4;38;5;81mG:
     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 test_with_statement(self):
     924          class ESC[4;38;5;81mmanager(ESC[4;38;5;149mobject):
     925              def __enter__(self):
     926                  return (1, 2)
     927              def __exit__(self, *args):
     928                  pass
     929  
     930          with manager():
     931              pass
     932          with manager() as x:
     933              pass
     934          with manager() as (x, y):
     935              pass
     936          with manager(), manager():
     937              pass
     938          with manager() as x, manager() as y:
     939              pass
     940          with manager() as x, manager():
     941              pass
     942  
     943      def testIfElseExpr(self):
     944          # Test ifelse expressions in various cases
     945          def _checkeval(msg, ret):
     946              "helper to check that evaluation of expressions is done correctly"
     947              print x
     948              return ret
     949  
     950          self.assertEqual([ x() for x in lambda: True, lambda: False if x() ], [True])
     951          self.assertEqual([ x() for x in (lambda: True, lambda: False) if x() ], [True])
     952          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])
     953          self.assertEqual((5 if 1 else _checkeval("check 1", 0)), 5)
     954          self.assertEqual((_checkeval("check 2", 0) if 0 else 5), 5)
     955          self.assertEqual((5 and 6 if 0 else 1), 1)
     956          self.assertEqual(((5 and 6) if 0 else 1), 1)
     957          self.assertEqual((5 and (6 if 1 else 1)), 6)
     958          self.assertEqual((0 or _checkeval("check 3", 2) if 0 else 3), 3)
     959          self.assertEqual((1 or _checkeval("check 4", 2) if 1 else _checkeval("check 5", 3)), 1)
     960          self.assertEqual((0 or 5 if 1 else _checkeval("check 6", 3)), 5)
     961          self.assertEqual((not 5 if 1 else 1), False)
     962          self.assertEqual((not 5 if 0 else 1), 1)
     963          self.assertEqual((6 + 1 if 1 else 2), 7)
     964          self.assertEqual((6 - 1 if 1 else 2), 5)
     965          self.assertEqual((6 * 2 if 1 else 4), 12)
     966          self.assertEqual((6 / 2 if 1 else 3), 3)
     967          self.assertEqual((6 < 4 if 0 else 2), 2)
     968  
     969  
     970  if __name__ == '__main__':
     971      unittest.main()