2000-08-24 17:14:10 -03:00
|
|
|
# Augmented assignment test.
|
|
|
|
|
2010-03-20 22:14:24 -03:00
|
|
|
from test.test_support import run_unittest, check_py3k_warnings
|
2006-03-28 06:26:45 -04: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
|
|
|
|
if 1/2 == 0:
|
|
|
|
# classic division
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(x, 3)
|
2006-03-28 06:26:45 -04:00
|
|
|
else:
|
|
|
|
# new-style division (with -Qnew)
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(x, 3.0)
|
2006-03-28 06:26:45 -04:00
|
|
|
|
2009-10-03 17:23:24 -03:00
|
|
|
def test_with_unpacking(self):
|
|
|
|
self.assertRaises(SyntaxError, compile, "x, b += 3", "<test>", "exec")
|
|
|
|
|
2006-03-28 06:26:45 -04: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
|
|
|
|
if 1/2 == 0:
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(x[0], 3)
|
2006-03-28 06:26:45 -04:00
|
|
|
else:
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(x[0], 3.0)
|
2006-03-28 06:26:45 -04: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
|
|
|
|
if 1/2 == 0:
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(x[0], 3)
|
2006-03-28 06:26:45 -04:00
|
|
|
else:
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(x[0], 3.0)
|
2006-03-28 06:26:45 -04:00
|
|
|
|
|
|
|
def testSequences(self):
|
|
|
|
x = [1,2]
|
|
|
|
x += [3,4]
|
|
|
|
x *= 2
|
|
|
|
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(x, [1, 2, 3, 4, 1, 2, 3, 4])
|
2006-03-30 08:59:11 -04:00
|
|
|
|
2006-03-28 06:26:45 -04:00
|
|
|
x = [1, 2, 3]
|
|
|
|
y = x
|
|
|
|
x[1:2] *= 2
|
|
|
|
y[1:2] += [1]
|
|
|
|
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(x, [1, 2, 1, 2, 3])
|
2009-06-30 19:57:08 -03:00
|
|
|
self.assertTrue(x is y)
|
2006-03-28 06:26:45 -04: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)
|
2006-03-30 08:59:11 -04:00
|
|
|
|
2006-03-28 06:26:45 -04:00
|
|
|
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)
|
2006-03-30 08:59:11 -04:00
|
|
|
|
2006-03-28 06:26:45 -04:00
|
|
|
x = aug_test(1)
|
|
|
|
y = x
|
|
|
|
x += 10
|
|
|
|
|
2010-01-24 12:58:36 -04:00
|
|
|
self.assertIsInstance(x, aug_test)
|
2009-06-30 19:57:08 -03:00
|
|
|
self.assertTrue(y is not x)
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(x.val, 11)
|
2006-03-28 06:26:45 -04:00
|
|
|
|
|
|
|
x = aug_test2(2)
|
|
|
|
y = x
|
|
|
|
x += 10
|
2006-03-30 08:59:11 -04:00
|
|
|
|
2009-06-30 19:57:08 -03:00
|
|
|
self.assertTrue(y is x)
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(x.val, 12)
|
2006-03-28 06:26:45 -04:00
|
|
|
|
|
|
|
x = aug_test3(3)
|
|
|
|
y = x
|
|
|
|
x += 10
|
|
|
|
|
2010-01-24 12:58:36 -04:00
|
|
|
self.assertIsInstance(x, aug_test3)
|
2009-06-30 19:57:08 -03:00
|
|
|
self.assertTrue(y is not x)
|
2010-11-21 09:34:58 -04:00
|
|
|
self.assertEqual(x.val, 13)
|
2006-03-28 06:26:45 -04: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
|
|
|
|
|
|
|
|
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 __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
|
|
|
|
|
|
|
|
if 1/2 == 0:
|
|
|
|
x / 1
|
|
|
|
1 / x
|
|
|
|
x /= 1
|
|
|
|
else:
|
|
|
|
# True division is in effect, so "/" doesn't map to __div__ etc;
|
|
|
|
# but the canned expected-output file requires that those get called.
|
|
|
|
x.__div__(1)
|
|
|
|
x.__rdiv__(1)
|
|
|
|
x.__idiv__(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-21 09:34:58 -04:00
|
|
|
test_self.assertEqual(output, '''\
|
2006-03-28 06:26:45 -04:00
|
|
|
__add__ called
|
|
|
|
__radd__ called
|
|
|
|
__iadd__ called
|
|
|
|
__sub__ called
|
|
|
|
__rsub__ called
|
|
|
|
__isub__ called
|
|
|
|
__mul__ called
|
|
|
|
__rmul__ called
|
|
|
|
__imul__ called
|
|
|
|
__div__ called
|
|
|
|
__rdiv__ called
|
|
|
|
__idiv__ 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())
|
2006-03-30 08:59:11 -04:00
|
|
|
|
2006-03-28 06:26:45 -04:00
|
|
|
def test_main():
|
2010-03-20 22:14:24 -03:00
|
|
|
with check_py3k_warnings(("classic int division", DeprecationWarning)):
|
|
|
|
run_unittest(AugAssignTest)
|
2006-03-28 06:26:45 -04:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
test_main()
|