14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport copy
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test.test_support import run_unittest, TestFailed, check_warnings
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Fake a number that implements numeric methods through __coerce__
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass CoerceNumber:
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, arg):
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.arg = arg
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __repr__(self):
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return '<CoerceNumber %s>' % repr(self.arg)
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __coerce__(self, other):
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(other, CoerceNumber):
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.arg, other.arg
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return (self.arg, other)
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# New-style class version of CoerceNumber
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass CoerceTo(object):
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, arg):
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.arg = arg
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __coerce__(self, other):
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(other, CoerceTo):
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.arg, other.arg
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.arg, other
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Fake a number that implements numeric ops through methods.
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MethodNumber:
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self,arg):
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.arg = arg
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __repr__(self):
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return '<MethodNumber %s>' % repr(self.arg)
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __add__(self,other):
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.arg + other
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __radd__(self,other):
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return other + self.arg
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __sub__(self,other):
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.arg - other
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __rsub__(self,other):
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return other - self.arg
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __mul__(self,other):
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.arg * other
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __rmul__(self,other):
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return other * self.arg
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __div__(self,other):
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.arg / other
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __rdiv__(self,other):
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return other / self.arg
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __truediv__(self,other):
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.arg / other
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __rtruediv__(self,other):
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return other / self.arg
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __floordiv__(self,other):
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.arg // other
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __rfloordiv__(self,other):
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return other // self.arg
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __pow__(self,other):
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.arg ** other
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __rpow__(self,other):
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return other ** self.arg
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __mod__(self,other):
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.arg % other
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __rmod__(self,other):
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return other % self.arg
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __cmp__(self, other):
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return cmp(self.arg, other)
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocandidates = [2, 2L, 4.0, 2+0j, [1], (2,), None,
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              MethodNumber(2), CoerceNumber(2)]
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoinfix_binops = [ '+', '-', '*', '**', '%', '//', '/' ]
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
964adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoTE = TypeError
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# b = both normal and augmented give same result list
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# s = single result lists for normal and augmented
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# e = equals other results
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# result lists: ['+', '-', '*', '**', '%', '//', ('classic /', 'new /')]
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#                                                ^^^^^^^^^^^^^^^^^^^^^^
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#                                               2-tuple if results differ
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#                                                 else only one value
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoinfix_results = {
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # 2
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (0,0): ('b', [4, 0, 4, 4, 0, 1, (1, 1.0)]),
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (0,1): ('e', (0,0)),
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (0,2): ('b', [6.0, -2.0, 8.0, 16.0, 2.0, 0.0, 0.5]),
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (0,3): ('b', [4+0j, 0+0j, 4+0j, 4+0j, 0+0j, 1+0j, 1+0j]),
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (0,4): ('b', [TE, TE, [1, 1], TE, TE, TE, TE]),
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (0,5): ('b', [TE, TE, (2, 2), TE, TE, TE, TE]),
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (0,6): ('b', [TE, TE, TE, TE, TE, TE, TE]),
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (0,7): ('e', (0,0)),
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (0,8): ('e', (0,0)),
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # 2L
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (1,0): ('e', (0,0)),
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (1,1): ('e', (0,1)),
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (1,2): ('e', (0,2)),
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (1,3): ('e', (0,3)),
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (1,4): ('e', (0,4)),
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (1,5): ('e', (0,5)),
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (1,6): ('e', (0,6)),
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (1,7): ('e', (0,7)),
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (1,8): ('e', (0,8)),
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # 4.0
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (2,0): ('b', [6.0, 2.0, 8.0, 16.0, 0.0, 2.0, 2.0]),
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (2,1): ('e', (2,0)),
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (2,2): ('b', [8.0, 0.0, 16.0, 256.0, 0.0, 1.0, 1.0]),
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (2,3): ('b', [6+0j, 2+0j, 8+0j, 16+0j, 0+0j, 2+0j, 2+0j]),
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (2,4): ('b', [TE, TE, TE, TE, TE, TE, TE]),
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (2,5): ('e', (2,4)),
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (2,6): ('e', (2,4)),
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (2,7): ('e', (2,0)),
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (2,8): ('e', (2,0)),
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # (2+0j)
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (3,0): ('b', [4+0j, 0+0j, 4+0j, 4+0j, 0+0j, 1+0j, 1+0j]),
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (3,1): ('e', (3,0)),
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (3,2): ('b', [6+0j, -2+0j, 8+0j, 16+0j, 2+0j, 0+0j, 0.5+0j]),
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (3,3): ('b', [4+0j, 0+0j, 4+0j, 4+0j, 0+0j, 1+0j, 1+0j]),
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (3,4): ('b', [TE, TE, TE, TE, TE, TE, TE]),
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (3,5): ('e', (3,4)),
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (3,6): ('e', (3,4)),
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (3,7): ('e', (3,0)),
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (3,8): ('e', (3,0)),
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # [1]
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (4,0): ('b', [TE, TE, [1, 1], TE, TE, TE, TE]),
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (4,1): ('e', (4,0)),
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (4,2): ('b', [TE, TE, TE, TE, TE, TE, TE]),
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (4,3): ('b', [TE, TE, TE, TE, TE, TE, TE]),
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (4,4): ('b', [[1, 1], TE, TE, TE, TE, TE, TE]),
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (4,5): ('s', [TE, TE, TE, TE, TE, TE, TE], [[1, 2], TE, TE, TE, TE, TE, TE]),
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (4,6): ('b', [TE, TE, TE, TE, TE, TE, TE]),
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (4,7): ('e', (4,0)),
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (4,8): ('e', (4,0)),
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # (2,)
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (5,0): ('b', [TE, TE, (2, 2), TE, TE, TE, TE]),
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (5,1): ('e', (5,0)),
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (5,2): ('b', [TE, TE, TE, TE, TE, TE, TE]),
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (5,3): ('e', (5,2)),
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (5,4): ('e', (5,2)),
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (5,5): ('b', [(2, 2), TE, TE, TE, TE, TE, TE]),
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (5,6): ('b', [TE, TE, TE, TE, TE, TE, TE]),
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (5,7): ('e', (5,0)),
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (5,8): ('e', (5,0)),
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # None
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (6,0): ('b', [TE, TE, TE, TE, TE, TE, TE]),
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (6,1): ('e', (6,0)),
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (6,2): ('e', (6,0)),
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (6,3): ('e', (6,0)),
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (6,4): ('e', (6,0)),
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (6,5): ('e', (6,0)),
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (6,6): ('e', (6,0)),
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (6,7): ('e', (6,0)),
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (6,8): ('e', (6,0)),
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # MethodNumber(2)
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (7,0): ('e', (0,0)),
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (7,1): ('e', (0,1)),
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (7,2): ('e', (0,2)),
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (7,3): ('e', (0,3)),
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (7,4): ('e', (0,4)),
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (7,5): ('e', (0,5)),
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (7,6): ('e', (0,6)),
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (7,7): ('e', (0,7)),
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (7,8): ('e', (0,8)),
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # CoerceNumber(2)
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (8,0): ('e', (0,0)),
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (8,1): ('e', (0,1)),
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (8,2): ('e', (0,2)),
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (8,3): ('e', (0,3)),
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (8,4): ('e', (0,4)),
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (8,5): ('e', (0,5)),
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (8,6): ('e', (0,6)),
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (8,7): ('e', (0,7)),
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (8,8): ('e', (0,8)),
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao}
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef process_infix_results():
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for key in sorted(infix_results):
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        val = infix_results[key]
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if val[0] == 'e':
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            infix_results[key] = infix_results[val[1]]
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if val[0] == 's':
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                res = (val[1], val[2])
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            elif val[0] == 'b':
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                res = (val[1], val[1])
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for i in range(1):
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if isinstance(res[i][6], tuple):
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if 1/2 == 0:
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # testing with classic (floor) division
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        res[i][6] = res[i][6][0]
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    else:
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # testing with -Qnew
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        res[i][6] = res[i][6][1]
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            infix_results[key] = res
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaowith check_warnings(("classic (int|long) division", DeprecationWarning),
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    quiet=True):
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    process_infix_results()
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # now infix_results has two lists of results for every pairing.
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoprefix_binops = [ 'divmod' ]
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoprefix_results = [
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    [(1,0), (1L,0L), (0.0,2.0), ((1+0j),0j), TE, TE, TE, TE, (1,0)],
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    [(1L,0L), (1L,0L), (0.0,2.0), ((1+0j),0j), TE, TE, TE, TE, (1L,0L)],
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    [(2.0,0.0), (2.0,0.0), (1.0,0.0), ((2+0j),0j), TE, TE, TE, TE, (2.0,0.0)],
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    [((1+0j),0j), ((1+0j),0j), (0j,(2+0j)), ((1+0j),0j), TE, TE, TE, TE, ((1+0j),0j)],
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    [TE, TE, TE, TE, TE, TE, TE, TE, TE],
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    [TE, TE, TE, TE, TE, TE, TE, TE, TE],
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    [TE, TE, TE, TE, TE, TE, TE, TE, TE],
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    [TE, TE, TE, TE, TE, TE, TE, TE, TE],
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    [(1,0), (1L,0L), (0.0,2.0), ((1+0j),0j), TE, TE, TE, TE, (1,0)]
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao]
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef format_float(value):
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if abs(value) < 0.01:
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return '0.0'
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return '%.1f' % value
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# avoid testing platform fp quirks
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef format_result(value):
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if isinstance(value, complex):
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return '(%s + %sj)' % (format_float(value.real),
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               format_float(value.imag))
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    elif isinstance(value, float):
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return format_float(value)
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return str(value)
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass CoercionTest(unittest.TestCase):
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_infix_binops(self):
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for ia, a in enumerate(candidates):
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for ib, b in enumerate(candidates):
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                results = infix_results[(ia, ib)]
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for op, res, ires in zip(infix_binops, results[0], results[1]):
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if res is TE:
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        self.assertRaises(TypeError, eval,
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                          'a %s b' % op, {'a': a, 'b': b})
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    else:
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        self.assertEqual(format_result(res),
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                         format_result(eval('a %s b' % op)),
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                         '%s %s %s == %s failed' % (a, op, b, res))
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    try:
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        z = copy.copy(a)
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    except copy.Error:
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        z = a # assume it has no inplace ops
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if ires is TE:
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        try:
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            exec 'z %s= b' % op
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        except TypeError:
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            pass
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        else:
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            self.fail("TypeError not raised")
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    else:
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        exec('z %s= b' % op)
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        self.assertEqual(ires, z)
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_prefix_binops(self):
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for ia, a in enumerate(candidates):
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for ib, b in enumerate(candidates):
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for op in prefix_binops:
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    res = prefix_results[ia][ib]
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if res is TE:
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        self.assertRaises(TypeError, eval,
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                          '%s(a, b)' % op, {'a': a, 'b': b})
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    else:
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        self.assertEqual(format_result(res),
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                         format_result(eval('%s(a, b)' % op)),
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                         '%s(%s, %s) == %s failed' % (op, a, b, res))
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_cmptypes(self):
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Built-in tp_compare slots expect their arguments to have the
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # same type, but a user-defined __coerce__ doesn't have to obey.
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # SF #980352
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        evil_coercer = CoerceTo(42)
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Make sure these don't crash any more
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(cmp(u'fish', evil_coercer), 0)
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(cmp(slice(1), evil_coercer), 0)
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ...but that this still works
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class WackyComparer(object):
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __cmp__(slf, other):
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertTrue(other == 42, 'expected evil_coercer, got %r' % other)
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return 0
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            __hash__ = None # Invalid cmp makes this unhashable
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cmp(WackyComparer(), evil_coercer), 0)
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ...and classic classes too, since that code path is a little different
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class ClassicWackyComparer:
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __cmp__(slf, other):
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertTrue(other == 42, 'expected evil_coercer, got %r' % other)
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return 0
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cmp(ClassicWackyComparer(), evil_coercer), 0)
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_infinite_rec_classic_classes(self):
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # if __coerce__() returns its arguments reversed it causes an infinite
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # recursion for classic classes.
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class Tester:
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __coerce__(self, other):
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return other, self
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        exc = TestFailed("__coerce__() returning its arguments reverse "
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                "should raise RuntimeError")
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            Tester() + 1
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except (RuntimeError, TypeError):
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise exc
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise exc
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    with check_warnings(("complex divmod.., // and % are deprecated",
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         DeprecationWarning),
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        ("classic (int|long) division", DeprecationWarning),
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        quiet=True):
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        run_unittest(CoercionTest)
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
349