summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2017-09-04 16:44:38 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2017-09-04 16:44:38 +0300
commit376618cd8ad322f5a8fa77dac7d202f451481688 (patch)
tree97a67498713f2227250121ada277a9e8b9baf224
parent60749e57f24741c685d2ae125cfff27d021eb90d (diff)
downloadmicropython-376618cd8ad322f5a8fa77dac7d202f451481688.tar.gz
micropython-376618cd8ad322f5a8fa77dac7d202f451481688.zip
tests/class_inplace_op: Test for inplace op fallback to normal one.
-rw-r--r--tests/basics/class_inplace_op.py47
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/basics/class_inplace_op.py b/tests/basics/class_inplace_op.py
new file mode 100644
index 0000000000..62aad8c7cf
--- /dev/null
+++ b/tests/basics/class_inplace_op.py
@@ -0,0 +1,47 @@
+# Case 1: Immutable object (e.g. number-like)
+# __iadd__ should not be defined, will be emulated using __add__
+
+class A:
+
+ def __init__(self, v):
+ self.v = v
+
+ def __add__(self, o):
+ return A(self.v + o.v)
+
+ def __repr__(self):
+ return "A(%s)" % self.v
+
+a = A(5)
+b = a
+a += A(3)
+print(a)
+# Should be original a's value, i.e. A(5)
+print(b)
+
+# Case 2: Mutable object (e.g. list-like)
+# __iadd__ should be defined
+
+class L:
+
+ def __init__(self, v):
+ self.v = v
+
+ def __add__(self, o):
+ # Should not be caled in this test
+ print("L.__add__")
+ return L(self.v + o.v)
+
+ def __iadd__(self, o):
+ self.v += o.v
+ return self
+
+ def __repr__(self):
+ return "L(%s)" % self.v
+
+c = L([1, 2])
+d = c
+c += L([3, 4])
+print(c)
+# Should be updated c's value, i.e. L([1, 2, 3, 4])
+print(d)