| 
									
										
										
										
											2000-08-24 20:14:10 +00:00
										 |  |  | # Augmented assignment test. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-20 21:35:26 +00:00
										 |  |  | from test.support import run_unittest | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AugAssignTest(unittest.TestCase): | 
					
						
							|  |  |  |     def testBasic(self): | 
					
						
							|  |  |  |         x = 2 | 
					
						
							|  |  |  |         x += 1 | 
					
						
							|  |  |  |         x *= 2 | 
					
						
							|  |  |  |         x **= 2 | 
					
						
							|  |  |  |         x -= 8 | 
					
						
							|  |  |  |         x //= 5 | 
					
						
							|  |  |  |         x %= 3 | 
					
						
							|  |  |  |         x &= 2 | 
					
						
							|  |  |  |         x |= 5 | 
					
						
							|  |  |  |         x ^= 1 | 
					
						
							|  |  |  |         x /= 2 | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         self.assertEqual(x, 3.0) | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-03 20:27:13 +00:00
										 |  |  |     def test_with_unpacking(self): | 
					
						
							|  |  |  |         self.assertRaises(SyntaxError, compile, "x, b += 3", "<test>", "exec") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  |     def testInList(self): | 
					
						
							|  |  |  |         x = [2] | 
					
						
							|  |  |  |         x[0] += 1 | 
					
						
							|  |  |  |         x[0] *= 2 | 
					
						
							|  |  |  |         x[0] **= 2 | 
					
						
							|  |  |  |         x[0] -= 8 | 
					
						
							|  |  |  |         x[0] //= 5 | 
					
						
							|  |  |  |         x[0] %= 3 | 
					
						
							|  |  |  |         x[0] &= 2 | 
					
						
							|  |  |  |         x[0] |= 5 | 
					
						
							|  |  |  |         x[0] ^= 1 | 
					
						
							|  |  |  |         x[0] /= 2 | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         self.assertEqual(x[0], 3.0) | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def testInDict(self): | 
					
						
							|  |  |  |         x = {0: 2} | 
					
						
							|  |  |  |         x[0] += 1 | 
					
						
							|  |  |  |         x[0] *= 2 | 
					
						
							|  |  |  |         x[0] **= 2 | 
					
						
							|  |  |  |         x[0] -= 8 | 
					
						
							|  |  |  |         x[0] //= 5 | 
					
						
							|  |  |  |         x[0] %= 3 | 
					
						
							|  |  |  |         x[0] &= 2 | 
					
						
							|  |  |  |         x[0] |= 5 | 
					
						
							|  |  |  |         x[0] ^= 1 | 
					
						
							|  |  |  |         x[0] /= 2 | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         self.assertEqual(x[0], 3.0) | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def testSequences(self): | 
					
						
							|  |  |  |         x = [1,2] | 
					
						
							|  |  |  |         x += [3,4] | 
					
						
							|  |  |  |         x *= 2 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         self.assertEqual(x, [1, 2, 3, 4, 1, 2, 3, 4]) | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         x = [1, 2, 3] | 
					
						
							|  |  |  |         y = x | 
					
						
							|  |  |  |         x[1:2] *= 2 | 
					
						
							|  |  |  |         y[1:2] += [1] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         self.assertEqual(x, [1, 2, 1, 2, 3]) | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(x is y) | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def testCustomMethods1(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class aug_test: | 
					
						
							|  |  |  |             def __init__(self, value): | 
					
						
							|  |  |  |                 self.val = value | 
					
						
							|  |  |  |             def __radd__(self, val): | 
					
						
							|  |  |  |                 return self.val + val | 
					
						
							|  |  |  |             def __add__(self, val): | 
					
						
							|  |  |  |                 return aug_test(self.val + val) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class aug_test2(aug_test): | 
					
						
							|  |  |  |             def __iadd__(self, val): | 
					
						
							|  |  |  |                 self.val = self.val + val | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class aug_test3(aug_test): | 
					
						
							|  |  |  |             def __iadd__(self, val): | 
					
						
							|  |  |  |                 return aug_test3(self.val + val) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x = aug_test(1) | 
					
						
							|  |  |  |         y = x | 
					
						
							|  |  |  |         x += 10 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-24 19:26:24 +00:00
										 |  |  |         self.assertIsInstance(x, aug_test) | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(y is not x) | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         self.assertEqual(x.val, 11) | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         x = aug_test2(2) | 
					
						
							|  |  |  |         y = x | 
					
						
							|  |  |  |         x += 10 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(y is x) | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         self.assertEqual(x.val, 12) | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         x = aug_test3(3) | 
					
						
							|  |  |  |         y = x | 
					
						
							|  |  |  |         x += 10 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-24 19:26:24 +00:00
										 |  |  |         self.assertIsInstance(x, aug_test3) | 
					
						
							| 
									
										
										
										
											2009-06-30 23:06:06 +00:00
										 |  |  |         self.assertTrue(y is not x) | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         self.assertEqual(x.val, 13) | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testCustomMethods2(test_self): | 
					
						
							|  |  |  |         output = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class testall: | 
					
						
							|  |  |  |             def __add__(self, val): | 
					
						
							|  |  |  |                 output.append("__add__ called") | 
					
						
							|  |  |  |             def __radd__(self, val): | 
					
						
							|  |  |  |                 output.append("__radd__ called") | 
					
						
							|  |  |  |             def __iadd__(self, val): | 
					
						
							|  |  |  |                 output.append("__iadd__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __sub__(self, val): | 
					
						
							|  |  |  |                 output.append("__sub__ called") | 
					
						
							|  |  |  |             def __rsub__(self, val): | 
					
						
							|  |  |  |                 output.append("__rsub__ called") | 
					
						
							|  |  |  |             def __isub__(self, val): | 
					
						
							|  |  |  |                 output.append("__isub__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __mul__(self, val): | 
					
						
							|  |  |  |                 output.append("__mul__ called") | 
					
						
							|  |  |  |             def __rmul__(self, val): | 
					
						
							|  |  |  |                 output.append("__rmul__ called") | 
					
						
							|  |  |  |             def __imul__(self, val): | 
					
						
							|  |  |  |                 output.append("__imul__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-09 23:55:56 -04:00
										 |  |  |             def __matmul__(self, val): | 
					
						
							|  |  |  |                 output.append("__matmul__ called") | 
					
						
							|  |  |  |             def __rmatmul__(self, val): | 
					
						
							|  |  |  |                 output.append("__rmatmul__ called") | 
					
						
							|  |  |  |             def __imatmul__(self, val): | 
					
						
							|  |  |  |                 output.append("__imatmul__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  |             def __div__(self, val): | 
					
						
							|  |  |  |                 output.append("__div__ called") | 
					
						
							|  |  |  |             def __rdiv__(self, val): | 
					
						
							|  |  |  |                 output.append("__rdiv__ called") | 
					
						
							|  |  |  |             def __idiv__(self, val): | 
					
						
							|  |  |  |                 output.append("__idiv__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __floordiv__(self, val): | 
					
						
							|  |  |  |                 output.append("__floordiv__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  |             def __ifloordiv__(self, val): | 
					
						
							|  |  |  |                 output.append("__ifloordiv__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  |             def __rfloordiv__(self, val): | 
					
						
							|  |  |  |                 output.append("__rfloordiv__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __truediv__(self, val): | 
					
						
							|  |  |  |                 output.append("__truediv__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  |             def __rtruediv__(self, val): | 
					
						
							|  |  |  |                 output.append("__rtruediv__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  |             def __itruediv__(self, val): | 
					
						
							|  |  |  |                 output.append("__itruediv__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __mod__(self, val): | 
					
						
							|  |  |  |                 output.append("__mod__ called") | 
					
						
							|  |  |  |             def __rmod__(self, val): | 
					
						
							|  |  |  |                 output.append("__rmod__ called") | 
					
						
							|  |  |  |             def __imod__(self, val): | 
					
						
							|  |  |  |                 output.append("__imod__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __pow__(self, val): | 
					
						
							|  |  |  |                 output.append("__pow__ called") | 
					
						
							|  |  |  |             def __rpow__(self, val): | 
					
						
							|  |  |  |                 output.append("__rpow__ called") | 
					
						
							|  |  |  |             def __ipow__(self, val): | 
					
						
							|  |  |  |                 output.append("__ipow__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __or__(self, val): | 
					
						
							|  |  |  |                 output.append("__or__ called") | 
					
						
							|  |  |  |             def __ror__(self, val): | 
					
						
							|  |  |  |                 output.append("__ror__ called") | 
					
						
							|  |  |  |             def __ior__(self, val): | 
					
						
							|  |  |  |                 output.append("__ior__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __and__(self, val): | 
					
						
							|  |  |  |                 output.append("__and__ called") | 
					
						
							|  |  |  |             def __rand__(self, val): | 
					
						
							|  |  |  |                 output.append("__rand__ called") | 
					
						
							|  |  |  |             def __iand__(self, val): | 
					
						
							|  |  |  |                 output.append("__iand__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __xor__(self, val): | 
					
						
							|  |  |  |                 output.append("__xor__ called") | 
					
						
							|  |  |  |             def __rxor__(self, val): | 
					
						
							|  |  |  |                 output.append("__rxor__ called") | 
					
						
							|  |  |  |             def __ixor__(self, val): | 
					
						
							|  |  |  |                 output.append("__ixor__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __rshift__(self, val): | 
					
						
							|  |  |  |                 output.append("__rshift__ called") | 
					
						
							|  |  |  |             def __rrshift__(self, val): | 
					
						
							|  |  |  |                 output.append("__rrshift__ called") | 
					
						
							|  |  |  |             def __irshift__(self, val): | 
					
						
							|  |  |  |                 output.append("__irshift__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __lshift__(self, val): | 
					
						
							|  |  |  |                 output.append("__lshift__ called") | 
					
						
							|  |  |  |             def __rlshift__(self, val): | 
					
						
							|  |  |  |                 output.append("__rlshift__ called") | 
					
						
							|  |  |  |             def __ilshift__(self, val): | 
					
						
							|  |  |  |                 output.append("__ilshift__ called") | 
					
						
							|  |  |  |                 return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x = testall() | 
					
						
							|  |  |  |         x + 1 | 
					
						
							|  |  |  |         1 + x | 
					
						
							|  |  |  |         x += 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x - 1 | 
					
						
							|  |  |  |         1 - x | 
					
						
							|  |  |  |         x -= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x * 1 | 
					
						
							|  |  |  |         1 * x | 
					
						
							|  |  |  |         x *= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-09 23:55:56 -04:00
										 |  |  |         x @ 1 | 
					
						
							|  |  |  |         1 @ x | 
					
						
							|  |  |  |         x @= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  |         x / 1 | 
					
						
							|  |  |  |         1 / x | 
					
						
							|  |  |  |         x /= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x // 1 | 
					
						
							|  |  |  |         1 // x | 
					
						
							|  |  |  |         x //= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x % 1 | 
					
						
							|  |  |  |         1 % x | 
					
						
							|  |  |  |         x %= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x ** 1 | 
					
						
							|  |  |  |         1 ** x | 
					
						
							|  |  |  |         x **= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x | 1 | 
					
						
							|  |  |  |         1 | x | 
					
						
							|  |  |  |         x |= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x & 1 | 
					
						
							|  |  |  |         1 & x | 
					
						
							|  |  |  |         x &= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x ^ 1 | 
					
						
							|  |  |  |         1 ^ x | 
					
						
							|  |  |  |         x ^= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x >> 1 | 
					
						
							|  |  |  |         1 >> x | 
					
						
							|  |  |  |         x >>= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x << 1 | 
					
						
							|  |  |  |         1 << x | 
					
						
							|  |  |  |         x <<= 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         test_self.assertEqual(output, '''\
 | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | __add__ called | 
					
						
							|  |  |  | __radd__ called | 
					
						
							|  |  |  | __iadd__ called | 
					
						
							|  |  |  | __sub__ called | 
					
						
							|  |  |  | __rsub__ called | 
					
						
							|  |  |  | __isub__ called | 
					
						
							|  |  |  | __mul__ called | 
					
						
							|  |  |  | __rmul__ called | 
					
						
							|  |  |  | __imul__ called | 
					
						
							| 
									
										
										
										
											2014-04-09 23:55:56 -04:00
										 |  |  | __matmul__ called | 
					
						
							|  |  |  | __rmatmul__ called | 
					
						
							|  |  |  | __imatmul__ called | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | __truediv__ called | 
					
						
							|  |  |  | __rtruediv__ called | 
					
						
							|  |  |  | __itruediv__ called | 
					
						
							|  |  |  | __floordiv__ called | 
					
						
							|  |  |  | __rfloordiv__ called | 
					
						
							|  |  |  | __ifloordiv__ called | 
					
						
							|  |  |  | __mod__ called | 
					
						
							|  |  |  | __rmod__ called | 
					
						
							|  |  |  | __imod__ called | 
					
						
							|  |  |  | __pow__ called | 
					
						
							|  |  |  | __rpow__ called | 
					
						
							|  |  |  | __ipow__ called | 
					
						
							|  |  |  | __or__ called | 
					
						
							|  |  |  | __ror__ called | 
					
						
							|  |  |  | __ior__ called | 
					
						
							|  |  |  | __and__ called | 
					
						
							|  |  |  | __rand__ called | 
					
						
							|  |  |  | __iand__ called | 
					
						
							|  |  |  | __xor__ called | 
					
						
							|  |  |  | __rxor__ called | 
					
						
							|  |  |  | __ixor__ called | 
					
						
							|  |  |  | __rshift__ called | 
					
						
							|  |  |  | __rrshift__ called | 
					
						
							|  |  |  | __irshift__ called | 
					
						
							|  |  |  | __lshift__ called | 
					
						
							|  |  |  | __rlshift__ called | 
					
						
							|  |  |  | __ilshift__ called | 
					
						
							|  |  |  | '''.splitlines())
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_main(): | 
					
						
							|  |  |  |     run_unittest(AugAssignTest) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     test_main() |