test_augassign.py 8.0 KB

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