-
Notifications
You must be signed in to change notification settings - Fork 1
/
test.py
82 lines (55 loc) · 1.87 KB
/
test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from classmaker import classbuilder
from pytest import raises
from six import add_metaclass
def build_class_using_classbuilder(bases, metaclasses):
@classbuilder(bases=bases, mc=metaclasses)
class MyClass:
pass
return MyClass
def test_one_base_one_metaclass():
class MetaClassA(type):
pass
class BaseClassA:
pass
MyClass = build_class_using_classbuilder((BaseClassA,), (MetaClassA,))
assert isinstance(MyClass, MetaClassA)
mc = MyClass()
assert isinstance(mc, BaseClassA)
def test_one_base_with_metaclass_and_one_metaclass():
class MetaClassA(type):
pass
@add_metaclass(MetaClassA)
class BaseClassA:
pass
class MetaClassB(type):
pass
MyClass = build_class_using_classbuilder((BaseClassA,), (MetaClassB,))
assert isinstance(MyClass, MetaClassA)
assert isinstance(MyClass, MetaClassB)
mc = MyClass()
assert isinstance(mc, BaseClassA)
def test_two_bases_each_with_metaclasses():
class MetaClassA(type):
def do_something(self):
pass
@add_metaclass(MetaClassA)
class BaseClassA:
pass
class MetaClassB(type):
def do_something_else(self):
pass
@add_metaclass(MetaClassB)
class BaseClassB:
pass
# demonstrate that we are actually doing something useful...
with raises(TypeError, match='metaclass conflict'):
def attempt_standard_class_build():
class MyClass(BaseClassA, BaseClassB):
pass
attempt_standard_class_build()
MyClass = build_class_using_classbuilder((BaseClassA, BaseClassB), ())
assert isinstance(MyClass, MetaClassB)
assert isinstance(MyClass, MetaClassA)
MyClass = build_class_using_classbuilder((BaseClassB, BaseClassA), ())
assert isinstance(MyClass, MetaClassB)
assert isinstance(MyClass, MetaClassA)