/Lib/test/test_augassign.py

http://unladen-swallow.googlecode.com/ · Python · 327 lines · 273 code · 49 blank · 5 comment · 9 complexity · 2730d9d94e42aeee9c71a044dec1e6b3 MD5 · raw file

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