5
5
# Skip this test if the _testcapi module isn't available.
6
6
_testcapi = import_helper .import_module ('_testcapi' )
7
7
8
- class set_child (set ):
8
+ class set_subclass (set ):
9
9
pass
10
10
11
- class frozenset_child (frozenset ):
11
+ class frozenset_subclass (frozenset ):
12
12
pass
13
13
14
14
15
15
class TestSetCAPI (unittest .TestCase ):
16
16
def assertImmutable (self , action , * args ):
17
17
self .assertRaises (SystemError , action , frozenset (), * args )
18
18
self .assertRaises (SystemError , action , frozenset ({1 }), * args )
19
- self .assertRaises (SystemError , action , frozenset_child (), * args )
20
- self .assertRaises (SystemError , action , frozenset_child ({1 }), * args )
19
+ self .assertRaises (SystemError , action , frozenset_subclass (), * args )
20
+ self .assertRaises (SystemError , action , frozenset_subclass ({1 }), * args )
21
21
22
22
def test_set_check (self ):
23
23
check = _testcapi .set_check
24
24
self .assertTrue (check (set ()))
25
25
self .assertTrue (check ({1 , 2 }))
26
26
self .assertFalse (check (frozenset ()))
27
- self .assertTrue (check (set_child ()))
28
- self .assertFalse (check (frozenset_child ()))
27
+ self .assertTrue (check (set_subclass ()))
28
+ self .assertFalse (check (frozenset_subclass ()))
29
29
self .assertFalse (check (object ()))
30
+ # CRASHES: check(NULL)
30
31
31
32
def test_set_check_exact (self ):
32
33
check = _testcapi .set_checkexact
33
34
self .assertTrue (check (set ()))
34
35
self .assertTrue (check ({1 , 2 }))
35
36
self .assertFalse (check (frozenset ()))
36
- self .assertFalse (check (set_child ()))
37
- self .assertFalse (check (frozenset_child ()))
37
+ self .assertFalse (check (set_subclass ()))
38
+ self .assertFalse (check (frozenset_subclass ()))
38
39
self .assertFalse (check (object ()))
40
+ # CRASHES: check(NULL)
39
41
40
42
def test_frozenset_check (self ):
41
43
check = _testcapi .frozenset_check
42
44
self .assertFalse (check (set ()))
43
45
self .assertTrue (check (frozenset ()))
44
46
self .assertTrue (check (frozenset ({1 , 2 })))
45
- self .assertFalse (check (set_child ()))
46
- self .assertTrue (check (frozenset_child ()))
47
+ self .assertFalse (check (set_subclass ()))
48
+ self .assertTrue (check (frozenset_subclass ()))
47
49
self .assertFalse (check (object ()))
50
+ # CRASHES: check(NULL)
48
51
49
52
def test_frozenset_check_exact (self ):
50
53
check = _testcapi .frozenset_checkexact
51
54
self .assertFalse (check (set ()))
52
55
self .assertTrue (check (frozenset ()))
53
56
self .assertTrue (check (frozenset ({1 , 2 })))
54
- self .assertFalse (check (set_child ()))
55
- self .assertFalse (check (frozenset_child ()))
57
+ self .assertFalse (check (set_subclass ()))
58
+ self .assertFalse (check (frozenset_subclass ()))
56
59
self .assertFalse (check (object ()))
57
60
58
61
def test_anyset_check (self ):
@@ -61,83 +64,103 @@ def test_anyset_check(self):
61
64
self .assertTrue (check ({1 , 2 }))
62
65
self .assertTrue (check (frozenset ()))
63
66
self .assertTrue (check (frozenset ({1 , 2 })))
64
- self .assertTrue (check (set_child ()))
65
- self .assertTrue (check (frozenset_child ()))
67
+ self .assertTrue (check (set_subclass ()))
68
+ self .assertTrue (check (frozenset_subclass ()))
66
69
self .assertFalse (check (object ()))
70
+ # CRASHES: check(NULL)
67
71
68
72
def test_anyset_check_exact (self ):
69
73
check = _testcapi .anyset_checkexact
70
74
self .assertTrue (check (set ()))
71
75
self .assertTrue (check ({1 , 2 }))
72
76
self .assertTrue (check (frozenset ()))
73
77
self .assertTrue (check (frozenset ({1 , 2 })))
74
- self .assertFalse (check (set_child ()))
75
- self .assertFalse (check (frozenset_child ()))
78
+ self .assertFalse (check (set_subclass ()))
79
+ self .assertFalse (check (frozenset_subclass ()))
76
80
self .assertFalse (check (object ()))
81
+ # CRASHES: check(NULL)
77
82
78
83
def test_set_new (self ):
79
- new = _testcapi .set_new
80
- self .assertEqual (new ().__class__ , set )
81
- self .assertEqual (new (), set ())
82
- self .assertEqual (new ((1 , 1 , 2 )), {1 , 2 })
84
+ set_new = _testcapi .set_new
85
+ self .assertEqual (set_new ().__class__ , set )
86
+ self .assertEqual (set_new (), set ())
87
+ self .assertEqual (set_new ((1 , 1 , 2 )), {1 , 2 })
83
88
with self .assertRaisesRegex (TypeError , 'object is not iterable' ):
84
- new (object ())
89
+ set_new (object ())
90
+ with self .assertRaisesRegex (TypeError , 'object is not iterable' ):
91
+ set_new (None )
85
92
with self .assertRaisesRegex (TypeError , "unhashable type: 'dict'" ):
86
- new ((1 , {}))
93
+ set_new ((1 , {}))
87
94
88
95
def test_frozenset_new (self ):
89
- new = _testcapi .frozenset_new
90
- self .assertEqual (new ().__class__ , frozenset )
91
- self .assertEqual (new (), frozenset ())
92
- self .assertEqual (new ((1 , 1 , 2 )), frozenset ({1 , 2 }))
96
+ frozenset_new = _testcapi .frozenset_new
97
+ self .assertEqual (frozenset_new ().__class__ , frozenset )
98
+ self .assertEqual (frozenset_new (), frozenset ())
99
+ self .assertEqual (frozenset_new ((1 , 1 , 2 )), frozenset ({1 , 2 }))
100
+ with self .assertRaisesRegex (TypeError , 'object is not iterable' ):
101
+ frozenset_new (object ())
93
102
with self .assertRaisesRegex (TypeError , 'object is not iterable' ):
94
- new ( object () )
103
+ frozenset_new ( None )
95
104
with self .assertRaisesRegex (TypeError , "unhashable type: 'dict'" ):
96
- new ((1 , {}))
105
+ frozenset_new ((1 , {}))
97
106
98
107
def test_set_size (self ):
99
- l = _testcapi .set_size
100
- self .assertEqual (l (set ()), 0 )
101
- self .assertEqual (l (frozenset ()), 0 )
102
- self .assertEqual (l ({1 , 1 , 2 }), 2 )
103
- self .assertEqual (l (frozenset ({1 , 1 , 2 })), 2 )
104
- self .assertEqual (l ( set_child ((1 , 2 , 3 ))), 3 )
105
- self .assertEqual (l ( frozenset_child ((1 , 2 , 3 ))), 3 )
108
+ get_size = _testcapi .set_size
109
+ self .assertEqual (get_size (set ()), 0 )
110
+ self .assertEqual (get_size (frozenset ()), 0 )
111
+ self .assertEqual (get_size ({1 , 1 , 2 }), 2 )
112
+ self .assertEqual (get_size (frozenset ({1 , 1 , 2 })), 2 )
113
+ self .assertEqual (get_size ( set_subclass ((1 , 2 , 3 ))), 3 )
114
+ self .assertEqual (get_size ( frozenset_subclass ((1 , 2 , 3 ))), 3 )
106
115
with self .assertRaises (SystemError ):
107
- l ([])
116
+ get_size ([])
117
+ # CRASHES: get_size(NULL)
108
118
109
119
def test_set_get_size (self ):
110
- l = _testcapi .set_get_size
111
- self .assertEqual (l (set ()), 0 )
112
- self .assertEqual (l (frozenset ()), 0 )
113
- self .assertEqual (l ({1 , 1 , 2 }), 2 )
114
- self .assertEqual (l (frozenset ({1 , 1 , 2 })), 2 )
115
- self .assertEqual (l (set_child ((1 , 2 , 3 ))), 3 )
116
- self .assertEqual (l (frozenset_child ((1 , 2 , 3 ))), 3 )
117
- # CRASHES: l([])
120
+ get_size = _testcapi .set_get_size
121
+ self .assertEqual (get_size (set ()), 0 )
122
+ self .assertEqual (get_size (frozenset ()), 0 )
123
+ self .assertEqual (get_size ({1 , 1 , 2 }), 2 )
124
+ self .assertEqual (get_size (frozenset ({1 , 1 , 2 })), 2 )
125
+ self .assertEqual (get_size (set_subclass ((1 , 2 , 3 ))), 3 )
126
+ self .assertEqual (get_size (frozenset_subclass ((1 , 2 , 3 ))), 3 )
127
+ # CRASHES: get_size(NULL)
128
+ # CRASHES: get_size(object())
118
129
119
130
def test_set_contains (self ):
120
- c = _testcapi .set_contains
121
- for cls in (set , frozenset , set_child , frozenset_child ):
131
+ contains = _testcapi .set_contains
132
+ for cls in (set , frozenset , set_subclass , frozenset_subclass ):
122
133
with self .subTest (cls = cls ):
123
134
instance = cls ((1 , 2 ))
124
- self .assertTrue (c (instance , 1 ))
125
- self .assertFalse (c (instance , 'missing' ))
135
+ self .assertTrue (contains (instance , 1 ))
136
+ self .assertFalse (contains (instance , 'missing' ))
137
+ with self .assertRaisesRegex (TypeError , "unhashable type: 'list'" ):
138
+ contains (instance , [])
139
+ # CRASHES: contains(instance, NULL)
140
+ # CRASHES: contains(NULL, object())
141
+ # CRASHES: contains(NULL, NULL)
126
142
127
143
def test_add (self ):
128
144
add = _testcapi .set_add
129
- for cls in (set , set_child ):
145
+ for cls in (set , set_subclass ):
130
146
with self .subTest (cls = cls ):
131
147
instance = cls ((1 , 2 ))
132
148
self .assertEqual (add (instance , 1 ), 0 )
133
149
self .assertEqual (instance , {1 , 2 })
134
150
self .assertEqual (add (instance , 3 ), 0 )
135
151
self .assertEqual (instance , {1 , 2 , 3 })
152
+ with self .assertRaisesRegex (TypeError , "unhashable type: 'list'" ):
153
+ add (instance , [])
154
+ # CRASHES: add(NULL, object())
155
+ # CRASHES: add(instance, NULL)
156
+ # CRASHES: add(NULL, NULL)
157
+ with self .assertRaises (SystemError ):
158
+ add (object (), 1 )
136
159
self .assertImmutable (add , 1 )
137
160
138
161
def test_discard (self ):
139
162
discard = _testcapi .set_discard
140
- for cls in (set , set_child ):
163
+ for cls in (set , set_subclass ):
141
164
with self .subTest (cls = cls ):
142
165
instance = cls ((1 , 2 ))
143
166
self .assertEqual (discard (instance , 3 ), 0 )
@@ -146,15 +169,21 @@ def test_discard(self):
146
169
self .assertEqual (instance , {2 })
147
170
self .assertEqual (discard (instance , 2 ), 1 )
148
171
self .assertEqual (instance , set ())
149
- # Discarding from empty set works
150
172
self .assertEqual (discard (instance , 2 ), 0 )
151
173
self .assertEqual (instance , set ())
174
+ with self .assertRaisesRegex (TypeError , "unhashable type: 'list'" ):
175
+ discard (instance , [])
176
+ # CRASHES: discard(NULL, object())
177
+ # CRASHES: discard(instance, NULL)
178
+ # CRASHES: discard(NULL, NULL)
179
+ with self .assertRaises (SystemError ):
180
+ discard (object (), 1 )
152
181
self .assertImmutable (discard , 1 )
153
182
154
183
def test_pop (self ):
155
184
pop = _testcapi .set_pop
156
185
orig = (1 , 2 )
157
- for cls in (set , set_child ):
186
+ for cls in (set , set_subclass ):
158
187
with self .subTest (cls = cls ):
159
188
instance = cls (orig )
160
189
self .assertIn (pop (instance ), orig )
@@ -163,13 +192,21 @@ def test_pop(self):
163
192
self .assertEqual (len (instance ), 0 )
164
193
with self .assertRaises (KeyError ):
165
194
pop (instance )
195
+ # CRASHES: pop(NULL)
196
+ with self .assertRaises (SystemError ):
197
+ pop (object ())
166
198
self .assertImmutable (pop )
167
199
168
200
def test_clear (self ):
169
201
clear = _testcapi .set_clear
170
- for cls in (set , set_child ):
202
+ for cls in (set , set_subclass ):
171
203
with self .subTest (cls = cls ):
172
204
instance = cls ((1 , 2 ))
173
205
self .assertEqual (clear (instance ), 0 )
174
206
self .assertEqual (instance , set ())
207
+ self .assertEqual (clear (instance ), 0 )
208
+ self .assertEqual (instance , set ())
209
+ # CRASHES: clear(NULL)
210
+ with self .assertRaises (SystemError ):
211
+ clear (object ())
175
212
self .assertImmutable (clear )
0 commit comments