summaryrefslogtreecommitdiff
path: root/Lib/test/test_abc.py
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@python.org>2020-10-19 15:50:36 +0100
committerGitHub <noreply@github.com>2020-10-19 15:50:36 +0100
commitc82f10450c547eb94a04ee17b7c816ff31948297 (patch)
treead305c05c5745e1a5e7c136545bec7eefa741e32 /Lib/test/test_abc.py
parenteee6bb50c69d94280f43b47390ea9d1b5f42930c (diff)
parentb580ed1d9d55461d8dde027411b90be26cae131e (diff)
downloadcpython-git-bpo-39107.tar.gz
Merge branch 'master' into bpo-39107bpo-39107
Diffstat (limited to 'Lib/test/test_abc.py')
-rw-r--r--Lib/test/test_abc.py149
1 files changed, 149 insertions, 0 deletions
diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py
index 7e9c47b3ca..3d603e7734 100644
--- a/Lib/test/test_abc.py
+++ b/Lib/test/test_abc.py
@@ -488,6 +488,155 @@ def test_factory(abc_ABCMeta, abc_get_cache_token):
pass
self.assertEqual(C.__class__, abc_ABCMeta)
+ def test_update_del(self):
+ class A(metaclass=abc_ABCMeta):
+ @abc.abstractmethod
+ def foo(self):
+ pass
+
+ del A.foo
+ self.assertEqual(A.__abstractmethods__, {'foo'})
+ self.assertFalse(hasattr(A, 'foo'))
+
+ abc.update_abstractmethods(A)
+
+ self.assertEqual(A.__abstractmethods__, set())
+ A()
+
+
+ def test_update_new_abstractmethods(self):
+ class A(metaclass=abc_ABCMeta):
+ @abc.abstractmethod
+ def bar(self):
+ pass
+
+ @abc.abstractmethod
+ def updated_foo(self):
+ pass
+
+ A.foo = updated_foo
+ abc.update_abstractmethods(A)
+ self.assertEqual(A.__abstractmethods__, {'foo', 'bar'})
+ msg = "class A with abstract methods bar, foo"
+ self.assertRaisesRegex(TypeError, msg, A)
+
+ def test_update_implementation(self):
+ class A(metaclass=abc_ABCMeta):
+ @abc.abstractmethod
+ def foo(self):
+ pass
+
+ class B(A):
+ pass
+
+ msg = "class B with abstract method foo"
+ self.assertRaisesRegex(TypeError, msg, B)
+ self.assertEqual(B.__abstractmethods__, {'foo'})
+
+ B.foo = lambda self: None
+
+ abc.update_abstractmethods(B)
+
+ B()
+ self.assertEqual(B.__abstractmethods__, set())
+
+ def test_update_as_decorator(self):
+ class A(metaclass=abc_ABCMeta):
+ @abc.abstractmethod
+ def foo(self):
+ pass
+
+ def class_decorator(cls):
+ cls.foo = lambda self: None
+ return cls
+
+ @abc.update_abstractmethods
+ @class_decorator
+ class B(A):
+ pass
+
+ B()
+ self.assertEqual(B.__abstractmethods__, set())
+
+ def test_update_non_abc(self):
+ class A:
+ pass
+
+ @abc.abstractmethod
+ def updated_foo(self):
+ pass
+
+ A.foo = updated_foo
+ abc.update_abstractmethods(A)
+ A()
+ self.assertFalse(hasattr(A, '__abstractmethods__'))
+
+ def test_update_del_implementation(self):
+ class A(metaclass=abc_ABCMeta):
+ @abc.abstractmethod
+ def foo(self):
+ pass
+
+ class B(A):
+ def foo(self):
+ pass
+
+ B()
+
+ del B.foo
+
+ abc.update_abstractmethods(B)
+
+ msg = "class B with abstract method foo"
+ self.assertRaisesRegex(TypeError, msg, B)
+
+ def test_update_layered_implementation(self):
+ class A(metaclass=abc_ABCMeta):
+ @abc.abstractmethod
+ def foo(self):
+ pass
+
+ class B(A):
+ pass
+
+ class C(B):
+ def foo(self):
+ pass
+
+ C()
+
+ del C.foo
+
+ abc.update_abstractmethods(C)
+
+ msg = "class C with abstract method foo"
+ self.assertRaisesRegex(TypeError, msg, C)
+
+ def test_update_multi_inheritance(self):
+ class A(metaclass=abc_ABCMeta):
+ @abc.abstractmethod
+ def foo(self):
+ pass
+
+ class B(metaclass=abc_ABCMeta):
+ def foo(self):
+ pass
+
+ class C(B, A):
+ @abc.abstractmethod
+ def foo(self):
+ pass
+
+ self.assertEqual(C.__abstractmethods__, {'foo'})
+
+ del C.foo
+
+ abc.update_abstractmethods(C)
+
+ self.assertEqual(C.__abstractmethods__, set())
+
+ C()
+
class TestABCWithInitSubclass(unittest.TestCase):
def test_works_with_init_subclass(self):