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