1"""This module tests SyntaxErrors. 2 3Here's an example of the sort of thing that is tested. 4 5>>> def f(x): 6... global x 7Traceback (most recent call last): 8SyntaxError: name 'x' is parameter and global 9 10The tests are all raise SyntaxErrors. They were created by checking 11each C call that raises SyntaxError. There are several modules that 12raise these exceptions-- ast.c, compile.c, future.c, pythonrun.c, and 13symtable.c. 14 15The parser itself outlaws a lot of invalid syntax. None of these 16errors are tested here at the moment. We should add some tests; since 17there are infinitely many programs with invalid syntax, we would need 18to be judicious in selecting some. 19 20The compiler generates a synthetic module name for code executed by 21doctest. Since all the code comes from the same module, a suffix like 22[1] is appended to the module name, As a consequence, changing the 23order of tests in this module means renumbering all the errors after 24it. (Maybe we should enable the ellipsis option for these tests.) 25 26In ast.c, syntax errors are raised by calling ast_error(). 27 28Errors from set_context(): 29 30>>> obj.None = 1 31Traceback (most recent call last): 32SyntaxError: invalid syntax 33 34>>> None = 1 35Traceback (most recent call last): 36SyntaxError: cannot assign to None 37 38>>> obj.True = 1 39Traceback (most recent call last): 40SyntaxError: invalid syntax 41 42>>> True = 1 43Traceback (most recent call last): 44SyntaxError: cannot assign to True 45 46>>> (True := 1) 47Traceback (most recent call last): 48SyntaxError: cannot use assignment expressions with True 49 50>>> obj.__debug__ = 1 51Traceback (most recent call last): 52SyntaxError: cannot assign to __debug__ 53 54>>> __debug__ = 1 55Traceback (most recent call last): 56SyntaxError: cannot assign to __debug__ 57 58>>> (__debug__ := 1) 59Traceback (most recent call last): 60SyntaxError: cannot assign to __debug__ 61 62>>> f() = 1 63Traceback (most recent call last): 64SyntaxError: cannot assign to function call 65 66>>> del f() 67Traceback (most recent call last): 68SyntaxError: cannot delete function call 69 70>>> a + 1 = 2 71Traceback (most recent call last): 72SyntaxError: cannot assign to operator 73 74>>> (x for x in x) = 1 75Traceback (most recent call last): 76SyntaxError: cannot assign to generator expression 77 78>>> 1 = 1 79Traceback (most recent call last): 80SyntaxError: cannot assign to literal 81 82>>> "abc" = 1 83Traceback (most recent call last): 84SyntaxError: cannot assign to literal 85 86>>> b"" = 1 87Traceback (most recent call last): 88SyntaxError: cannot assign to literal 89 90>>> ... = 1 91Traceback (most recent call last): 92SyntaxError: cannot assign to Ellipsis 93 94>>> `1` = 1 95Traceback (most recent call last): 96SyntaxError: invalid syntax 97 98If the left-hand side of an assignment is a list or tuple, an illegal 99expression inside that contain should still cause a syntax error. 100This test just checks a couple of cases rather than enumerating all of 101them. 102 103>>> (a, "b", c) = (1, 2, 3) 104Traceback (most recent call last): 105SyntaxError: cannot assign to literal 106 107>>> (a, True, c) = (1, 2, 3) 108Traceback (most recent call last): 109SyntaxError: cannot assign to True 110 111>>> (a, __debug__, c) = (1, 2, 3) 112Traceback (most recent call last): 113SyntaxError: cannot assign to __debug__ 114 115>>> (a, *True, c) = (1, 2, 3) 116Traceback (most recent call last): 117SyntaxError: cannot assign to True 118 119>>> (a, *__debug__, c) = (1, 2, 3) 120Traceback (most recent call last): 121SyntaxError: cannot assign to __debug__ 122 123>>> [a, b, c + 1] = [1, 2, 3] 124Traceback (most recent call last): 125SyntaxError: cannot assign to operator 126 127>>> a if 1 else b = 1 128Traceback (most recent call last): 129SyntaxError: cannot assign to conditional expression 130 131From compiler_complex_args(): 132 133>>> def f(None=1): 134... pass 135Traceback (most recent call last): 136SyntaxError: invalid syntax 137 138 139From ast_for_arguments(): 140 141>>> def f(x, y=1, z): 142... pass 143Traceback (most recent call last): 144SyntaxError: non-default argument follows default argument 145 146>>> def f(x, None): 147... pass 148Traceback (most recent call last): 149SyntaxError: invalid syntax 150 151>>> def f(*None): 152... pass 153Traceback (most recent call last): 154SyntaxError: invalid syntax 155 156>>> def f(**None): 157... pass 158Traceback (most recent call last): 159SyntaxError: invalid syntax 160 161 162From ast_for_funcdef(): 163 164>>> def None(x): 165... pass 166Traceback (most recent call last): 167SyntaxError: invalid syntax 168 169 170From ast_for_call(): 171 172>>> def f(it, *varargs, **kwargs): 173... return list(it) 174>>> L = range(10) 175>>> f(x for x in L) 176[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 177>>> f(x for x in L, 1) 178Traceback (most recent call last): 179SyntaxError: Generator expression must be parenthesized 180>>> f(x for x in L, y=1) 181Traceback (most recent call last): 182SyntaxError: Generator expression must be parenthesized 183>>> f(x for x in L, *[]) 184Traceback (most recent call last): 185SyntaxError: Generator expression must be parenthesized 186>>> f(x for x in L, **{}) 187Traceback (most recent call last): 188SyntaxError: Generator expression must be parenthesized 189>>> f(L, x for x in L) 190Traceback (most recent call last): 191SyntaxError: Generator expression must be parenthesized 192>>> f(x for x in L, y for y in L) 193Traceback (most recent call last): 194SyntaxError: Generator expression must be parenthesized 195>>> f(x for x in L,) 196Traceback (most recent call last): 197SyntaxError: Generator expression must be parenthesized 198>>> f((x for x in L), 1) 199[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 200>>> class C(x for x in L): 201... pass 202Traceback (most recent call last): 203SyntaxError: invalid syntax 204 205>>> def g(*args, **kwargs): 206... print(args, sorted(kwargs.items())) 207>>> g(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 208... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 209... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 210... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 211... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 212... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 213... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 214... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 215... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 216... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 217... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 218... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 219... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 220... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 221... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 222... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 223... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 224... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 225... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 226... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS 227(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) [] 228 229>>> g(a000=0, a001=1, a002=2, a003=3, a004=4, a005=5, a006=6, a007=7, a008=8, 230... a009=9, a010=10, a011=11, a012=12, a013=13, a014=14, a015=15, a016=16, 231... a017=17, a018=18, a019=19, a020=20, a021=21, a022=22, a023=23, a024=24, 232... a025=25, a026=26, a027=27, a028=28, a029=29, a030=30, a031=31, a032=32, 233... a033=33, a034=34, a035=35, a036=36, a037=37, a038=38, a039=39, a040=40, 234... a041=41, a042=42, a043=43, a044=44, a045=45, a046=46, a047=47, a048=48, 235... a049=49, a050=50, a051=51, a052=52, a053=53, a054=54, a055=55, a056=56, 236... a057=57, a058=58, a059=59, a060=60, a061=61, a062=62, a063=63, a064=64, 237... a065=65, a066=66, a067=67, a068=68, a069=69, a070=70, a071=71, a072=72, 238... a073=73, a074=74, a075=75, a076=76, a077=77, a078=78, a079=79, a080=80, 239... a081=81, a082=82, a083=83, a084=84, a085=85, a086=86, a087=87, a088=88, 240... a089=89, a090=90, a091=91, a092=92, a093=93, a094=94, a095=95, a096=96, 241... a097=97, a098=98, a099=99, a100=100, a101=101, a102=102, a103=103, 242... a104=104, a105=105, a106=106, a107=107, a108=108, a109=109, a110=110, 243... a111=111, a112=112, a113=113, a114=114, a115=115, a116=116, a117=117, 244... a118=118, a119=119, a120=120, a121=121, a122=122, a123=123, a124=124, 245... a125=125, a126=126, a127=127, a128=128, a129=129, a130=130, a131=131, 246... a132=132, a133=133, a134=134, a135=135, a136=136, a137=137, a138=138, 247... a139=139, a140=140, a141=141, a142=142, a143=143, a144=144, a145=145, 248... a146=146, a147=147, a148=148, a149=149, a150=150, a151=151, a152=152, 249... a153=153, a154=154, a155=155, a156=156, a157=157, a158=158, a159=159, 250... a160=160, a161=161, a162=162, a163=163, a164=164, a165=165, a166=166, 251... a167=167, a168=168, a169=169, a170=170, a171=171, a172=172, a173=173, 252... a174=174, a175=175, a176=176, a177=177, a178=178, a179=179, a180=180, 253... a181=181, a182=182, a183=183, a184=184, a185=185, a186=186, a187=187, 254... a188=188, a189=189, a190=190, a191=191, a192=192, a193=193, a194=194, 255... a195=195, a196=196, a197=197, a198=198, a199=199, a200=200, a201=201, 256... a202=202, a203=203, a204=204, a205=205, a206=206, a207=207, a208=208, 257... a209=209, a210=210, a211=211, a212=212, a213=213, a214=214, a215=215, 258... a216=216, a217=217, a218=218, a219=219, a220=220, a221=221, a222=222, 259... a223=223, a224=224, a225=225, a226=226, a227=227, a228=228, a229=229, 260... a230=230, a231=231, a232=232, a233=233, a234=234, a235=235, a236=236, 261... a237=237, a238=238, a239=239, a240=240, a241=241, a242=242, a243=243, 262... a244=244, a245=245, a246=246, a247=247, a248=248, a249=249, a250=250, 263... a251=251, a252=252, a253=253, a254=254, a255=255, a256=256, a257=257, 264... a258=258, a259=259, a260=260, a261=261, a262=262, a263=263, a264=264, 265... a265=265, a266=266, a267=267, a268=268, a269=269, a270=270, a271=271, 266... a272=272, a273=273, a274=274, a275=275, a276=276, a277=277, a278=278, 267... a279=279, a280=280, a281=281, a282=282, a283=283, a284=284, a285=285, 268... a286=286, a287=287, a288=288, a289=289, a290=290, a291=291, a292=292, 269... a293=293, a294=294, a295=295, a296=296, a297=297, a298=298, a299=299) 270... # doctest: +ELLIPSIS 271() [('a000', 0), ('a001', 1), ('a002', 2), ..., ('a298', 298), ('a299', 299)] 272 273>>> class C: 274... def meth(self, *args): 275... return args 276>>> obj = C() 277>>> obj.meth( 278... 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 279... 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 280... 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 281... 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 282... 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 283... 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 284... 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 285... 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 286... 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 287... 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 288... 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 289... 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 290... 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 291... 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 292... 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 293... 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 294... 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 295... 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 296... 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 297... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299) # doctest: +ELLIPSIS 298(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ..., 297, 298, 299) 299 300>>> f(lambda x: x[0] = 3) 301Traceback (most recent call last): 302SyntaxError: expression cannot contain assignment, perhaps you meant "=="? 303 304The grammar accepts any test (basically, any expression) in the 305keyword slot of a call site. Test a few different options. 306 307>>> f(x()=2) 308Traceback (most recent call last): 309SyntaxError: expression cannot contain assignment, perhaps you meant "=="? 310>>> f(a or b=1) 311Traceback (most recent call last): 312SyntaxError: expression cannot contain assignment, perhaps you meant "=="? 313>>> f(x.y=1) 314Traceback (most recent call last): 315SyntaxError: expression cannot contain assignment, perhaps you meant "=="? 316>>> f((x)=2) 317Traceback (most recent call last): 318SyntaxError: expression cannot contain assignment, perhaps you meant "=="? 319>>> f(True=2) 320Traceback (most recent call last): 321SyntaxError: cannot assign to True 322>>> f(__debug__=1) 323Traceback (most recent call last): 324SyntaxError: cannot assign to __debug__ 325 326 327More set_context(): 328 329>>> (x for x in x) += 1 330Traceback (most recent call last): 331SyntaxError: cannot assign to generator expression 332>>> None += 1 333Traceback (most recent call last): 334SyntaxError: cannot assign to None 335>>> __debug__ += 1 336Traceback (most recent call last): 337SyntaxError: cannot assign to __debug__ 338>>> f() += 1 339Traceback (most recent call last): 340SyntaxError: cannot assign to function call 341 342 343Test continue in finally in weird combinations. 344 345continue in for loop under finally should be ok. 346 347 >>> def test(): 348 ... try: 349 ... pass 350 ... finally: 351 ... for abc in range(10): 352 ... continue 353 ... print(abc) 354 >>> test() 355 9 356 357continue in a finally should be ok. 358 359 >>> def test(): 360 ... for abc in range(10): 361 ... try: 362 ... pass 363 ... finally: 364 ... continue 365 ... print(abc) 366 >>> test() 367 9 368 369 >>> def test(): 370 ... for abc in range(10): 371 ... try: 372 ... pass 373 ... finally: 374 ... try: 375 ... continue 376 ... except: 377 ... pass 378 ... print(abc) 379 >>> test() 380 9 381 382 >>> def test(): 383 ... for abc in range(10): 384 ... try: 385 ... pass 386 ... finally: 387 ... try: 388 ... pass 389 ... except: 390 ... continue 391 ... print(abc) 392 >>> test() 393 9 394 395A continue outside loop should not be allowed. 396 397 >>> def foo(): 398 ... try: 399 ... pass 400 ... finally: 401 ... continue 402 Traceback (most recent call last): 403 ... 404 SyntaxError: 'continue' not properly in loop 405 406There is one test for a break that is not in a loop. The compiler 407uses a single data structure to keep track of try-finally and loops, 408so we need to be sure that a break is actually inside a loop. If it 409isn't, there should be a syntax error. 410 411 >>> try: 412 ... print(1) 413 ... break 414 ... print(2) 415 ... finally: 416 ... print(3) 417 Traceback (most recent call last): 418 ... 419 SyntaxError: 'break' outside loop 420 421This raises a SyntaxError, it used to raise a SystemError. 422Context for this change can be found on issue #27514 423 424In 2.5 there was a missing exception and an assert was triggered in a debug 425build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514 426 427 >>> while 1: 428 ... while 2: 429 ... while 3: 430 ... while 4: 431 ... while 5: 432 ... while 6: 433 ... while 8: 434 ... while 9: 435 ... while 10: 436 ... while 11: 437 ... while 12: 438 ... while 13: 439 ... while 14: 440 ... while 15: 441 ... while 16: 442 ... while 17: 443 ... while 18: 444 ... while 19: 445 ... while 20: 446 ... while 21: 447 ... while 22: 448 ... break 449 Traceback (most recent call last): 450 ... 451 SyntaxError: too many statically nested blocks 452 453Misuse of the nonlocal and global statement can lead to a few unique syntax errors. 454 455 >>> def f(): 456 ... print(x) 457 ... global x 458 Traceback (most recent call last): 459 ... 460 SyntaxError: name 'x' is used prior to global declaration 461 462 >>> def f(): 463 ... x = 1 464 ... global x 465 Traceback (most recent call last): 466 ... 467 SyntaxError: name 'x' is assigned to before global declaration 468 469 >>> def f(x): 470 ... global x 471 Traceback (most recent call last): 472 ... 473 SyntaxError: name 'x' is parameter and global 474 475 >>> def f(): 476 ... x = 1 477 ... def g(): 478 ... print(x) 479 ... nonlocal x 480 Traceback (most recent call last): 481 ... 482 SyntaxError: name 'x' is used prior to nonlocal declaration 483 484 >>> def f(): 485 ... x = 1 486 ... def g(): 487 ... x = 2 488 ... nonlocal x 489 Traceback (most recent call last): 490 ... 491 SyntaxError: name 'x' is assigned to before nonlocal declaration 492 493 >>> def f(x): 494 ... nonlocal x 495 Traceback (most recent call last): 496 ... 497 SyntaxError: name 'x' is parameter and nonlocal 498 499 >>> def f(): 500 ... global x 501 ... nonlocal x 502 Traceback (most recent call last): 503 ... 504 SyntaxError: name 'x' is nonlocal and global 505 506 >>> def f(): 507 ... nonlocal x 508 Traceback (most recent call last): 509 ... 510 SyntaxError: no binding for nonlocal 'x' found 511 512From SF bug #1705365 513 >>> nonlocal x 514 Traceback (most recent call last): 515 ... 516 SyntaxError: nonlocal declaration not allowed at module level 517 518From https://bugs.python.org/issue25973 519 >>> class A: 520 ... def f(self): 521 ... nonlocal __x 522 Traceback (most recent call last): 523 ... 524 SyntaxError: no binding for nonlocal '_A__x' found 525 526 527This tests assignment-context; there was a bug in Python 2.5 where compiling 528a complex 'if' (one with 'elif') would fail to notice an invalid suite, 529leading to spurious errors. 530 531 >>> if 1: 532 ... x() = 1 533 ... elif 1: 534 ... pass 535 Traceback (most recent call last): 536 ... 537 SyntaxError: cannot assign to function call 538 539 >>> if 1: 540 ... pass 541 ... elif 1: 542 ... x() = 1 543 Traceback (most recent call last): 544 ... 545 SyntaxError: cannot assign to function call 546 547 >>> if 1: 548 ... x() = 1 549 ... elif 1: 550 ... pass 551 ... else: 552 ... pass 553 Traceback (most recent call last): 554 ... 555 SyntaxError: cannot assign to function call 556 557 >>> if 1: 558 ... pass 559 ... elif 1: 560 ... x() = 1 561 ... else: 562 ... pass 563 Traceback (most recent call last): 564 ... 565 SyntaxError: cannot assign to function call 566 567 >>> if 1: 568 ... pass 569 ... elif 1: 570 ... pass 571 ... else: 572 ... x() = 1 573 Traceback (most recent call last): 574 ... 575 SyntaxError: cannot assign to function call 576 577Make sure that the old "raise X, Y[, Z]" form is gone: 578 >>> raise X, Y 579 Traceback (most recent call last): 580 ... 581 SyntaxError: invalid syntax 582 >>> raise X, Y, Z 583 Traceback (most recent call last): 584 ... 585 SyntaxError: invalid syntax 586 587 588>>> f(a=23, a=234) 589Traceback (most recent call last): 590 ... 591SyntaxError: keyword argument repeated 592 593>>> {1, 2, 3} = 42 594Traceback (most recent call last): 595SyntaxError: cannot assign to set display 596 597>>> {1: 2, 3: 4} = 42 598Traceback (most recent call last): 599SyntaxError: cannot assign to dict display 600 601>>> f'{x}' = 42 602Traceback (most recent call last): 603SyntaxError: cannot assign to f-string expression 604 605>>> f'{x}-{y}' = 42 606Traceback (most recent call last): 607SyntaxError: cannot assign to f-string expression 608 609Corner-cases that used to fail to raise the correct error: 610 611 >>> def f(*, x=lambda __debug__:0): pass 612 Traceback (most recent call last): 613 SyntaxError: cannot assign to __debug__ 614 615 >>> def f(*args:(lambda __debug__:0)): pass 616 Traceback (most recent call last): 617 SyntaxError: cannot assign to __debug__ 618 619 >>> def f(**kwargs:(lambda __debug__:0)): pass 620 Traceback (most recent call last): 621 SyntaxError: cannot assign to __debug__ 622 623 >>> with (lambda *:0): pass 624 Traceback (most recent call last): 625 SyntaxError: named arguments must follow bare * 626 627Corner-cases that used to crash: 628 629 >>> def f(**__debug__): pass 630 Traceback (most recent call last): 631 SyntaxError: cannot assign to __debug__ 632 633 >>> def f(*xx, __debug__): pass 634 Traceback (most recent call last): 635 SyntaxError: cannot assign to __debug__ 636 637""" 638 639import re 640import unittest 641 642from test import support 643 644class SyntaxTestCase(unittest.TestCase): 645 646 def _check_error(self, code, errtext, 647 filename="<testcase>", mode="exec", subclass=None, lineno=None, offset=None): 648 """Check that compiling code raises SyntaxError with errtext. 649 650 errtest is a regular expression that must be present in the 651 test of the exception raised. If subclass is specified it 652 is the expected subclass of SyntaxError (e.g. IndentationError). 653 """ 654 try: 655 compile(code, filename, mode) 656 except SyntaxError as err: 657 if subclass and not isinstance(err, subclass): 658 self.fail("SyntaxError is not a %s" % subclass.__name__) 659 mo = re.search(errtext, str(err)) 660 if mo is None: 661 self.fail("SyntaxError did not contain '%r'" % (errtext,)) 662 self.assertEqual(err.filename, filename) 663 if lineno is not None: 664 self.assertEqual(err.lineno, lineno) 665 if offset is not None: 666 self.assertEqual(err.offset, offset) 667 else: 668 self.fail("compile() did not raise SyntaxError") 669 670 def test_assign_call(self): 671 self._check_error("f() = 1", "assign") 672 673 def test_assign_del(self): 674 self._check_error("del f()", "delete") 675 676 def test_global_param_err_first(self): 677 source = """if 1: 678 def error(a): 679 global a # SyntaxError 680 def error2(): 681 b = 1 682 global b # SyntaxError 683 """ 684 self._check_error(source, "parameter and global", lineno=3) 685 686 def test_nonlocal_param_err_first(self): 687 source = """if 1: 688 def error(a): 689 nonlocal a # SyntaxError 690 def error2(): 691 b = 1 692 global b # SyntaxError 693 """ 694 self._check_error(source, "parameter and nonlocal", lineno=3) 695 696 def test_break_outside_loop(self): 697 self._check_error("break", "outside loop") 698 699 def test_yield_outside_function(self): 700 self._check_error("if 0: yield", "outside function") 701 self._check_error("if 0: yield\nelse: x=1", "outside function") 702 self._check_error("if 1: pass\nelse: yield", "outside function") 703 self._check_error("while 0: yield", "outside function") 704 self._check_error("while 0: yield\nelse: x=1", "outside function") 705 self._check_error("class C:\n if 0: yield", "outside function") 706 self._check_error("class C:\n if 1: pass\n else: yield", 707 "outside function") 708 self._check_error("class C:\n while 0: yield", "outside function") 709 self._check_error("class C:\n while 0: yield\n else: x = 1", 710 "outside function") 711 712 def test_return_outside_function(self): 713 self._check_error("if 0: return", "outside function") 714 self._check_error("if 0: return\nelse: x=1", "outside function") 715 self._check_error("if 1: pass\nelse: return", "outside function") 716 self._check_error("while 0: return", "outside function") 717 self._check_error("class C:\n if 0: return", "outside function") 718 self._check_error("class C:\n while 0: return", "outside function") 719 self._check_error("class C:\n while 0: return\n else: x=1", 720 "outside function") 721 self._check_error("class C:\n if 0: return\n else: x= 1", 722 "outside function") 723 self._check_error("class C:\n if 1: pass\n else: return", 724 "outside function") 725 726 def test_break_outside_loop(self): 727 self._check_error("if 0: break", "outside loop") 728 self._check_error("if 0: break\nelse: x=1", "outside loop") 729 self._check_error("if 1: pass\nelse: break", "outside loop") 730 self._check_error("class C:\n if 0: break", "outside loop") 731 self._check_error("class C:\n if 1: pass\n else: break", 732 "outside loop") 733 734 def test_continue_outside_loop(self): 735 self._check_error("if 0: continue", "not properly in loop") 736 self._check_error("if 0: continue\nelse: x=1", "not properly in loop") 737 self._check_error("if 1: pass\nelse: continue", "not properly in loop") 738 self._check_error("class C:\n if 0: continue", "not properly in loop") 739 self._check_error("class C:\n if 1: pass\n else: continue", 740 "not properly in loop") 741 742 def test_unexpected_indent(self): 743 self._check_error("foo()\n bar()\n", "unexpected indent", 744 subclass=IndentationError) 745 746 def test_no_indent(self): 747 self._check_error("if 1:\nfoo()", "expected an indented block", 748 subclass=IndentationError) 749 750 def test_bad_outdent(self): 751 self._check_error("if 1:\n foo()\n bar()", 752 "unindent does not match .* level", 753 subclass=IndentationError) 754 755 def test_kwargs_last(self): 756 self._check_error("int(base=10, '2')", 757 "positional argument follows keyword argument") 758 759 def test_kwargs_last2(self): 760 self._check_error("int(**{'base': 10}, '2')", 761 "positional argument follows " 762 "keyword argument unpacking") 763 764 def test_kwargs_last3(self): 765 self._check_error("int(**{'base': 10}, *['2'])", 766 "iterable argument unpacking follows " 767 "keyword argument unpacking") 768 769def test_main(): 770 support.run_unittest(SyntaxTestCase) 771 from test import test_syntax 772 support.run_doctest(test_syntax, verbosity=True) 773 774if __name__ == "__main__": 775 test_main() 776