1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport copy
2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest
3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test.test_support import run_unittest, TestFailed, check_warnings
4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Fake a number that implements numeric methods through __coerce__
7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass CoerceNumber:
8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __init__(self, arg):
9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.arg = arg
10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __repr__(self):
12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return '<CoerceNumber %s>' % repr(self.arg)
13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __coerce__(self, other):
15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if isinstance(other, CoerceNumber):
16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return self.arg, other.arg
17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        else:
18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return (self.arg, other)
19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# New-style class version of CoerceNumber
21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass CoerceTo(object):
22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __init__(self, arg):
23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.arg = arg
24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __coerce__(self, other):
25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if isinstance(other, CoerceTo):
26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return self.arg, other.arg
27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        else:
28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return self.arg, other
29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Fake a number that implements numeric ops through methods.
32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass MethodNumber:
33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __init__(self,arg):
34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.arg = arg
35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __repr__(self):
37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return '<MethodNumber %s>' % repr(self.arg)
38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __add__(self,other):
40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return self.arg + other
41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __radd__(self,other):
43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return other + self.arg
44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __sub__(self,other):
46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return self.arg - other
47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __rsub__(self,other):
49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return other - self.arg
50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __mul__(self,other):
52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return self.arg * other
53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __rmul__(self,other):
55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return other * self.arg
56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __div__(self,other):
58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return self.arg / other
59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __rdiv__(self,other):
61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return other / self.arg
62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __truediv__(self,other):
64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return self.arg / other
65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __rtruediv__(self,other):
67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return other / self.arg
68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __floordiv__(self,other):
70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return self.arg // other
71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __rfloordiv__(self,other):
73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return other // self.arg
74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __pow__(self,other):
76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return self.arg ** other
77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __rpow__(self,other):
79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return other ** self.arg
80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __mod__(self,other):
82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return self.arg % other
83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __rmod__(self,other):
85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return other % self.arg
86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __cmp__(self, other):
88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return cmp(self.arg, other)
89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehcandidates = [2, 2L, 4.0, 2+0j, [1], (2,), None,
92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              MethodNumber(2), CoerceNumber(2)]
93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehinfix_binops = [ '+', '-', '*', '**', '%', '//', '/' ]
95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehTE = TypeError
97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# b = both normal and augmented give same result list
98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# s = single result lists for normal and augmented
99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# e = equals other results
100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# result lists: ['+', '-', '*', '**', '%', '//', ('classic /', 'new /')]
101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#                                                ^^^^^^^^^^^^^^^^^^^^^^
102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#                                               2-tuple if results differ
103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#                                                 else only one value
104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehinfix_results = {
105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # 2
106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (0,0): ('b', [4, 0, 4, 4, 0, 1, (1, 1.0)]),
107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (0,1): ('e', (0,0)),
108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (0,2): ('b', [6.0, -2.0, 8.0, 16.0, 2.0, 0.0, 0.5]),
109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (0,3): ('b', [4+0j, 0+0j, 4+0j, 4+0j, 0+0j, 1+0j, 1+0j]),
110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (0,4): ('b', [TE, TE, [1, 1], TE, TE, TE, TE]),
111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (0,5): ('b', [TE, TE, (2, 2), TE, TE, TE, TE]),
112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (0,6): ('b', [TE, TE, TE, TE, TE, TE, TE]),
113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (0,7): ('e', (0,0)),
114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (0,8): ('e', (0,0)),
115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # 2L
117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (1,0): ('e', (0,0)),
118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (1,1): ('e', (0,1)),
119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (1,2): ('e', (0,2)),
120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (1,3): ('e', (0,3)),
121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (1,4): ('e', (0,4)),
122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (1,5): ('e', (0,5)),
123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (1,6): ('e', (0,6)),
124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (1,7): ('e', (0,7)),
125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (1,8): ('e', (0,8)),
126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # 4.0
128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (2,0): ('b', [6.0, 2.0, 8.0, 16.0, 0.0, 2.0, 2.0]),
129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (2,1): ('e', (2,0)),
130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (2,2): ('b', [8.0, 0.0, 16.0, 256.0, 0.0, 1.0, 1.0]),
131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (2,3): ('b', [6+0j, 2+0j, 8+0j, 16+0j, 0+0j, 2+0j, 2+0j]),
132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (2,4): ('b', [TE, TE, TE, TE, TE, TE, TE]),
133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (2,5): ('e', (2,4)),
134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (2,6): ('e', (2,4)),
135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (2,7): ('e', (2,0)),
136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (2,8): ('e', (2,0)),
137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # (2+0j)
139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (3,0): ('b', [4+0j, 0+0j, 4+0j, 4+0j, 0+0j, 1+0j, 1+0j]),
140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (3,1): ('e', (3,0)),
141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (3,2): ('b', [6+0j, -2+0j, 8+0j, 16+0j, 2+0j, 0+0j, 0.5+0j]),
142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (3,3): ('b', [4+0j, 0+0j, 4+0j, 4+0j, 0+0j, 1+0j, 1+0j]),
143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (3,4): ('b', [TE, TE, TE, TE, TE, TE, TE]),
144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (3,5): ('e', (3,4)),
145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (3,6): ('e', (3,4)),
146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (3,7): ('e', (3,0)),
147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (3,8): ('e', (3,0)),
148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # [1]
150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (4,0): ('b', [TE, TE, [1, 1], TE, TE, TE, TE]),
151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (4,1): ('e', (4,0)),
152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (4,2): ('b', [TE, TE, TE, TE, TE, TE, TE]),
153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (4,3): ('b', [TE, TE, TE, TE, TE, TE, TE]),
154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (4,4): ('b', [[1, 1], TE, TE, TE, TE, TE, TE]),
155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (4,5): ('s', [TE, TE, TE, TE, TE, TE, TE], [[1, 2], TE, TE, TE, TE, TE, TE]),
156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (4,6): ('b', [TE, TE, TE, TE, TE, TE, TE]),
157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (4,7): ('e', (4,0)),
158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (4,8): ('e', (4,0)),
159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # (2,)
161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (5,0): ('b', [TE, TE, (2, 2), TE, TE, TE, TE]),
162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (5,1): ('e', (5,0)),
163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (5,2): ('b', [TE, TE, TE, TE, TE, TE, TE]),
164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (5,3): ('e', (5,2)),
165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (5,4): ('e', (5,2)),
166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (5,5): ('b', [(2, 2), TE, TE, TE, TE, TE, TE]),
167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (5,6): ('b', [TE, TE, TE, TE, TE, TE, TE]),
168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (5,7): ('e', (5,0)),
169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (5,8): ('e', (5,0)),
170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # None
172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (6,0): ('b', [TE, TE, TE, TE, TE, TE, TE]),
173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (6,1): ('e', (6,0)),
174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (6,2): ('e', (6,0)),
175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (6,3): ('e', (6,0)),
176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (6,4): ('e', (6,0)),
177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (6,5): ('e', (6,0)),
178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (6,6): ('e', (6,0)),
179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (6,7): ('e', (6,0)),
180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (6,8): ('e', (6,0)),
181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # MethodNumber(2)
183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (7,0): ('e', (0,0)),
184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (7,1): ('e', (0,1)),
185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (7,2): ('e', (0,2)),
186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (7,3): ('e', (0,3)),
187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (7,4): ('e', (0,4)),
188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (7,5): ('e', (0,5)),
189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (7,6): ('e', (0,6)),
190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (7,7): ('e', (0,7)),
191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (7,8): ('e', (0,8)),
192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # CoerceNumber(2)
194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (8,0): ('e', (0,0)),
195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (8,1): ('e', (0,1)),
196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (8,2): ('e', (0,2)),
197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (8,3): ('e', (0,3)),
198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (8,4): ('e', (0,4)),
199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (8,5): ('e', (0,5)),
200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (8,6): ('e', (0,6)),
201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (8,7): ('e', (0,7)),
202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    (8,8): ('e', (0,8)),
203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh}
204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef process_infix_results():
206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    for key in sorted(infix_results):
207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        val = infix_results[key]
208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if val[0] == 'e':
209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            infix_results[key] = infix_results[val[1]]
210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        else:
211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            if val[0] == 's':
212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                res = (val[1], val[2])
213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            elif val[0] == 'b':
214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                res = (val[1], val[1])
215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for i in range(1):
216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if isinstance(res[i][6], tuple):
217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    if 1/2 == 0:
218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        # testing with classic (floor) division
219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        res[i][6] = res[i][6][0]
220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    else:
221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        # testing with -Qnew
222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        res[i][6] = res[i][6][1]
223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            infix_results[key] = res
224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehwith check_warnings(("classic (int|long) division", DeprecationWarning),
227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    quiet=True):
228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    process_infix_results()
229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # now infix_results has two lists of results for every pairing.
230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehprefix_binops = [ 'divmod' ]
232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehprefix_results = [
233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    [(1,0), (1L,0L), (0.0,2.0), ((1+0j),0j), TE, TE, TE, TE, (1,0)],
234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    [(1L,0L), (1L,0L), (0.0,2.0), ((1+0j),0j), TE, TE, TE, TE, (1L,0L)],
235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    [(2.0,0.0), (2.0,0.0), (1.0,0.0), ((2+0j),0j), TE, TE, TE, TE, (2.0,0.0)],
236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    [((1+0j),0j), ((1+0j),0j), (0j,(2+0j)), ((1+0j),0j), TE, TE, TE, TE, ((1+0j),0j)],
237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    [TE, TE, TE, TE, TE, TE, TE, TE, TE],
238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    [TE, TE, TE, TE, TE, TE, TE, TE, TE],
239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    [TE, TE, TE, TE, TE, TE, TE, TE, TE],
240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    [TE, TE, TE, TE, TE, TE, TE, TE, TE],
241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    [(1,0), (1L,0L), (0.0,2.0), ((1+0j),0j), TE, TE, TE, TE, (1,0)]
242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh]
243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef format_float(value):
245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    if abs(value) < 0.01:
246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return '0.0'
247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    else:
248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return '%.1f' % value
249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# avoid testing platform fp quirks
251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef format_result(value):
252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    if isinstance(value, complex):
253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return '(%s + %sj)' % (format_float(value.real),
254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                               format_float(value.imag))
255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    elif isinstance(value, float):
256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return format_float(value)
257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    return str(value)
258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass CoercionTest(unittest.TestCase):
260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_infix_binops(self):
261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for ia, a in enumerate(candidates):
262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for ib, b in enumerate(candidates):
263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                results = infix_results[(ia, ib)]
264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                for op, res, ires in zip(infix_binops, results[0], results[1]):
265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    if res is TE:
266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        self.assertRaises(TypeError, eval,
267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                          'a %s b' % op, {'a': a, 'b': b})
268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    else:
269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        self.assertEqual(format_result(res),
270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                         format_result(eval('a %s b' % op)),
271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                         '%s %s %s == %s failed' % (a, op, b, res))
272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    try:
273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        z = copy.copy(a)
274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    except copy.Error:
275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        z = a # assume it has no inplace ops
276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    if ires is TE:
277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        try:
278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                            exec 'z %s= b' % op
279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        except TypeError:
280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                            pass
281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        else:
282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                            self.fail("TypeError not raised")
283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    else:
284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        exec('z %s= b' % op)
285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        self.assertEqual(ires, z)
286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_prefix_binops(self):
288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for ia, a in enumerate(candidates):
289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for ib, b in enumerate(candidates):
290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                for op in prefix_binops:
291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    res = prefix_results[ia][ib]
292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    if res is TE:
293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        self.assertRaises(TypeError, eval,
294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                          '%s(a, b)' % op, {'a': a, 'b': b})
295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    else:
296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        self.assertEqual(format_result(res),
297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                         format_result(eval('%s(a, b)' % op)),
298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                         '%s(%s, %s) == %s failed' % (op, a, b, res))
299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_cmptypes(self):
301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Built-in tp_compare slots expect their arguments to have the
302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # same type, but a user-defined __coerce__ doesn't have to obey.
303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # SF #980352
304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        evil_coercer = CoerceTo(42)
305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Make sure these don't crash any more
306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotEqual(cmp(u'fish', evil_coercer), 0)
307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotEqual(cmp(slice(1), evil_coercer), 0)
308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # ...but that this still works
309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class WackyComparer(object):
310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __cmp__(slf, other):
311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertTrue(other == 42, 'expected evil_coercer, got %r' % other)
312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return 0
313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            __hash__ = None # Invalid cmp makes this unhashable
314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(cmp(WackyComparer(), evil_coercer), 0)
315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # ...and classic classes too, since that code path is a little different
316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class ClassicWackyComparer:
317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __cmp__(slf, other):
318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertTrue(other == 42, 'expected evil_coercer, got %r' % other)
319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return 0
320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(cmp(ClassicWackyComparer(), evil_coercer), 0)
321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_infinite_rec_classic_classes(self):
323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # if __coerce__() returns its arguments reversed it causes an infinite
324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # recursion for classic classes.
325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Tester:
326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __coerce__(self, other):
327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return other, self
328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        exc = TestFailed("__coerce__() returning its arguments reverse "
330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                "should raise RuntimeError")
331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        try:
332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Tester() + 1
333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        except (RuntimeError, TypeError):
334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return
335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        except:
336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            raise exc
337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        else:
338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            raise exc
339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main():
341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    with check_warnings(("complex divmod.., // and % are deprecated",
342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         DeprecationWarning),
343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        ("classic (int|long) division", DeprecationWarning),
344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        quiet=True):
345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        run_unittest(CoercionTest)
346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == "__main__":
348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    test_main()
349