test_augassign.py 7.7 KB

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