python-2.5.2/win32/Lib/test/test_compile.py
changeset 0 ae805ac0140d
equal deleted inserted replaced
-1:000000000000 0:ae805ac0140d
       
     1 import unittest
       
     2 import warnings
       
     3 import sys
       
     4 from test import test_support
       
     5 
       
     6 class TestSpecifics(unittest.TestCase):
       
     7 
       
     8     def test_debug_assignment(self):
       
     9         # catch assignments to __debug__
       
    10         self.assertRaises(SyntaxError, compile, '__debug__ = 1', '?', 'single')
       
    11         import __builtin__
       
    12         prev = __builtin__.__debug__
       
    13         setattr(__builtin__, '__debug__', 'sure')
       
    14         setattr(__builtin__, '__debug__', prev)
       
    15 
       
    16     def test_argument_handling(self):
       
    17         # detect duplicate positional and keyword arguments
       
    18         self.assertRaises(SyntaxError, eval, 'lambda a,a:0')
       
    19         self.assertRaises(SyntaxError, eval, 'lambda a,a=1:0')
       
    20         self.assertRaises(SyntaxError, eval, 'lambda a=1,a=1:0')
       
    21         try:
       
    22             exec 'def f(a, a): pass'
       
    23             self.fail("duplicate arguments")
       
    24         except SyntaxError:
       
    25             pass
       
    26         try:
       
    27             exec 'def f(a = 0, a = 1): pass'
       
    28             self.fail("duplicate keyword arguments")
       
    29         except SyntaxError:
       
    30             pass
       
    31         try:
       
    32             exec 'def f(a): global a; a = 1'
       
    33             self.fail("variable is global and local")
       
    34         except SyntaxError:
       
    35             pass
       
    36 
       
    37     def test_syntax_error(self):
       
    38         self.assertRaises(SyntaxError, compile, "1+*3", "filename", "exec")
       
    39 
       
    40     def test_none_keyword_arg(self):
       
    41         self.assertRaises(SyntaxError, compile, "f(None=1)", "<string>", "exec")
       
    42 
       
    43     def test_duplicate_global_local(self):
       
    44         try:
       
    45             exec 'def f(a): global a; a = 1'
       
    46             self.fail("variable is global and local")
       
    47         except SyntaxError:
       
    48             pass
       
    49 
       
    50     def test_exec_with_general_mapping_for_locals(self):
       
    51 
       
    52         class M:
       
    53             "Test mapping interface versus possible calls from eval()."
       
    54             def __getitem__(self, key):
       
    55                 if key == 'a':
       
    56                     return 12
       
    57                 raise KeyError
       
    58             def __setitem__(self, key, value):
       
    59                 self.results = (key, value)
       
    60             def keys(self):
       
    61                 return list('xyz')
       
    62 
       
    63         m = M()
       
    64         g = globals()
       
    65         exec 'z = a' in g, m
       
    66         self.assertEqual(m.results, ('z', 12))
       
    67         try:
       
    68             exec 'z = b' in g, m
       
    69         except NameError:
       
    70             pass
       
    71         else:
       
    72             self.fail('Did not detect a KeyError')
       
    73         exec 'z = dir()' in g, m
       
    74         self.assertEqual(m.results, ('z', list('xyz')))
       
    75         exec 'z = globals()' in g, m
       
    76         self.assertEqual(m.results, ('z', g))
       
    77         exec 'z = locals()' in g, m
       
    78         self.assertEqual(m.results, ('z', m))
       
    79         try:
       
    80             exec 'z = b' in m
       
    81         except TypeError:
       
    82             pass
       
    83         else:
       
    84             self.fail('Did not validate globals as a real dict')
       
    85 
       
    86         class A:
       
    87             "Non-mapping"
       
    88             pass
       
    89         m = A()
       
    90         try:
       
    91             exec 'z = a' in g, m
       
    92         except TypeError:
       
    93             pass
       
    94         else:
       
    95             self.fail('Did not validate locals as a mapping')
       
    96 
       
    97         # Verify that dict subclasses work as well
       
    98         class D(dict):
       
    99             def __getitem__(self, key):
       
   100                 if key == 'a':
       
   101                     return 12
       
   102                 return dict.__getitem__(self, key)
       
   103         d = D()
       
   104         exec 'z = a' in g, d
       
   105         self.assertEqual(d['z'], 12)
       
   106 
       
   107     def test_extended_arg(self):
       
   108         longexpr = 'x = x or ' + '-x' * 2500
       
   109         code = '''
       
   110 def f(x):
       
   111     %s
       
   112     %s
       
   113     %s
       
   114     %s
       
   115     %s
       
   116     %s
       
   117     %s
       
   118     %s
       
   119     %s
       
   120     %s
       
   121     # the expressions above have no effect, x == argument
       
   122     while x:
       
   123         x -= 1
       
   124         # EXTENDED_ARG/JUMP_ABSOLUTE here
       
   125     return x
       
   126 ''' % ((longexpr,)*10)
       
   127         exec code
       
   128         self.assertEqual(f(5), 0)
       
   129 
       
   130     def test_complex_args(self):
       
   131 
       
   132         def comp_args((a, b)):
       
   133             return a,b
       
   134         self.assertEqual(comp_args((1, 2)), (1, 2))
       
   135 
       
   136         def comp_args((a, b)=(3, 4)):
       
   137             return a, b
       
   138         self.assertEqual(comp_args((1, 2)), (1, 2))
       
   139         self.assertEqual(comp_args(), (3, 4))
       
   140 
       
   141         def comp_args(a, (b, c)):
       
   142             return a, b, c
       
   143         self.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
       
   144 
       
   145         def comp_args(a=2, (b, c)=(3, 4)):
       
   146             return a, b, c
       
   147         self.assertEqual(comp_args(1, (2, 3)), (1, 2, 3))
       
   148         self.assertEqual(comp_args(), (2, 3, 4))
       
   149 
       
   150     def test_argument_order(self):
       
   151         try:
       
   152             exec 'def f(a=1, (b, c)): pass'
       
   153             self.fail("non-default args after default")
       
   154         except SyntaxError:
       
   155             pass
       
   156 
       
   157     def test_float_literals(self):
       
   158         # testing bad float literals
       
   159         self.assertRaises(SyntaxError, eval, "2e")
       
   160         self.assertRaises(SyntaxError, eval, "2.0e+")
       
   161         self.assertRaises(SyntaxError, eval, "1e-")
       
   162         self.assertRaises(SyntaxError, eval, "3-4e/21")
       
   163 
       
   164     def test_indentation(self):
       
   165         # testing compile() of indented block w/o trailing newline"
       
   166         s = """
       
   167 if 1:
       
   168     if 2:
       
   169         pass"""
       
   170         compile(s, "<string>", "exec")
       
   171 
       
   172     # This test is probably specific to CPython and may not generalize
       
   173     # to other implementations.  We are trying to ensure that when
       
   174     # the first line of code starts after 256, correct line numbers
       
   175     # in tracebacks are still produced.
       
   176     def test_leading_newlines(self):
       
   177         s256 = "".join(["\n"] * 256 + ["spam"])
       
   178         co = compile(s256, 'fn', 'exec')
       
   179         self.assertEqual(co.co_firstlineno, 257)
       
   180         self.assertEqual(co.co_lnotab, '')
       
   181 
       
   182     def test_literals_with_leading_zeroes(self):
       
   183         for arg in ["077787", "0xj", "0x.", "0e",  "090000000000000",
       
   184                     "080000000000000", "000000000000009", "000000000000008"]:
       
   185             self.assertRaises(SyntaxError, eval, arg)
       
   186 
       
   187         self.assertEqual(eval("0777"), 511)
       
   188         self.assertEqual(eval("0777L"), 511)
       
   189         self.assertEqual(eval("000777"), 511)
       
   190         self.assertEqual(eval("0xff"), 255)
       
   191         self.assertEqual(eval("0xffL"), 255)
       
   192         self.assertEqual(eval("0XfF"), 255)
       
   193         self.assertEqual(eval("0777."), 777)
       
   194         self.assertEqual(eval("0777.0"), 777)
       
   195         self.assertEqual(eval("000000000000000000000000000000000000000000000000000777e0"), 777)
       
   196         self.assertEqual(eval("0777e1"), 7770)
       
   197         self.assertEqual(eval("0e0"), 0)
       
   198         self.assertEqual(eval("0000E-012"), 0)
       
   199         self.assertEqual(eval("09.5"), 9.5)
       
   200         self.assertEqual(eval("0777j"), 777j)
       
   201         self.assertEqual(eval("00j"), 0j)
       
   202         self.assertEqual(eval("00.0"), 0)
       
   203         self.assertEqual(eval("0e3"), 0)
       
   204         self.assertEqual(eval("090000000000000."), 90000000000000.)
       
   205         self.assertEqual(eval("090000000000000.0000000000000000000000"), 90000000000000.)
       
   206         self.assertEqual(eval("090000000000000e0"), 90000000000000.)
       
   207         self.assertEqual(eval("090000000000000e-0"), 90000000000000.)
       
   208         self.assertEqual(eval("090000000000000j"), 90000000000000j)
       
   209         self.assertEqual(eval("000000000000007"), 7)
       
   210         self.assertEqual(eval("000000000000008."), 8.)
       
   211         self.assertEqual(eval("000000000000009."), 9.)
       
   212 
       
   213     def test_unary_minus(self):
       
   214         # Verify treatment of unary minus on negative numbers SF bug #660455
       
   215         if sys.maxint == 2147483647:
       
   216             # 32-bit machine
       
   217             all_one_bits = '0xffffffff'
       
   218             self.assertEqual(eval(all_one_bits), 4294967295L)
       
   219             self.assertEqual(eval("-" + all_one_bits), -4294967295L)
       
   220         elif sys.maxint == 9223372036854775807:
       
   221             # 64-bit machine
       
   222             all_one_bits = '0xffffffffffffffff'
       
   223             self.assertEqual(eval(all_one_bits), 18446744073709551615L)
       
   224             self.assertEqual(eval("-" + all_one_bits), -18446744073709551615L)
       
   225         else:
       
   226             self.fail("How many bits *does* this machine have???")
       
   227         # Verify treatment of contant folding on -(sys.maxint+1)
       
   228         # i.e. -2147483648 on 32 bit platforms.  Should return int, not long.
       
   229         self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 1)), int))
       
   230         self.assertTrue(isinstance(eval("%s" % (-sys.maxint - 2)), long))
       
   231 
       
   232     if sys.maxint == 9223372036854775807:
       
   233         def test_32_63_bit_values(self):
       
   234             a = +4294967296  # 1 << 32
       
   235             b = -4294967296  # 1 << 32
       
   236             c = +281474976710656  # 1 << 48
       
   237             d = -281474976710656  # 1 << 48
       
   238             e = +4611686018427387904  # 1 << 62
       
   239             f = -4611686018427387904  # 1 << 62
       
   240             g = +9223372036854775807  # 1 << 63 - 1
       
   241             h = -9223372036854775807  # 1 << 63 - 1
       
   242 
       
   243             for variable in self.test_32_63_bit_values.func_code.co_consts:
       
   244                 if variable is not None:
       
   245                     self.assertTrue(isinstance(variable, int))
       
   246 
       
   247     def test_sequence_unpacking_error(self):
       
   248         # Verify sequence packing/unpacking with "or".  SF bug #757818
       
   249         i,j = (1, -1) or (-1, 1)
       
   250         self.assertEqual(i, 1)
       
   251         self.assertEqual(j, -1)
       
   252 
       
   253     def test_none_assignment(self):
       
   254         stmts = [
       
   255             'None = 0',
       
   256             'None += 0',
       
   257             '__builtins__.None = 0',
       
   258             'def None(): pass',
       
   259             'class None: pass',
       
   260             '(a, None) = 0, 0',
       
   261             'for None in range(10): pass',
       
   262             'def f(None): pass',
       
   263         ]
       
   264         for stmt in stmts:
       
   265             stmt += "\n"
       
   266             self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'single')
       
   267             self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
       
   268 
       
   269     def test_import(self):
       
   270         succeed = [
       
   271             'import sys',
       
   272             'import os, sys',
       
   273             'import os as bar',
       
   274             'import os.path as bar',
       
   275             'from __future__ import nested_scopes, generators',
       
   276             'from __future__ import (nested_scopes,\ngenerators)',
       
   277             'from __future__ import (nested_scopes,\ngenerators,)',
       
   278             'from sys import stdin, stderr, stdout',
       
   279             'from sys import (stdin, stderr,\nstdout)',
       
   280             'from sys import (stdin, stderr,\nstdout,)',
       
   281             'from sys import (stdin\n, stderr, stdout)',
       
   282             'from sys import (stdin\n, stderr, stdout,)',
       
   283             'from sys import stdin as si, stdout as so, stderr as se',
       
   284             'from sys import (stdin as si, stdout as so, stderr as se)',
       
   285             'from sys import (stdin as si, stdout as so, stderr as se,)',
       
   286             ]
       
   287         fail = [
       
   288             'import (os, sys)',
       
   289             'import (os), (sys)',
       
   290             'import ((os), (sys))',
       
   291             'import (sys',
       
   292             'import sys)',
       
   293             'import (os,)',
       
   294             'import os As bar',
       
   295             'import os.path a bar',
       
   296             'from sys import stdin As stdout',
       
   297             'from sys import stdin a stdout',
       
   298             'from (sys) import stdin',
       
   299             'from __future__ import (nested_scopes',
       
   300             'from __future__ import nested_scopes)',
       
   301             'from __future__ import nested_scopes,\ngenerators',
       
   302             'from sys import (stdin',
       
   303             'from sys import stdin)',
       
   304             'from sys import stdin, stdout,\nstderr',
       
   305             'from sys import stdin si',
       
   306             'from sys import stdin,'
       
   307             'from sys import (*)',
       
   308             'from sys import (stdin,, stdout, stderr)',
       
   309             'from sys import (stdin, stdout),',
       
   310             ]
       
   311         for stmt in succeed:
       
   312             compile(stmt, 'tmp', 'exec')
       
   313         for stmt in fail:
       
   314             self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
       
   315 
       
   316     def test_for_distinct_code_objects(self):
       
   317         # SF bug 1048870
       
   318         def f():
       
   319             f1 = lambda x=1: x
       
   320             f2 = lambda x=2: x
       
   321             return f1, f2
       
   322         f1, f2 = f()
       
   323         self.assertNotEqual(id(f1.func_code), id(f2.func_code))
       
   324 
       
   325     def test_unicode_encoding(self):
       
   326         code = u"# -*- coding: utf-8 -*-\npass\n"
       
   327         self.assertRaises(SyntaxError, compile, code, "tmp", "exec")
       
   328 
       
   329     def test_subscripts(self):
       
   330         # SF bug 1448804
       
   331         # Class to make testing subscript results easy
       
   332         class str_map(object):
       
   333             def __init__(self):
       
   334                 self.data = {}
       
   335             def __getitem__(self, key):
       
   336                 return self.data[str(key)]
       
   337             def __setitem__(self, key, value):
       
   338                 self.data[str(key)] = value
       
   339             def __delitem__(self, key):
       
   340                 del self.data[str(key)]
       
   341             def __contains__(self, key):
       
   342                 return str(key) in self.data
       
   343         d = str_map()
       
   344         # Index
       
   345         d[1] = 1
       
   346         self.assertEqual(d[1], 1)
       
   347         d[1] += 1
       
   348         self.assertEqual(d[1], 2)
       
   349         del d[1]
       
   350         self.assertEqual(1 in d, False)
       
   351         # Tuple of indices
       
   352         d[1, 1] = 1
       
   353         self.assertEqual(d[1, 1], 1)
       
   354         d[1, 1] += 1
       
   355         self.assertEqual(d[1, 1], 2)
       
   356         del d[1, 1]
       
   357         self.assertEqual((1, 1) in d, False)
       
   358         # Simple slice
       
   359         d[1:2] = 1
       
   360         self.assertEqual(d[1:2], 1)
       
   361         d[1:2] += 1
       
   362         self.assertEqual(d[1:2], 2)
       
   363         del d[1:2]
       
   364         self.assertEqual(slice(1, 2) in d, False)
       
   365         # Tuple of simple slices
       
   366         d[1:2, 1:2] = 1
       
   367         self.assertEqual(d[1:2, 1:2], 1)
       
   368         d[1:2, 1:2] += 1
       
   369         self.assertEqual(d[1:2, 1:2], 2)
       
   370         del d[1:2, 1:2]
       
   371         self.assertEqual((slice(1, 2), slice(1, 2)) in d, False)
       
   372         # Extended slice
       
   373         d[1:2:3] = 1
       
   374         self.assertEqual(d[1:2:3], 1)
       
   375         d[1:2:3] += 1
       
   376         self.assertEqual(d[1:2:3], 2)
       
   377         del d[1:2:3]
       
   378         self.assertEqual(slice(1, 2, 3) in d, False)
       
   379         # Tuple of extended slices
       
   380         d[1:2:3, 1:2:3] = 1
       
   381         self.assertEqual(d[1:2:3, 1:2:3], 1)
       
   382         d[1:2:3, 1:2:3] += 1
       
   383         self.assertEqual(d[1:2:3, 1:2:3], 2)
       
   384         del d[1:2:3, 1:2:3]
       
   385         self.assertEqual((slice(1, 2, 3), slice(1, 2, 3)) in d, False)
       
   386         # Ellipsis
       
   387         d[...] = 1
       
   388         self.assertEqual(d[...], 1)
       
   389         d[...] += 1
       
   390         self.assertEqual(d[...], 2)
       
   391         del d[...]
       
   392         self.assertEqual(Ellipsis in d, False)
       
   393         # Tuple of Ellipses
       
   394         d[..., ...] = 1
       
   395         self.assertEqual(d[..., ...], 1)
       
   396         d[..., ...] += 1
       
   397         self.assertEqual(d[..., ...], 2)
       
   398         del d[..., ...]
       
   399         self.assertEqual((Ellipsis, Ellipsis) in d, False)
       
   400 
       
   401 def test_main():
       
   402     test_support.run_unittest(TestSpecifics)
       
   403 
       
   404 if __name__ == "__main__":
       
   405     test_main()