mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			315 lines
		
	
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			315 lines
		
	
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Augmented assignment test.
 | 
						|
 | 
						|
from test.support import run_unittest
 | 
						|
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
 | 
						|
        self.assertEqual(x, 3.0)
 | 
						|
 | 
						|
    def test_with_unpacking(self):
 | 
						|
        self.assertRaises(SyntaxError, compile, "x, b += 3", "<test>", "exec")
 | 
						|
 | 
						|
    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
 | 
						|
        self.assertEqual(x[0], 3.0)
 | 
						|
 | 
						|
    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
 | 
						|
        self.assertEqual(x[0], 3.0)
 | 
						|
 | 
						|
    def testSequences(self):
 | 
						|
        x = [1,2]
 | 
						|
        x += [3,4]
 | 
						|
        x *= 2
 | 
						|
 | 
						|
        self.assertEqual(x, [1, 2, 3, 4, 1, 2, 3, 4])
 | 
						|
 | 
						|
        x = [1, 2, 3]
 | 
						|
        y = x
 | 
						|
        x[1:2] *= 2
 | 
						|
        y[1:2] += [1]
 | 
						|
 | 
						|
        self.assertEqual(x, [1, 2, 1, 2, 3])
 | 
						|
        self.assertTrue(x is y)
 | 
						|
 | 
						|
    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
 | 
						|
 | 
						|
        self.assertIsInstance(x, aug_test)
 | 
						|
        self.assertTrue(y is not x)
 | 
						|
        self.assertEqual(x.val, 11)
 | 
						|
 | 
						|
        x = aug_test2(2)
 | 
						|
        y = x
 | 
						|
        x += 10
 | 
						|
 | 
						|
        self.assertTrue(y is x)
 | 
						|
        self.assertEqual(x.val, 12)
 | 
						|
 | 
						|
        x = aug_test3(3)
 | 
						|
        y = x
 | 
						|
        x += 10
 | 
						|
 | 
						|
        self.assertIsInstance(x, aug_test3)
 | 
						|
        self.assertTrue(y is not x)
 | 
						|
        self.assertEqual(x.val, 13)
 | 
						|
 | 
						|
 | 
						|
    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
 | 
						|
 | 
						|
            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
 | 
						|
 | 
						|
        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
 | 
						|
 | 
						|
        test_self.assertEqual(output, '''\
 | 
						|
__add__ called
 | 
						|
__radd__ called
 | 
						|
__iadd__ called
 | 
						|
__sub__ called
 | 
						|
__rsub__ called
 | 
						|
__isub__ called
 | 
						|
__mul__ called
 | 
						|
__rmul__ called
 | 
						|
__imul__ called
 | 
						|
__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()
 |