1 # Augmented assignment test. 2 3 import unittest 4 5 6 class AugAssignTest(unittest.TestCase): 7 def testBasic(self): 8 x = 2 9 x += 1 10 x *= 2 11 x **= 2 12 x -= 8 13 x //= 5 14 x %= 3 15 x &= 2 16 x |= 5 17 x ^= 1 18 x /= 2 19 self.assertEqual(x, 3.0) 20 21 def test_with_unpacking(self): 22 self.assertRaises(SyntaxError, compile, "x, b += 3", "<test>", "exec") 23 24 def testInList(self): 25 x = [2] 26 x[0] += 1 27 x[0] *= 2 28 x[0] **= 2 29 x[0] -= 8 30 x[0] //= 5 31 x[0] %= 3 32 x[0] &= 2 33 x[0] |= 5 34 x[0] ^= 1 35 x[0] /= 2 36 self.assertEqual(x[0], 3.0) 37 38 def testInDict(self): 39 x = {0: 2} 40 x[0] += 1 41 x[0] *= 2 42 x[0] **= 2 43 x[0] -= 8 44 x[0] //= 5 45 x[0] %= 3 46 x[0] &= 2 47 x[0] |= 5 48 x[0] ^= 1 49 x[0] /= 2 50 self.assertEqual(x[0], 3.0) 51 52 def testSequences(self): 53 x = [1,2] 54 x += [3,4] 55 x *= 2 56 57 self.assertEqual(x, [1, 2, 3, 4, 1, 2, 3, 4]) 58 59 x = [1, 2, 3] 60 y = x 61 x[1:2] *= 2 62 y[1:2] += [1] 63 64 self.assertEqual(x, [1, 2, 1, 2, 3]) 65 self.assertTrue(x is y) 66 67 def testCustomMethods1(self): 68 69 class aug_test: 70 def __init__(self, value): 71 self.val = value 72 def __radd__(self, val): 73 return self.val + val 74 def __add__(self, val): 75 return aug_test(self.val + val) 76 77 class aug_test2(aug_test): 78 def __iadd__(self, val): 79 self.val = self.val + val 80 return self 81 82 class aug_test3(aug_test): 83 def __iadd__(self, val): 84 return aug_test3(self.val + val) 85 86 class aug_test4(aug_test3): 87 """Blocks inheritance, and fallback to __add__""" 88 __iadd__ = None 89 90 x = aug_test(1) 91 y = x 92 x += 10 93 94 self.assertIsInstance(x, aug_test) 95 self.assertTrue(y is not x) 96 self.assertEqual(x.val, 11) 97 98 x = aug_test2(2) 99 y = x 100 x += 10 101 102 self.assertTrue(y is x) 103 self.assertEqual(x.val, 12) 104 105 x = aug_test3(3) 106 y = x 107 x += 10 108 109 self.assertIsInstance(x, aug_test3) 110 self.assertTrue(y is not x) 111 self.assertEqual(x.val, 13) 112 113 x = aug_test4(4) 114 with self.assertRaises(TypeError): 115 x += 10 116 117 118 def testCustomMethods2(test_self): 119 output = [] 120 121 class testall: 122 def __add__(self, val): 123 output.append("__add__ called") 124 def __radd__(self, val): 125 output.append("__radd__ called") 126 def __iadd__(self, val): 127 output.append("__iadd__ called") 128 return self 129 130 def __sub__(self, val): 131 output.append("__sub__ called") 132 def __rsub__(self, val): 133 output.append("__rsub__ called") 134 def __isub__(self, val): 135 output.append("__isub__ called") 136 return self 137 138 def __mul__(self, val): 139 output.append("__mul__ called") 140 def __rmul__(self, val): 141 output.append("__rmul__ called") 142 def __imul__(self, val): 143 output.append("__imul__ called") 144 return self 145 146 def __matmul__(self, val): 147 output.append("__matmul__ called") 148 def __rmatmul__(self, val): 149 output.append("__rmatmul__ called") 150 def __imatmul__(self, val): 151 output.append("__imatmul__ called") 152 return self 153 154 def __floordiv__(self, val): 155 output.append("__floordiv__ called") 156 return self 157 def __ifloordiv__(self, val): 158 output.append("__ifloordiv__ called") 159 return self 160 def __rfloordiv__(self, val): 161 output.append("__rfloordiv__ called") 162 return self 163 164 def __truediv__(self, val): 165 output.append("__truediv__ called") 166 return self 167 def __rtruediv__(self, val): 168 output.append("__rtruediv__ called") 169 return self 170 def __itruediv__(self, val): 171 output.append("__itruediv__ called") 172 return self 173 174 def __mod__(self, val): 175 output.append("__mod__ called") 176 def __rmod__(self, val): 177 output.append("__rmod__ called") 178 def __imod__(self, val): 179 output.append("__imod__ called") 180 return self 181 182 def __pow__(self, val): 183 output.append("__pow__ called") 184 def __rpow__(self, val): 185 output.append("__rpow__ called") 186 def __ipow__(self, val): 187 output.append("__ipow__ called") 188 return self 189 190 def __or__(self, val): 191 output.append("__or__ called") 192 def __ror__(self, val): 193 output.append("__ror__ called") 194 def __ior__(self, val): 195 output.append("__ior__ called") 196 return self 197 198 def __and__(self, val): 199 output.append("__and__ called") 200 def __rand__(self, val): 201 output.append("__rand__ called") 202 def __iand__(self, val): 203 output.append("__iand__ called") 204 return self 205 206 def __xor__(self, val): 207 output.append("__xor__ called") 208 def __rxor__(self, val): 209 output.append("__rxor__ called") 210 def __ixor__(self, val): 211 output.append("__ixor__ called") 212 return self 213 214 def __rshift__(self, val): 215 output.append("__rshift__ called") 216 def __rrshift__(self, val): 217 output.append("__rrshift__ called") 218 def __irshift__(self, val): 219 output.append("__irshift__ called") 220 return self 221 222 def __lshift__(self, val): 223 output.append("__lshift__ called") 224 def __rlshift__(self, val): 225 output.append("__rlshift__ called") 226 def __ilshift__(self, val): 227 output.append("__ilshift__ called") 228 return self 229 230 x = testall() 231 x + 1 232 1 + x 233 x += 1 234 235 x - 1 236 1 - x 237 x -= 1 238 239 x * 1 240 1 * x 241 x *= 1 242 243 x @ 1 244 1 @ x 245 x @= 1 246 247 x / 1 248 1 / x 249 x /= 1 250 251 x // 1 252 1 // x 253 x //= 1 254 255 x % 1 256 1 % x 257 x %= 1 258 259 x ** 1 260 1 ** x 261 x **= 1 262 263 x | 1 264 1 | x 265 x |= 1 266 267 x & 1 268 1 & x 269 x &= 1 270 271 x ^ 1 272 1 ^ x 273 x ^= 1 274 275 x >> 1 276 1 >> x 277 x >>= 1 278 279 x << 1 280 1 << x 281 x <<= 1 282 283 test_self.assertEqual(output, '''\ 284 __add__ called 285 __radd__ called 286 __iadd__ called 287 __sub__ called 288 __rsub__ called 289 __isub__ called 290 __mul__ called 291 __rmul__ called 292 __imul__ called 293 __matmul__ called 294 __rmatmul__ called 295 __imatmul__ called 296 __truediv__ called 297 __rtruediv__ called 298 __itruediv__ called 299 __floordiv__ called 300 __rfloordiv__ called 301 __ifloordiv__ called 302 __mod__ called 303 __rmod__ called 304 __imod__ called 305 __pow__ called 306 __rpow__ called 307 __ipow__ called 308 __or__ called 309 __ror__ called 310 __ior__ called 311 __and__ called 312 __rand__ called 313 __iand__ called 314 __xor__ called 315 __rxor__ called 316 __ixor__ called 317 __rshift__ called 318 __rrshift__ called 319 __irshift__ called 320 __lshift__ called 321 __rlshift__ called 322 __ilshift__ called 323 '''.splitlines()) 324 325 if __name__ == '__main__': 326 unittest.main() 327