blob: 422cc41c2565c3ba0c86a765a68d156ee4fb29e7 [file] [log] [blame]
Raymond Hettingera690a992003-11-16 16:17:49 +00001import unittest
2from test import test_support
Raymond Hettinger691d8052004-05-30 07:26:47 +00003from weakref import proxy
Raymond Hettingera690a992003-11-16 16:17:49 +00004import operator
5import copy
6import pickle
Raymond Hettingereae05de2004-07-09 04:51:24 +00007import os
Raymond Hettinger82cb9a22005-07-05 05:34:43 +00008from random import randrange, shuffle
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00009import sys
Raymond Hettingera690a992003-11-16 16:17:49 +000010
11class PassThru(Exception):
12 pass
13
14def check_pass_thru():
15 raise PassThru
16 yield 1
17
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000018class BadCmp:
19 def __hash__(self):
20 return 1
21 def __cmp__(self, other):
22 raise RuntimeError
23
Raymond Hettingera690a992003-11-16 16:17:49 +000024class TestJointOps(unittest.TestCase):
25 # Tests common to both set and frozenset
26
27 def setUp(self):
28 self.word = word = 'simsalabim'
29 self.otherword = 'madagascar'
30 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
31 self.s = self.thetype(word)
32 self.d = dict.fromkeys(word)
33
Raymond Hettinger6429a472004-09-28 01:51:35 +000034 def test_new_or_init(self):
35 self.assertRaises(TypeError, self.thetype, [], 2)
36
Raymond Hettingera690a992003-11-16 16:17:49 +000037 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000038 actual = sorted(self.s)
39 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000040 self.assertEqual(actual, expected)
41 self.assertRaises(PassThru, self.thetype, check_pass_thru())
42 self.assertRaises(TypeError, self.thetype, [[]])
43
44 def test_len(self):
45 self.assertEqual(len(self.s), len(self.d))
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__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000051 s = self.thetype([frozenset(self.letters)])
52 self.assert_(self.thetype(self.letters) in s)
Raymond Hettingera690a992003-11-16 16:17:49 +000053
Raymond Hettingera690a992003-11-16 16:17:49 +000054 def test_union(self):
55 u = self.s.union(self.otherword)
56 for c in self.letters:
57 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000058 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000059 self.assertEqual(type(u), self.thetype)
60 self.assertRaises(PassThru, self.s.union, check_pass_thru())
61 self.assertRaises(TypeError, self.s.union, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000062 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
63 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
64 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
65 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
66 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +000067
68 def test_or(self):
69 i = self.s.union(self.otherword)
70 self.assertEqual(self.s | set(self.otherword), i)
71 self.assertEqual(self.s | frozenset(self.otherword), i)
72 try:
73 self.s | self.otherword
74 except TypeError:
75 pass
76 else:
77 self.fail("s|t did not screen-out general iterables")
78
79 def test_intersection(self):
80 i = self.s.intersection(self.otherword)
81 for c in self.letters:
82 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000083 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000084 self.assertEqual(type(i), self.thetype)
85 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000086 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
87 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
88 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
89 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
90 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Raymond Hettingera690a992003-11-16 16:17:49 +000091
92 def test_and(self):
93 i = self.s.intersection(self.otherword)
94 self.assertEqual(self.s & set(self.otherword), i)
95 self.assertEqual(self.s & frozenset(self.otherword), i)
96 try:
97 self.s & self.otherword
98 except TypeError:
99 pass
100 else:
101 self.fail("s&t did not screen-out general iterables")
102
103 def test_difference(self):
104 i = self.s.difference(self.otherword)
105 for c in self.letters:
106 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000107 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000108 self.assertEqual(type(i), self.thetype)
109 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
110 self.assertRaises(TypeError, self.s.difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000111 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
112 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
113 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
114 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
115 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000116
117 def test_sub(self):
118 i = self.s.difference(self.otherword)
119 self.assertEqual(self.s - set(self.otherword), i)
120 self.assertEqual(self.s - frozenset(self.otherword), i)
121 try:
122 self.s - self.otherword
123 except TypeError:
124 pass
125 else:
126 self.fail("s-t did not screen-out general iterables")
127
128 def test_symmetric_difference(self):
129 i = self.s.symmetric_difference(self.otherword)
130 for c in self.letters:
131 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000132 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000133 self.assertEqual(type(i), self.thetype)
134 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
135 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000136 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
137 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
138 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
139 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
140 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000141
142 def test_xor(self):
143 i = self.s.symmetric_difference(self.otherword)
144 self.assertEqual(self.s ^ set(self.otherword), i)
145 self.assertEqual(self.s ^ frozenset(self.otherword), i)
146 try:
147 self.s ^ self.otherword
148 except TypeError:
149 pass
150 else:
151 self.fail("s^t did not screen-out general iterables")
152
153 def test_equality(self):
154 self.assertEqual(self.s, set(self.word))
155 self.assertEqual(self.s, frozenset(self.word))
156 self.assertEqual(self.s == self.word, False)
157 self.assertNotEqual(self.s, set(self.otherword))
158 self.assertNotEqual(self.s, frozenset(self.otherword))
159 self.assertEqual(self.s != self.word, True)
160
161 def test_setOfFrozensets(self):
162 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
163 s = self.thetype(t)
164 self.assertEqual(len(s), 3)
165
166 def test_compare(self):
167 self.assertRaises(TypeError, self.s.__cmp__, self.s)
168
169 def test_sub_and_super(self):
170 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
171 self.assert_(p < q)
172 self.assert_(p <= q)
173 self.assert_(q <= q)
174 self.assert_(q > p)
175 self.assert_(q >= p)
176 self.failIf(q < r)
177 self.failIf(q <= r)
178 self.failIf(q > r)
179 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000180 self.assert_(set('a').issubset('abc'))
181 self.assert_(set('abc').issuperset('a'))
182 self.failIf(set('a').issubset('cbs'))
183 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000184
185 def test_pickling(self):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000186 for i in (0, 1, 2):
187 p = pickle.dumps(self.s, i)
188 dup = pickle.loads(p)
189 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
190 if type(self.s) not in (set, frozenset):
191 self.s.x = 10
192 p = pickle.dumps(self.s)
193 dup = pickle.loads(p)
194 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000195
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000196 def test_deepcopy(self):
197 class Tracer:
198 def __init__(self, value):
199 self.value = value
200 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000201 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000202 def __deepcopy__(self, memo=None):
203 return Tracer(self.value + 1)
204 t = Tracer(10)
205 s = self.thetype([t])
206 dup = copy.deepcopy(s)
207 self.assertNotEqual(id(s), id(dup))
208 for elem in dup:
209 newt = elem
210 self.assertNotEqual(id(t), id(newt))
211 self.assertEqual(t.value + 1, newt.value)
212
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000213 def test_gc(self):
214 # Create a nest of cycles to exercise overall ref count check
215 class A:
216 pass
217 s = set(A() for i in xrange(1000))
218 for elem in s:
219 elem.cycle = s
220 elem.sub = elem
221 elem.set = set([elem])
222
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000223 def test_subclass_with_custom_hash(self):
224 # Bug #1257731
225 class H(self.thetype):
226 def __hash__(self):
Tim Peters6902b442006-04-11 00:43:27 +0000227 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000228 s=H()
229 f=set()
230 f.add(s)
231 self.assert_(s in f)
232 f.remove(s)
233 f.add(s)
234 f.discard(s)
235
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000236 def test_badcmp(self):
237 s = self.thetype([BadCmp()])
238 # Detect comparison errors during insertion and lookup
239 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
240 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
241 # Detect errors during mutating operations
242 if hasattr(s, 'add'):
243 self.assertRaises(RuntimeError, s.add, BadCmp())
244 self.assertRaises(RuntimeError, s.discard, BadCmp())
245 self.assertRaises(RuntimeError, s.remove, BadCmp())
246
Raymond Hettingera690a992003-11-16 16:17:49 +0000247class TestSet(TestJointOps):
248 thetype = set
249
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000250 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000251 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000252 s.__init__(self.word)
253 self.assertEqual(s, set(self.word))
254 s.__init__(self.otherword)
255 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000256 self.assertRaises(TypeError, s.__init__, s, 2);
257 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000258
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000259 def test_constructor_identity(self):
260 s = self.thetype(range(3))
261 t = self.thetype(s)
262 self.assertNotEqual(id(s), id(t))
263
Raymond Hettingera690a992003-11-16 16:17:49 +0000264 def test_hash(self):
265 self.assertRaises(TypeError, hash, self.s)
266
267 def test_clear(self):
268 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000269 self.assertEqual(self.s, set())
270 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000271
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000272 def test_copy(self):
273 dup = self.s.copy()
274 self.assertEqual(self.s, dup)
275 self.assertNotEqual(id(self.s), id(dup))
276
Raymond Hettingera690a992003-11-16 16:17:49 +0000277 def test_add(self):
278 self.s.add('Q')
279 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000280 dup = self.s.copy()
281 self.s.add('Q')
282 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000283 self.assertRaises(TypeError, self.s.add, [])
284
285 def test_remove(self):
286 self.s.remove('a')
287 self.assert_('a' not in self.s)
288 self.assertRaises(KeyError, self.s.remove, 'Q')
289 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000290 s = self.thetype([frozenset(self.word)])
291 self.assert_(self.thetype(self.word) in s)
292 s.remove(self.thetype(self.word))
293 self.assert_(self.thetype(self.word) not in s)
294 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000295
Raymond Hettingerc789f342006-12-08 17:35:25 +0000296 def test_remove_keyerror_unpacking(self):
297 # bug: www.python.org/sf/1576657
298 for v1 in ['Q', (1,)]:
299 try:
300 self.s.remove(v1)
301 except KeyError, e:
302 v2 = e.args[0]
303 self.assertEqual(v1, v2)
304 else:
305 self.fail()
306
Raymond Hettingera690a992003-11-16 16:17:49 +0000307 def test_discard(self):
308 self.s.discard('a')
309 self.assert_('a' not in self.s)
310 self.s.discard('Q')
311 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000312 s = self.thetype([frozenset(self.word)])
313 self.assert_(self.thetype(self.word) in s)
314 s.discard(self.thetype(self.word))
315 self.assert_(self.thetype(self.word) not in s)
316 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000317
318 def test_pop(self):
319 for i in xrange(len(self.s)):
320 elem = self.s.pop()
321 self.assert_(elem not in self.s)
322 self.assertRaises(KeyError, self.s.pop)
323
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000324 def test_update(self):
325 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000326 self.assertEqual(retval, None)
327 for c in (self.word + self.otherword):
328 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000329 self.assertRaises(PassThru, self.s.update, check_pass_thru())
330 self.assertRaises(TypeError, self.s.update, [[]])
331 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
332 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
333 s = self.thetype('abcba')
334 self.assertEqual(s.update(C(p)), None)
335 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000336
337 def test_ior(self):
338 self.s |= set(self.otherword)
339 for c in (self.word + self.otherword):
340 self.assert_(c in self.s)
341
342 def test_intersection_update(self):
343 retval = self.s.intersection_update(self.otherword)
344 self.assertEqual(retval, None)
345 for c in (self.word + self.otherword):
346 if c in self.otherword and c in self.word:
347 self.assert_(c in self.s)
348 else:
349 self.assert_(c not in self.s)
350 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
351 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000352 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
353 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
354 s = self.thetype('abcba')
355 self.assertEqual(s.intersection_update(C(p)), None)
356 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000357
358 def test_iand(self):
359 self.s &= set(self.otherword)
360 for c in (self.word + self.otherword):
361 if c in self.otherword and c in self.word:
362 self.assert_(c in self.s)
363 else:
364 self.assert_(c not in self.s)
365
366 def test_difference_update(self):
367 retval = self.s.difference_update(self.otherword)
368 self.assertEqual(retval, None)
369 for c in (self.word + self.otherword):
370 if c in self.word and c not in self.otherword:
371 self.assert_(c in self.s)
372 else:
373 self.assert_(c not in self.s)
374 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
375 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000376 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
377 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
378 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
379 s = self.thetype('abcba')
380 self.assertEqual(s.difference_update(C(p)), None)
381 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000382
383 def test_isub(self):
384 self.s -= set(self.otherword)
385 for c in (self.word + self.otherword):
386 if c in self.word and c not in self.otherword:
387 self.assert_(c in self.s)
388 else:
389 self.assert_(c not in self.s)
390
391 def test_symmetric_difference_update(self):
392 retval = self.s.symmetric_difference_update(self.otherword)
393 self.assertEqual(retval, None)
394 for c in (self.word + self.otherword):
395 if (c in self.word) ^ (c in self.otherword):
396 self.assert_(c in self.s)
397 else:
398 self.assert_(c not in self.s)
399 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
400 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000401 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
402 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
403 s = self.thetype('abcba')
404 self.assertEqual(s.symmetric_difference_update(C(p)), None)
405 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000406
407 def test_ixor(self):
408 self.s ^= set(self.otherword)
409 for c in (self.word + self.otherword):
410 if (c in self.word) ^ (c in self.otherword):
411 self.assert_(c in self.s)
412 else:
413 self.assert_(c not in self.s)
414
Raymond Hettingerc991db22005-08-11 07:58:45 +0000415 def test_inplace_on_self(self):
416 t = self.s.copy()
417 t |= t
418 self.assertEqual(t, self.s)
419 t &= t
420 self.assertEqual(t, self.s)
421 t -= t
422 self.assertEqual(t, self.thetype())
423 t = self.s.copy()
424 t ^= t
425 self.assertEqual(t, self.thetype())
426
Raymond Hettinger691d8052004-05-30 07:26:47 +0000427 def test_weakref(self):
428 s = self.thetype('gallahad')
429 p = proxy(s)
430 self.assertEqual(str(p), str(s))
431 s = None
432 self.assertRaises(ReferenceError, str, p)
433
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000434 # C API test only available in a debug build
Barry Warsaw176014f2006-03-30 22:45:35 +0000435 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000436 def test_c_api(self):
437 self.assertEqual(set('abc').test_c_api(), True)
438
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000439class SetSubclass(set):
440 pass
441
442class TestSetSubclass(TestSet):
443 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000444
445class TestFrozenSet(TestJointOps):
446 thetype = frozenset
447
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000448 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000449 s = self.thetype(self.word)
450 s.__init__(self.otherword)
451 self.assertEqual(s, set(self.word))
452
Raymond Hettingerd7946662005-08-01 21:39:29 +0000453 def test_singleton_empty_frozenset(self):
454 f = frozenset()
455 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
456 frozenset(), frozenset([]), frozenset(()), frozenset(''),
457 frozenset(xrange(0)), frozenset(frozenset()),
458 frozenset(f), f]
459 # All of the empty frozensets should have just one id()
460 self.assertEqual(len(set(map(id, efs))), 1)
461
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000462 def test_constructor_identity(self):
463 s = self.thetype(range(3))
464 t = self.thetype(s)
465 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000466
Raymond Hettingera690a992003-11-16 16:17:49 +0000467 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000468 self.assertEqual(hash(self.thetype('abcdeb')),
469 hash(self.thetype('ebecda')))
470
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000471 # make sure that all permutations give the same hash value
472 n = 100
473 seq = [randrange(n) for i in xrange(n)]
474 results = set()
475 for i in xrange(200):
476 shuffle(seq)
477 results.add(hash(self.thetype(seq)))
478 self.assertEqual(len(results), 1)
479
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000480 def test_copy(self):
481 dup = self.s.copy()
482 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000483
484 def test_frozen_as_dictkey(self):
485 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000486 key1 = self.thetype(seq)
487 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000488 self.assertEqual(key1, key2)
489 self.assertNotEqual(id(key1), id(key2))
490 d = {}
491 d[key1] = 42
492 self.assertEqual(d[key2], 42)
493
494 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000495 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000496 self.assertEqual(hash(f), hash(f))
497
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000498 def test_hash_effectiveness(self):
499 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000500 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000501 addhashvalue = hashvalues.add
502 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000503 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000504 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
505 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000506
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000507class FrozenSetSubclass(frozenset):
508 pass
509
510class TestFrozenSetSubclass(TestFrozenSet):
511 thetype = FrozenSetSubclass
512
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000513 def test_constructor_identity(self):
514 s = self.thetype(range(3))
515 t = self.thetype(s)
516 self.assertNotEqual(id(s), id(t))
517
518 def test_copy(self):
519 dup = self.s.copy()
520 self.assertNotEqual(id(self.s), id(dup))
521
522 def test_nested_empty_constructor(self):
523 s = self.thetype()
524 t = self.thetype(s)
525 self.assertEqual(s, t)
526
Raymond Hettingerd7946662005-08-01 21:39:29 +0000527 def test_singleton_empty_frozenset(self):
528 Frozenset = self.thetype
529 f = frozenset()
530 F = Frozenset()
531 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
532 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
533 Frozenset(xrange(0)), Frozenset(Frozenset()),
534 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
535 # All empty frozenset subclass instances should have different ids
536 self.assertEqual(len(set(map(id, efs))), len(efs))
537
Raymond Hettingera690a992003-11-16 16:17:49 +0000538# Tests taken from test_sets.py =============================================
539
540empty_set = set()
541
542#==============================================================================
543
544class TestBasicOps(unittest.TestCase):
545
546 def test_repr(self):
547 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000548 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000549
Raymond Hettingereae05de2004-07-09 04:51:24 +0000550 def test_print(self):
551 try:
552 fo = open(test_support.TESTFN, "wb")
553 print >> fo, self.set,
554 fo.close()
555 fo = open(test_support.TESTFN, "rb")
556 self.assertEqual(fo.read(), repr(self.set))
557 finally:
558 fo.close()
559 os.remove(test_support.TESTFN)
560
Raymond Hettingera690a992003-11-16 16:17:49 +0000561 def test_length(self):
562 self.assertEqual(len(self.set), self.length)
563
564 def test_self_equality(self):
565 self.assertEqual(self.set, self.set)
566
567 def test_equivalent_equality(self):
568 self.assertEqual(self.set, self.dup)
569
570 def test_copy(self):
571 self.assertEqual(self.set.copy(), self.dup)
572
573 def test_self_union(self):
574 result = self.set | self.set
575 self.assertEqual(result, self.dup)
576
577 def test_empty_union(self):
578 result = self.set | empty_set
579 self.assertEqual(result, self.dup)
580
581 def test_union_empty(self):
582 result = empty_set | self.set
583 self.assertEqual(result, self.dup)
584
585 def test_self_intersection(self):
586 result = self.set & self.set
587 self.assertEqual(result, self.dup)
588
589 def test_empty_intersection(self):
590 result = self.set & empty_set
591 self.assertEqual(result, empty_set)
592
593 def test_intersection_empty(self):
594 result = empty_set & self.set
595 self.assertEqual(result, empty_set)
596
597 def test_self_symmetric_difference(self):
598 result = self.set ^ self.set
599 self.assertEqual(result, empty_set)
600
601 def checkempty_symmetric_difference(self):
602 result = self.set ^ empty_set
603 self.assertEqual(result, self.set)
604
605 def test_self_difference(self):
606 result = self.set - self.set
607 self.assertEqual(result, empty_set)
608
609 def test_empty_difference(self):
610 result = self.set - empty_set
611 self.assertEqual(result, self.dup)
612
613 def test_empty_difference_rev(self):
614 result = empty_set - self.set
615 self.assertEqual(result, empty_set)
616
617 def test_iteration(self):
618 for v in self.set:
619 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000620 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000621 # note: __length_hint__ is an internal undocumented API,
622 # don't rely on it in your own programs
623 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000624
625 def test_pickling(self):
626 p = pickle.dumps(self.set)
627 copy = pickle.loads(p)
628 self.assertEqual(self.set, copy,
629 "%s != %s" % (self.set, copy))
630
631#------------------------------------------------------------------------------
632
633class TestBasicOpsEmpty(TestBasicOps):
634 def setUp(self):
635 self.case = "empty set"
636 self.values = []
637 self.set = set(self.values)
638 self.dup = set(self.values)
639 self.length = 0
640 self.repr = "set([])"
641
642#------------------------------------------------------------------------------
643
644class TestBasicOpsSingleton(TestBasicOps):
645 def setUp(self):
646 self.case = "unit set (number)"
647 self.values = [3]
648 self.set = set(self.values)
649 self.dup = set(self.values)
650 self.length = 1
651 self.repr = "set([3])"
652
653 def test_in(self):
654 self.failUnless(3 in self.set)
655
656 def test_not_in(self):
657 self.failUnless(2 not in self.set)
658
659#------------------------------------------------------------------------------
660
661class TestBasicOpsTuple(TestBasicOps):
662 def setUp(self):
663 self.case = "unit set (tuple)"
664 self.values = [(0, "zero")]
665 self.set = set(self.values)
666 self.dup = set(self.values)
667 self.length = 1
668 self.repr = "set([(0, 'zero')])"
669
670 def test_in(self):
671 self.failUnless((0, "zero") in self.set)
672
673 def test_not_in(self):
674 self.failUnless(9 not in self.set)
675
676#------------------------------------------------------------------------------
677
678class TestBasicOpsTriple(TestBasicOps):
679 def setUp(self):
680 self.case = "triple set"
681 self.values = [0, "zero", operator.add]
682 self.set = set(self.values)
683 self.dup = set(self.values)
684 self.length = 3
685 self.repr = None
686
687#==============================================================================
688
689def baditer():
690 raise TypeError
691 yield True
692
693def gooditer():
694 yield True
695
696class TestExceptionPropagation(unittest.TestCase):
697 """SF 628246: Set constructor should not trap iterator TypeErrors"""
698
699 def test_instanceWithException(self):
700 self.assertRaises(TypeError, set, baditer())
701
702 def test_instancesWithoutException(self):
703 # All of these iterables should load without exception.
704 set([1,2,3])
705 set((1,2,3))
706 set({'one':1, 'two':2, 'three':3})
707 set(xrange(3))
708 set('abc')
709 set(gooditer())
710
Neal Norwitzfcf44352005-11-27 20:37:43 +0000711 def test_changingSizeWhileIterating(self):
712 s = set([1,2,3])
713 try:
714 for i in s:
715 s.update([4])
716 except RuntimeError:
717 pass
718 else:
719 self.fail("no exception when changing size during iteration")
720
Raymond Hettingera690a992003-11-16 16:17:49 +0000721#==============================================================================
722
723class TestSetOfSets(unittest.TestCase):
724 def test_constructor(self):
725 inner = frozenset([1])
726 outer = set([inner])
727 element = outer.pop()
728 self.assertEqual(type(element), frozenset)
729 outer.add(inner) # Rebuild set of sets with .add method
730 outer.remove(inner)
731 self.assertEqual(outer, set()) # Verify that remove worked
732 outer.discard(inner) # Absence of KeyError indicates working fine
733
734#==============================================================================
735
736class TestBinaryOps(unittest.TestCase):
737 def setUp(self):
738 self.set = set((2, 4, 6))
739
740 def test_eq(self): # SF bug 643115
741 self.assertEqual(self.set, set({2:1,4:3,6:5}))
742
743 def test_union_subset(self):
744 result = self.set | set([2])
745 self.assertEqual(result, set((2, 4, 6)))
746
747 def test_union_superset(self):
748 result = self.set | set([2, 4, 6, 8])
749 self.assertEqual(result, set([2, 4, 6, 8]))
750
751 def test_union_overlap(self):
752 result = self.set | set([3, 4, 5])
753 self.assertEqual(result, set([2, 3, 4, 5, 6]))
754
755 def test_union_non_overlap(self):
756 result = self.set | set([8])
757 self.assertEqual(result, set([2, 4, 6, 8]))
758
759 def test_intersection_subset(self):
760 result = self.set & set((2, 4))
761 self.assertEqual(result, set((2, 4)))
762
763 def test_intersection_superset(self):
764 result = self.set & set([2, 4, 6, 8])
765 self.assertEqual(result, set([2, 4, 6]))
766
767 def test_intersection_overlap(self):
768 result = self.set & set([3, 4, 5])
769 self.assertEqual(result, set([4]))
770
771 def test_intersection_non_overlap(self):
772 result = self.set & set([8])
773 self.assertEqual(result, empty_set)
774
775 def test_sym_difference_subset(self):
776 result = self.set ^ set((2, 4))
777 self.assertEqual(result, set([6]))
778
779 def test_sym_difference_superset(self):
780 result = self.set ^ set((2, 4, 6, 8))
781 self.assertEqual(result, set([8]))
782
783 def test_sym_difference_overlap(self):
784 result = self.set ^ set((3, 4, 5))
785 self.assertEqual(result, set([2, 3, 5, 6]))
786
787 def test_sym_difference_non_overlap(self):
788 result = self.set ^ set([8])
789 self.assertEqual(result, set([2, 4, 6, 8]))
790
791 def test_cmp(self):
792 a, b = set('a'), set('b')
793 self.assertRaises(TypeError, cmp, a, b)
794
795 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
796 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
797 # which Python thinks is good enough to synthesize a cmp() result
798 # without calling __cmp__.
799 self.assertEqual(cmp(a, a), 0)
800
801 self.assertRaises(TypeError, cmp, a, 12)
802 self.assertRaises(TypeError, cmp, "abc", a)
803
804#==============================================================================
805
806class TestUpdateOps(unittest.TestCase):
807 def setUp(self):
808 self.set = set((2, 4, 6))
809
810 def test_union_subset(self):
811 self.set |= set([2])
812 self.assertEqual(self.set, set((2, 4, 6)))
813
814 def test_union_superset(self):
815 self.set |= set([2, 4, 6, 8])
816 self.assertEqual(self.set, set([2, 4, 6, 8]))
817
818 def test_union_overlap(self):
819 self.set |= set([3, 4, 5])
820 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
821
822 def test_union_non_overlap(self):
823 self.set |= set([8])
824 self.assertEqual(self.set, set([2, 4, 6, 8]))
825
826 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000827 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000828 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
829
830 def test_intersection_subset(self):
831 self.set &= set((2, 4))
832 self.assertEqual(self.set, set((2, 4)))
833
834 def test_intersection_superset(self):
835 self.set &= set([2, 4, 6, 8])
836 self.assertEqual(self.set, set([2, 4, 6]))
837
838 def test_intersection_overlap(self):
839 self.set &= set([3, 4, 5])
840 self.assertEqual(self.set, set([4]))
841
842 def test_intersection_non_overlap(self):
843 self.set &= set([8])
844 self.assertEqual(self.set, empty_set)
845
846 def test_intersection_method_call(self):
847 self.set.intersection_update(set([3, 4, 5]))
848 self.assertEqual(self.set, set([4]))
849
850 def test_sym_difference_subset(self):
851 self.set ^= set((2, 4))
852 self.assertEqual(self.set, set([6]))
853
854 def test_sym_difference_superset(self):
855 self.set ^= set((2, 4, 6, 8))
856 self.assertEqual(self.set, set([8]))
857
858 def test_sym_difference_overlap(self):
859 self.set ^= set((3, 4, 5))
860 self.assertEqual(self.set, set([2, 3, 5, 6]))
861
862 def test_sym_difference_non_overlap(self):
863 self.set ^= set([8])
864 self.assertEqual(self.set, set([2, 4, 6, 8]))
865
866 def test_sym_difference_method_call(self):
867 self.set.symmetric_difference_update(set([3, 4, 5]))
868 self.assertEqual(self.set, set([2, 3, 5, 6]))
869
870 def test_difference_subset(self):
871 self.set -= set((2, 4))
872 self.assertEqual(self.set, set([6]))
873
874 def test_difference_superset(self):
875 self.set -= set((2, 4, 6, 8))
876 self.assertEqual(self.set, set([]))
877
878 def test_difference_overlap(self):
879 self.set -= set((3, 4, 5))
880 self.assertEqual(self.set, set([2, 6]))
881
882 def test_difference_non_overlap(self):
883 self.set -= set([8])
884 self.assertEqual(self.set, set([2, 4, 6]))
885
886 def test_difference_method_call(self):
887 self.set.difference_update(set([3, 4, 5]))
888 self.assertEqual(self.set, set([2, 6]))
889
890#==============================================================================
891
892class TestMutate(unittest.TestCase):
893 def setUp(self):
894 self.values = ["a", "b", "c"]
895 self.set = set(self.values)
896
897 def test_add_present(self):
898 self.set.add("c")
899 self.assertEqual(self.set, set("abc"))
900
901 def test_add_absent(self):
902 self.set.add("d")
903 self.assertEqual(self.set, set("abcd"))
904
905 def test_add_until_full(self):
906 tmp = set()
907 expected_len = 0
908 for v in self.values:
909 tmp.add(v)
910 expected_len += 1
911 self.assertEqual(len(tmp), expected_len)
912 self.assertEqual(tmp, self.set)
913
914 def test_remove_present(self):
915 self.set.remove("b")
916 self.assertEqual(self.set, set("ac"))
917
918 def test_remove_absent(self):
919 try:
920 self.set.remove("d")
921 self.fail("Removing missing element should have raised LookupError")
922 except LookupError:
923 pass
924
925 def test_remove_until_empty(self):
926 expected_len = len(self.set)
927 for v in self.values:
928 self.set.remove(v)
929 expected_len -= 1
930 self.assertEqual(len(self.set), expected_len)
931
932 def test_discard_present(self):
933 self.set.discard("c")
934 self.assertEqual(self.set, set("ab"))
935
936 def test_discard_absent(self):
937 self.set.discard("d")
938 self.assertEqual(self.set, set("abc"))
939
940 def test_clear(self):
941 self.set.clear()
942 self.assertEqual(len(self.set), 0)
943
944 def test_pop(self):
945 popped = {}
946 while self.set:
947 popped[self.set.pop()] = None
948 self.assertEqual(len(popped), len(self.values))
949 for v in self.values:
950 self.failUnless(v in popped)
951
952 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000953 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +0000954 self.assertEqual(self.set, set(self.values))
955
956 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000957 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +0000958 self.assertEqual(self.set, set(self.values))
959
960 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000961 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +0000962 self.assertEqual(self.set, set(self.values + ["z"]))
963
964#==============================================================================
965
966class TestSubsets(unittest.TestCase):
967
968 case2method = {"<=": "issubset",
969 ">=": "issuperset",
970 }
971
972 reverse = {"==": "==",
973 "!=": "!=",
974 "<": ">",
975 ">": "<",
976 "<=": ">=",
977 ">=": "<=",
978 }
979
980 def test_issubset(self):
981 x = self.left
982 y = self.right
983 for case in "!=", "==", "<", "<=", ">", ">=":
984 expected = case in self.cases
985 # Test the binary infix spelling.
986 result = eval("x" + case + "y", locals())
987 self.assertEqual(result, expected)
988 # Test the "friendly" method-name spelling, if one exists.
989 if case in TestSubsets.case2method:
990 method = getattr(x, TestSubsets.case2method[case])
991 result = method(y)
992 self.assertEqual(result, expected)
993
994 # Now do the same for the operands reversed.
995 rcase = TestSubsets.reverse[case]
996 result = eval("y" + rcase + "x", locals())
997 self.assertEqual(result, expected)
998 if rcase in TestSubsets.case2method:
999 method = getattr(y, TestSubsets.case2method[rcase])
1000 result = method(x)
1001 self.assertEqual(result, expected)
1002#------------------------------------------------------------------------------
1003
1004class TestSubsetEqualEmpty(TestSubsets):
1005 left = set()
1006 right = set()
1007 name = "both empty"
1008 cases = "==", "<=", ">="
1009
1010#------------------------------------------------------------------------------
1011
1012class TestSubsetEqualNonEmpty(TestSubsets):
1013 left = set([1, 2])
1014 right = set([1, 2])
1015 name = "equal pair"
1016 cases = "==", "<=", ">="
1017
1018#------------------------------------------------------------------------------
1019
1020class TestSubsetEmptyNonEmpty(TestSubsets):
1021 left = set()
1022 right = set([1, 2])
1023 name = "one empty, one non-empty"
1024 cases = "!=", "<", "<="
1025
1026#------------------------------------------------------------------------------
1027
1028class TestSubsetPartial(TestSubsets):
1029 left = set([1])
1030 right = set([1, 2])
1031 name = "one a non-empty proper subset of other"
1032 cases = "!=", "<", "<="
1033
1034#------------------------------------------------------------------------------
1035
1036class TestSubsetNonOverlap(TestSubsets):
1037 left = set([1])
1038 right = set([2])
1039 name = "neither empty, neither contains"
1040 cases = "!="
1041
1042#==============================================================================
1043
1044class TestOnlySetsInBinaryOps(unittest.TestCase):
1045
1046 def test_eq_ne(self):
1047 # Unlike the others, this is testing that == and != *are* allowed.
1048 self.assertEqual(self.other == self.set, False)
1049 self.assertEqual(self.set == self.other, False)
1050 self.assertEqual(self.other != self.set, True)
1051 self.assertEqual(self.set != self.other, True)
1052
1053 def test_ge_gt_le_lt(self):
1054 self.assertRaises(TypeError, lambda: self.set < self.other)
1055 self.assertRaises(TypeError, lambda: self.set <= self.other)
1056 self.assertRaises(TypeError, lambda: self.set > self.other)
1057 self.assertRaises(TypeError, lambda: self.set >= self.other)
1058
1059 self.assertRaises(TypeError, lambda: self.other < self.set)
1060 self.assertRaises(TypeError, lambda: self.other <= self.set)
1061 self.assertRaises(TypeError, lambda: self.other > self.set)
1062 self.assertRaises(TypeError, lambda: self.other >= self.set)
1063
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001064 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001065 try:
1066 self.set |= self.other
1067 except TypeError:
1068 pass
1069 else:
1070 self.fail("expected TypeError")
1071
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001072 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001073 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001074 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001075 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001076 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001077
1078 def test_union(self):
1079 self.assertRaises(TypeError, lambda: self.set | self.other)
1080 self.assertRaises(TypeError, lambda: self.other | self.set)
1081 if self.otherIsIterable:
1082 self.set.union(self.other)
1083 else:
1084 self.assertRaises(TypeError, self.set.union, self.other)
1085
1086 def test_intersection_update_operator(self):
1087 try:
1088 self.set &= self.other
1089 except TypeError:
1090 pass
1091 else:
1092 self.fail("expected TypeError")
1093
1094 def test_intersection_update(self):
1095 if self.otherIsIterable:
1096 self.set.intersection_update(self.other)
1097 else:
1098 self.assertRaises(TypeError,
1099 self.set.intersection_update,
1100 self.other)
1101
1102 def test_intersection(self):
1103 self.assertRaises(TypeError, lambda: self.set & self.other)
1104 self.assertRaises(TypeError, lambda: self.other & self.set)
1105 if self.otherIsIterable:
1106 self.set.intersection(self.other)
1107 else:
1108 self.assertRaises(TypeError, self.set.intersection, self.other)
1109
1110 def test_sym_difference_update_operator(self):
1111 try:
1112 self.set ^= self.other
1113 except TypeError:
1114 pass
1115 else:
1116 self.fail("expected TypeError")
1117
1118 def test_sym_difference_update(self):
1119 if self.otherIsIterable:
1120 self.set.symmetric_difference_update(self.other)
1121 else:
1122 self.assertRaises(TypeError,
1123 self.set.symmetric_difference_update,
1124 self.other)
1125
1126 def test_sym_difference(self):
1127 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1128 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1129 if self.otherIsIterable:
1130 self.set.symmetric_difference(self.other)
1131 else:
1132 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1133
1134 def test_difference_update_operator(self):
1135 try:
1136 self.set -= self.other
1137 except TypeError:
1138 pass
1139 else:
1140 self.fail("expected TypeError")
1141
1142 def test_difference_update(self):
1143 if self.otherIsIterable:
1144 self.set.difference_update(self.other)
1145 else:
1146 self.assertRaises(TypeError,
1147 self.set.difference_update,
1148 self.other)
1149
1150 def test_difference(self):
1151 self.assertRaises(TypeError, lambda: self.set - self.other)
1152 self.assertRaises(TypeError, lambda: self.other - self.set)
1153 if self.otherIsIterable:
1154 self.set.difference(self.other)
1155 else:
1156 self.assertRaises(TypeError, self.set.difference, self.other)
1157
1158#------------------------------------------------------------------------------
1159
1160class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1161 def setUp(self):
1162 self.set = set((1, 2, 3))
1163 self.other = 19
1164 self.otherIsIterable = False
1165
1166#------------------------------------------------------------------------------
1167
1168class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1169 def setUp(self):
1170 self.set = set((1, 2, 3))
1171 self.other = {1:2, 3:4}
1172 self.otherIsIterable = True
1173
1174#------------------------------------------------------------------------------
1175
1176class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1177 def setUp(self):
1178 self.set = set((1, 2, 3))
1179 self.other = operator.add
1180 self.otherIsIterable = False
1181
1182#------------------------------------------------------------------------------
1183
1184class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1185 def setUp(self):
1186 self.set = set((1, 2, 3))
1187 self.other = (2, 4, 6)
1188 self.otherIsIterable = True
1189
1190#------------------------------------------------------------------------------
1191
1192class TestOnlySetsString(TestOnlySetsInBinaryOps):
1193 def setUp(self):
1194 self.set = set((1, 2, 3))
1195 self.other = 'abc'
1196 self.otherIsIterable = True
1197
1198#------------------------------------------------------------------------------
1199
1200class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1201 def setUp(self):
1202 def gen():
1203 for i in xrange(0, 10, 2):
1204 yield i
1205 self.set = set((1, 2, 3))
1206 self.other = gen()
1207 self.otherIsIterable = True
1208
1209#==============================================================================
1210
1211class TestCopying(unittest.TestCase):
1212
1213 def test_copy(self):
1214 dup = self.set.copy()
1215 dup_list = list(dup); dup_list.sort()
1216 set_list = list(self.set); set_list.sort()
1217 self.assertEqual(len(dup_list), len(set_list))
1218 for i in range(len(dup_list)):
1219 self.failUnless(dup_list[i] is set_list[i])
1220
1221 def test_deep_copy(self):
1222 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001223 ##print type(dup), repr(dup)
Raymond Hettingera690a992003-11-16 16:17:49 +00001224 dup_list = list(dup); dup_list.sort()
1225 set_list = list(self.set); set_list.sort()
1226 self.assertEqual(len(dup_list), len(set_list))
1227 for i in range(len(dup_list)):
1228 self.assertEqual(dup_list[i], set_list[i])
1229
1230#------------------------------------------------------------------------------
1231
1232class TestCopyingEmpty(TestCopying):
1233 def setUp(self):
1234 self.set = set()
1235
1236#------------------------------------------------------------------------------
1237
1238class TestCopyingSingleton(TestCopying):
1239 def setUp(self):
1240 self.set = set(["hello"])
1241
1242#------------------------------------------------------------------------------
1243
1244class TestCopyingTriple(TestCopying):
1245 def setUp(self):
1246 self.set = set(["zero", 0, None])
1247
1248#------------------------------------------------------------------------------
1249
1250class TestCopyingTuple(TestCopying):
1251 def setUp(self):
1252 self.set = set([(1, 2)])
1253
1254#------------------------------------------------------------------------------
1255
1256class TestCopyingNested(TestCopying):
1257 def setUp(self):
1258 self.set = set([((1, 2), (3, 4))])
1259
1260#==============================================================================
1261
1262class TestIdentities(unittest.TestCase):
1263 def setUp(self):
1264 self.a = set('abracadabra')
1265 self.b = set('alacazam')
1266
1267 def test_binopsVsSubsets(self):
1268 a, b = self.a, self.b
1269 self.assert_(a - b < a)
1270 self.assert_(b - a < b)
1271 self.assert_(a & b < a)
1272 self.assert_(a & b < b)
1273 self.assert_(a | b > a)
1274 self.assert_(a | b > b)
1275 self.assert_(a ^ b < a | b)
1276
1277 def test_commutativity(self):
1278 a, b = self.a, self.b
1279 self.assertEqual(a&b, b&a)
1280 self.assertEqual(a|b, b|a)
1281 self.assertEqual(a^b, b^a)
1282 if a != b:
1283 self.assertNotEqual(a-b, b-a)
1284
1285 def test_summations(self):
1286 # check that sums of parts equal the whole
1287 a, b = self.a, self.b
1288 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1289 self.assertEqual((a&b)|(a^b), a|b)
1290 self.assertEqual(a|(b-a), a|b)
1291 self.assertEqual((a-b)|b, a|b)
1292 self.assertEqual((a-b)|(a&b), a)
1293 self.assertEqual((b-a)|(a&b), b)
1294 self.assertEqual((a-b)|(b-a), a^b)
1295
1296 def test_exclusion(self):
1297 # check that inverse operations show non-overlap
1298 a, b, zero = self.a, self.b, set()
1299 self.assertEqual((a-b)&b, zero)
1300 self.assertEqual((b-a)&a, zero)
1301 self.assertEqual((a&b)&(a^b), zero)
1302
1303# Tests derived from test_itertools.py =======================================
1304
1305def R(seqn):
1306 'Regular generator'
1307 for i in seqn:
1308 yield i
1309
1310class G:
1311 'Sequence using __getitem__'
1312 def __init__(self, seqn):
1313 self.seqn = seqn
1314 def __getitem__(self, i):
1315 return self.seqn[i]
1316
1317class I:
1318 'Sequence using iterator protocol'
1319 def __init__(self, seqn):
1320 self.seqn = seqn
1321 self.i = 0
1322 def __iter__(self):
1323 return self
1324 def next(self):
1325 if self.i >= len(self.seqn): raise StopIteration
1326 v = self.seqn[self.i]
1327 self.i += 1
1328 return v
1329
1330class Ig:
1331 'Sequence using iterator protocol defined with a generator'
1332 def __init__(self, seqn):
1333 self.seqn = seqn
1334 self.i = 0
1335 def __iter__(self):
1336 for val in self.seqn:
1337 yield val
1338
1339class X:
1340 'Missing __getitem__ and __iter__'
1341 def __init__(self, seqn):
1342 self.seqn = seqn
1343 self.i = 0
1344 def next(self):
1345 if self.i >= len(self.seqn): raise StopIteration
1346 v = self.seqn[self.i]
1347 self.i += 1
1348 return v
1349
1350class N:
1351 'Iterator missing next()'
1352 def __init__(self, seqn):
1353 self.seqn = seqn
1354 self.i = 0
1355 def __iter__(self):
1356 return self
1357
1358class E:
1359 'Test propagation of exceptions'
1360 def __init__(self, seqn):
1361 self.seqn = seqn
1362 self.i = 0
1363 def __iter__(self):
1364 return self
1365 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001366 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001367
1368class S:
1369 'Test immediate stop'
1370 def __init__(self, seqn):
1371 pass
1372 def __iter__(self):
1373 return self
1374 def next(self):
1375 raise StopIteration
1376
1377from itertools import chain, imap
1378def L(seqn):
1379 'Test multiple tiers of iterators'
1380 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1381
1382class TestVariousIteratorArgs(unittest.TestCase):
1383
1384 def test_constructor(self):
1385 for cons in (set, frozenset):
1386 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1387 for g in (G, I, Ig, S, L, R):
Raymond Hettinger64958a12003-12-17 20:43:33 +00001388 self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
Raymond Hettingera690a992003-11-16 16:17:49 +00001389 self.assertRaises(TypeError, cons , X(s))
1390 self.assertRaises(TypeError, cons , N(s))
1391 self.assertRaises(ZeroDivisionError, cons , E(s))
1392
1393 def test_inline_methods(self):
1394 s = set('november')
1395 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1396 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1397 for g in (G, I, Ig, L, R):
1398 expected = meth(data)
1399 actual = meth(G(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001400 self.assertEqual(sorted(actual), sorted(expected))
Raymond Hettingera690a992003-11-16 16:17:49 +00001401 self.assertRaises(TypeError, meth, X(s))
1402 self.assertRaises(TypeError, meth, N(s))
1403 self.assertRaises(ZeroDivisionError, meth, E(s))
1404
1405 def test_inplace_methods(self):
1406 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001407 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001408 'difference_update', 'symmetric_difference_update'):
1409 for g in (G, I, Ig, S, L, R):
1410 s = set('january')
1411 t = s.copy()
1412 getattr(s, methname)(list(g(data)))
1413 getattr(t, methname)(g(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001414 self.assertEqual(sorted(s), sorted(t))
Raymond Hettingera690a992003-11-16 16:17:49 +00001415
1416 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1417 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1418 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1419
1420#==============================================================================
1421
1422def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001423 from test import test_sets
1424 test_classes = (
1425 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001426 TestSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001427 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001428 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001429 TestSetOfSets,
1430 TestExceptionPropagation,
1431 TestBasicOpsEmpty,
1432 TestBasicOpsSingleton,
1433 TestBasicOpsTuple,
1434 TestBasicOpsTriple,
1435 TestBinaryOps,
1436 TestUpdateOps,
1437 TestMutate,
1438 TestSubsetEqualEmpty,
1439 TestSubsetEqualNonEmpty,
1440 TestSubsetEmptyNonEmpty,
1441 TestSubsetPartial,
1442 TestSubsetNonOverlap,
1443 TestOnlySetsNumeric,
1444 TestOnlySetsDict,
1445 TestOnlySetsOperator,
1446 TestOnlySetsTuple,
1447 TestOnlySetsString,
1448 TestOnlySetsGenerator,
1449 TestCopyingEmpty,
1450 TestCopyingSingleton,
1451 TestCopyingTriple,
1452 TestCopyingTuple,
1453 TestCopyingNested,
1454 TestIdentities,
1455 TestVariousIteratorArgs,
1456 )
1457
1458 test_support.run_unittest(*test_classes)
1459
1460 # verify reference counting
1461 if verbose and hasattr(sys, "gettotalrefcount"):
1462 import gc
1463 counts = [None] * 5
1464 for i in xrange(len(counts)):
1465 test_support.run_unittest(*test_classes)
1466 gc.collect()
1467 counts[i] = sys.gettotalrefcount()
1468 print counts
1469
1470if __name__ == "__main__":
1471 test_main(verbose=True)