blob: 49bdec344547944c0ebdb32a158906bb8558ce9e [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 Hettinger53999102006-12-30 04:01:17 +000024class ReprWrapper:
25 'Used to test self-referential repr() calls'
26 def __repr__(self):
27 return repr(self.value)
28
Raymond Hettingera690a992003-11-16 16:17:49 +000029class TestJointOps(unittest.TestCase):
30 # Tests common to both set and frozenset
31
32 def setUp(self):
33 self.word = word = 'simsalabim'
34 self.otherword = 'madagascar'
35 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
36 self.s = self.thetype(word)
37 self.d = dict.fromkeys(word)
38
Raymond Hettinger6429a472004-09-28 01:51:35 +000039 def test_new_or_init(self):
40 self.assertRaises(TypeError, self.thetype, [], 2)
41
Raymond Hettingera690a992003-11-16 16:17:49 +000042 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000043 actual = sorted(self.s)
44 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000045 self.assertEqual(actual, expected)
46 self.assertRaises(PassThru, self.thetype, check_pass_thru())
47 self.assertRaises(TypeError, self.thetype, [[]])
48
49 def test_len(self):
50 self.assertEqual(len(self.s), len(self.d))
51
52 def test_contains(self):
53 for c in self.letters:
54 self.assertEqual(c in self.s, c in self.d)
55 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000056 s = self.thetype([frozenset(self.letters)])
57 self.assert_(self.thetype(self.letters) in s)
Raymond Hettingera690a992003-11-16 16:17:49 +000058
Raymond Hettingera690a992003-11-16 16:17:49 +000059 def test_union(self):
60 u = self.s.union(self.otherword)
61 for c in self.letters:
62 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000063 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000064 self.assertEqual(type(u), self.thetype)
65 self.assertRaises(PassThru, self.s.union, check_pass_thru())
66 self.assertRaises(TypeError, self.s.union, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000067 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
68 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
69 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
70 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
71 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +000072
73 def test_or(self):
74 i = self.s.union(self.otherword)
75 self.assertEqual(self.s | set(self.otherword), i)
76 self.assertEqual(self.s | frozenset(self.otherword), i)
77 try:
78 self.s | self.otherword
79 except TypeError:
80 pass
81 else:
82 self.fail("s|t did not screen-out general iterables")
83
84 def test_intersection(self):
85 i = self.s.intersection(self.otherword)
86 for c in self.letters:
87 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000088 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000089 self.assertEqual(type(i), self.thetype)
90 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000091 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
92 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
93 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
94 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
95 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Raymond Hettingera690a992003-11-16 16:17:49 +000096
97 def test_and(self):
98 i = self.s.intersection(self.otherword)
99 self.assertEqual(self.s & set(self.otherword), i)
100 self.assertEqual(self.s & frozenset(self.otherword), i)
101 try:
102 self.s & self.otherword
103 except TypeError:
104 pass
105 else:
106 self.fail("s&t did not screen-out general iterables")
107
108 def test_difference(self):
109 i = self.s.difference(self.otherword)
110 for c in self.letters:
111 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000112 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000113 self.assertEqual(type(i), self.thetype)
114 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
115 self.assertRaises(TypeError, self.s.difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000116 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
117 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
118 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
119 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
120 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000121
122 def test_sub(self):
123 i = self.s.difference(self.otherword)
124 self.assertEqual(self.s - set(self.otherword), i)
125 self.assertEqual(self.s - frozenset(self.otherword), i)
126 try:
127 self.s - self.otherword
128 except TypeError:
129 pass
130 else:
131 self.fail("s-t did not screen-out general iterables")
132
133 def test_symmetric_difference(self):
134 i = self.s.symmetric_difference(self.otherword)
135 for c in self.letters:
136 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000137 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000138 self.assertEqual(type(i), self.thetype)
139 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
140 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000141 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
142 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
143 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
144 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
145 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000146
147 def test_xor(self):
148 i = self.s.symmetric_difference(self.otherword)
149 self.assertEqual(self.s ^ set(self.otherword), i)
150 self.assertEqual(self.s ^ frozenset(self.otherword), i)
151 try:
152 self.s ^ self.otherword
153 except TypeError:
154 pass
155 else:
156 self.fail("s^t did not screen-out general iterables")
157
158 def test_equality(self):
159 self.assertEqual(self.s, set(self.word))
160 self.assertEqual(self.s, frozenset(self.word))
161 self.assertEqual(self.s == self.word, False)
162 self.assertNotEqual(self.s, set(self.otherword))
163 self.assertNotEqual(self.s, frozenset(self.otherword))
164 self.assertEqual(self.s != self.word, True)
165
166 def test_setOfFrozensets(self):
167 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
168 s = self.thetype(t)
169 self.assertEqual(len(s), 3)
170
171 def test_compare(self):
172 self.assertRaises(TypeError, self.s.__cmp__, self.s)
173
174 def test_sub_and_super(self):
175 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
176 self.assert_(p < q)
177 self.assert_(p <= q)
178 self.assert_(q <= q)
179 self.assert_(q > p)
180 self.assert_(q >= p)
181 self.failIf(q < r)
182 self.failIf(q <= r)
183 self.failIf(q > r)
184 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000185 self.assert_(set('a').issubset('abc'))
186 self.assert_(set('abc').issuperset('a'))
187 self.failIf(set('a').issubset('cbs'))
188 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000189
190 def test_pickling(self):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000191 for i in (0, 1, 2):
192 p = pickle.dumps(self.s, i)
193 dup = pickle.loads(p)
194 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
195 if type(self.s) not in (set, frozenset):
196 self.s.x = 10
197 p = pickle.dumps(self.s)
198 dup = pickle.loads(p)
199 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000200
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000201 def test_deepcopy(self):
202 class Tracer:
203 def __init__(self, value):
204 self.value = value
205 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000206 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000207 def __deepcopy__(self, memo=None):
208 return Tracer(self.value + 1)
209 t = Tracer(10)
210 s = self.thetype([t])
211 dup = copy.deepcopy(s)
212 self.assertNotEqual(id(s), id(dup))
213 for elem in dup:
214 newt = elem
215 self.assertNotEqual(id(t), id(newt))
216 self.assertEqual(t.value + 1, newt.value)
217
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000218 def test_gc(self):
219 # Create a nest of cycles to exercise overall ref count check
220 class A:
221 pass
222 s = set(A() for i in xrange(1000))
223 for elem in s:
224 elem.cycle = s
225 elem.sub = elem
226 elem.set = set([elem])
227
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000228 def test_subclass_with_custom_hash(self):
229 # Bug #1257731
230 class H(self.thetype):
231 def __hash__(self):
Tim Peters6902b442006-04-11 00:43:27 +0000232 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000233 s=H()
234 f=set()
235 f.add(s)
236 self.assert_(s in f)
237 f.remove(s)
238 f.add(s)
239 f.discard(s)
240
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000241 def test_badcmp(self):
242 s = self.thetype([BadCmp()])
243 # Detect comparison errors during insertion and lookup
244 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
245 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
246 # Detect errors during mutating operations
247 if hasattr(s, 'add'):
248 self.assertRaises(RuntimeError, s.add, BadCmp())
249 self.assertRaises(RuntimeError, s.discard, BadCmp())
250 self.assertRaises(RuntimeError, s.remove, BadCmp())
251
Raymond Hettinger53999102006-12-30 04:01:17 +0000252 def test_cyclical_repr(self):
253 w = ReprWrapper()
254 s = self.thetype([w])
255 w.value = s
256 name = repr(s).partition('(')[0] # strip class name from repr string
257 self.assertEqual(repr(s), '%s([%s(...)])' % (name, name))
258
259 def test_cyclical_print(self):
260 w = ReprWrapper()
261 s = self.thetype([w])
262 w.value = s
263 try:
264 fo = open(test_support.TESTFN, "wb")
265 print >> fo, s,
266 fo.close()
267 fo = open(test_support.TESTFN, "rb")
268 self.assertEqual(fo.read(), repr(s))
269 finally:
270 fo.close()
271 os.remove(test_support.TESTFN)
272
Raymond Hettingera690a992003-11-16 16:17:49 +0000273class TestSet(TestJointOps):
274 thetype = set
275
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000276 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000277 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000278 s.__init__(self.word)
279 self.assertEqual(s, set(self.word))
280 s.__init__(self.otherword)
281 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000282 self.assertRaises(TypeError, s.__init__, s, 2);
283 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000284
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000285 def test_constructor_identity(self):
286 s = self.thetype(range(3))
287 t = self.thetype(s)
288 self.assertNotEqual(id(s), id(t))
289
Raymond Hettingera690a992003-11-16 16:17:49 +0000290 def test_hash(self):
291 self.assertRaises(TypeError, hash, self.s)
292
293 def test_clear(self):
294 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000295 self.assertEqual(self.s, set())
296 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000297
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000298 def test_copy(self):
299 dup = self.s.copy()
300 self.assertEqual(self.s, dup)
301 self.assertNotEqual(id(self.s), id(dup))
302
Raymond Hettingera690a992003-11-16 16:17:49 +0000303 def test_add(self):
304 self.s.add('Q')
305 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000306 dup = self.s.copy()
307 self.s.add('Q')
308 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000309 self.assertRaises(TypeError, self.s.add, [])
310
311 def test_remove(self):
312 self.s.remove('a')
313 self.assert_('a' not in self.s)
314 self.assertRaises(KeyError, self.s.remove, 'Q')
315 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000316 s = self.thetype([frozenset(self.word)])
317 self.assert_(self.thetype(self.word) in s)
318 s.remove(self.thetype(self.word))
319 self.assert_(self.thetype(self.word) not in s)
320 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000321
Raymond Hettingerc789f342006-12-08 17:35:25 +0000322 def test_remove_keyerror_unpacking(self):
323 # bug: www.python.org/sf/1576657
324 for v1 in ['Q', (1,)]:
325 try:
326 self.s.remove(v1)
327 except KeyError, e:
328 v2 = e.args[0]
329 self.assertEqual(v1, v2)
330 else:
331 self.fail()
332
Raymond Hettingera690a992003-11-16 16:17:49 +0000333 def test_discard(self):
334 self.s.discard('a')
335 self.assert_('a' not in self.s)
336 self.s.discard('Q')
337 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000338 s = self.thetype([frozenset(self.word)])
339 self.assert_(self.thetype(self.word) in s)
340 s.discard(self.thetype(self.word))
341 self.assert_(self.thetype(self.word) not in s)
342 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000343
344 def test_pop(self):
345 for i in xrange(len(self.s)):
346 elem = self.s.pop()
347 self.assert_(elem not in self.s)
348 self.assertRaises(KeyError, self.s.pop)
349
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000350 def test_update(self):
351 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000352 self.assertEqual(retval, None)
353 for c in (self.word + self.otherword):
354 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000355 self.assertRaises(PassThru, self.s.update, check_pass_thru())
356 self.assertRaises(TypeError, self.s.update, [[]])
357 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
358 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
359 s = self.thetype('abcba')
360 self.assertEqual(s.update(C(p)), None)
361 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000362
363 def test_ior(self):
364 self.s |= set(self.otherword)
365 for c in (self.word + self.otherword):
366 self.assert_(c in self.s)
367
368 def test_intersection_update(self):
369 retval = self.s.intersection_update(self.otherword)
370 self.assertEqual(retval, None)
371 for c in (self.word + self.otherword):
372 if c in self.otherword and c in self.word:
373 self.assert_(c in self.s)
374 else:
375 self.assert_(c not in self.s)
376 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
377 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000378 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
379 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
380 s = self.thetype('abcba')
381 self.assertEqual(s.intersection_update(C(p)), None)
382 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000383
384 def test_iand(self):
385 self.s &= set(self.otherword)
386 for c in (self.word + self.otherword):
387 if c in self.otherword and c in self.word:
388 self.assert_(c in self.s)
389 else:
390 self.assert_(c not in self.s)
391
392 def test_difference_update(self):
393 retval = self.s.difference_update(self.otherword)
394 self.assertEqual(retval, None)
395 for c in (self.word + self.otherword):
396 if c in self.word and c not in self.otherword:
397 self.assert_(c in self.s)
398 else:
399 self.assert_(c not in self.s)
400 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
401 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000402 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
403 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
404 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
405 s = self.thetype('abcba')
406 self.assertEqual(s.difference_update(C(p)), None)
407 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000408
409 def test_isub(self):
410 self.s -= set(self.otherword)
411 for c in (self.word + self.otherword):
412 if c in self.word and c not in self.otherword:
413 self.assert_(c in self.s)
414 else:
415 self.assert_(c not in self.s)
416
417 def test_symmetric_difference_update(self):
418 retval = self.s.symmetric_difference_update(self.otherword)
419 self.assertEqual(retval, None)
420 for c in (self.word + self.otherword):
421 if (c in self.word) ^ (c in self.otherword):
422 self.assert_(c in self.s)
423 else:
424 self.assert_(c not in self.s)
425 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
426 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000427 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
428 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
429 s = self.thetype('abcba')
430 self.assertEqual(s.symmetric_difference_update(C(p)), None)
431 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000432
433 def test_ixor(self):
434 self.s ^= set(self.otherword)
435 for c in (self.word + self.otherword):
436 if (c in self.word) ^ (c in self.otherword):
437 self.assert_(c in self.s)
438 else:
439 self.assert_(c not in self.s)
440
Raymond Hettingerc991db22005-08-11 07:58:45 +0000441 def test_inplace_on_self(self):
442 t = self.s.copy()
443 t |= t
444 self.assertEqual(t, self.s)
445 t &= t
446 self.assertEqual(t, self.s)
447 t -= t
448 self.assertEqual(t, self.thetype())
449 t = self.s.copy()
450 t ^= t
451 self.assertEqual(t, self.thetype())
452
Raymond Hettinger691d8052004-05-30 07:26:47 +0000453 def test_weakref(self):
454 s = self.thetype('gallahad')
455 p = proxy(s)
456 self.assertEqual(str(p), str(s))
457 s = None
458 self.assertRaises(ReferenceError, str, p)
459
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000460 # C API test only available in a debug build
Barry Warsaw176014f2006-03-30 22:45:35 +0000461 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000462 def test_c_api(self):
463 self.assertEqual(set('abc').test_c_api(), True)
464
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000465class SetSubclass(set):
466 pass
467
468class TestSetSubclass(TestSet):
469 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000470
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +0000471class SetSubclassWithKeywordArgs(set):
472 def __init__(self, iterable=[], newarg=None):
473 set.__init__(self, iterable)
474
475class TestSetSubclassWithKeywordArgs(TestSet):
476
477 def test_keywords_in_subclass(self):
478 'SF bug #1486663 -- this used to erroneously raise a TypeError'
479 SetSubclassWithKeywordArgs(newarg=1)
480
Raymond Hettingera690a992003-11-16 16:17:49 +0000481class TestFrozenSet(TestJointOps):
482 thetype = frozenset
483
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000484 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000485 s = self.thetype(self.word)
486 s.__init__(self.otherword)
487 self.assertEqual(s, set(self.word))
488
Raymond Hettingerd7946662005-08-01 21:39:29 +0000489 def test_singleton_empty_frozenset(self):
490 f = frozenset()
491 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
492 frozenset(), frozenset([]), frozenset(()), frozenset(''),
493 frozenset(xrange(0)), frozenset(frozenset()),
494 frozenset(f), f]
495 # All of the empty frozensets should have just one id()
496 self.assertEqual(len(set(map(id, efs))), 1)
497
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000498 def test_constructor_identity(self):
499 s = self.thetype(range(3))
500 t = self.thetype(s)
501 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000502
Raymond Hettingera690a992003-11-16 16:17:49 +0000503 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000504 self.assertEqual(hash(self.thetype('abcdeb')),
505 hash(self.thetype('ebecda')))
506
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000507 # make sure that all permutations give the same hash value
508 n = 100
509 seq = [randrange(n) for i in xrange(n)]
510 results = set()
511 for i in xrange(200):
512 shuffle(seq)
513 results.add(hash(self.thetype(seq)))
514 self.assertEqual(len(results), 1)
515
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000516 def test_copy(self):
517 dup = self.s.copy()
518 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000519
520 def test_frozen_as_dictkey(self):
521 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000522 key1 = self.thetype(seq)
523 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000524 self.assertEqual(key1, key2)
525 self.assertNotEqual(id(key1), id(key2))
526 d = {}
527 d[key1] = 42
528 self.assertEqual(d[key2], 42)
529
530 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000531 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000532 self.assertEqual(hash(f), hash(f))
533
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000534 def test_hash_effectiveness(self):
535 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000536 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000537 addhashvalue = hashvalues.add
538 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000539 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000540 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
541 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000542
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000543class FrozenSetSubclass(frozenset):
544 pass
545
546class TestFrozenSetSubclass(TestFrozenSet):
547 thetype = FrozenSetSubclass
548
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000549 def test_constructor_identity(self):
550 s = self.thetype(range(3))
551 t = self.thetype(s)
552 self.assertNotEqual(id(s), id(t))
553
554 def test_copy(self):
555 dup = self.s.copy()
556 self.assertNotEqual(id(self.s), id(dup))
557
558 def test_nested_empty_constructor(self):
559 s = self.thetype()
560 t = self.thetype(s)
561 self.assertEqual(s, t)
562
Raymond Hettingerd7946662005-08-01 21:39:29 +0000563 def test_singleton_empty_frozenset(self):
564 Frozenset = self.thetype
565 f = frozenset()
566 F = Frozenset()
567 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
568 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
569 Frozenset(xrange(0)), Frozenset(Frozenset()),
570 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
571 # All empty frozenset subclass instances should have different ids
572 self.assertEqual(len(set(map(id, efs))), len(efs))
573
Raymond Hettingera690a992003-11-16 16:17:49 +0000574# Tests taken from test_sets.py =============================================
575
576empty_set = set()
577
578#==============================================================================
579
580class TestBasicOps(unittest.TestCase):
581
582 def test_repr(self):
583 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000584 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000585
Raymond Hettingereae05de2004-07-09 04:51:24 +0000586 def test_print(self):
587 try:
588 fo = open(test_support.TESTFN, "wb")
589 print >> fo, self.set,
590 fo.close()
591 fo = open(test_support.TESTFN, "rb")
592 self.assertEqual(fo.read(), repr(self.set))
593 finally:
594 fo.close()
595 os.remove(test_support.TESTFN)
596
Raymond Hettingera690a992003-11-16 16:17:49 +0000597 def test_length(self):
598 self.assertEqual(len(self.set), self.length)
599
600 def test_self_equality(self):
601 self.assertEqual(self.set, self.set)
602
603 def test_equivalent_equality(self):
604 self.assertEqual(self.set, self.dup)
605
606 def test_copy(self):
607 self.assertEqual(self.set.copy(), self.dup)
608
609 def test_self_union(self):
610 result = self.set | self.set
611 self.assertEqual(result, self.dup)
612
613 def test_empty_union(self):
614 result = self.set | empty_set
615 self.assertEqual(result, self.dup)
616
617 def test_union_empty(self):
618 result = empty_set | self.set
619 self.assertEqual(result, self.dup)
620
621 def test_self_intersection(self):
622 result = self.set & self.set
623 self.assertEqual(result, self.dup)
624
625 def test_empty_intersection(self):
626 result = self.set & empty_set
627 self.assertEqual(result, empty_set)
628
629 def test_intersection_empty(self):
630 result = empty_set & self.set
631 self.assertEqual(result, empty_set)
632
633 def test_self_symmetric_difference(self):
634 result = self.set ^ self.set
635 self.assertEqual(result, empty_set)
636
637 def checkempty_symmetric_difference(self):
638 result = self.set ^ empty_set
639 self.assertEqual(result, self.set)
640
641 def test_self_difference(self):
642 result = self.set - self.set
643 self.assertEqual(result, empty_set)
644
645 def test_empty_difference(self):
646 result = self.set - empty_set
647 self.assertEqual(result, self.dup)
648
649 def test_empty_difference_rev(self):
650 result = empty_set - self.set
651 self.assertEqual(result, empty_set)
652
653 def test_iteration(self):
654 for v in self.set:
655 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000656 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000657 # note: __length_hint__ is an internal undocumented API,
658 # don't rely on it in your own programs
659 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000660
661 def test_pickling(self):
662 p = pickle.dumps(self.set)
663 copy = pickle.loads(p)
664 self.assertEqual(self.set, copy,
665 "%s != %s" % (self.set, copy))
666
667#------------------------------------------------------------------------------
668
669class TestBasicOpsEmpty(TestBasicOps):
670 def setUp(self):
671 self.case = "empty set"
672 self.values = []
673 self.set = set(self.values)
674 self.dup = set(self.values)
675 self.length = 0
676 self.repr = "set([])"
677
678#------------------------------------------------------------------------------
679
680class TestBasicOpsSingleton(TestBasicOps):
681 def setUp(self):
682 self.case = "unit set (number)"
683 self.values = [3]
684 self.set = set(self.values)
685 self.dup = set(self.values)
686 self.length = 1
687 self.repr = "set([3])"
688
689 def test_in(self):
690 self.failUnless(3 in self.set)
691
692 def test_not_in(self):
693 self.failUnless(2 not in self.set)
694
695#------------------------------------------------------------------------------
696
697class TestBasicOpsTuple(TestBasicOps):
698 def setUp(self):
699 self.case = "unit set (tuple)"
700 self.values = [(0, "zero")]
701 self.set = set(self.values)
702 self.dup = set(self.values)
703 self.length = 1
704 self.repr = "set([(0, 'zero')])"
705
706 def test_in(self):
707 self.failUnless((0, "zero") in self.set)
708
709 def test_not_in(self):
710 self.failUnless(9 not in self.set)
711
712#------------------------------------------------------------------------------
713
714class TestBasicOpsTriple(TestBasicOps):
715 def setUp(self):
716 self.case = "triple set"
717 self.values = [0, "zero", operator.add]
718 self.set = set(self.values)
719 self.dup = set(self.values)
720 self.length = 3
721 self.repr = None
722
723#==============================================================================
724
725def baditer():
726 raise TypeError
727 yield True
728
729def gooditer():
730 yield True
731
732class TestExceptionPropagation(unittest.TestCase):
733 """SF 628246: Set constructor should not trap iterator TypeErrors"""
734
735 def test_instanceWithException(self):
736 self.assertRaises(TypeError, set, baditer())
737
738 def test_instancesWithoutException(self):
739 # All of these iterables should load without exception.
740 set([1,2,3])
741 set((1,2,3))
742 set({'one':1, 'two':2, 'three':3})
743 set(xrange(3))
744 set('abc')
745 set(gooditer())
746
Neal Norwitzfcf44352005-11-27 20:37:43 +0000747 def test_changingSizeWhileIterating(self):
748 s = set([1,2,3])
749 try:
750 for i in s:
751 s.update([4])
752 except RuntimeError:
753 pass
754 else:
755 self.fail("no exception when changing size during iteration")
756
Raymond Hettingera690a992003-11-16 16:17:49 +0000757#==============================================================================
758
759class TestSetOfSets(unittest.TestCase):
760 def test_constructor(self):
761 inner = frozenset([1])
762 outer = set([inner])
763 element = outer.pop()
764 self.assertEqual(type(element), frozenset)
765 outer.add(inner) # Rebuild set of sets with .add method
766 outer.remove(inner)
767 self.assertEqual(outer, set()) # Verify that remove worked
768 outer.discard(inner) # Absence of KeyError indicates working fine
769
770#==============================================================================
771
772class TestBinaryOps(unittest.TestCase):
773 def setUp(self):
774 self.set = set((2, 4, 6))
775
776 def test_eq(self): # SF bug 643115
777 self.assertEqual(self.set, set({2:1,4:3,6:5}))
778
779 def test_union_subset(self):
780 result = self.set | set([2])
781 self.assertEqual(result, set((2, 4, 6)))
782
783 def test_union_superset(self):
784 result = self.set | set([2, 4, 6, 8])
785 self.assertEqual(result, set([2, 4, 6, 8]))
786
787 def test_union_overlap(self):
788 result = self.set | set([3, 4, 5])
789 self.assertEqual(result, set([2, 3, 4, 5, 6]))
790
791 def test_union_non_overlap(self):
792 result = self.set | set([8])
793 self.assertEqual(result, set([2, 4, 6, 8]))
794
795 def test_intersection_subset(self):
796 result = self.set & set((2, 4))
797 self.assertEqual(result, set((2, 4)))
798
799 def test_intersection_superset(self):
800 result = self.set & set([2, 4, 6, 8])
801 self.assertEqual(result, set([2, 4, 6]))
802
803 def test_intersection_overlap(self):
804 result = self.set & set([3, 4, 5])
805 self.assertEqual(result, set([4]))
806
807 def test_intersection_non_overlap(self):
808 result = self.set & set([8])
809 self.assertEqual(result, empty_set)
810
811 def test_sym_difference_subset(self):
812 result = self.set ^ set((2, 4))
813 self.assertEqual(result, set([6]))
814
815 def test_sym_difference_superset(self):
816 result = self.set ^ set((2, 4, 6, 8))
817 self.assertEqual(result, set([8]))
818
819 def test_sym_difference_overlap(self):
820 result = self.set ^ set((3, 4, 5))
821 self.assertEqual(result, set([2, 3, 5, 6]))
822
823 def test_sym_difference_non_overlap(self):
824 result = self.set ^ set([8])
825 self.assertEqual(result, set([2, 4, 6, 8]))
826
827 def test_cmp(self):
828 a, b = set('a'), set('b')
829 self.assertRaises(TypeError, cmp, a, b)
830
831 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
832 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
833 # which Python thinks is good enough to synthesize a cmp() result
834 # without calling __cmp__.
835 self.assertEqual(cmp(a, a), 0)
836
837 self.assertRaises(TypeError, cmp, a, 12)
838 self.assertRaises(TypeError, cmp, "abc", a)
839
840#==============================================================================
841
842class TestUpdateOps(unittest.TestCase):
843 def setUp(self):
844 self.set = set((2, 4, 6))
845
846 def test_union_subset(self):
847 self.set |= set([2])
848 self.assertEqual(self.set, set((2, 4, 6)))
849
850 def test_union_superset(self):
851 self.set |= set([2, 4, 6, 8])
852 self.assertEqual(self.set, set([2, 4, 6, 8]))
853
854 def test_union_overlap(self):
855 self.set |= set([3, 4, 5])
856 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
857
858 def test_union_non_overlap(self):
859 self.set |= set([8])
860 self.assertEqual(self.set, set([2, 4, 6, 8]))
861
862 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000863 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000864 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
865
866 def test_intersection_subset(self):
867 self.set &= set((2, 4))
868 self.assertEqual(self.set, set((2, 4)))
869
870 def test_intersection_superset(self):
871 self.set &= set([2, 4, 6, 8])
872 self.assertEqual(self.set, set([2, 4, 6]))
873
874 def test_intersection_overlap(self):
875 self.set &= set([3, 4, 5])
876 self.assertEqual(self.set, set([4]))
877
878 def test_intersection_non_overlap(self):
879 self.set &= set([8])
880 self.assertEqual(self.set, empty_set)
881
882 def test_intersection_method_call(self):
883 self.set.intersection_update(set([3, 4, 5]))
884 self.assertEqual(self.set, set([4]))
885
886 def test_sym_difference_subset(self):
887 self.set ^= set((2, 4))
888 self.assertEqual(self.set, set([6]))
889
890 def test_sym_difference_superset(self):
891 self.set ^= set((2, 4, 6, 8))
892 self.assertEqual(self.set, set([8]))
893
894 def test_sym_difference_overlap(self):
895 self.set ^= set((3, 4, 5))
896 self.assertEqual(self.set, set([2, 3, 5, 6]))
897
898 def test_sym_difference_non_overlap(self):
899 self.set ^= set([8])
900 self.assertEqual(self.set, set([2, 4, 6, 8]))
901
902 def test_sym_difference_method_call(self):
903 self.set.symmetric_difference_update(set([3, 4, 5]))
904 self.assertEqual(self.set, set([2, 3, 5, 6]))
905
906 def test_difference_subset(self):
907 self.set -= set((2, 4))
908 self.assertEqual(self.set, set([6]))
909
910 def test_difference_superset(self):
911 self.set -= set((2, 4, 6, 8))
912 self.assertEqual(self.set, set([]))
913
914 def test_difference_overlap(self):
915 self.set -= set((3, 4, 5))
916 self.assertEqual(self.set, set([2, 6]))
917
918 def test_difference_non_overlap(self):
919 self.set -= set([8])
920 self.assertEqual(self.set, set([2, 4, 6]))
921
922 def test_difference_method_call(self):
923 self.set.difference_update(set([3, 4, 5]))
924 self.assertEqual(self.set, set([2, 6]))
925
926#==============================================================================
927
928class TestMutate(unittest.TestCase):
929 def setUp(self):
930 self.values = ["a", "b", "c"]
931 self.set = set(self.values)
932
933 def test_add_present(self):
934 self.set.add("c")
935 self.assertEqual(self.set, set("abc"))
936
937 def test_add_absent(self):
938 self.set.add("d")
939 self.assertEqual(self.set, set("abcd"))
940
941 def test_add_until_full(self):
942 tmp = set()
943 expected_len = 0
944 for v in self.values:
945 tmp.add(v)
946 expected_len += 1
947 self.assertEqual(len(tmp), expected_len)
948 self.assertEqual(tmp, self.set)
949
950 def test_remove_present(self):
951 self.set.remove("b")
952 self.assertEqual(self.set, set("ac"))
953
954 def test_remove_absent(self):
955 try:
956 self.set.remove("d")
957 self.fail("Removing missing element should have raised LookupError")
958 except LookupError:
959 pass
960
961 def test_remove_until_empty(self):
962 expected_len = len(self.set)
963 for v in self.values:
964 self.set.remove(v)
965 expected_len -= 1
966 self.assertEqual(len(self.set), expected_len)
967
968 def test_discard_present(self):
969 self.set.discard("c")
970 self.assertEqual(self.set, set("ab"))
971
972 def test_discard_absent(self):
973 self.set.discard("d")
974 self.assertEqual(self.set, set("abc"))
975
976 def test_clear(self):
977 self.set.clear()
978 self.assertEqual(len(self.set), 0)
979
980 def test_pop(self):
981 popped = {}
982 while self.set:
983 popped[self.set.pop()] = None
984 self.assertEqual(len(popped), len(self.values))
985 for v in self.values:
986 self.failUnless(v in popped)
987
988 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000989 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +0000990 self.assertEqual(self.set, set(self.values))
991
992 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000993 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +0000994 self.assertEqual(self.set, set(self.values))
995
996 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000997 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +0000998 self.assertEqual(self.set, set(self.values + ["z"]))
999
1000#==============================================================================
1001
1002class TestSubsets(unittest.TestCase):
1003
1004 case2method = {"<=": "issubset",
1005 ">=": "issuperset",
1006 }
1007
1008 reverse = {"==": "==",
1009 "!=": "!=",
1010 "<": ">",
1011 ">": "<",
1012 "<=": ">=",
1013 ">=": "<=",
1014 }
1015
1016 def test_issubset(self):
1017 x = self.left
1018 y = self.right
1019 for case in "!=", "==", "<", "<=", ">", ">=":
1020 expected = case in self.cases
1021 # Test the binary infix spelling.
1022 result = eval("x" + case + "y", locals())
1023 self.assertEqual(result, expected)
1024 # Test the "friendly" method-name spelling, if one exists.
1025 if case in TestSubsets.case2method:
1026 method = getattr(x, TestSubsets.case2method[case])
1027 result = method(y)
1028 self.assertEqual(result, expected)
1029
1030 # Now do the same for the operands reversed.
1031 rcase = TestSubsets.reverse[case]
1032 result = eval("y" + rcase + "x", locals())
1033 self.assertEqual(result, expected)
1034 if rcase in TestSubsets.case2method:
1035 method = getattr(y, TestSubsets.case2method[rcase])
1036 result = method(x)
1037 self.assertEqual(result, expected)
1038#------------------------------------------------------------------------------
1039
1040class TestSubsetEqualEmpty(TestSubsets):
1041 left = set()
1042 right = set()
1043 name = "both empty"
1044 cases = "==", "<=", ">="
1045
1046#------------------------------------------------------------------------------
1047
1048class TestSubsetEqualNonEmpty(TestSubsets):
1049 left = set([1, 2])
1050 right = set([1, 2])
1051 name = "equal pair"
1052 cases = "==", "<=", ">="
1053
1054#------------------------------------------------------------------------------
1055
1056class TestSubsetEmptyNonEmpty(TestSubsets):
1057 left = set()
1058 right = set([1, 2])
1059 name = "one empty, one non-empty"
1060 cases = "!=", "<", "<="
1061
1062#------------------------------------------------------------------------------
1063
1064class TestSubsetPartial(TestSubsets):
1065 left = set([1])
1066 right = set([1, 2])
1067 name = "one a non-empty proper subset of other"
1068 cases = "!=", "<", "<="
1069
1070#------------------------------------------------------------------------------
1071
1072class TestSubsetNonOverlap(TestSubsets):
1073 left = set([1])
1074 right = set([2])
1075 name = "neither empty, neither contains"
1076 cases = "!="
1077
1078#==============================================================================
1079
1080class TestOnlySetsInBinaryOps(unittest.TestCase):
1081
1082 def test_eq_ne(self):
1083 # Unlike the others, this is testing that == and != *are* allowed.
1084 self.assertEqual(self.other == self.set, False)
1085 self.assertEqual(self.set == self.other, False)
1086 self.assertEqual(self.other != self.set, True)
1087 self.assertEqual(self.set != self.other, True)
1088
1089 def test_ge_gt_le_lt(self):
1090 self.assertRaises(TypeError, lambda: self.set < self.other)
1091 self.assertRaises(TypeError, lambda: self.set <= self.other)
1092 self.assertRaises(TypeError, lambda: self.set > self.other)
1093 self.assertRaises(TypeError, lambda: self.set >= self.other)
1094
1095 self.assertRaises(TypeError, lambda: self.other < self.set)
1096 self.assertRaises(TypeError, lambda: self.other <= self.set)
1097 self.assertRaises(TypeError, lambda: self.other > self.set)
1098 self.assertRaises(TypeError, lambda: self.other >= self.set)
1099
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001100 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001101 try:
1102 self.set |= self.other
1103 except TypeError:
1104 pass
1105 else:
1106 self.fail("expected TypeError")
1107
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001108 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001109 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001110 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001111 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001112 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001113
1114 def test_union(self):
1115 self.assertRaises(TypeError, lambda: self.set | self.other)
1116 self.assertRaises(TypeError, lambda: self.other | self.set)
1117 if self.otherIsIterable:
1118 self.set.union(self.other)
1119 else:
1120 self.assertRaises(TypeError, self.set.union, self.other)
1121
1122 def test_intersection_update_operator(self):
1123 try:
1124 self.set &= self.other
1125 except TypeError:
1126 pass
1127 else:
1128 self.fail("expected TypeError")
1129
1130 def test_intersection_update(self):
1131 if self.otherIsIterable:
1132 self.set.intersection_update(self.other)
1133 else:
1134 self.assertRaises(TypeError,
1135 self.set.intersection_update,
1136 self.other)
1137
1138 def test_intersection(self):
1139 self.assertRaises(TypeError, lambda: self.set & self.other)
1140 self.assertRaises(TypeError, lambda: self.other & self.set)
1141 if self.otherIsIterable:
1142 self.set.intersection(self.other)
1143 else:
1144 self.assertRaises(TypeError, self.set.intersection, self.other)
1145
1146 def test_sym_difference_update_operator(self):
1147 try:
1148 self.set ^= self.other
1149 except TypeError:
1150 pass
1151 else:
1152 self.fail("expected TypeError")
1153
1154 def test_sym_difference_update(self):
1155 if self.otherIsIterable:
1156 self.set.symmetric_difference_update(self.other)
1157 else:
1158 self.assertRaises(TypeError,
1159 self.set.symmetric_difference_update,
1160 self.other)
1161
1162 def test_sym_difference(self):
1163 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1164 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1165 if self.otherIsIterable:
1166 self.set.symmetric_difference(self.other)
1167 else:
1168 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1169
1170 def test_difference_update_operator(self):
1171 try:
1172 self.set -= self.other
1173 except TypeError:
1174 pass
1175 else:
1176 self.fail("expected TypeError")
1177
1178 def test_difference_update(self):
1179 if self.otherIsIterable:
1180 self.set.difference_update(self.other)
1181 else:
1182 self.assertRaises(TypeError,
1183 self.set.difference_update,
1184 self.other)
1185
1186 def test_difference(self):
1187 self.assertRaises(TypeError, lambda: self.set - self.other)
1188 self.assertRaises(TypeError, lambda: self.other - self.set)
1189 if self.otherIsIterable:
1190 self.set.difference(self.other)
1191 else:
1192 self.assertRaises(TypeError, self.set.difference, self.other)
1193
1194#------------------------------------------------------------------------------
1195
1196class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1197 def setUp(self):
1198 self.set = set((1, 2, 3))
1199 self.other = 19
1200 self.otherIsIterable = False
1201
1202#------------------------------------------------------------------------------
1203
1204class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1205 def setUp(self):
1206 self.set = set((1, 2, 3))
1207 self.other = {1:2, 3:4}
1208 self.otherIsIterable = True
1209
1210#------------------------------------------------------------------------------
1211
1212class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1213 def setUp(self):
1214 self.set = set((1, 2, 3))
1215 self.other = operator.add
1216 self.otherIsIterable = False
1217
1218#------------------------------------------------------------------------------
1219
1220class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1221 def setUp(self):
1222 self.set = set((1, 2, 3))
1223 self.other = (2, 4, 6)
1224 self.otherIsIterable = True
1225
1226#------------------------------------------------------------------------------
1227
1228class TestOnlySetsString(TestOnlySetsInBinaryOps):
1229 def setUp(self):
1230 self.set = set((1, 2, 3))
1231 self.other = 'abc'
1232 self.otherIsIterable = True
1233
1234#------------------------------------------------------------------------------
1235
1236class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1237 def setUp(self):
1238 def gen():
1239 for i in xrange(0, 10, 2):
1240 yield i
1241 self.set = set((1, 2, 3))
1242 self.other = gen()
1243 self.otherIsIterable = True
1244
1245#==============================================================================
1246
1247class TestCopying(unittest.TestCase):
1248
1249 def test_copy(self):
1250 dup = self.set.copy()
1251 dup_list = list(dup); dup_list.sort()
1252 set_list = list(self.set); set_list.sort()
1253 self.assertEqual(len(dup_list), len(set_list))
1254 for i in range(len(dup_list)):
1255 self.failUnless(dup_list[i] is set_list[i])
1256
1257 def test_deep_copy(self):
1258 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001259 ##print type(dup), repr(dup)
Raymond Hettingera690a992003-11-16 16:17:49 +00001260 dup_list = list(dup); dup_list.sort()
1261 set_list = list(self.set); set_list.sort()
1262 self.assertEqual(len(dup_list), len(set_list))
1263 for i in range(len(dup_list)):
1264 self.assertEqual(dup_list[i], set_list[i])
1265
1266#------------------------------------------------------------------------------
1267
1268class TestCopyingEmpty(TestCopying):
1269 def setUp(self):
1270 self.set = set()
1271
1272#------------------------------------------------------------------------------
1273
1274class TestCopyingSingleton(TestCopying):
1275 def setUp(self):
1276 self.set = set(["hello"])
1277
1278#------------------------------------------------------------------------------
1279
1280class TestCopyingTriple(TestCopying):
1281 def setUp(self):
1282 self.set = set(["zero", 0, None])
1283
1284#------------------------------------------------------------------------------
1285
1286class TestCopyingTuple(TestCopying):
1287 def setUp(self):
1288 self.set = set([(1, 2)])
1289
1290#------------------------------------------------------------------------------
1291
1292class TestCopyingNested(TestCopying):
1293 def setUp(self):
1294 self.set = set([((1, 2), (3, 4))])
1295
1296#==============================================================================
1297
1298class TestIdentities(unittest.TestCase):
1299 def setUp(self):
1300 self.a = set('abracadabra')
1301 self.b = set('alacazam')
1302
1303 def test_binopsVsSubsets(self):
1304 a, b = self.a, self.b
1305 self.assert_(a - b < a)
1306 self.assert_(b - a < b)
1307 self.assert_(a & b < a)
1308 self.assert_(a & b < b)
1309 self.assert_(a | b > a)
1310 self.assert_(a | b > b)
1311 self.assert_(a ^ b < a | b)
1312
1313 def test_commutativity(self):
1314 a, b = self.a, self.b
1315 self.assertEqual(a&b, b&a)
1316 self.assertEqual(a|b, b|a)
1317 self.assertEqual(a^b, b^a)
1318 if a != b:
1319 self.assertNotEqual(a-b, b-a)
1320
1321 def test_summations(self):
1322 # check that sums of parts equal the whole
1323 a, b = self.a, self.b
1324 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1325 self.assertEqual((a&b)|(a^b), a|b)
1326 self.assertEqual(a|(b-a), a|b)
1327 self.assertEqual((a-b)|b, a|b)
1328 self.assertEqual((a-b)|(a&b), a)
1329 self.assertEqual((b-a)|(a&b), b)
1330 self.assertEqual((a-b)|(b-a), a^b)
1331
1332 def test_exclusion(self):
1333 # check that inverse operations show non-overlap
1334 a, b, zero = self.a, self.b, set()
1335 self.assertEqual((a-b)&b, zero)
1336 self.assertEqual((b-a)&a, zero)
1337 self.assertEqual((a&b)&(a^b), zero)
1338
1339# Tests derived from test_itertools.py =======================================
1340
1341def R(seqn):
1342 'Regular generator'
1343 for i in seqn:
1344 yield i
1345
1346class G:
1347 'Sequence using __getitem__'
1348 def __init__(self, seqn):
1349 self.seqn = seqn
1350 def __getitem__(self, i):
1351 return self.seqn[i]
1352
1353class I:
1354 'Sequence using iterator protocol'
1355 def __init__(self, seqn):
1356 self.seqn = seqn
1357 self.i = 0
1358 def __iter__(self):
1359 return self
1360 def next(self):
1361 if self.i >= len(self.seqn): raise StopIteration
1362 v = self.seqn[self.i]
1363 self.i += 1
1364 return v
1365
1366class Ig:
1367 'Sequence using iterator protocol defined with a generator'
1368 def __init__(self, seqn):
1369 self.seqn = seqn
1370 self.i = 0
1371 def __iter__(self):
1372 for val in self.seqn:
1373 yield val
1374
1375class X:
1376 'Missing __getitem__ and __iter__'
1377 def __init__(self, seqn):
1378 self.seqn = seqn
1379 self.i = 0
1380 def next(self):
1381 if self.i >= len(self.seqn): raise StopIteration
1382 v = self.seqn[self.i]
1383 self.i += 1
1384 return v
1385
1386class N:
1387 'Iterator missing next()'
1388 def __init__(self, seqn):
1389 self.seqn = seqn
1390 self.i = 0
1391 def __iter__(self):
1392 return self
1393
1394class E:
1395 'Test propagation of exceptions'
1396 def __init__(self, seqn):
1397 self.seqn = seqn
1398 self.i = 0
1399 def __iter__(self):
1400 return self
1401 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001402 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001403
1404class S:
1405 'Test immediate stop'
1406 def __init__(self, seqn):
1407 pass
1408 def __iter__(self):
1409 return self
1410 def next(self):
1411 raise StopIteration
1412
1413from itertools import chain, imap
1414def L(seqn):
1415 'Test multiple tiers of iterators'
1416 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1417
1418class TestVariousIteratorArgs(unittest.TestCase):
1419
1420 def test_constructor(self):
1421 for cons in (set, frozenset):
1422 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1423 for g in (G, I, Ig, S, L, R):
Raymond Hettinger64958a12003-12-17 20:43:33 +00001424 self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
Raymond Hettingera690a992003-11-16 16:17:49 +00001425 self.assertRaises(TypeError, cons , X(s))
1426 self.assertRaises(TypeError, cons , N(s))
1427 self.assertRaises(ZeroDivisionError, cons , E(s))
1428
1429 def test_inline_methods(self):
1430 s = set('november')
1431 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1432 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1433 for g in (G, I, Ig, L, R):
1434 expected = meth(data)
1435 actual = meth(G(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001436 self.assertEqual(sorted(actual), sorted(expected))
Raymond Hettingera690a992003-11-16 16:17:49 +00001437 self.assertRaises(TypeError, meth, X(s))
1438 self.assertRaises(TypeError, meth, N(s))
1439 self.assertRaises(ZeroDivisionError, meth, E(s))
1440
1441 def test_inplace_methods(self):
1442 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001443 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001444 'difference_update', 'symmetric_difference_update'):
1445 for g in (G, I, Ig, S, L, R):
1446 s = set('january')
1447 t = s.copy()
1448 getattr(s, methname)(list(g(data)))
1449 getattr(t, methname)(g(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001450 self.assertEqual(sorted(s), sorted(t))
Raymond Hettingera690a992003-11-16 16:17:49 +00001451
1452 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1453 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1454 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1455
1456#==============================================================================
1457
1458def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001459 from test import test_sets
1460 test_classes = (
1461 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001462 TestSetSubclass,
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +00001463 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001464 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001465 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001466 TestSetOfSets,
1467 TestExceptionPropagation,
1468 TestBasicOpsEmpty,
1469 TestBasicOpsSingleton,
1470 TestBasicOpsTuple,
1471 TestBasicOpsTriple,
1472 TestBinaryOps,
1473 TestUpdateOps,
1474 TestMutate,
1475 TestSubsetEqualEmpty,
1476 TestSubsetEqualNonEmpty,
1477 TestSubsetEmptyNonEmpty,
1478 TestSubsetPartial,
1479 TestSubsetNonOverlap,
1480 TestOnlySetsNumeric,
1481 TestOnlySetsDict,
1482 TestOnlySetsOperator,
1483 TestOnlySetsTuple,
1484 TestOnlySetsString,
1485 TestOnlySetsGenerator,
1486 TestCopyingEmpty,
1487 TestCopyingSingleton,
1488 TestCopyingTriple,
1489 TestCopyingTuple,
1490 TestCopyingNested,
1491 TestIdentities,
1492 TestVariousIteratorArgs,
1493 )
1494
1495 test_support.run_unittest(*test_classes)
1496
1497 # verify reference counting
1498 if verbose and hasattr(sys, "gettotalrefcount"):
1499 import gc
1500 counts = [None] * 5
1501 for i in xrange(len(counts)):
1502 test_support.run_unittest(*test_classes)
1503 gc.collect()
1504 counts[i] = sys.gettotalrefcount()
1505 print counts
1506
1507if __name__ == "__main__":
1508 test_main(verbose=True)