blob: 22ac9afe160adc650c4a3a2fbe31a746471f26c7 [file] [log] [blame]
Georg Brandl9dba5d92008-05-18 16:27:29 +00001import unittest
2from test import test_support
3from 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):
34 if method.startswith('_'):
35 continue
36 self.assert_(method in weaksetmethods)
37
38 def test_new_or_init(self):
39 self.assertRaises(TypeError, WeakSet, [], 2)
40
41 def test_len(self):
42 self.assertEqual(len(self.s), len(self.d))
43 self.assertEqual(len(self.fs), 1)
44 del self.obj
45 self.assertEqual(len(self.fs), 0)
46
47 def test_contains(self):
48 for c in self.letters:
49 self.assertEqual(c in self.s, c in self.d)
50 self.assertRaises(TypeError, self.s.__contains__, [[]])
51 self.assert_(self.obj in self.fs)
52 del self.obj
53 self.assert_(ustr('F') not in self.fs)
54
55 def test_union(self):
56 u = self.s.union(self.items2)
57 for c in self.letters:
58 self.assertEqual(c in u, c in self.d or c in self.items2)
59 self.assertEqual(self.s, WeakSet(self.items))
60 self.assertEqual(type(u), WeakSet)
61 self.assertRaises(TypeError, self.s.union, [[]])
62 for C in set, frozenset, dict.fromkeys, list, tuple:
63 x = WeakSet(self.items + self.items2)
64 c = C(self.items2)
65 self.assertEqual(self.s.union(c), x)
66
67 def test_or(self):
68 i = self.s.union(self.items2)
69 self.assertEqual(self.s | set(self.items2), i)
70 self.assertEqual(self.s | frozenset(self.items2), i)
71
72 def test_intersection(self):
73 i = self.s.intersection(self.items2)
74 for c in self.letters:
75 self.assertEqual(c in i, c in self.d and c in self.items2)
76 self.assertEqual(self.s, WeakSet(self.items))
77 self.assertEqual(type(i), WeakSet)
78 for C in set, frozenset, dict.fromkeys, list, tuple:
79 x = WeakSet([])
80 self.assertEqual(self.s.intersection(C(self.items2)), x)
81
82 def test_isdisjoint(self):
83 self.assert_(self.s.isdisjoint(WeakSet(self.items2)))
84 self.assert_(not self.s.isdisjoint(WeakSet(self.letters)))
85
86 def test_and(self):
87 i = self.s.intersection(self.items2)
88 self.assertEqual(self.s & set(self.items2), i)
89 self.assertEqual(self.s & frozenset(self.items2), i)
90
91 def test_difference(self):
92 i = self.s.difference(self.items2)
93 for c in self.letters:
94 self.assertEqual(c in i, c in self.d and c not in self.items2)
95 self.assertEqual(self.s, WeakSet(self.items))
96 self.assertEqual(type(i), WeakSet)
97 self.assertRaises(TypeError, self.s.difference, [[]])
98
99 def test_sub(self):
100 i = self.s.difference(self.items2)
101 self.assertEqual(self.s - set(self.items2), i)
102 self.assertEqual(self.s - frozenset(self.items2), i)
103
104 def test_symmetric_difference(self):
105 i = self.s.symmetric_difference(self.items2)
106 for c in self.letters:
107 self.assertEqual(c in i, (c in self.d) ^ (c in self.items2))
108 self.assertEqual(self.s, WeakSet(self.items))
109 self.assertEqual(type(i), WeakSet)
110 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
111
112 def test_xor(self):
113 i = self.s.symmetric_difference(self.items2)
114 self.assertEqual(self.s ^ set(self.items2), i)
115 self.assertEqual(self.s ^ frozenset(self.items2), i)
116
117 def test_sub_and_super(self):
118 pl, ql, rl = map(lambda s: [ustr(c) for c in s], ['ab', 'abcde', 'def'])
119 p, q, r = map(WeakSet, (pl, ql, rl))
120 self.assert_(p < q)
121 self.assert_(p <= q)
122 self.assert_(q <= q)
123 self.assert_(q > p)
124 self.assert_(q >= p)
125 self.failIf(q < r)
126 self.failIf(q <= r)
127 self.failIf(q > r)
128 self.failIf(q >= r)
129 self.assert_(set('a').issubset('abc'))
130 self.assert_(set('abc').issuperset('a'))
131 self.failIf(set('a').issubset('cbs'))
132 self.failIf(set('cbs').issuperset('a'))
133
134 def test_gc(self):
135 # Create a nest of cycles to exercise overall ref count check
136 class A:
137 pass
138 s = set(A() for i in range(1000))
139 for elem in s:
140 elem.cycle = s
141 elem.sub = elem
142 elem.set = set([elem])
143
144 def test_subclass_with_custom_hash(self):
145 # Bug #1257731
146 class H(WeakSet):
147 def __hash__(self):
148 return int(id(self) & 0x7fffffff)
149 s=H()
150 f=set()
151 f.add(s)
152 self.assert_(s in f)
153 f.remove(s)
154 f.add(s)
155 f.discard(s)
156
157 def test_init(self):
158 s = WeakSet()
159 s.__init__(self.items)
160 self.assertEqual(s, self.s)
161 s.__init__(self.items2)
162 self.assertEqual(s, WeakSet(self.items2))
163 self.assertRaises(TypeError, s.__init__, s, 2);
164 self.assertRaises(TypeError, s.__init__, 1);
165
166 def test_constructor_identity(self):
167 s = WeakSet(self.items)
168 t = WeakSet(s)
169 self.assertNotEqual(id(s), id(t))
170
171 def test_set_literal(self):
172 s = set([1,2,3])
173 t = {1,2,3}
174 self.assertEqual(s, t)
175
176 def test_hash(self):
177 self.assertRaises(TypeError, hash, self.s)
178
179 def test_clear(self):
180 self.s.clear()
181 self.assertEqual(self.s, set())
182 self.assertEqual(len(self.s), 0)
183
184 def test_copy(self):
185 dup = self.s.copy()
186 self.assertEqual(self.s, dup)
187 self.assertNotEqual(id(self.s), id(dup))
188
189 def test_add(self):
190 x = ustr('Q')
191 self.s.add(x)
192 self.assert_(x in self.s)
193 dup = self.s.copy()
194 self.s.add(x)
195 self.assertEqual(self.s, dup)
196 self.assertRaises(TypeError, self.s.add, [])
197 self.fs.add(Foo())
198 self.assert_(len(self.fs) == 1)
199 self.fs.add(self.obj)
200 self.assert_(len(self.fs) == 1)
201
202 def test_remove(self):
203 x = ustr('a')
204 self.s.remove(x)
205 self.assert_(x not in self.s)
206 self.assertRaises(KeyError, self.s.remove, x)
207 self.assertRaises(TypeError, self.s.remove, [])
208
209 def test_discard(self):
210 a, q = ustr('a'), ustr('Q')
211 self.s.discard(a)
212 self.assert_(a not in self.s)
213 self.s.discard(q)
214 self.assertRaises(TypeError, self.s.discard, [])
215
216 def test_pop(self):
217 for i in range(len(self.s)):
218 elem = self.s.pop()
219 self.assert_(elem not in self.s)
220 self.assertRaises(KeyError, self.s.pop)
221
222 def test_update(self):
223 retval = self.s.update(self.items2)
224 self.assertEqual(retval, None)
225 for c in (self.items + self.items2):
226 self.assert_(c in self.s)
227 self.assertRaises(TypeError, self.s.update, [[]])
228
229 def test_update_set(self):
230 self.s.update(set(self.items2))
231 for c in (self.items + self.items2):
232 self.assert_(c in self.s)
233
234 def test_ior(self):
235 self.s |= set(self.items2)
236 for c in (self.items + self.items2):
237 self.assert_(c in self.s)
238
239 def test_intersection_update(self):
240 retval = self.s.intersection_update(self.items2)
241 self.assertEqual(retval, None)
242 for c in (self.items + self.items2):
243 if c in self.items2 and c in self.items:
244 self.assert_(c in self.s)
245 else:
246 self.assert_(c not in self.s)
247 self.assertRaises(TypeError, self.s.intersection_update, [[]])
248
249 def test_iand(self):
250 self.s &= set(self.items2)
251 for c in (self.items + self.items2):
252 if c in self.items2 and c in self.items:
253 self.assert_(c in self.s)
254 else:
255 self.assert_(c not in self.s)
256
257 def test_difference_update(self):
258 retval = self.s.difference_update(self.items2)
259 self.assertEqual(retval, None)
260 for c in (self.items + self.items2):
261 if c in self.items and c not in self.items2:
262 self.assert_(c in self.s)
263 else:
264 self.assert_(c not in self.s)
265 self.assertRaises(TypeError, self.s.difference_update, [[]])
266 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
267
268 def test_isub(self):
269 self.s -= set(self.items2)
270 for c in (self.items + self.items2):
271 if c in self.items and c not in self.items2:
272 self.assert_(c in self.s)
273 else:
274 self.assert_(c not in self.s)
275
276 def test_symmetric_difference_update(self):
277 retval = self.s.symmetric_difference_update(self.items2)
278 self.assertEqual(retval, None)
279 for c in (self.items + self.items2):
280 if (c in self.items) ^ (c in self.items2):
281 self.assert_(c in self.s)
282 else:
283 self.assert_(c not in self.s)
284 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
285
286 def test_ixor(self):
287 self.s ^= set(self.items2)
288 for c in (self.items + self.items2):
289 if (c in self.items) ^ (c in self.items2):
290 self.assert_(c in self.s)
291 else:
292 self.assert_(c not in self.s)
293
294 def test_inplace_on_self(self):
295 t = self.s.copy()
296 t |= t
297 self.assertEqual(t, self.s)
298 t &= t
299 self.assertEqual(t, self.s)
300 t -= t
301 self.assertEqual(t, WeakSet())
302 t = self.s.copy()
303 t ^= t
304 self.assertEqual(t, WeakSet())
305
306
307def test_main(verbose=None):
308 test_support.run_unittest(TestWeakSet)
309
310if __name__ == "__main__":
311 test_main(verbose=True)