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