@@ -24,7 +24,43 @@ def test_refleaks(self):
24
24
25
25
class TestInheritance (unittest .TestCase ):
26
26
27
- def test_multiple_inheritance (self ):
27
+ @staticmethod
28
+ def check_sequence_then_mapping (x ):
29
+ match x :
30
+ case [* _]:
31
+ return "seq"
32
+ case {}:
33
+ return "map"
34
+
35
+ @staticmethod
36
+ def check_mapping_then_sequence (x ):
37
+ match x :
38
+ case {}:
39
+ return "map"
40
+ case [* _]:
41
+ return "seq"
42
+
43
+ def test_multiple_inheritance_mapping (self ):
44
+ class C :
45
+ pass
46
+ class M1 (collections .UserDict , collections .abc .Sequence ):
47
+ pass
48
+ class M2 (C , collections .UserDict , collections .abc .Sequence ):
49
+ pass
50
+ class M3 (collections .UserDict , C , list ):
51
+ pass
52
+ class M4 (dict , collections .abc .Sequence , C ):
53
+ pass
54
+ self .assertEqual (self .check_sequence_then_mapping (M1 ()), "map" )
55
+ self .assertEqual (self .check_sequence_then_mapping (M2 ()), "map" )
56
+ self .assertEqual (self .check_sequence_then_mapping (M3 ()), "map" )
57
+ self .assertEqual (self .check_sequence_then_mapping (M4 ()), "map" )
58
+ self .assertEqual (self .check_mapping_then_sequence (M1 ()), "map" )
59
+ self .assertEqual (self .check_mapping_then_sequence (M2 ()), "map" )
60
+ self .assertEqual (self .check_mapping_then_sequence (M3 ()), "map" )
61
+ self .assertEqual (self .check_mapping_then_sequence (M4 ()), "map" )
62
+
63
+ def test_multiple_inheritance_sequence (self ):
28
64
class C :
29
65
pass
30
66
class S1 (collections .UserList , collections .abc .Mapping ):
@@ -35,32 +71,60 @@ class S3(list, C, collections.abc.Mapping):
35
71
pass
36
72
class S4 (collections .UserList , dict , C ):
37
73
pass
38
- class M1 (collections .UserDict , collections .abc .Sequence ):
74
+ self .assertEqual (self .check_sequence_then_mapping (S1 ()), "seq" )
75
+ self .assertEqual (self .check_sequence_then_mapping (S2 ()), "seq" )
76
+ self .assertEqual (self .check_sequence_then_mapping (S3 ()), "seq" )
77
+ self .assertEqual (self .check_sequence_then_mapping (S4 ()), "seq" )
78
+ self .assertEqual (self .check_mapping_then_sequence (S1 ()), "seq" )
79
+ self .assertEqual (self .check_mapping_then_sequence (S2 ()), "seq" )
80
+ self .assertEqual (self .check_mapping_then_sequence (S3 ()), "seq" )
81
+ self .assertEqual (self .check_mapping_then_sequence (S4 ()), "seq" )
82
+
83
+ def test_late_registration_mapping (self ):
84
+ class Parent :
39
85
pass
40
- class M2 ( C , collections . UserDict , collections . abc . Sequence ):
86
+ class ChildPre ( Parent ):
41
87
pass
42
- class M3 ( collections . UserDict , C , list ):
88
+ class GrandchildPre ( ChildPre ):
43
89
pass
44
- class M4 (dict , collections .abc .Sequence , C ):
90
+ collections .abc .Mapping .register (Parent )
91
+ class ChildPost (Parent ):
45
92
pass
46
- def f (x ):
47
- match x :
48
- case []:
49
- return "seq"
50
- case {}:
51
- return "map"
52
- def g (x ):
53
- match x :
54
- case {}:
55
- return "map"
56
- case []:
57
- return "seq"
58
- for Seq in (S1 , S2 , S3 , S4 ):
59
- self .assertEqual (f (Seq ()), "seq" )
60
- self .assertEqual (g (Seq ()), "seq" )
61
- for Map in (M1 , M2 , M3 , M4 ):
62
- self .assertEqual (f (Map ()), "map" )
63
- self .assertEqual (g (Map ()), "map" )
93
+ class GrandchildPost (ChildPost ):
94
+ pass
95
+ self .assertEqual (self .check_sequence_then_mapping (Parent ()), "map" )
96
+ self .assertEqual (self .check_sequence_then_mapping (ChildPre ()), "map" )
97
+ self .assertEqual (self .check_sequence_then_mapping (GrandchildPre ()), "map" )
98
+ self .assertEqual (self .check_sequence_then_mapping (ChildPost ()), "map" )
99
+ self .assertEqual (self .check_sequence_then_mapping (GrandchildPost ()), "map" )
100
+ self .assertEqual (self .check_mapping_then_sequence (Parent ()), "map" )
101
+ self .assertEqual (self .check_mapping_then_sequence (ChildPre ()), "map" )
102
+ self .assertEqual (self .check_mapping_then_sequence (GrandchildPre ()), "map" )
103
+ self .assertEqual (self .check_mapping_then_sequence (ChildPost ()), "map" )
104
+ self .assertEqual (self .check_mapping_then_sequence (GrandchildPost ()), "map" )
105
+
106
+ def test_late_registration_sequence (self ):
107
+ class Parent :
108
+ pass
109
+ class ChildPre (Parent ):
110
+ pass
111
+ class GrandchildPre (ChildPre ):
112
+ pass
113
+ collections .abc .Sequence .register (Parent )
114
+ class ChildPost (Parent ):
115
+ pass
116
+ class GrandchildPost (ChildPost ):
117
+ pass
118
+ self .assertEqual (self .check_sequence_then_mapping (Parent ()), "seq" )
119
+ self .assertEqual (self .check_sequence_then_mapping (ChildPre ()), "seq" )
120
+ self .assertEqual (self .check_sequence_then_mapping (GrandchildPre ()), "seq" )
121
+ self .assertEqual (self .check_sequence_then_mapping (ChildPost ()), "seq" )
122
+ self .assertEqual (self .check_sequence_then_mapping (GrandchildPost ()), "seq" )
123
+ self .assertEqual (self .check_mapping_then_sequence (Parent ()), "seq" )
124
+ self .assertEqual (self .check_mapping_then_sequence (ChildPre ()), "seq" )
125
+ self .assertEqual (self .check_mapping_then_sequence (GrandchildPre ()), "seq" )
126
+ self .assertEqual (self .check_mapping_then_sequence (ChildPost ()), "seq" )
127
+ self .assertEqual (self .check_mapping_then_sequence (GrandchildPost ()), "seq" )
64
128
65
129
66
130
class TestPatma (unittest .TestCase ):
0 commit comments