test_compile.py revision 66b1259dbc2cf4aaefd779d76c4a83fe8003bafd
1from test.test_support import verbose, TestFailed
2
3if verbose:
4    print "Testing whether compiler catches assignment to __debug__"
5
6try:
7    compile('__debug__ = 1', '?', 'single')
8except SyntaxError:
9    pass
10
11import __builtin__
12prev = __builtin__.__debug__
13setattr(__builtin__, '__debug__', 'sure')
14setattr(__builtin__, '__debug__', prev)
15
16if verbose:
17    print 'Running tests on argument handling'
18
19try:
20    exec 'def f(a, a): pass'
21    raise TestFailed, "duplicate arguments"
22except SyntaxError:
23    pass
24
25if verbose:
26    print "compiling string with syntax error"
27
28try:
29    compile("1+*3", "filename", "exec")
30except SyntaxError, detail:
31    if not detail.filename == "filename":
32        raise TestFailed, "expected 'filename', got %r" % detail.filename
33
34try:
35    exec 'def f(a = 0, a = 1): pass'
36    raise TestFailed, "duplicate keyword arguments"
37except SyntaxError:
38    pass
39
40try:
41    exec 'def f(a): global a; a = 1'
42    raise TestFailed, "variable is global and local"
43except SyntaxError:
44    pass
45
46if verbose:
47    print "testing complex args"
48
49def comp_args((a, b)):
50    print a,b
51
52comp_args((1, 2))
53
54def comp_args((a, b)=(3, 4)):
55    print a, b
56
57comp_args((1, 2))
58comp_args()
59
60def comp_args(a, (b, c)):
61    print a, b, c
62
63comp_args(1, (2, 3))
64
65def comp_args(a=2, (b, c)=(3, 4)):
66    print a, b, c
67
68comp_args(1, (2, 3))
69comp_args()
70
71try:
72    exec 'def f(a=1, (b, c)): pass'
73    raise TestFailed, "non-default args after default"
74except SyntaxError:
75    pass
76
77if verbose:
78    print "testing bad float literals"
79
80def expect_error(s):
81    try:
82        eval(s)
83        raise TestFailed("%r accepted" % s)
84    except SyntaxError:
85        pass
86
87expect_error("2e")
88expect_error("2.0e+")
89expect_error("1e-")
90expect_error("3-4e/21")
91
92
93if verbose:
94    print "testing literals with leading zeroes"
95
96def expect_same(test_source, expected):
97    got = eval(test_source)
98    if got != expected:
99        raise TestFailed("eval(%r) gave %r, but expected %r" %
100                         (test_source, got, expected))
101
102expect_error("077787")
103expect_error("0xj")
104expect_error("0x.")
105expect_error("0e")
106expect_same("0777", 511)
107expect_same("0777L", 511)
108expect_same("000777", 511)
109expect_same("0xff", 255)
110expect_same("0xffL", 255)
111expect_same("0XfF", 255)
112expect_same("0777.", 777)
113expect_same("0777.0", 777)
114expect_same("000000000000000000000000000000000000000000000000000777e0", 777)
115expect_same("0777e1", 7770)
116expect_same("0e0", 0)
117expect_same("0000E-012", 0)
118expect_same("09.5", 9.5)
119expect_same("0777j", 777j)
120expect_same("00j", 0j)
121expect_same("00.0", 0)
122expect_same("0e3", 0)
123expect_same("090000000000000.", 90000000000000.)
124expect_same("090000000000000.0000000000000000000000", 90000000000000.)
125expect_same("090000000000000e0", 90000000000000.)
126expect_same("090000000000000e-0", 90000000000000.)
127expect_same("090000000000000j", 90000000000000j)
128expect_error("090000000000000")  # plain octal literal w/ decimal digit
129expect_error("080000000000000")  # plain octal literal w/ decimal digit
130expect_error("000000000000009")  # plain octal literal w/ decimal digit
131expect_error("000000000000008")  # plain octal literal w/ decimal digit
132expect_same("000000000000007", 7)
133expect_same("000000000000008.", 8.)
134expect_same("000000000000009.", 9.)
135
136# Verify treatment of unary minus on negative numbers SF bug #660455
137import warnings
138warnings.filterwarnings("ignore", "hex/oct constants", FutureWarning)
139# XXX Of course the following test will have to be changed in Python 2.4
140# This test is in a <string> so the filterwarnings() can affect it
141exec """
142expect_same("0xffffffff", -1)
143expect_same("-0xffffffff", 1)
144"""
145