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