2 from test
import support
3 from weakref
import proxy
, ref
, WeakSet
8 from random
import randrange
, shuffle
12 from collections
import UserString
as ustr
19 class TestWeakSet(unittest
.TestCase
):
22 # need to keep references to them
23 self
.items
= [ustr(c
) for c
in ('a', 'b', 'c')]
24 self
.items2
= [ustr(c
) for c
in ('x', 'y', 'z')]
25 self
.letters
= [ustr(c
) for c
in string
.ascii_letters
]
26 self
.s
= WeakSet(self
.items
)
27 self
.d
= dict.fromkeys(self
.items
)
29 self
.fs
= WeakSet([self
.obj
])
31 def test_methods(self
):
32 weaksetmethods
= dir(WeakSet
)
33 for method
in dir(set):
34 if method
== 'test_c_api' or method
.startswith('_'):
36 self
.assert_(method
in weaksetmethods
,
37 "WeakSet missing method " + method
)
39 def test_new_or_init(self
):
40 self
.assertRaises(TypeError, WeakSet
, [], 2)
43 self
.assertEqual(len(self
.s
), len(self
.d
))
44 self
.assertEqual(len(self
.fs
), 1)
46 self
.assertEqual(len(self
.fs
), 0)
48 def test_contains(self
):
49 for c
in self
.letters
:
50 self
.assertEqual(c
in self
.s
, c
in self
.d
)
51 self
.assertRaises(TypeError, self
.s
.__contains
__, [[]])
52 self
.assert_(self
.obj
in self
.fs
)
54 self
.assert_(ustr('F') not in self
.fs
)
57 u
= self
.s
.union(self
.items2
)
58 for c
in self
.letters
:
59 self
.assertEqual(c
in u
, c
in self
.d
or c
in self
.items2
)
60 self
.assertEqual(self
.s
, WeakSet(self
.items
))
61 self
.assertEqual(type(u
), WeakSet
)
62 self
.assertRaises(TypeError, self
.s
.union
, [[]])
63 for C
in set, frozenset, dict.fromkeys
, list, tuple:
64 x
= WeakSet(self
.items
+ self
.items2
)
66 self
.assertEqual(self
.s
.union(c
), x
)
69 i
= self
.s
.union(self
.items2
)
70 self
.assertEqual(self
.s |
set(self
.items2
), i
)
71 self
.assertEqual(self
.s |
frozenset(self
.items2
), i
)
73 def test_intersection(self
):
74 i
= self
.s
.intersection(self
.items2
)
75 for c
in self
.letters
:
76 self
.assertEqual(c
in i
, c
in self
.d
and c
in self
.items2
)
77 self
.assertEqual(self
.s
, WeakSet(self
.items
))
78 self
.assertEqual(type(i
), WeakSet
)
79 for C
in set, frozenset, dict.fromkeys
, list, tuple:
81 self
.assertEqual(self
.s
.intersection(C(self
.items2
)), x
)
83 def test_isdisjoint(self
):
84 self
.assert_(self
.s
.isdisjoint(WeakSet(self
.items2
)))
85 self
.assert_(not self
.s
.isdisjoint(WeakSet(self
.letters
)))
88 i
= self
.s
.intersection(self
.items2
)
89 self
.assertEqual(self
.s
& set(self
.items2
), i
)
90 self
.assertEqual(self
.s
& frozenset(self
.items2
), i
)
92 def test_difference(self
):
93 i
= self
.s
.difference(self
.items2
)
94 for c
in self
.letters
:
95 self
.assertEqual(c
in i
, c
in self
.d
and c
not in self
.items2
)
96 self
.assertEqual(self
.s
, WeakSet(self
.items
))
97 self
.assertEqual(type(i
), WeakSet
)
98 self
.assertRaises(TypeError, self
.s
.difference
, [[]])
101 i
= self
.s
.difference(self
.items2
)
102 self
.assertEqual(self
.s
- set(self
.items2
), i
)
103 self
.assertEqual(self
.s
- frozenset(self
.items2
), i
)
105 def test_symmetric_difference(self
):
106 i
= self
.s
.symmetric_difference(self
.items2
)
107 for c
in self
.letters
:
108 self
.assertEqual(c
in i
, (c
in self
.d
) ^
(c
in self
.items2
))
109 self
.assertEqual(self
.s
, WeakSet(self
.items
))
110 self
.assertEqual(type(i
), WeakSet
)
111 self
.assertRaises(TypeError, self
.s
.symmetric_difference
, [[]])
114 i
= self
.s
.symmetric_difference(self
.items2
)
115 self
.assertEqual(self
.s ^
set(self
.items2
), i
)
116 self
.assertEqual(self
.s ^
frozenset(self
.items2
), i
)
118 def test_sub_and_super(self
):
119 pl
, ql
, rl
= map(lambda s
: [ustr(c
) for c
in s
], ['ab', 'abcde', 'def'])
120 p
, q
, r
= map(WeakSet
, (pl
, ql
, rl
))
130 self
.assert_(set('a').issubset('abc'))
131 self
.assert_(set('abc').issuperset('a'))
132 self
.failIf(set('a').issubset('cbs'))
133 self
.failIf(set('cbs').issuperset('a'))
136 # Create a nest of cycles to exercise overall ref count check
137 s
= WeakSet(Foo() for i
in range(1000))
141 elem
.set = WeakSet([elem
])
143 def test_subclass_with_custom_hash(self
):
147 return int(id(self
) & 0x7fffffff)
158 s
.__init
__(self
.items
)
159 self
.assertEqual(s
, self
.s
)
160 s
.__init
__(self
.items2
)
161 self
.assertEqual(s
, WeakSet(self
.items2
))
162 self
.assertRaises(TypeError, s
.__init
__, s
, 2);
163 self
.assertRaises(TypeError, s
.__init
__, 1);
165 def test_constructor_identity(self
):
166 s
= WeakSet(self
.items
)
168 self
.assertNotEqual(id(s
), id(t
))
171 self
.assertRaises(TypeError, hash, self
.s
)
173 def test_clear(self
):
175 self
.assertEqual(self
.s
, WeakSet([]))
176 self
.assertEqual(len(self
.s
), 0)
180 self
.assertEqual(self
.s
, dup
)
181 self
.assertNotEqual(id(self
.s
), id(dup
))
186 self
.assert_(x
in self
.s
)
189 self
.assertEqual(self
.s
, dup
)
190 self
.assertRaises(TypeError, self
.s
.add
, [])
192 self
.assert_(len(self
.fs
) == 1)
193 self
.fs
.add(self
.obj
)
194 self
.assert_(len(self
.fs
) == 1)
196 def test_remove(self
):
199 self
.assert_(x
not in self
.s
)
200 self
.assertRaises(KeyError, self
.s
.remove
, x
)
201 self
.assertRaises(TypeError, self
.s
.remove
, [])
203 def test_discard(self
):
204 a
, q
= ustr('a'), ustr('Q')
206 self
.assert_(a
not in self
.s
)
208 self
.assertRaises(TypeError, self
.s
.discard
, [])
211 for i
in range(len(self
.s
)):
213 self
.assert_(elem
not in self
.s
)
214 self
.assertRaises(KeyError, self
.s
.pop
)
216 def test_update(self
):
217 retval
= self
.s
.update(self
.items2
)
218 self
.assertEqual(retval
, None)
219 for c
in (self
.items
+ self
.items2
):
220 self
.assert_(c
in self
.s
)
221 self
.assertRaises(TypeError, self
.s
.update
, [[]])
223 def test_update_set(self
):
224 self
.s
.update(set(self
.items2
))
225 for c
in (self
.items
+ self
.items2
):
226 self
.assert_(c
in self
.s
)
229 self
.s |
= set(self
.items2
)
230 for c
in (self
.items
+ self
.items2
):
231 self
.assert_(c
in self
.s
)
233 def test_intersection_update(self
):
234 retval
= self
.s
.intersection_update(self
.items2
)
235 self
.assertEqual(retval
, None)
236 for c
in (self
.items
+ self
.items2
):
237 if c
in self
.items2
and c
in self
.items
:
238 self
.assert_(c
in self
.s
)
240 self
.assert_(c
not in self
.s
)
241 self
.assertRaises(TypeError, self
.s
.intersection_update
, [[]])
244 self
.s
&= set(self
.items2
)
245 for c
in (self
.items
+ self
.items2
):
246 if c
in self
.items2
and c
in self
.items
:
247 self
.assert_(c
in self
.s
)
249 self
.assert_(c
not in self
.s
)
251 def test_difference_update(self
):
252 retval
= self
.s
.difference_update(self
.items2
)
253 self
.assertEqual(retval
, None)
254 for c
in (self
.items
+ self
.items2
):
255 if c
in self
.items
and c
not in self
.items2
:
256 self
.assert_(c
in self
.s
)
258 self
.assert_(c
not in self
.s
)
259 self
.assertRaises(TypeError, self
.s
.difference_update
, [[]])
260 self
.assertRaises(TypeError, self
.s
.symmetric_difference_update
, [[]])
263 self
.s
-= set(self
.items2
)
264 for c
in (self
.items
+ self
.items2
):
265 if c
in self
.items
and c
not in self
.items2
:
266 self
.assert_(c
in self
.s
)
268 self
.assert_(c
not in self
.s
)
270 def test_symmetric_difference_update(self
):
271 retval
= self
.s
.symmetric_difference_update(self
.items2
)
272 self
.assertEqual(retval
, None)
273 for c
in (self
.items
+ self
.items2
):
274 if (c
in self
.items
) ^
(c
in self
.items2
):
275 self
.assert_(c
in self
.s
)
277 self
.assert_(c
not in self
.s
)
278 self
.assertRaises(TypeError, self
.s
.symmetric_difference_update
, [[]])
281 self
.s ^
= set(self
.items2
)
282 for c
in (self
.items
+ self
.items2
):
283 if (c
in self
.items
) ^
(c
in self
.items2
):
284 self
.assert_(c
in self
.s
)
286 self
.assert_(c
not in self
.s
)
288 def test_inplace_on_self(self
):
291 self
.assertEqual(t
, self
.s
)
293 self
.assertEqual(t
, self
.s
)
295 self
.assertEqual(t
, WeakSet())
298 self
.assertEqual(t
, WeakSet())
302 self
.assertTrue(self
.s
== self
.s
)
303 self
.assertTrue(self
.s
== WeakSet(self
.items
))
304 self
.assertFalse(self
.s
== set(self
.items
))
305 self
.assertFalse(self
.s
== list(self
.items
))
306 self
.assertFalse(self
.s
== tuple(self
.items
))
307 self
.assertFalse(self
.s
== WeakSet([Foo
]))
308 self
.assertFalse(self
.s
== 1)
311 def test_main(verbose
=None):
312 support
.run_unittest(TestWeakSet
)
314 if __name__
== "__main__":
315 test_main(verbose
=True)