Home | History | Annotate | Download | only in test
      1 """This module tests SyntaxErrors.
      2 
      3 Here's an example of the sort of thing that is tested.
      4 
      5 >>> def f(x):
      6 ...     global x
      7 Traceback (most recent call last):
      8 SyntaxError: name 'x' is local and global (<doctest test.test_syntax[0]>, line 1)
      9 
     10 The tests are all raise SyntaxErrors.  They were created by checking
     11 each C call that raises SyntaxError.  There are several modules that
     12 raise these exceptions-- ast.c, compile.c, future.c, pythonrun.c, and
     13 symtable.c.
     14 
     15 The parser itself outlaws a lot of invalid syntax.  None of these
     16 errors are tested here at the moment.  We should add some tests; since
     17 there are infinitely many programs with invalid syntax, we would need
     18 to be judicious in selecting some.
     19 
     20 The compiler generates a synthetic module name for code executed by
     21 doctest.  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
     23 order of tests in this module means renumbering all the errors after
     24 it.  (Maybe we should enable the ellipsis option for these tests.)
     25 
     26 In ast.c, syntax errors are raised by calling ast_error().
     27 
     28 Errors from set_context():
     29 
     30 >>> obj.None = 1
     31 Traceback (most recent call last):
     32   File "<doctest test.test_syntax[1]>", line 1
     33 SyntaxError: cannot assign to None
     34 
     35 >>> None = 1
     36 Traceback (most recent call last):
     37   File "<doctest test.test_syntax[2]>", line 1
     38 SyntaxError: cannot assign to None
     39 
     40 It's a syntax error to assign to the empty tuple.  Why isn't it an
     41 error to assign to the empty list?  It will always raise some error at
     42 runtime.
     43 
     44 >>> () = 1
     45 Traceback (most recent call last):
     46   File "<doctest test.test_syntax[3]>", line 1
     47 SyntaxError: can't assign to ()
     48 
     49 >>> f() = 1
     50 Traceback (most recent call last):
     51   File "<doctest test.test_syntax[4]>", line 1
     52 SyntaxError: can't assign to function call
     53 
     54 >>> del f()
     55 Traceback (most recent call last):
     56   File "<doctest test.test_syntax[5]>", line 1
     57 SyntaxError: can't delete function call
     58 
     59 >>> a + 1 = 2
     60 Traceback (most recent call last):
     61   File "<doctest test.test_syntax[6]>", line 1
     62 SyntaxError: can't assign to operator
     63 
     64 >>> (x for x in x) = 1
     65 Traceback (most recent call last):
     66   File "<doctest test.test_syntax[7]>", line 1
     67 SyntaxError: can't assign to generator expression
     68 
     69 >>> 1 = 1
     70 Traceback (most recent call last):
     71   File "<doctest test.test_syntax[8]>", line 1
     72 SyntaxError: can't assign to literal
     73 
     74 >>> "abc" = 1
     75 Traceback (most recent call last):
     76   File "<doctest test.test_syntax[8]>", line 1
     77 SyntaxError: can't assign to literal
     78 
     79 >>> `1` = 1
     80 Traceback (most recent call last):
     81   File "<doctest test.test_syntax[10]>", line 1
     82 SyntaxError: can't assign to repr
     83 
     84 If the left-hand side of an assignment is a list or tuple, an illegal
     85 expression inside that contain should still cause a syntax error.
     86 This test just checks a couple of cases rather than enumerating all of
     87 them.
     88 
     89 >>> (a, "b", c) = (1, 2, 3)
     90 Traceback (most recent call last):
     91   File "<doctest test.test_syntax[11]>", line 1
     92 SyntaxError: can't assign to literal
     93 
     94 >>> [a, b, c + 1] = [1, 2, 3]
     95 Traceback (most recent call last):
     96   File "<doctest test.test_syntax[12]>", line 1
     97 SyntaxError: can't assign to operator
     98 
     99 >>> a if 1 else b = 1
    100 Traceback (most recent call last):
    101   File "<doctest test.test_syntax[13]>", line 1
    102 SyntaxError: can't assign to conditional expression
    103 
    104 From compiler_complex_args():
    105 
    106 >>> def f(None=1):
    107 ...     pass
    108 Traceback (most recent call last):
    109   File "<doctest test.test_syntax[14]>", line 1
    110 SyntaxError: cannot assign to None
    111 
    112 
    113 From ast_for_arguments():
    114 
    115 >>> def f(x, y=1, z):
    116 ...     pass
    117 Traceback (most recent call last):
    118   File "<doctest test.test_syntax[15]>", line 1
    119 SyntaxError: non-default argument follows default argument
    120 
    121 >>> def f(x, None):
    122 ...     pass
    123 Traceback (most recent call last):
    124   File "<doctest test.test_syntax[16]>", line 1
    125 SyntaxError: cannot assign to None
    126 
    127 >>> def f(*None):
    128 ...     pass
    129 Traceback (most recent call last):
    130   File "<doctest test.test_syntax[17]>", line 1
    131 SyntaxError: cannot assign to None
    132 
    133 >>> def f(**None):
    134 ...     pass
    135 Traceback (most recent call last):
    136   File "<doctest test.test_syntax[18]>", line 1
    137 SyntaxError: cannot assign to None
    138 
    139 
    140 From ast_for_funcdef():
    141 
    142 >>> def None(x):
    143 ...     pass
    144 Traceback (most recent call last):
    145   File "<doctest test.test_syntax[19]>", line 1
    146 SyntaxError: cannot assign to None
    147 
    148 
    149 From ast_for_call():
    150 
    151 >>> def f(it, *varargs):
    152 ...     return list(it)
    153 >>> L = range(10)
    154 >>> f(x for x in L)
    155 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    156 >>> f(x for x in L, 1)
    157 Traceback (most recent call last):
    158   File "<doctest test.test_syntax[23]>", line 1
    159 SyntaxError: Generator expression must be parenthesized if not sole argument
    160 >>> f((x for x in L), 1)
    161 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    162 
    163 >>> f(i0,  i1,  i2,  i3,  i4,  i5,  i6,  i7,  i8,  i9,  i10,  i11,
    164 ...   i12,  i13,  i14,  i15,  i16,  i17,  i18,  i19,  i20,  i21,  i22,
    165 ...   i23,  i24,  i25,  i26,  i27,  i28,  i29,  i30,  i31,  i32,  i33,
    166 ...   i34,  i35,  i36,  i37,  i38,  i39,  i40,  i41,  i42,  i43,  i44,
    167 ...   i45,  i46,  i47,  i48,  i49,  i50,  i51,  i52,  i53,  i54,  i55,
    168 ...   i56,  i57,  i58,  i59,  i60,  i61,  i62,  i63,  i64,  i65,  i66,
    169 ...   i67,  i68,  i69,  i70,  i71,  i72,  i73,  i74,  i75,  i76,  i77,
    170 ...   i78,  i79,  i80,  i81,  i82,  i83,  i84,  i85,  i86,  i87,  i88,
    171 ...   i89,  i90,  i91,  i92,  i93,  i94,  i95,  i96,  i97,  i98,  i99,
    172 ...   i100,  i101,  i102,  i103,  i104,  i105,  i106,  i107,  i108,
    173 ...   i109,  i110,  i111,  i112,  i113,  i114,  i115,  i116,  i117,
    174 ...   i118,  i119,  i120,  i121,  i122,  i123,  i124,  i125,  i126,
    175 ...   i127,  i128,  i129,  i130,  i131,  i132,  i133,  i134,  i135,
    176 ...   i136,  i137,  i138,  i139,  i140,  i141,  i142,  i143,  i144,
    177 ...   i145,  i146,  i147,  i148,  i149,  i150,  i151,  i152,  i153,
    178 ...   i154,  i155,  i156,  i157,  i158,  i159,  i160,  i161,  i162,
    179 ...   i163,  i164,  i165,  i166,  i167,  i168,  i169,  i170,  i171,
    180 ...   i172,  i173,  i174,  i175,  i176,  i177,  i178,  i179,  i180,
    181 ...   i181,  i182,  i183,  i184,  i185,  i186,  i187,  i188,  i189,
    182 ...   i190,  i191,  i192,  i193,  i194,  i195,  i196,  i197,  i198,
    183 ...   i199,  i200,  i201,  i202,  i203,  i204,  i205,  i206,  i207,
    184 ...   i208,  i209,  i210,  i211,  i212,  i213,  i214,  i215,  i216,
    185 ...   i217,  i218,  i219,  i220,  i221,  i222,  i223,  i224,  i225,
    186 ...   i226,  i227,  i228,  i229,  i230,  i231,  i232,  i233,  i234,
    187 ...   i235,  i236,  i237,  i238,  i239,  i240,  i241,  i242,  i243,
    188 ...   i244,  i245,  i246,  i247,  i248,  i249,  i250,  i251,  i252,
    189 ...   i253,  i254,  i255)
    190 Traceback (most recent call last):
    191   File "<doctest test.test_syntax[25]>", line 1
    192 SyntaxError: more than 255 arguments
    193 
    194 The actual error cases counts positional arguments, keyword arguments,
    195 and generator expression arguments separately.  This test combines the
    196 three.
    197 
    198 >>> f(i0,  i1,  i2,  i3,  i4,  i5,  i6,  i7,  i8,  i9,  i10,  i11,
    199 ...   i12,  i13,  i14,  i15,  i16,  i17,  i18,  i19,  i20,  i21,  i22,
    200 ...   i23,  i24,  i25,  i26,  i27,  i28,  i29,  i30,  i31,  i32,  i33,
    201 ...   i34,  i35,  i36,  i37,  i38,  i39,  i40,  i41,  i42,  i43,  i44,
    202 ...   i45,  i46,  i47,  i48,  i49,  i50,  i51,  i52,  i53,  i54,  i55,
    203 ...   i56,  i57,  i58,  i59,  i60,  i61,  i62,  i63,  i64,  i65,  i66,
    204 ...   i67,  i68,  i69,  i70,  i71,  i72,  i73,  i74,  i75,  i76,  i77,
    205 ...   i78,  i79,  i80,  i81,  i82,  i83,  i84,  i85,  i86,  i87,  i88,
    206 ...   i89,  i90,  i91,  i92,  i93,  i94,  i95,  i96,  i97,  i98,  i99,
    207 ...   i100,  i101,  i102,  i103,  i104,  i105,  i106,  i107,  i108,
    208 ...   i109,  i110,  i111,  i112,  i113,  i114,  i115,  i116,  i117,
    209 ...   i118,  i119,  i120,  i121,  i122,  i123,  i124,  i125,  i126,
    210 ...   i127,  i128,  i129,  i130,  i131,  i132,  i133,  i134,  i135,
    211 ...   i136,  i137,  i138,  i139,  i140,  i141,  i142,  i143,  i144,
    212 ...   i145,  i146,  i147,  i148,  i149,  i150,  i151,  i152,  i153,
    213 ...   i154,  i155,  i156,  i157,  i158,  i159,  i160,  i161,  i162,
    214 ...   i163,  i164,  i165,  i166,  i167,  i168,  i169,  i170,  i171,
    215 ...   i172,  i173,  i174,  i175,  i176,  i177,  i178,  i179,  i180,
    216 ...   i181,  i182,  i183,  i184,  i185,  i186,  i187,  i188,  i189,
    217 ...   i190,  i191,  i192,  i193,  i194,  i195,  i196,  i197,  i198,
    218 ...   i199,  i200,  i201,  i202,  i203,  i204,  i205,  i206,  i207,
    219 ...   i208,  i209,  i210,  i211,  i212,  i213,  i214,  i215,  i216,
    220 ...   i217,  i218,  i219,  i220,  i221,  i222,  i223,  i224,  i225,
    221 ...   i226,  i227,  i228,  i229,  i230,  i231,  i232,  i233,  i234,
    222 ...   i235, i236,  i237,  i238,  i239,  i240,  i241,  i242,  i243,
    223 ...   (x for x in i244),  i245,  i246,  i247,  i248,  i249,  i250,  i251,
    224 ...    i252=1, i253=1,  i254=1,  i255=1)
    225 Traceback (most recent call last):
    226   File "<doctest test.test_syntax[26]>", line 1
    227 SyntaxError: more than 255 arguments
    228 
    229 >>> f(lambda x: x[0] = 3)
    230 Traceback (most recent call last):
    231   File "<doctest test.test_syntax[27]>", line 1
    232 SyntaxError: lambda cannot contain assignment
    233 
    234 The grammar accepts any test (basically, any expression) in the
    235 keyword slot of a call site.  Test a few different options.
    236 
    237 >>> f(x()=2)
    238 Traceback (most recent call last):
    239   File "<doctest test.test_syntax[28]>", line 1
    240 SyntaxError: keyword can't be an expression
    241 >>> f(a or b=1)
    242 Traceback (most recent call last):
    243   File "<doctest test.test_syntax[29]>", line 1
    244 SyntaxError: keyword can't be an expression
    245 >>> f(x.y=1)
    246 Traceback (most recent call last):
    247   File "<doctest test.test_syntax[30]>", line 1
    248 SyntaxError: keyword can't be an expression
    249 
    250 
    251 More set_context():
    252 
    253 >>> (x for x in x) += 1
    254 Traceback (most recent call last):
    255   File "<doctest test.test_syntax[31]>", line 1
    256 SyntaxError: can't assign to generator expression
    257 >>> None += 1
    258 Traceback (most recent call last):
    259   File "<doctest test.test_syntax[32]>", line 1
    260 SyntaxError: cannot assign to None
    261 >>> f() += 1
    262 Traceback (most recent call last):
    263   File "<doctest test.test_syntax[33]>", line 1
    264 SyntaxError: can't assign to function call
    265 
    266 
    267 Test continue in finally in weird combinations.
    268 
    269 continue in for loop under finally should be ok.
    270 
    271     >>> def test():
    272     ...     try:
    273     ...         pass
    274     ...     finally:
    275     ...         for abc in range(10):
    276     ...             continue
    277     ...     print abc
    278     >>> test()
    279     9
    280 
    281 Start simple, a continue in a finally should not be allowed.
    282 
    283     >>> def test():
    284     ...    for abc in range(10):
    285     ...        try:
    286     ...            pass
    287     ...        finally:
    288     ...            continue
    289     Traceback (most recent call last):
    290       ...
    291       File "<doctest test.test_syntax[36]>", line 6
    292     SyntaxError: 'continue' not supported inside 'finally' clause
    293 
    294 This is essentially a continue in a finally which should not be allowed.
    295 
    296     >>> def test():
    297     ...    for abc in range(10):
    298     ...        try:
    299     ...            pass
    300     ...        finally:
    301     ...            try:
    302     ...                continue
    303     ...            except:
    304     ...                pass
    305     Traceback (most recent call last):
    306       ...
    307       File "<doctest test.test_syntax[37]>", line 6
    308     SyntaxError: 'continue' not supported inside 'finally' clause
    309 
    310     >>> def foo():
    311     ...     try:
    312     ...         pass
    313     ...     finally:
    314     ...         continue
    315     Traceback (most recent call last):
    316       ...
    317       File "<doctest test.test_syntax[38]>", line 5
    318     SyntaxError: 'continue' not supported inside 'finally' clause
    319 
    320     >>> def foo():
    321     ...     for a in ():
    322     ...       try:
    323     ...           pass
    324     ...       finally:
    325     ...           continue
    326     Traceback (most recent call last):
    327       ...
    328       File "<doctest test.test_syntax[39]>", line 6
    329     SyntaxError: 'continue' not supported inside 'finally' clause
    330 
    331     >>> def foo():
    332     ...     for a in ():
    333     ...         try:
    334     ...             pass
    335     ...         finally:
    336     ...             try:
    337     ...                 continue
    338     ...             finally:
    339     ...                 pass
    340     Traceback (most recent call last):
    341       ...
    342       File "<doctest test.test_syntax[40]>", line 7
    343     SyntaxError: 'continue' not supported inside 'finally' clause
    344 
    345     >>> def foo():
    346     ...  for a in ():
    347     ...   try: pass
    348     ...   finally:
    349     ...    try:
    350     ...     pass
    351     ...    except:
    352     ...     continue
    353     Traceback (most recent call last):
    354       ...
    355       File "<doctest test.test_syntax[41]>", line 8
    356     SyntaxError: 'continue' not supported inside 'finally' clause
    357 
    358 There is one test for a break that is not in a loop.  The compiler
    359 uses a single data structure to keep track of try-finally and loops,
    360 so we need to be sure that a break is actually inside a loop.  If it
    361 isn't, there should be a syntax error.
    362 
    363    >>> try:
    364    ...     print 1
    365    ...     break
    366    ...     print 2
    367    ... finally:
    368    ...     print 3
    369    Traceback (most recent call last):
    370      ...
    371      File "<doctest test.test_syntax[42]>", line 3
    372    SyntaxError: 'break' outside loop
    373 
    374 This should probably raise a better error than a SystemError (or none at all).
    375 In 2.5 there was a missing exception and an assert was triggered in a debug
    376 build.  The number of blocks must be greater than CO_MAXBLOCKS.  SF #1565514
    377 
    378    >>> while 1:
    379    ...  while 2:
    380    ...   while 3:
    381    ...    while 4:
    382    ...     while 5:
    383    ...      while 6:
    384    ...       while 8:
    385    ...        while 9:
    386    ...         while 10:
    387    ...          while 11:
    388    ...           while 12:
    389    ...            while 13:
    390    ...             while 14:
    391    ...              while 15:
    392    ...               while 16:
    393    ...                while 17:
    394    ...                 while 18:
    395    ...                  while 19:
    396    ...                   while 20:
    397    ...                    while 21:
    398    ...                     while 22:
    399    ...                      break
    400    Traceback (most recent call last):
    401      ...
    402    SystemError: too many statically nested blocks
    403 
    404 This tests assignment-context; there was a bug in Python 2.5 where compiling
    405 a complex 'if' (one with 'elif') would fail to notice an invalid suite,
    406 leading to spurious errors.
    407 
    408    >>> if 1:
    409    ...   x() = 1
    410    ... elif 1:
    411    ...   pass
    412    Traceback (most recent call last):
    413      ...
    414      File "<doctest test.test_syntax[44]>", line 2
    415    SyntaxError: can't assign to function call
    416 
    417    >>> if 1:
    418    ...   pass
    419    ... elif 1:
    420    ...   x() = 1
    421    Traceback (most recent call last):
    422      ...
    423      File "<doctest test.test_syntax[45]>", line 4
    424    SyntaxError: can't assign to function call
    425 
    426    >>> if 1:
    427    ...   x() = 1
    428    ... elif 1:
    429    ...   pass
    430    ... else:
    431    ...   pass
    432    Traceback (most recent call last):
    433      ...
    434      File "<doctest test.test_syntax[46]>", line 2
    435    SyntaxError: can't assign to function call
    436 
    437    >>> if 1:
    438    ...   pass
    439    ... elif 1:
    440    ...   x() = 1
    441    ... else:
    442    ...   pass
    443    Traceback (most recent call last):
    444      ...
    445      File "<doctest test.test_syntax[47]>", line 4
    446    SyntaxError: can't assign to function call
    447 
    448    >>> if 1:
    449    ...   pass
    450    ... elif 1:
    451    ...   pass
    452    ... else:
    453    ...   x() = 1
    454    Traceback (most recent call last):
    455      ...
    456      File "<doctest test.test_syntax[48]>", line 6
    457    SyntaxError: can't assign to function call
    458 
    459 >>> f(a=23, a=234)
    460 Traceback (most recent call last):
    461    ...
    462   File "<doctest test.test_syntax[49]>", line 1
    463 SyntaxError: keyword argument repeated
    464 
    465 >>> del ()
    466 Traceback (most recent call last):
    467    ...
    468   File "<doctest test.test_syntax[50]>", line 1
    469 SyntaxError: can't delete ()
    470 
    471 >>> {1, 2, 3} = 42
    472 Traceback (most recent call last):
    473    ...
    474    File "<doctest test.test_syntax[50]>", line 1
    475 SyntaxError: can't assign to literal
    476 
    477 Corner-case that used to crash:
    478 
    479     >>> def f(*xx, **__debug__): pass
    480     Traceback (most recent call last):
    481     SyntaxError: cannot assign to __debug__
    482 
    483 """
    484 
    485 import re
    486 import unittest
    487 import warnings
    488 
    489 from test import test_support
    490 
    491 class SyntaxTestCase(unittest.TestCase):
    492 
    493     def _check_error(self, code, errtext,
    494                      filename="<testcase>", mode="exec", subclass=None):
    495         """Check that compiling code raises SyntaxError with errtext.
    496 
    497         errtest is a regular expression that must be present in the
    498         test of the exception raised.  If subclass is specified it
    499         is the expected subclass of SyntaxError (e.g. IndentationError).
    500         """
    501         try:
    502             compile(code, filename, mode)
    503         except SyntaxError, err:
    504             if subclass and not isinstance(err, subclass):
    505                 self.fail("SyntaxError is not a %s" % subclass.__name__)
    506             mo = re.search(errtext, str(err))
    507             if mo is None:
    508                 self.fail("%s did not contain '%r'" % (err, errtext,))
    509         else:
    510             self.fail("compile() did not raise SyntaxError")
    511 
    512     def test_paren_arg_with_default(self):
    513         self._check_error("def f((x)=23): pass",
    514                           "parenthesized arg with default")
    515 
    516     def test_assign_call(self):
    517         self._check_error("f() = 1", "assign")
    518 
    519     def test_assign_del(self):
    520         self._check_error("del f()", "delete")
    521 
    522     def test_global_err_then_warn(self):
    523         # Bug tickler:  The SyntaxError raised for one global statement
    524         # shouldn't be clobbered by a SyntaxWarning issued for a later one.
    525         source = re.sub('(?m)^ *:', '', """\
    526             :def error(a):
    527             :    global a  # SyntaxError
    528             :def warning():
    529             :    b = 1
    530             :    global b  # SyntaxWarning
    531             :""")
    532         warnings.filterwarnings(action='ignore', category=SyntaxWarning)
    533         self._check_error(source, "global")
    534         warnings.filters.pop(0)
    535 
    536     def test_break_outside_loop(self):
    537         self._check_error("break", "outside loop")
    538 
    539     def test_delete_deref(self):
    540         source = re.sub('(?m)^ *:', '', """\
    541             :def foo(x):
    542             :  def bar():
    543             :    print x
    544             :  del x
    545             :""")
    546         self._check_error(source, "nested scope")
    547 
    548     def test_unexpected_indent(self):
    549         self._check_error("foo()\n bar()\n", "unexpected indent",
    550                           subclass=IndentationError)
    551 
    552     def test_no_indent(self):
    553         self._check_error("if 1:\nfoo()", "expected an indented block",
    554                           subclass=IndentationError)
    555 
    556     def test_bad_outdent(self):
    557         self._check_error("if 1:\n  foo()\n bar()",
    558                           "unindent does not match .* level",
    559                           subclass=IndentationError)
    560 
    561     def test_kwargs_last(self):
    562         self._check_error("int(base=10, '2')", "non-keyword arg")
    563 
    564 def test_main():
    565     test_support.run_unittest(SyntaxTestCase)
    566     from test import test_syntax
    567     with test_support.check_py3k_warnings(("backquote not supported",
    568                                              SyntaxWarning)):
    569         test_support.run_doctest(test_syntax, verbosity=True)
    570 
    571 if __name__ == "__main__":
    572     test_main()
    573