From c3c2c37fbcc59f8ecd58dc294b31ad4d239fd52c Mon Sep 17 00:00:00 2001
From: Mike Wadsten <mikewadsten@gmail.com>
Date: Mon, 13 Jan 2020 11:52:36 -0600
Subject: [PATCH] tests/basics: Add tests for type-checking subclassed exc
 instances.

---
 tests/basics/subclass_native_exc_new.py     | 39 +++++++++++++++++++++
 tests/basics/subclass_native_exc_new.py.exp |  6 ++++
 2 files changed, 45 insertions(+)
 create mode 100644 tests/basics/subclass_native_exc_new.py
 create mode 100644 tests/basics/subclass_native_exc_new.py.exp

diff --git a/tests/basics/subclass_native_exc_new.py b/tests/basics/subclass_native_exc_new.py
new file mode 100644
index 0000000000..c1bd89a6fa
--- /dev/null
+++ b/tests/basics/subclass_native_exc_new.py
@@ -0,0 +1,39 @@
+# test subclassing exceptions and providing __new__
+
+
+class Dummy(BaseException):
+    pass
+
+
+class GoodException(BaseException):
+    def __new__(cls, *args, **kwargs):
+        print("GoodException __new__")
+        return Dummy(*args, **kwargs)
+
+
+class BadException(BaseException):
+    def __new__(cls, *args, **kwargs):
+        print("BadException __new__")
+        return 1
+
+
+try:
+    raise GoodException("good message")
+except BaseException as good:
+    print(type(good), good.args[0])
+
+try:
+    raise BadException("bad message")
+except Exception as bad:
+    # Should be TypeError 'exceptions must derive from BaseException'
+    print(type(bad), bad.args[0])
+
+try:
+
+    def gen():
+        yield
+
+    gen().throw(BadException)
+except Exception as genbad:
+    # Should be TypeError 'exceptions must derive from BaseException'
+    print(type(genbad), genbad.args[0])
diff --git a/tests/basics/subclass_native_exc_new.py.exp b/tests/basics/subclass_native_exc_new.py.exp
new file mode 100644
index 0000000000..65709b2ccf
--- /dev/null
+++ b/tests/basics/subclass_native_exc_new.py.exp
@@ -0,0 +1,6 @@
+GoodException __new__
+<class 'Dummy'> good message
+BadException __new__
+<class 'TypeError'> exceptions must derive from BaseException
+BadException __new__
+<class 'TypeError'> exceptions must derive from BaseException