blob: cff20455566e6689533ba2965ccc7842d661327d [file] [log] [blame]
Georg Brandl9dba5d92008-05-18 16:27:29 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Georg Brandl9dba5d92008-05-18 16:27:29 +00003from weakref import proxy, ref, WeakSet
4import operator
5import copy
6import string
7import os
8from random import randrange, shuffle
9import sys
10import warnings
11import collections
12from collections import UserString as ustr
13
14
15class Foo:
16 pass
17
18
19class TestWeakSet(unittest.TestCase):
20
21 def setUp(self):
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)
28 self.obj = ustr('F')
29 self.fs = WeakSet([self.obj])
30
31 def test_methods(self):
32 weaksetmethods = dir(WeakSet)
33 for method in dir(set):
Georg Brandl02c0bbb2008-05-18 21:04:46 +000034 if method == 'test_c_api' or method.startswith('_'):
Georg Brandl9dba5d92008-05-18 16:27:29 +000035 continue
Georg Brandl19219702008-05-18 17:10:40 +000036 self.assert_(method in weaksetmethods,
37 "WeakSet missing method " + method)
Georg Brandl9dba5d92008-05-18 16:27:29 +000038
39 def test_new_or_init(self):
40 self.assertRaises(TypeError, WeakSet, [], 2)
41
42 def test_len(self):
43 self.assertEqual(len(self.s), len(self.d))
44 self.assertEqual(len(self.fs), 1)
45 del self.obj
46 self.assertEqual(len(self.fs), 0)
47
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)
53 del self.obj
54 self.assert_(ustr('F') not in self.fs)
55
56 def test_union(self):
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)
65 c = C(self.items2)
66 self.assertEqual(self.s.union(c), x)
67
68 def test_or(self):
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)
72
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:
80 x = WeakSet([])
81 self.assertEqual(self.s.intersection(C(self.items2)), x)
82
83 def test_isdisjoint(self):
84 self.assert_(self.s.isdisjoint(WeakSet(self.items2)))
85 self.assert_(not self.s.isdisjoint(WeakSet(self.letters)))
86
87 def test_and(self):
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)
91
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, [[]])
99
100 def test_sub(self):
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)
104
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, [[]])
112
113 def test_xor(self):
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)
117
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))
121 self.assert_(p < q)
122 self.assert_(p <= q)
123 self.assert_(q <= q)
124 self.assert_(q > p)
125 self.assert_(q >= p)
126 self.failIf(q < r)
127 self.failIf(q <= r)
128 self.failIf(q > r)
129 self.failIf(q >= r)
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'))
134
135 def test_gc(self):
136 # Create a nest of cycles to exercise overall ref count check
137 class A:
138 pass
139 s = set(A() for i in range(1000))
140 for elem in s:
141 elem.cycle = s
142 elem.sub = elem
143 elem.set = set([elem])
144
145 def test_subclass_with_custom_hash(self):
146 # Bug #1257731
147 class H(WeakSet):
148 def __hash__(self):
149 return int(id(self) & 0x7fffffff)
150 s=H()
151 f=set()
152 f.add(s)
153 self.assert_(s in f)
154 f.remove(s)
155 f.add(s)
156 f.discard(s)
157
158 def test_init(self):
159 s = WeakSet()
160 s.__init__(self.items)
161 self.assertEqual(s, self.s)
162 s.__init__(self.items2)
163 self.assertEqual(s, WeakSet(self.items2))
164 self.assertRaises(TypeError, s.__init__, s, 2);
165 self.assertRaises(TypeError, s.__init__, 1);
166
167 def test_constructor_identity(self):
168 s = WeakSet(self.items)
169 t = WeakSet(s)
170 self.assertNotEqual(id(s), id(t))
171
172 def test_set_literal(self):
173 s = set([1,2,3])
174 t = {1,2,3}
175 self.assertEqual(s, t)
176
177 def test_hash(self):
178 self.assertRaises(TypeError, hash, self.s)
179
180 def test_clear(self):
181 self.s.clear()
182 self.assertEqual(self.s, set())
183 self.assertEqual(len(self.s), 0)
184
185 def test_copy(self):
186 dup = self.s.copy()
187 self.assertEqual(self.s, dup)
188 self.assertNotEqual(id(self.s), id(dup))
189
190 def test_add(self):
191 x = ustr('Q')
192 self.s.add(x)
193 self.assert_(x in self.s)
194 dup = self.s.copy()
195 self.s.add(x)
196 self.assertEqual(self.s, dup)
197 self.assertRaises(TypeError, self.s.add, [])
198 self.fs.add(Foo())
199 self.assert_(len(self.fs) == 1)
200 self.fs.add(self.obj)
201 self.assert_(len(self.fs) == 1)
202
203 def test_remove(self):
204 x = ustr('a')
205 self.s.remove(x)
206 self.assert_(x not in self.s)
207 self.assertRaises(KeyError, self.s.remove, x)
208 self.assertRaises(TypeError, self.s.remove, [])
209
210 def test_discard(self):
211 a, q = ustr('a'), ustr('Q')
212 self.s.discard(a)
213 self.assert_(a not in self.s)
214 self.s.discard(q)
215 self.assertRaises(TypeError, self.s.discard, [])
216
217 def test_pop(self):
218 for i in range(len(self.s)):
219 elem = self.s.pop()
220 self.assert_(elem not in self.s)
221 self.assertRaises(KeyError, self.s.pop)
222
223 def test_update(self):
224 retval = self.s.update(self.items2)
225 self.assertEqual(retval, None)
226 for c in (self.items + self.items2):
227 self.assert_(c in self.s)
228 self.assertRaises(TypeError, self.s.update, [[]])
229
230 def test_update_set(self):
231 self.s.update(set(self.items2))
232 for c in (self.items + self.items2):
233 self.assert_(c in self.s)
234
235 def test_ior(self):
236 self.s |= set(self.items2)
237 for c in (self.items + self.items2):
238 self.assert_(c in self.s)
239
240 def test_intersection_update(self):
241 retval = self.s.intersection_update(self.items2)
242 self.assertEqual(retval, None)
243 for c in (self.items + self.items2):
244 if c in self.items2 and c in self.items:
245 self.assert_(c in self.s)
246 else:
247 self.assert_(c not in self.s)
248 self.assertRaises(TypeError, self.s.intersection_update, [[]])
249
250 def test_iand(self):
251 self.s &= set(self.items2)
252 for c in (self.items + self.items2):
253 if c in self.items2 and c in self.items:
254 self.assert_(c in self.s)
255 else:
256 self.assert_(c not in self.s)
257
258 def test_difference_update(self):
259 retval = self.s.difference_update(self.items2)
260 self.assertEqual(retval, None)
261 for c in (self.items + self.items2):
262 if c in self.items and c not in self.items2:
263 self.assert_(c in self.s)
264 else:
265 self.assert_(c not in self.s)
266 self.assertRaises(TypeError, self.s.difference_update, [[]])
267 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
268
269 def test_isub(self):
270 self.s -= set(self.items2)
271 for c in (self.items + self.items2):
272 if c in self.items and c not in self.items2:
273 self.assert_(c in self.s)
274 else:
275 self.assert_(c not in self.s)
276
277 def test_symmetric_difference_update(self):
278 retval = self.s.symmetric_difference_update(self.items2)
279 self.assertEqual(retval, None)
280 for c in (self.items + self.items2):
281 if (c in self.items) ^ (c in self.items2):
282 self.assert_(c in self.s)
283 else:
284 self.assert_(c not in self.s)
285 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
286
287 def test_ixor(self):
288 self.s ^= set(self.items2)
289 for c in (self.items + self.items2):
290 if (c in self.items) ^ (c in self.items2):
291 self.assert_(c in self.s)
292 else:
293 self.assert_(c not in self.s)
294
295 def test_inplace_on_self(self):
296 t = self.s.copy()
297 t |= t
298 self.assertEqual(t, self.s)
299 t &= t
300 self.assertEqual(t, self.s)
301 t -= t
302 self.assertEqual(t, WeakSet())
303 t = self.s.copy()
304 t ^= t
305 self.assertEqual(t, WeakSet())
306
307
308def test_main(verbose=None):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000309 support.run_unittest(TestWeakSet)
Georg Brandl9dba5d92008-05-18 16:27:29 +0000310
311if __name__ == "__main__":
312 test_main(verbose=True)