summaryrefslogtreecommitdiff
path: root/tests/basics/class_notimpl.py
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2017-08-30 01:35:48 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2017-08-30 01:39:24 +0300
commit784909ce1655bf8b2a97ac81a3842e844992082f (patch)
tree8567b5d4771b43288bfc81940b833cc193661e8a /tests/basics/class_notimpl.py
parent8388ec4e35142539fb09d2a9ef5981b5732a349f (diff)
py/objtype: Handle NotImplemented return from binary special methods.
NotImplemented means "try other fallbacks (like calling __rop__ instead of __op__) and if nothing works, raise TypeError". As MicroPython doesn't implement any fallbacks, signal to raise TypeError right away.
Diffstat (limited to 'tests/basics/class_notimpl.py')
-rw-r--r--tests/basics/class_notimpl.py50
1 files changed, 50 insertions, 0 deletions
diff --git a/tests/basics/class_notimpl.py b/tests/basics/class_notimpl.py
new file mode 100644
index 000000000..7fd8166f9
--- /dev/null
+++ b/tests/basics/class_notimpl.py
@@ -0,0 +1,50 @@
+# Test that returning of NotImplemented from binary op methods leads to
+# TypeError.
+try:
+ NotImplemented
+except NameError:
+ print("SKIP")
+ raise SystemExit
+
+class C:
+ def __init__(self, value):
+ self.value = value
+
+ def __str__(self):
+ return "C(%s)" % self.value
+
+ def __add__(self, rhs):
+ print(self, '+', rhs)
+ return NotImplemented
+
+ def __sub__(self, rhs):
+ print(self, '-', rhs)
+ return NotImplemented
+
+ def __lt__(self, rhs):
+ print(self, '<', rhs)
+ return NotImplemented
+
+ def __neg__(self):
+ print('-', self)
+ return NotImplemented
+
+c = C(0)
+
+try:
+ c + 1
+except TypeError:
+ print("TypeError")
+
+try:
+ c - 2
+except TypeError:
+ print("TypeError")
+
+try:
+ c < 1
+except TypeError:
+ print("TypeError")
+
+# NotImplemented isn't handled specially in unary methods
+print(-c)