blob: dedd1fb5e599cfdb995df5cd5964f8e4e62f0c16 [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
471class TestFrozenSet(TestJointOps):
472 thetype = frozenset
473
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000474 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000475 s = self.thetype(self.word)
476 s.__init__(self.otherword)
477 self.assertEqual(s, set(self.word))
478
Raymond Hettingerd7946662005-08-01 21:39:29 +0000479 def test_singleton_empty_frozenset(self):
480 f = frozenset()
481 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
482 frozenset(), frozenset([]), frozenset(()), frozenset(''),
483 frozenset(xrange(0)), frozenset(frozenset()),
484 frozenset(f), f]
485 # All of the empty frozensets should have just one id()
486 self.assertEqual(len(set(map(id, efs))), 1)
487
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000488 def test_constructor_identity(self):
489 s = self.thetype(range(3))
490 t = self.thetype(s)
491 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000492
Raymond Hettingera690a992003-11-16 16:17:49 +0000493 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000494 self.assertEqual(hash(self.thetype('abcdeb')),
495 hash(self.thetype('ebecda')))
496
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000497 # make sure that all permutations give the same hash value
498 n = 100
499 seq = [randrange(n) for i in xrange(n)]
500 results = set()
501 for i in xrange(200):
502 shuffle(seq)
503 results.add(hash(self.thetype(seq)))
504 self.assertEqual(len(results), 1)
505
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000506 def test_copy(self):
507 dup = self.s.copy()
508 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000509
510 def test_frozen_as_dictkey(self):
511 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000512 key1 = self.thetype(seq)
513 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000514 self.assertEqual(key1, key2)
515 self.assertNotEqual(id(key1), id(key2))
516 d = {}
517 d[key1] = 42
518 self.assertEqual(d[key2], 42)
519
520 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000521 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000522 self.assertEqual(hash(f), hash(f))
523
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000524 def test_hash_effectiveness(self):
525 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000526 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000527 addhashvalue = hashvalues.add
528 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000529 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000530 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
531 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000532
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000533class FrozenSetSubclass(frozenset):
534 pass
535
536class TestFrozenSetSubclass(TestFrozenSet):
537 thetype = FrozenSetSubclass
538
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000539 def test_constructor_identity(self):
540 s = self.thetype(range(3))
541 t = self.thetype(s)
542 self.assertNotEqual(id(s), id(t))
543
544 def test_copy(self):
545 dup = self.s.copy()
546 self.assertNotEqual(id(self.s), id(dup))
547
548 def test_nested_empty_constructor(self):
549 s = self.thetype()
550 t = self.thetype(s)
551 self.assertEqual(s, t)
552
Raymond Hettingerd7946662005-08-01 21:39:29 +0000553 def test_singleton_empty_frozenset(self):
554 Frozenset = self.thetype
555 f = frozenset()
556 F = Frozenset()
557 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
558 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
559 Frozenset(xrange(0)), Frozenset(Frozenset()),
560 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
561 # All empty frozenset subclass instances should have different ids
562 self.assertEqual(len(set(map(id, efs))), len(efs))
563
Raymond Hettingera690a992003-11-16 16:17:49 +0000564# Tests taken from test_sets.py =============================================
565
566empty_set = set()
567
568#==============================================================================
569
570class TestBasicOps(unittest.TestCase):
571
572 def test_repr(self):
573 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000574 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000575
Raymond Hettingereae05de2004-07-09 04:51:24 +0000576 def test_print(self):
577 try:
578 fo = open(test_support.TESTFN, "wb")
579 print >> fo, self.set,
580 fo.close()
581 fo = open(test_support.TESTFN, "rb")
582 self.assertEqual(fo.read(), repr(self.set))
583 finally:
584 fo.close()
585 os.remove(test_support.TESTFN)
586
Raymond Hettingera690a992003-11-16 16:17:49 +0000587 def test_length(self):
588 self.assertEqual(len(self.set), self.length)
589
590 def test_self_equality(self):
591 self.assertEqual(self.set, self.set)
592
593 def test_equivalent_equality(self):
594 self.assertEqual(self.set, self.dup)
595
596 def test_copy(self):
597 self.assertEqual(self.set.copy(), self.dup)
598
599 def test_self_union(self):
600 result = self.set | self.set
601 self.assertEqual(result, self.dup)
602
603 def test_empty_union(self):
604 result = self.set | empty_set
605 self.assertEqual(result, self.dup)
606
607 def test_union_empty(self):
608 result = empty_set | self.set
609 self.assertEqual(result, self.dup)
610
611 def test_self_intersection(self):
612 result = self.set & self.set
613 self.assertEqual(result, self.dup)
614
615 def test_empty_intersection(self):
616 result = self.set & empty_set
617 self.assertEqual(result, empty_set)
618
619 def test_intersection_empty(self):
620 result = empty_set & self.set
621 self.assertEqual(result, empty_set)
622
623 def test_self_symmetric_difference(self):
624 result = self.set ^ self.set
625 self.assertEqual(result, empty_set)
626
627 def checkempty_symmetric_difference(self):
628 result = self.set ^ empty_set
629 self.assertEqual(result, self.set)
630
631 def test_self_difference(self):
632 result = self.set - self.set
633 self.assertEqual(result, empty_set)
634
635 def test_empty_difference(self):
636 result = self.set - empty_set
637 self.assertEqual(result, self.dup)
638
639 def test_empty_difference_rev(self):
640 result = empty_set - self.set
641 self.assertEqual(result, empty_set)
642
643 def test_iteration(self):
644 for v in self.set:
645 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000646 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000647 # note: __length_hint__ is an internal undocumented API,
648 # don't rely on it in your own programs
649 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000650
651 def test_pickling(self):
652 p = pickle.dumps(self.set)
653 copy = pickle.loads(p)
654 self.assertEqual(self.set, copy,
655 "%s != %s" % (self.set, copy))
656
657#------------------------------------------------------------------------------
658
659class TestBasicOpsEmpty(TestBasicOps):
660 def setUp(self):
661 self.case = "empty set"
662 self.values = []
663 self.set = set(self.values)
664 self.dup = set(self.values)
665 self.length = 0
666 self.repr = "set([])"
667
668#------------------------------------------------------------------------------
669
670class TestBasicOpsSingleton(TestBasicOps):
671 def setUp(self):
672 self.case = "unit set (number)"
673 self.values = [3]
674 self.set = set(self.values)
675 self.dup = set(self.values)
676 self.length = 1
677 self.repr = "set([3])"
678
679 def test_in(self):
680 self.failUnless(3 in self.set)
681
682 def test_not_in(self):
683 self.failUnless(2 not in self.set)
684
685#------------------------------------------------------------------------------
686
687class TestBasicOpsTuple(TestBasicOps):
688 def setUp(self):
689 self.case = "unit set (tuple)"
690 self.values = [(0, "zero")]
691 self.set = set(self.values)
692 self.dup = set(self.values)
693 self.length = 1
694 self.repr = "set([(0, 'zero')])"
695
696 def test_in(self):
697 self.failUnless((0, "zero") in self.set)
698
699 def test_not_in(self):
700 self.failUnless(9 not in self.set)
701
702#------------------------------------------------------------------------------
703
704class TestBasicOpsTriple(TestBasicOps):
705 def setUp(self):
706 self.case = "triple set"
707 self.values = [0, "zero", operator.add]
708 self.set = set(self.values)
709 self.dup = set(self.values)
710 self.length = 3
711 self.repr = None
712
713#==============================================================================
714
715def baditer():
716 raise TypeError
717 yield True
718
719def gooditer():
720 yield True
721
722class TestExceptionPropagation(unittest.TestCase):
723 """SF 628246: Set constructor should not trap iterator TypeErrors"""
724
725 def test_instanceWithException(self):
726 self.assertRaises(TypeError, set, baditer())
727
728 def test_instancesWithoutException(self):
729 # All of these iterables should load without exception.
730 set([1,2,3])
731 set((1,2,3))
732 set({'one':1, 'two':2, 'three':3})
733 set(xrange(3))
734 set('abc')
735 set(gooditer())
736
Neal Norwitzfcf44352005-11-27 20:37:43 +0000737 def test_changingSizeWhileIterating(self):
738 s = set([1,2,3])
739 try:
740 for i in s:
741 s.update([4])
742 except RuntimeError:
743 pass
744 else:
745 self.fail("no exception when changing size during iteration")
746
Raymond Hettingera690a992003-11-16 16:17:49 +0000747#==============================================================================
748
749class TestSetOfSets(unittest.TestCase):
750 def test_constructor(self):
751 inner = frozenset([1])
752 outer = set([inner])
753 element = outer.pop()
754 self.assertEqual(type(element), frozenset)
755 outer.add(inner) # Rebuild set of sets with .add method
756 outer.remove(inner)
757 self.assertEqual(outer, set()) # Verify that remove worked
758 outer.discard(inner) # Absence of KeyError indicates working fine
759
760#==============================================================================
761
762class TestBinaryOps(unittest.TestCase):
763 def setUp(self):
764 self.set = set((2, 4, 6))
765
766 def test_eq(self): # SF bug 643115
767 self.assertEqual(self.set, set({2:1,4:3,6:5}))
768
769 def test_union_subset(self):
770 result = self.set | set([2])
771 self.assertEqual(result, set((2, 4, 6)))
772
773 def test_union_superset(self):
774 result = self.set | set([2, 4, 6, 8])
775 self.assertEqual(result, set([2, 4, 6, 8]))
776
777 def test_union_overlap(self):
778 result = self.set | set([3, 4, 5])
779 self.assertEqual(result, set([2, 3, 4, 5, 6]))
780
781 def test_union_non_overlap(self):
782 result = self.set | set([8])
783 self.assertEqual(result, set([2, 4, 6, 8]))
784
785 def test_intersection_subset(self):
786 result = self.set & set((2, 4))
787 self.assertEqual(result, set((2, 4)))
788
789 def test_intersection_superset(self):
790 result = self.set & set([2, 4, 6, 8])
791 self.assertEqual(result, set([2, 4, 6]))
792
793 def test_intersection_overlap(self):
794 result = self.set & set([3, 4, 5])
795 self.assertEqual(result, set([4]))
796
797 def test_intersection_non_overlap(self):
798 result = self.set & set([8])
799 self.assertEqual(result, empty_set)
800
801 def test_sym_difference_subset(self):
802 result = self.set ^ set((2, 4))
803 self.assertEqual(result, set([6]))
804
805 def test_sym_difference_superset(self):
806 result = self.set ^ set((2, 4, 6, 8))
807 self.assertEqual(result, set([8]))
808
809 def test_sym_difference_overlap(self):
810 result = self.set ^ set((3, 4, 5))
811 self.assertEqual(result, set([2, 3, 5, 6]))
812
813 def test_sym_difference_non_overlap(self):
814 result = self.set ^ set([8])
815 self.assertEqual(result, set([2, 4, 6, 8]))
816
817 def test_cmp(self):
818 a, b = set('a'), set('b')
819 self.assertRaises(TypeError, cmp, a, b)
820
821 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
822 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
823 # which Python thinks is good enough to synthesize a cmp() result
824 # without calling __cmp__.
825 self.assertEqual(cmp(a, a), 0)
826
827 self.assertRaises(TypeError, cmp, a, 12)
828 self.assertRaises(TypeError, cmp, "abc", a)
829
830#==============================================================================
831
832class TestUpdateOps(unittest.TestCase):
833 def setUp(self):
834 self.set = set((2, 4, 6))
835
836 def test_union_subset(self):
837 self.set |= set([2])
838 self.assertEqual(self.set, set((2, 4, 6)))
839
840 def test_union_superset(self):
841 self.set |= set([2, 4, 6, 8])
842 self.assertEqual(self.set, set([2, 4, 6, 8]))
843
844 def test_union_overlap(self):
845 self.set |= set([3, 4, 5])
846 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
847
848 def test_union_non_overlap(self):
849 self.set |= set([8])
850 self.assertEqual(self.set, set([2, 4, 6, 8]))
851
852 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000853 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000854 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
855
856 def test_intersection_subset(self):
857 self.set &= set((2, 4))
858 self.assertEqual(self.set, set((2, 4)))
859
860 def test_intersection_superset(self):
861 self.set &= set([2, 4, 6, 8])
862 self.assertEqual(self.set, set([2, 4, 6]))
863
864 def test_intersection_overlap(self):
865 self.set &= set([3, 4, 5])
866 self.assertEqual(self.set, set([4]))
867
868 def test_intersection_non_overlap(self):
869 self.set &= set([8])
870 self.assertEqual(self.set, empty_set)
871
872 def test_intersection_method_call(self):
873 self.set.intersection_update(set([3, 4, 5]))
874 self.assertEqual(self.set, set([4]))
875
876 def test_sym_difference_subset(self):
877 self.set ^= set((2, 4))
878 self.assertEqual(self.set, set([6]))
879
880 def test_sym_difference_superset(self):
881 self.set ^= set((2, 4, 6, 8))
882 self.assertEqual(self.set, set([8]))
883
884 def test_sym_difference_overlap(self):
885 self.set ^= set((3, 4, 5))
886 self.assertEqual(self.set, set([2, 3, 5, 6]))
887
888 def test_sym_difference_non_overlap(self):
889 self.set ^= set([8])
890 self.assertEqual(self.set, set([2, 4, 6, 8]))
891
892 def test_sym_difference_method_call(self):
893 self.set.symmetric_difference_update(set([3, 4, 5]))
894 self.assertEqual(self.set, set([2, 3, 5, 6]))
895
896 def test_difference_subset(self):
897 self.set -= set((2, 4))
898 self.assertEqual(self.set, set([6]))
899
900 def test_difference_superset(self):
901 self.set -= set((2, 4, 6, 8))
902 self.assertEqual(self.set, set([]))
903
904 def test_difference_overlap(self):
905 self.set -= set((3, 4, 5))
906 self.assertEqual(self.set, set([2, 6]))
907
908 def test_difference_non_overlap(self):
909 self.set -= set([8])
910 self.assertEqual(self.set, set([2, 4, 6]))
911
912 def test_difference_method_call(self):
913 self.set.difference_update(set([3, 4, 5]))
914 self.assertEqual(self.set, set([2, 6]))
915
916#==============================================================================
917
918class TestMutate(unittest.TestCase):
919 def setUp(self):
920 self.values = ["a", "b", "c"]
921 self.set = set(self.values)
922
923 def test_add_present(self):
924 self.set.add("c")
925 self.assertEqual(self.set, set("abc"))
926
927 def test_add_absent(self):
928 self.set.add("d")
929 self.assertEqual(self.set, set("abcd"))
930
931 def test_add_until_full(self):
932 tmp = set()
933 expected_len = 0
934 for v in self.values:
935 tmp.add(v)
936 expected_len += 1
937 self.assertEqual(len(tmp), expected_len)
938 self.assertEqual(tmp, self.set)
939
940 def test_remove_present(self):
941 self.set.remove("b")
942 self.assertEqual(self.set, set("ac"))
943
944 def test_remove_absent(self):
945 try:
946 self.set.remove("d")
947 self.fail("Removing missing element should have raised LookupError")
948 except LookupError:
949 pass
950
951 def test_remove_until_empty(self):
952 expected_len = len(self.set)
953 for v in self.values:
954 self.set.remove(v)
955 expected_len -= 1
956 self.assertEqual(len(self.set), expected_len)
957
958 def test_discard_present(self):
959 self.set.discard("c")
960 self.assertEqual(self.set, set("ab"))
961
962 def test_discard_absent(self):
963 self.set.discard("d")
964 self.assertEqual(self.set, set("abc"))
965
966 def test_clear(self):
967 self.set.clear()
968 self.assertEqual(len(self.set), 0)
969
970 def test_pop(self):
971 popped = {}
972 while self.set:
973 popped[self.set.pop()] = None
974 self.assertEqual(len(popped), len(self.values))
975 for v in self.values:
976 self.failUnless(v in popped)
977
978 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000979 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +0000980 self.assertEqual(self.set, set(self.values))
981
982 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000983 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +0000984 self.assertEqual(self.set, set(self.values))
985
986 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000987 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +0000988 self.assertEqual(self.set, set(self.values + ["z"]))
989
990#==============================================================================
991
992class TestSubsets(unittest.TestCase):
993
994 case2method = {"<=": "issubset",
995 ">=": "issuperset",
996 }
997
998 reverse = {"==": "==",
999 "!=": "!=",
1000 "<": ">",
1001 ">": "<",
1002 "<=": ">=",
1003 ">=": "<=",
1004 }
1005
1006 def test_issubset(self):
1007 x = self.left
1008 y = self.right
1009 for case in "!=", "==", "<", "<=", ">", ">=":
1010 expected = case in self.cases
1011 # Test the binary infix spelling.
1012 result = eval("x" + case + "y", locals())
1013 self.assertEqual(result, expected)
1014 # Test the "friendly" method-name spelling, if one exists.
1015 if case in TestSubsets.case2method:
1016 method = getattr(x, TestSubsets.case2method[case])
1017 result = method(y)
1018 self.assertEqual(result, expected)
1019
1020 # Now do the same for the operands reversed.
1021 rcase = TestSubsets.reverse[case]
1022 result = eval("y" + rcase + "x", locals())
1023 self.assertEqual(result, expected)
1024 if rcase in TestSubsets.case2method:
1025 method = getattr(y, TestSubsets.case2method[rcase])
1026 result = method(x)
1027 self.assertEqual(result, expected)
1028#------------------------------------------------------------------------------
1029
1030class TestSubsetEqualEmpty(TestSubsets):
1031 left = set()
1032 right = set()
1033 name = "both empty"
1034 cases = "==", "<=", ">="
1035
1036#------------------------------------------------------------------------------
1037
1038class TestSubsetEqualNonEmpty(TestSubsets):
1039 left = set([1, 2])
1040 right = set([1, 2])
1041 name = "equal pair"
1042 cases = "==", "<=", ">="
1043
1044#------------------------------------------------------------------------------
1045
1046class TestSubsetEmptyNonEmpty(TestSubsets):
1047 left = set()
1048 right = set([1, 2])
1049 name = "one empty, one non-empty"
1050 cases = "!=", "<", "<="
1051
1052#------------------------------------------------------------------------------
1053
1054class TestSubsetPartial(TestSubsets):
1055 left = set([1])
1056 right = set([1, 2])
1057 name = "one a non-empty proper subset of other"
1058 cases = "!=", "<", "<="
1059
1060#------------------------------------------------------------------------------
1061
1062class TestSubsetNonOverlap(TestSubsets):
1063 left = set([1])
1064 right = set([2])
1065 name = "neither empty, neither contains"
1066 cases = "!="
1067
1068#==============================================================================
1069
1070class TestOnlySetsInBinaryOps(unittest.TestCase):
1071
1072 def test_eq_ne(self):
1073 # Unlike the others, this is testing that == and != *are* allowed.
1074 self.assertEqual(self.other == self.set, False)
1075 self.assertEqual(self.set == self.other, False)
1076 self.assertEqual(self.other != self.set, True)
1077 self.assertEqual(self.set != self.other, True)
1078
1079 def test_ge_gt_le_lt(self):
1080 self.assertRaises(TypeError, lambda: self.set < self.other)
1081 self.assertRaises(TypeError, lambda: self.set <= self.other)
1082 self.assertRaises(TypeError, lambda: self.set > self.other)
1083 self.assertRaises(TypeError, lambda: self.set >= self.other)
1084
1085 self.assertRaises(TypeError, lambda: self.other < self.set)
1086 self.assertRaises(TypeError, lambda: self.other <= self.set)
1087 self.assertRaises(TypeError, lambda: self.other > self.set)
1088 self.assertRaises(TypeError, lambda: self.other >= self.set)
1089
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001090 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001091 try:
1092 self.set |= self.other
1093 except TypeError:
1094 pass
1095 else:
1096 self.fail("expected TypeError")
1097
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001098 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001099 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001100 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001101 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001102 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001103
1104 def test_union(self):
1105 self.assertRaises(TypeError, lambda: self.set | self.other)
1106 self.assertRaises(TypeError, lambda: self.other | self.set)
1107 if self.otherIsIterable:
1108 self.set.union(self.other)
1109 else:
1110 self.assertRaises(TypeError, self.set.union, self.other)
1111
1112 def test_intersection_update_operator(self):
1113 try:
1114 self.set &= self.other
1115 except TypeError:
1116 pass
1117 else:
1118 self.fail("expected TypeError")
1119
1120 def test_intersection_update(self):
1121 if self.otherIsIterable:
1122 self.set.intersection_update(self.other)
1123 else:
1124 self.assertRaises(TypeError,
1125 self.set.intersection_update,
1126 self.other)
1127
1128 def test_intersection(self):
1129 self.assertRaises(TypeError, lambda: self.set & self.other)
1130 self.assertRaises(TypeError, lambda: self.other & self.set)
1131 if self.otherIsIterable:
1132 self.set.intersection(self.other)
1133 else:
1134 self.assertRaises(TypeError, self.set.intersection, self.other)
1135
1136 def test_sym_difference_update_operator(self):
1137 try:
1138 self.set ^= self.other
1139 except TypeError:
1140 pass
1141 else:
1142 self.fail("expected TypeError")
1143
1144 def test_sym_difference_update(self):
1145 if self.otherIsIterable:
1146 self.set.symmetric_difference_update(self.other)
1147 else:
1148 self.assertRaises(TypeError,
1149 self.set.symmetric_difference_update,
1150 self.other)
1151
1152 def test_sym_difference(self):
1153 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1154 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1155 if self.otherIsIterable:
1156 self.set.symmetric_difference(self.other)
1157 else:
1158 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1159
1160 def test_difference_update_operator(self):
1161 try:
1162 self.set -= self.other
1163 except TypeError:
1164 pass
1165 else:
1166 self.fail("expected TypeError")
1167
1168 def test_difference_update(self):
1169 if self.otherIsIterable:
1170 self.set.difference_update(self.other)
1171 else:
1172 self.assertRaises(TypeError,
1173 self.set.difference_update,
1174 self.other)
1175
1176 def test_difference(self):
1177 self.assertRaises(TypeError, lambda: self.set - self.other)
1178 self.assertRaises(TypeError, lambda: self.other - self.set)
1179 if self.otherIsIterable:
1180 self.set.difference(self.other)
1181 else:
1182 self.assertRaises(TypeError, self.set.difference, self.other)
1183
1184#------------------------------------------------------------------------------
1185
1186class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1187 def setUp(self):
1188 self.set = set((1, 2, 3))
1189 self.other = 19
1190 self.otherIsIterable = False
1191
1192#------------------------------------------------------------------------------
1193
1194class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1195 def setUp(self):
1196 self.set = set((1, 2, 3))
1197 self.other = {1:2, 3:4}
1198 self.otherIsIterable = True
1199
1200#------------------------------------------------------------------------------
1201
1202class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1203 def setUp(self):
1204 self.set = set((1, 2, 3))
1205 self.other = operator.add
1206 self.otherIsIterable = False
1207
1208#------------------------------------------------------------------------------
1209
1210class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1211 def setUp(self):
1212 self.set = set((1, 2, 3))
1213 self.other = (2, 4, 6)
1214 self.otherIsIterable = True
1215
1216#------------------------------------------------------------------------------
1217
1218class TestOnlySetsString(TestOnlySetsInBinaryOps):
1219 def setUp(self):
1220 self.set = set((1, 2, 3))
1221 self.other = 'abc'
1222 self.otherIsIterable = True
1223
1224#------------------------------------------------------------------------------
1225
1226class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1227 def setUp(self):
1228 def gen():
1229 for i in xrange(0, 10, 2):
1230 yield i
1231 self.set = set((1, 2, 3))
1232 self.other = gen()
1233 self.otherIsIterable = True
1234
1235#==============================================================================
1236
1237class TestCopying(unittest.TestCase):
1238
1239 def test_copy(self):
1240 dup = self.set.copy()
1241 dup_list = list(dup); dup_list.sort()
1242 set_list = list(self.set); set_list.sort()
1243 self.assertEqual(len(dup_list), len(set_list))
1244 for i in range(len(dup_list)):
1245 self.failUnless(dup_list[i] is set_list[i])
1246
1247 def test_deep_copy(self):
1248 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001249 ##print type(dup), repr(dup)
Raymond Hettingera690a992003-11-16 16:17:49 +00001250 dup_list = list(dup); dup_list.sort()
1251 set_list = list(self.set); set_list.sort()
1252 self.assertEqual(len(dup_list), len(set_list))
1253 for i in range(len(dup_list)):
1254 self.assertEqual(dup_list[i], set_list[i])
1255
1256#------------------------------------------------------------------------------
1257
1258class TestCopyingEmpty(TestCopying):
1259 def setUp(self):
1260 self.set = set()
1261
1262#------------------------------------------------------------------------------
1263
1264class TestCopyingSingleton(TestCopying):
1265 def setUp(self):
1266 self.set = set(["hello"])
1267
1268#------------------------------------------------------------------------------
1269
1270class TestCopyingTriple(TestCopying):
1271 def setUp(self):
1272 self.set = set(["zero", 0, None])
1273
1274#------------------------------------------------------------------------------
1275
1276class TestCopyingTuple(TestCopying):
1277 def setUp(self):
1278 self.set = set([(1, 2)])
1279
1280#------------------------------------------------------------------------------
1281
1282class TestCopyingNested(TestCopying):
1283 def setUp(self):
1284 self.set = set([((1, 2), (3, 4))])
1285
1286#==============================================================================
1287
1288class TestIdentities(unittest.TestCase):
1289 def setUp(self):
1290 self.a = set('abracadabra')
1291 self.b = set('alacazam')
1292
1293 def test_binopsVsSubsets(self):
1294 a, b = self.a, self.b
1295 self.assert_(a - b < a)
1296 self.assert_(b - a < b)
1297 self.assert_(a & b < a)
1298 self.assert_(a & b < b)
1299 self.assert_(a | b > a)
1300 self.assert_(a | b > b)
1301 self.assert_(a ^ b < a | b)
1302
1303 def test_commutativity(self):
1304 a, b = self.a, self.b
1305 self.assertEqual(a&b, b&a)
1306 self.assertEqual(a|b, b|a)
1307 self.assertEqual(a^b, b^a)
1308 if a != b:
1309 self.assertNotEqual(a-b, b-a)
1310
1311 def test_summations(self):
1312 # check that sums of parts equal the whole
1313 a, b = self.a, self.b
1314 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1315 self.assertEqual((a&b)|(a^b), a|b)
1316 self.assertEqual(a|(b-a), a|b)
1317 self.assertEqual((a-b)|b, a|b)
1318 self.assertEqual((a-b)|(a&b), a)
1319 self.assertEqual((b-a)|(a&b), b)
1320 self.assertEqual((a-b)|(b-a), a^b)
1321
1322 def test_exclusion(self):
1323 # check that inverse operations show non-overlap
1324 a, b, zero = self.a, self.b, set()
1325 self.assertEqual((a-b)&b, zero)
1326 self.assertEqual((b-a)&a, zero)
1327 self.assertEqual((a&b)&(a^b), zero)
1328
1329# Tests derived from test_itertools.py =======================================
1330
1331def R(seqn):
1332 'Regular generator'
1333 for i in seqn:
1334 yield i
1335
1336class G:
1337 'Sequence using __getitem__'
1338 def __init__(self, seqn):
1339 self.seqn = seqn
1340 def __getitem__(self, i):
1341 return self.seqn[i]
1342
1343class I:
1344 'Sequence using iterator protocol'
1345 def __init__(self, seqn):
1346 self.seqn = seqn
1347 self.i = 0
1348 def __iter__(self):
1349 return self
1350 def next(self):
1351 if self.i >= len(self.seqn): raise StopIteration
1352 v = self.seqn[self.i]
1353 self.i += 1
1354 return v
1355
1356class Ig:
1357 'Sequence using iterator protocol defined with a generator'
1358 def __init__(self, seqn):
1359 self.seqn = seqn
1360 self.i = 0
1361 def __iter__(self):
1362 for val in self.seqn:
1363 yield val
1364
1365class X:
1366 'Missing __getitem__ and __iter__'
1367 def __init__(self, seqn):
1368 self.seqn = seqn
1369 self.i = 0
1370 def next(self):
1371 if self.i >= len(self.seqn): raise StopIteration
1372 v = self.seqn[self.i]
1373 self.i += 1
1374 return v
1375
1376class N:
1377 'Iterator missing next()'
1378 def __init__(self, seqn):
1379 self.seqn = seqn
1380 self.i = 0
1381 def __iter__(self):
1382 return self
1383
1384class E:
1385 'Test propagation of exceptions'
1386 def __init__(self, seqn):
1387 self.seqn = seqn
1388 self.i = 0
1389 def __iter__(self):
1390 return self
1391 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001392 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001393
1394class S:
1395 'Test immediate stop'
1396 def __init__(self, seqn):
1397 pass
1398 def __iter__(self):
1399 return self
1400 def next(self):
1401 raise StopIteration
1402
1403from itertools import chain, imap
1404def L(seqn):
1405 'Test multiple tiers of iterators'
1406 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1407
1408class TestVariousIteratorArgs(unittest.TestCase):
1409
1410 def test_constructor(self):
1411 for cons in (set, frozenset):
1412 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1413 for g in (G, I, Ig, S, L, R):
Raymond Hettinger64958a12003-12-17 20:43:33 +00001414 self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
Raymond Hettingera690a992003-11-16 16:17:49 +00001415 self.assertRaises(TypeError, cons , X(s))
1416 self.assertRaises(TypeError, cons , N(s))
1417 self.assertRaises(ZeroDivisionError, cons , E(s))
1418
1419 def test_inline_methods(self):
1420 s = set('november')
1421 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1422 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1423 for g in (G, I, Ig, L, R):
1424 expected = meth(data)
1425 actual = meth(G(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001426 self.assertEqual(sorted(actual), sorted(expected))
Raymond Hettingera690a992003-11-16 16:17:49 +00001427 self.assertRaises(TypeError, meth, X(s))
1428 self.assertRaises(TypeError, meth, N(s))
1429 self.assertRaises(ZeroDivisionError, meth, E(s))
1430
1431 def test_inplace_methods(self):
1432 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001433 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001434 'difference_update', 'symmetric_difference_update'):
1435 for g in (G, I, Ig, S, L, R):
1436 s = set('january')
1437 t = s.copy()
1438 getattr(s, methname)(list(g(data)))
1439 getattr(t, methname)(g(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001440 self.assertEqual(sorted(s), sorted(t))
Raymond Hettingera690a992003-11-16 16:17:49 +00001441
1442 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1443 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1444 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1445
1446#==============================================================================
1447
1448def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001449 from test import test_sets
1450 test_classes = (
1451 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001452 TestSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001453 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001454 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001455 TestSetOfSets,
1456 TestExceptionPropagation,
1457 TestBasicOpsEmpty,
1458 TestBasicOpsSingleton,
1459 TestBasicOpsTuple,
1460 TestBasicOpsTriple,
1461 TestBinaryOps,
1462 TestUpdateOps,
1463 TestMutate,
1464 TestSubsetEqualEmpty,
1465 TestSubsetEqualNonEmpty,
1466 TestSubsetEmptyNonEmpty,
1467 TestSubsetPartial,
1468 TestSubsetNonOverlap,
1469 TestOnlySetsNumeric,
1470 TestOnlySetsDict,
1471 TestOnlySetsOperator,
1472 TestOnlySetsTuple,
1473 TestOnlySetsString,
1474 TestOnlySetsGenerator,
1475 TestCopyingEmpty,
1476 TestCopyingSingleton,
1477 TestCopyingTriple,
1478 TestCopyingTuple,
1479 TestCopyingNested,
1480 TestIdentities,
1481 TestVariousIteratorArgs,
1482 )
1483
1484 test_support.run_unittest(*test_classes)
1485
1486 # verify reference counting
1487 if verbose and hasattr(sys, "gettotalrefcount"):
1488 import gc
1489 counts = [None] * 5
1490 for i in xrange(len(counts)):
1491 test_support.run_unittest(*test_classes)
1492 gc.collect()
1493 counts[i] = sys.gettotalrefcount()
1494 print counts
1495
1496if __name__ == "__main__":
1497 test_main(verbose=True)