Home | History | Annotate | Download | only in test
      1 """
      2    Test cases for codeop.py
      3    Nick Mathewson
      4 """
      5 import unittest
      6 from test.test_support import run_unittest, is_jython
      7 
      8 from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT
      9 
     10 if is_jython:
     11     import sys
     12     import cStringIO
     13 
     14     def unify_callables(d):
     15         for n,v in d.items():
     16             if callable(v):
     17                 d[n] = callable
     18         return d
     19 
     20 class CodeopTests(unittest.TestCase):
     21 
     22     def assertValid(self, str, symbol='single'):
     23         '''succeed iff str is a valid piece of code'''
     24         if is_jython:
     25             code = compile_command(str, "<input>", symbol)
     26             self.assertTrue(code)
     27             if symbol == "single":
     28                 d,r = {},{}
     29                 saved_stdout = sys.stdout
     30                 sys.stdout = cStringIO.StringIO()
     31                 try:
     32                     exec code in d
     33                     exec compile(str,"<input>","single") in r
     34                 finally:
     35                     sys.stdout = saved_stdout
     36             elif symbol == 'eval':
     37                 ctx = {'a': 2}
     38                 d = { 'value': eval(code,ctx) }
     39                 r = { 'value': eval(str,ctx) }
     40             self.assertEqual(unify_callables(r),unify_callables(d))
     41         else:
     42             expected = compile(str, "<input>", symbol, PyCF_DONT_IMPLY_DEDENT)
     43             self.assertEqual(compile_command(str, "<input>", symbol), expected)
     44 
     45     def assertIncomplete(self, str, symbol='single'):
     46         '''succeed iff str is the start of a valid piece of code'''
     47         self.assertEqual(compile_command(str, symbol=symbol), None)
     48 
     49     def assertInvalid(self, str, symbol='single', is_syntax=1):
     50         '''succeed iff str is the start of an invalid piece of code'''
     51         try:
     52             compile_command(str,symbol=symbol)
     53             self.fail("No exception raised for invalid code")
     54         except SyntaxError:
     55             self.assertTrue(is_syntax)
     56         except OverflowError:
     57             self.assertTrue(not is_syntax)
     58 
     59     def test_valid(self):
     60         av = self.assertValid
     61 
     62         # special case
     63         if not is_jython:
     64             self.assertEqual(compile_command(""),
     65                              compile("pass", "<input>", 'single',
     66                                      PyCF_DONT_IMPLY_DEDENT))
     67             self.assertEqual(compile_command("\n"),
     68                              compile("pass", "<input>", 'single',
     69                                      PyCF_DONT_IMPLY_DEDENT))
     70         else:
     71             av("")
     72             av("\n")
     73 
     74         av("a = 1")
     75         av("\na = 1")
     76         av("a = 1\n")
     77         av("a = 1\n\n")
     78         av("\n\na = 1\n\n")
     79 
     80         av("def x():\n  pass\n")
     81         av("if 1:\n pass\n")
     82 
     83         av("\n\nif 1: pass\n")
     84         av("\n\nif 1: pass\n\n")
     85 
     86         av("def x():\n\n pass\n")
     87         av("def x():\n  pass\n  \n")
     88         av("def x():\n  pass\n \n")
     89 
     90         av("pass\n")
     91         av("3**3\n")
     92 
     93         av("if 9==3:\n   pass\nelse:\n   pass\n")
     94         av("if 1:\n pass\n if 1:\n  pass\n else:\n  pass\n")
     95 
     96         av("#a\n#b\na = 3\n")
     97         av("#a\n\n   \na=3\n")
     98         av("a=3\n\n")
     99         av("a = 9+ \\\n3")
    100 
    101         av("3**3","eval")
    102         av("(lambda z: \n z**3)","eval")
    103 
    104         av("9+ \\\n3","eval")
    105         av("9+ \\\n3\n","eval")
    106 
    107         av("\n\na**3","eval")
    108         av("\n \na**3","eval")
    109         av("#a\n#b\na**3","eval")
    110 
    111         av("\n\na = 1\n\n")
    112         av("\n\nif 1: a=1\n\n")
    113 
    114         av("if 1:\n pass\n if 1:\n  pass\n else:\n  pass\n")
    115         av("#a\n\n   \na=3\n\n")
    116 
    117         av("\n\na**3","eval")
    118         av("\n \na**3","eval")
    119         av("#a\n#b\na**3","eval")
    120 
    121         av("def f():\n try: pass\n finally: [x for x in (1,2)]\n")
    122         av("def f():\n pass\n#foo\n")
    123         av("@a.b.c\ndef f():\n pass\n")
    124 
    125     def test_incomplete(self):
    126         ai = self.assertIncomplete
    127 
    128         ai("(a **")
    129         ai("(a,b,")
    130         ai("(a,b,(")
    131         ai("(a,b,(")
    132         ai("a = (")
    133         ai("a = {")
    134         ai("b + {")
    135 
    136         ai("if 9==3:\n   pass\nelse:")
    137         ai("if 9==3:\n   pass\nelse:\n")
    138         ai("if 9==3:\n   pass\nelse:\n   pass")
    139         ai("if 1:")
    140         ai("if 1:\n")
    141         ai("if 1:\n pass\n if 1:\n  pass\n else:")
    142         ai("if 1:\n pass\n if 1:\n  pass\n else:\n")
    143         ai("if 1:\n pass\n if 1:\n  pass\n else:\n  pass")
    144 
    145         ai("def x():")
    146         ai("def x():\n")
    147         ai("def x():\n\n")
    148 
    149         ai("def x():\n  pass")
    150         ai("def x():\n  pass\n ")
    151         ai("def x():\n  pass\n  ")
    152         ai("\n\ndef x():\n  pass")
    153 
    154         ai("a = 9+ \\")
    155         ai("a = 'a\\")
    156         ai("a = '''xy")
    157 
    158         ai("","eval")
    159         ai("\n","eval")
    160         ai("(","eval")
    161         ai("(\n\n\n","eval")
    162         ai("(9+","eval")
    163         ai("9+ \\","eval")
    164         ai("lambda z: \\","eval")
    165 
    166         ai("if True:\n if True:\n  if True:   \n")
    167 
    168         ai("@a(")
    169         ai("@a(b")
    170         ai("@a(b,")
    171         ai("@a(b,c")
    172         ai("@a(b,c,")
    173 
    174         ai("from a import (")
    175         ai("from a import (b")
    176         ai("from a import (b,")
    177         ai("from a import (b,c")
    178         ai("from a import (b,c,")
    179 
    180         ai("[");
    181         ai("[a");
    182         ai("[a,");
    183         ai("[a,b");
    184         ai("[a,b,");
    185 
    186         ai("{");
    187         ai("{a");
    188         ai("{a:");
    189         ai("{a:b");
    190         ai("{a:b,");
    191         ai("{a:b,c");
    192         ai("{a:b,c:");
    193         ai("{a:b,c:d");
    194         ai("{a:b,c:d,");
    195 
    196         ai("a(")
    197         ai("a(b")
    198         ai("a(b,")
    199         ai("a(b,c")
    200         ai("a(b,c,")
    201 
    202         ai("a[")
    203         ai("a[b")
    204         ai("a[b,")
    205         ai("a[b:")
    206         ai("a[b:c")
    207         ai("a[b:c:")
    208         ai("a[b:c:d")
    209 
    210         ai("def a(")
    211         ai("def a(b")
    212         ai("def a(b,")
    213         ai("def a(b,c")
    214         ai("def a(b,c,")
    215 
    216         ai("(")
    217         ai("(a")
    218         ai("(a,")
    219         ai("(a,b")
    220         ai("(a,b,")
    221 
    222         ai("if a:\n pass\nelif b:")
    223         ai("if a:\n pass\nelif b:\n pass\nelse:")
    224 
    225         ai("while a:")
    226         ai("while a:\n pass\nelse:")
    227 
    228         ai("for a in b:")
    229         ai("for a in b:\n pass\nelse:")
    230 
    231         ai("try:")
    232         ai("try:\n pass\nexcept:")
    233         ai("try:\n pass\nfinally:")
    234         ai("try:\n pass\nexcept:\n pass\nfinally:")
    235 
    236         ai("with a:")
    237         ai("with a as b:")
    238 
    239         ai("class a:")
    240         ai("class a(")
    241         ai("class a(b")
    242         ai("class a(b,")
    243         ai("class a():")
    244 
    245         ai("[x for")
    246         ai("[x for x in")
    247         ai("[x for x in (")
    248 
    249         ai("(x for")
    250         ai("(x for x in")
    251         ai("(x for x in (")
    252 
    253     def test_invalid(self):
    254         ai = self.assertInvalid
    255         ai("a b")
    256 
    257         ai("a @")
    258         ai("a b @")
    259         ai("a ** @")
    260 
    261         ai("a = ")
    262         ai("a = 9 +")
    263 
    264         ai("def x():\n\npass\n")
    265 
    266         ai("\n\n if 1: pass\n\npass")
    267 
    268         ai("a = 9+ \\\n")
    269         ai("a = 'a\\ ")
    270         ai("a = 'a\\\n")
    271 
    272         ai("a = 1","eval")
    273         ai("a = (","eval")
    274         ai("]","eval")
    275         ai("())","eval")
    276         ai("[}","eval")
    277         ai("9+","eval")
    278         ai("lambda z:","eval")
    279         ai("a b","eval")
    280 
    281         ai("return 2.3")
    282         ai("if (a == 1 and b = 2): pass")
    283 
    284         ai("del 1")
    285         ai("del ()")
    286         ai("del (1,)")
    287         ai("del [1]")
    288         ai("del '1'")
    289 
    290         ai("[i for i in range(10)] = (1, 2, 3)")
    291 
    292     def test_filename(self):
    293         self.assertEqual(compile_command("a = 1\n", "abc").co_filename,
    294                          compile("a = 1\n", "abc", 'single').co_filename)
    295         self.assertNotEqual(compile_command("a = 1\n", "abc").co_filename,
    296                             compile("a = 1\n", "def", 'single').co_filename)
    297 
    298 
    299 def test_main():
    300     run_unittest(CodeopTests)
    301 
    302 
    303 if __name__ == "__main__":
    304     test_main()
    305