diff options
author | Benjamin Peterson <benjamin@python.org> | 2013-08-21 22:39:12 -0500 |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2013-08-21 22:39:12 -0500 |
commit | 0163ad03b519fcde529a4473ba712d71a57ac4ba (patch) | |
tree | 22312334bfb3cf09b9d4c8f4032b691a3ee217a1 /test_six.py | |
parent | 70b7d9ce6a6663bbe28358cbbcbe57cf4fd65334 (diff) | |
parent | f9adf9c8d673f7115724a85a62cd84aa159eb1ae (diff) | |
download | six-git-0163ad03b519fcde529a4473ba712d71a57ac4ba.tar.gz |
Merged in jaraco/six (pull request #12)
Add 'patch_with_metaclass' which provides a more complete interface for supporting metaclass-based classes across Python versions.
Diffstat (limited to 'test_six.py')
-rw-r--r-- | test_six.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/test_six.py b/test_six.py index 38bd0e5..12d3a06 100644 --- a/test_six.py +++ b/test_six.py @@ -511,3 +511,66 @@ def test_with_metaclass(): assert type(X) is Meta assert issubclass(X, Base) assert issubclass(X, Base2) + + +def test_add_metaclass(): + class Meta(type): + pass + class X: + "success" + X = six.add_metaclass(Meta)(X) + assert type(X) is Meta + assert issubclass(X, object) + assert X.__module__ is __name__ + assert X.__doc__ == "success" + class Base(object): + pass + class X(Base): + pass + X = six.add_metaclass(Meta)(X) + assert type(X) is Meta + assert issubclass(X, Base) + class Base2(object): + pass + class X(Base, Base2): + pass + X = six.add_metaclass(Meta)(X) + assert type(X) is Meta + assert issubclass(X, Base) + assert issubclass(X, Base2) + + # additionally test a second-generation subclass of a type + class Meta1(type): + m1 = "m1" + class Meta2(Meta1): + m2 = "m2" + class Base: + b = "b" + Base = six.add_metaclass(Meta1)(Base) + class X(Base): + x = "x" + X = six.add_metaclass(Meta2)(X) + assert type(X) is Meta2 + assert issubclass(X, Base) + assert type(Base) is Meta1 + assert "__dict__" not in vars(X) + instance = X() + instance.attr = "test" + assert vars(instance) == {"attr": "test"} + assert instance.b == Base.b + assert instance.x == X.x + + # test a class with slots + class MySlots(object): + __slots__ = ["a", "b"] + MySlots = six.add_metaclass(Meta1)(MySlots) + + assert MySlots.__slots__ == ["a", "b"] + instance = MySlots() + instance.a = "foo" + try: + instance.c = "baz" + except AttributeError: + pass + else: + raise RuntimeError("did not raise") |