blob: 8a43109f31d40cfb61495717030bee458b3bd75e [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
Guido van Rossum47b9ff62006-08-24 00:41:19 +000021 def __eq__(self, other):
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000022 raise RuntimeError
23
Thomas Wouters902d6eb2007-01-09 23:18:33 +000024class ReprWrapper:
25 'Used to test self-referential repr() calls'
26 def __repr__(self):
27 return repr(self.value)
28
Thomas Wouterscf297e42007-02-23 15:07:44 +000029class HashCountingInt(int):
30 'int-like object that counts the number of times __hash__ is called'
31 def __init__(self, *args):
32 self.hash_count = 0
33 def __hash__(self):
34 self.hash_count += 1
35 return int.__hash__(self)
36
Raymond Hettingera690a992003-11-16 16:17:49 +000037class TestJointOps(unittest.TestCase):
38 # Tests common to both set and frozenset
39
40 def setUp(self):
41 self.word = word = 'simsalabim'
42 self.otherword = 'madagascar'
43 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
44 self.s = self.thetype(word)
45 self.d = dict.fromkeys(word)
46
Raymond Hettinger6429a472004-09-28 01:51:35 +000047 def test_new_or_init(self):
48 self.assertRaises(TypeError, self.thetype, [], 2)
49
Raymond Hettingera690a992003-11-16 16:17:49 +000050 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000051 actual = sorted(self.s)
52 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000053 self.assertEqual(actual, expected)
54 self.assertRaises(PassThru, self.thetype, check_pass_thru())
55 self.assertRaises(TypeError, self.thetype, [[]])
56
57 def test_len(self):
58 self.assertEqual(len(self.s), len(self.d))
59
60 def test_contains(self):
61 for c in self.letters:
62 self.assertEqual(c in self.s, c in self.d)
63 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000064 s = self.thetype([frozenset(self.letters)])
65 self.assert_(self.thetype(self.letters) in s)
Raymond Hettingera690a992003-11-16 16:17:49 +000066
Raymond Hettingera690a992003-11-16 16:17:49 +000067 def test_union(self):
68 u = self.s.union(self.otherword)
69 for c in self.letters:
70 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000071 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000072 self.assertEqual(type(u), self.thetype)
73 self.assertRaises(PassThru, self.s.union, check_pass_thru())
74 self.assertRaises(TypeError, self.s.union, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000075 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
76 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
77 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
78 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
79 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +000080
81 def test_or(self):
82 i = self.s.union(self.otherword)
83 self.assertEqual(self.s | set(self.otherword), i)
84 self.assertEqual(self.s | frozenset(self.otherword), i)
85 try:
86 self.s | self.otherword
87 except TypeError:
88 pass
89 else:
90 self.fail("s|t did not screen-out general iterables")
91
92 def test_intersection(self):
93 i = self.s.intersection(self.otherword)
94 for c in self.letters:
95 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000096 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000097 self.assertEqual(type(i), self.thetype)
98 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000099 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
100 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
101 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
102 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
103 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Raymond Hettingera690a992003-11-16 16:17:49 +0000104
105 def test_and(self):
106 i = self.s.intersection(self.otherword)
107 self.assertEqual(self.s & set(self.otherword), i)
108 self.assertEqual(self.s & frozenset(self.otherword), i)
109 try:
110 self.s & self.otherword
111 except TypeError:
112 pass
113 else:
114 self.fail("s&t did not screen-out general iterables")
115
116 def test_difference(self):
117 i = self.s.difference(self.otherword)
118 for c in self.letters:
119 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000120 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000121 self.assertEqual(type(i), self.thetype)
122 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
123 self.assertRaises(TypeError, self.s.difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000124 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
125 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
126 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
127 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
128 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000129
130 def test_sub(self):
131 i = self.s.difference(self.otherword)
132 self.assertEqual(self.s - set(self.otherword), i)
133 self.assertEqual(self.s - frozenset(self.otherword), i)
134 try:
135 self.s - self.otherword
136 except TypeError:
137 pass
138 else:
139 self.fail("s-t did not screen-out general iterables")
140
141 def test_symmetric_difference(self):
142 i = self.s.symmetric_difference(self.otherword)
143 for c in self.letters:
144 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000145 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000146 self.assertEqual(type(i), self.thetype)
147 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
148 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000149 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
150 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
151 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
152 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
153 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000154
155 def test_xor(self):
156 i = self.s.symmetric_difference(self.otherword)
157 self.assertEqual(self.s ^ set(self.otherword), i)
158 self.assertEqual(self.s ^ frozenset(self.otherword), i)
159 try:
160 self.s ^ self.otherword
161 except TypeError:
162 pass
163 else:
164 self.fail("s^t did not screen-out general iterables")
165
166 def test_equality(self):
167 self.assertEqual(self.s, set(self.word))
168 self.assertEqual(self.s, frozenset(self.word))
169 self.assertEqual(self.s == self.word, False)
170 self.assertNotEqual(self.s, set(self.otherword))
171 self.assertNotEqual(self.s, frozenset(self.otherword))
172 self.assertEqual(self.s != self.word, True)
173
174 def test_setOfFrozensets(self):
175 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
176 s = self.thetype(t)
177 self.assertEqual(len(s), 3)
178
179 def test_compare(self):
180 self.assertRaises(TypeError, self.s.__cmp__, self.s)
181
182 def test_sub_and_super(self):
183 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
184 self.assert_(p < q)
185 self.assert_(p <= q)
186 self.assert_(q <= q)
187 self.assert_(q > p)
188 self.assert_(q >= p)
189 self.failIf(q < r)
190 self.failIf(q <= r)
191 self.failIf(q > r)
192 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000193 self.assert_(set('a').issubset('abc'))
194 self.assert_(set('abc').issuperset('a'))
195 self.failIf(set('a').issubset('cbs'))
196 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000197
198 def test_pickling(self):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000199 for i in (0, 1, 2):
200 p = pickle.dumps(self.s, i)
201 dup = pickle.loads(p)
202 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
203 if type(self.s) not in (set, frozenset):
204 self.s.x = 10
205 p = pickle.dumps(self.s)
206 dup = pickle.loads(p)
207 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000208
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000209 def test_deepcopy(self):
210 class Tracer:
211 def __init__(self, value):
212 self.value = value
213 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000214 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000215 def __deepcopy__(self, memo=None):
216 return Tracer(self.value + 1)
217 t = Tracer(10)
218 s = self.thetype([t])
219 dup = copy.deepcopy(s)
220 self.assertNotEqual(id(s), id(dup))
221 for elem in dup:
222 newt = elem
223 self.assertNotEqual(id(t), id(newt))
224 self.assertEqual(t.value + 1, newt.value)
225
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000226 def test_gc(self):
227 # Create a nest of cycles to exercise overall ref count check
228 class A:
229 pass
230 s = set(A() for i in xrange(1000))
231 for elem in s:
232 elem.cycle = s
233 elem.sub = elem
234 elem.set = set([elem])
235
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000236 def test_subclass_with_custom_hash(self):
237 # Bug #1257731
238 class H(self.thetype):
239 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000240 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000241 s=H()
242 f=set()
243 f.add(s)
244 self.assert_(s in f)
245 f.remove(s)
246 f.add(s)
247 f.discard(s)
248
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000249 def test_badcmp(self):
250 s = self.thetype([BadCmp()])
251 # Detect comparison errors during insertion and lookup
252 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
253 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
254 # Detect errors during mutating operations
255 if hasattr(s, 'add'):
256 self.assertRaises(RuntimeError, s.add, BadCmp())
257 self.assertRaises(RuntimeError, s.discard, BadCmp())
258 self.assertRaises(RuntimeError, s.remove, BadCmp())
259
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000260 def test_cyclical_repr(self):
261 w = ReprWrapper()
262 s = self.thetype([w])
263 w.value = s
264 if self.thetype == set:
265 self.assertEqual(repr(s), '{set(...)}')
266 else:
267 name = repr(s).partition('(')[0] # strip class name
268 self.assertEqual(repr(s), '%s([%s(...)])' % (name, name))
269
270 def test_cyclical_print(self):
271 w = ReprWrapper()
272 s = self.thetype([w])
273 w.value = s
274 try:
275 fo = open(test_support.TESTFN, "wb")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000276 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000277 fo.close()
278 fo = open(test_support.TESTFN, "rb")
279 self.assertEqual(fo.read(), repr(s))
280 finally:
281 fo.close()
282 os.remove(test_support.TESTFN)
283
Thomas Wouterscf297e42007-02-23 15:07:44 +0000284 def test_do_not_rehash_dict_keys(self):
285 n = 10
286 d = dict.fromkeys(map(HashCountingInt, xrange(n)))
287 self.assertEqual(sum(elem.hash_count for elem in d), n)
288 s = self.thetype(d)
289 self.assertEqual(sum(elem.hash_count for elem in d), n)
290 s.difference(d)
291 self.assertEqual(sum(elem.hash_count for elem in d), n)
292 if hasattr(s, 'symmetric_difference_update'):
293 s.symmetric_difference_update(d)
294 self.assertEqual(sum(elem.hash_count for elem in d), n)
295
Raymond Hettingera690a992003-11-16 16:17:49 +0000296class TestSet(TestJointOps):
297 thetype = set
298
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000299 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000300 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000301 s.__init__(self.word)
302 self.assertEqual(s, set(self.word))
303 s.__init__(self.otherword)
304 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000305 self.assertRaises(TypeError, s.__init__, s, 2);
306 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000307
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000308 def test_constructor_identity(self):
309 s = self.thetype(range(3))
310 t = self.thetype(s)
311 self.assertNotEqual(id(s), id(t))
312
Guido van Rossum86e58e22006-08-28 15:27:34 +0000313 def test_set_literal(self):
314 s = set([1,2,3])
315 t = {1,2,3}
316 self.assertEqual(s, t)
317
Raymond Hettingera690a992003-11-16 16:17:49 +0000318 def test_hash(self):
319 self.assertRaises(TypeError, hash, self.s)
320
321 def test_clear(self):
322 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000323 self.assertEqual(self.s, set())
324 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000325
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000326 def test_copy(self):
327 dup = self.s.copy()
328 self.assertEqual(self.s, dup)
329 self.assertNotEqual(id(self.s), id(dup))
330
Raymond Hettingera690a992003-11-16 16:17:49 +0000331 def test_add(self):
332 self.s.add('Q')
333 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000334 dup = self.s.copy()
335 self.s.add('Q')
336 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000337 self.assertRaises(TypeError, self.s.add, [])
338
339 def test_remove(self):
340 self.s.remove('a')
341 self.assert_('a' not in self.s)
342 self.assertRaises(KeyError, self.s.remove, 'Q')
343 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000344 s = self.thetype([frozenset(self.word)])
345 self.assert_(self.thetype(self.word) in s)
346 s.remove(self.thetype(self.word))
347 self.assert_(self.thetype(self.word) not in s)
348 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000349
Thomas Wouters89f507f2006-12-13 04:49:30 +0000350 def test_remove_keyerror_unpacking(self):
351 # bug: www.python.org/sf/1576657
352 for v1 in ['Q', (1,)]:
353 try:
354 self.s.remove(v1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000355 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000356 v2 = e.args[0]
357 self.assertEqual(v1, v2)
358 else:
359 self.fail()
360
Raymond Hettingera690a992003-11-16 16:17:49 +0000361 def test_discard(self):
362 self.s.discard('a')
363 self.assert_('a' not in self.s)
364 self.s.discard('Q')
365 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000366 s = self.thetype([frozenset(self.word)])
367 self.assert_(self.thetype(self.word) in s)
368 s.discard(self.thetype(self.word))
369 self.assert_(self.thetype(self.word) not in s)
370 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000371
372 def test_pop(self):
373 for i in xrange(len(self.s)):
374 elem = self.s.pop()
375 self.assert_(elem not in self.s)
376 self.assertRaises(KeyError, self.s.pop)
377
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000378 def test_update(self):
379 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000380 self.assertEqual(retval, None)
381 for c in (self.word + self.otherword):
382 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000383 self.assertRaises(PassThru, self.s.update, check_pass_thru())
384 self.assertRaises(TypeError, self.s.update, [[]])
385 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
386 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
387 s = self.thetype('abcba')
388 self.assertEqual(s.update(C(p)), None)
389 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000390
391 def test_ior(self):
392 self.s |= set(self.otherword)
393 for c in (self.word + self.otherword):
394 self.assert_(c in self.s)
395
396 def test_intersection_update(self):
397 retval = self.s.intersection_update(self.otherword)
398 self.assertEqual(retval, None)
399 for c in (self.word + self.otherword):
400 if c in self.otherword and c in self.word:
401 self.assert_(c in self.s)
402 else:
403 self.assert_(c not in self.s)
404 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
405 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000406 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
407 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
408 s = self.thetype('abcba')
409 self.assertEqual(s.intersection_update(C(p)), None)
410 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000411
412 def test_iand(self):
413 self.s &= set(self.otherword)
414 for c in (self.word + self.otherword):
415 if c in self.otherword and c in self.word:
416 self.assert_(c in self.s)
417 else:
418 self.assert_(c not in self.s)
419
420 def test_difference_update(self):
421 retval = self.s.difference_update(self.otherword)
422 self.assertEqual(retval, None)
423 for c in (self.word + self.otherword):
424 if c in self.word and c not in self.otherword:
425 self.assert_(c in self.s)
426 else:
427 self.assert_(c not in self.s)
428 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
429 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000430 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
431 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
432 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
433 s = self.thetype('abcba')
434 self.assertEqual(s.difference_update(C(p)), None)
435 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000436
437 def test_isub(self):
438 self.s -= set(self.otherword)
439 for c in (self.word + self.otherword):
440 if c in self.word and c not in self.otherword:
441 self.assert_(c in self.s)
442 else:
443 self.assert_(c not in self.s)
444
445 def test_symmetric_difference_update(self):
446 retval = self.s.symmetric_difference_update(self.otherword)
447 self.assertEqual(retval, None)
448 for c in (self.word + self.otherword):
449 if (c in self.word) ^ (c in self.otherword):
450 self.assert_(c in self.s)
451 else:
452 self.assert_(c not in self.s)
453 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
454 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000455 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
456 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
457 s = self.thetype('abcba')
458 self.assertEqual(s.symmetric_difference_update(C(p)), None)
459 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000460
461 def test_ixor(self):
462 self.s ^= set(self.otherword)
463 for c in (self.word + self.otherword):
464 if (c in self.word) ^ (c in self.otherword):
465 self.assert_(c in self.s)
466 else:
467 self.assert_(c not in self.s)
468
Raymond Hettingerc991db22005-08-11 07:58:45 +0000469 def test_inplace_on_self(self):
470 t = self.s.copy()
471 t |= t
472 self.assertEqual(t, self.s)
473 t &= t
474 self.assertEqual(t, self.s)
475 t -= t
476 self.assertEqual(t, self.thetype())
477 t = self.s.copy()
478 t ^= t
479 self.assertEqual(t, self.thetype())
480
Raymond Hettinger691d8052004-05-30 07:26:47 +0000481 def test_weakref(self):
482 s = self.thetype('gallahad')
483 p = proxy(s)
484 self.assertEqual(str(p), str(s))
485 s = None
486 self.assertRaises(ReferenceError, str, p)
487
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000488 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000489 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000490 def test_c_api(self):
491 self.assertEqual(set('abc').test_c_api(), True)
492
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000493class SetSubclass(set):
494 pass
495
496class TestSetSubclass(TestSet):
497 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000498
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000499class SetSubclassWithKeywordArgs(set):
500 def __init__(self, iterable=[], newarg=None):
501 set.__init__(self, iterable)
502
503class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000504
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000505 def test_keywords_in_subclass(self):
506 'SF bug #1486663 -- this used to erroneously raise a TypeError'
507 SetSubclassWithKeywordArgs(newarg=1)
508
Raymond Hettingera690a992003-11-16 16:17:49 +0000509class TestFrozenSet(TestJointOps):
510 thetype = frozenset
511
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000512 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000513 s = self.thetype(self.word)
514 s.__init__(self.otherword)
515 self.assertEqual(s, set(self.word))
516
Raymond Hettingerd7946662005-08-01 21:39:29 +0000517 def test_singleton_empty_frozenset(self):
518 f = frozenset()
519 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
520 frozenset(), frozenset([]), frozenset(()), frozenset(''),
521 frozenset(xrange(0)), frozenset(frozenset()),
522 frozenset(f), f]
523 # All of the empty frozensets should have just one id()
524 self.assertEqual(len(set(map(id, efs))), 1)
525
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000526 def test_constructor_identity(self):
527 s = self.thetype(range(3))
528 t = self.thetype(s)
529 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000530
Raymond Hettingera690a992003-11-16 16:17:49 +0000531 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000532 self.assertEqual(hash(self.thetype('abcdeb')),
533 hash(self.thetype('ebecda')))
534
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000535 # make sure that all permutations give the same hash value
536 n = 100
537 seq = [randrange(n) for i in xrange(n)]
538 results = set()
539 for i in xrange(200):
540 shuffle(seq)
541 results.add(hash(self.thetype(seq)))
542 self.assertEqual(len(results), 1)
543
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000544 def test_copy(self):
545 dup = self.s.copy()
546 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000547
548 def test_frozen_as_dictkey(self):
549 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000550 key1 = self.thetype(seq)
551 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000552 self.assertEqual(key1, key2)
553 self.assertNotEqual(id(key1), id(key2))
554 d = {}
555 d[key1] = 42
556 self.assertEqual(d[key2], 42)
557
558 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000559 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000560 self.assertEqual(hash(f), hash(f))
561
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000562 def test_hash_effectiveness(self):
563 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000564 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000565 addhashvalue = hashvalues.add
566 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000567 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000568 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
569 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000570
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000571class FrozenSetSubclass(frozenset):
572 pass
573
574class TestFrozenSetSubclass(TestFrozenSet):
575 thetype = FrozenSetSubclass
576
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000577 def test_constructor_identity(self):
578 s = self.thetype(range(3))
579 t = self.thetype(s)
580 self.assertNotEqual(id(s), id(t))
581
582 def test_copy(self):
583 dup = self.s.copy()
584 self.assertNotEqual(id(self.s), id(dup))
585
586 def test_nested_empty_constructor(self):
587 s = self.thetype()
588 t = self.thetype(s)
589 self.assertEqual(s, t)
590
Raymond Hettingerd7946662005-08-01 21:39:29 +0000591 def test_singleton_empty_frozenset(self):
592 Frozenset = self.thetype
593 f = frozenset()
594 F = Frozenset()
595 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
596 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
597 Frozenset(xrange(0)), Frozenset(Frozenset()),
598 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
599 # All empty frozenset subclass instances should have different ids
600 self.assertEqual(len(set(map(id, efs))), len(efs))
601
Raymond Hettingera690a992003-11-16 16:17:49 +0000602# Tests taken from test_sets.py =============================================
603
604empty_set = set()
605
606#==============================================================================
607
608class TestBasicOps(unittest.TestCase):
609
610 def test_repr(self):
611 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000612 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000613
Raymond Hettingereae05de2004-07-09 04:51:24 +0000614 def test_print(self):
615 try:
616 fo = open(test_support.TESTFN, "wb")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000617 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000618 fo.close()
619 fo = open(test_support.TESTFN, "rb")
620 self.assertEqual(fo.read(), repr(self.set))
621 finally:
622 fo.close()
623 os.remove(test_support.TESTFN)
624
Raymond Hettingera690a992003-11-16 16:17:49 +0000625 def test_length(self):
626 self.assertEqual(len(self.set), self.length)
627
628 def test_self_equality(self):
629 self.assertEqual(self.set, self.set)
630
631 def test_equivalent_equality(self):
632 self.assertEqual(self.set, self.dup)
633
634 def test_copy(self):
635 self.assertEqual(self.set.copy(), self.dup)
636
637 def test_self_union(self):
638 result = self.set | self.set
639 self.assertEqual(result, self.dup)
640
641 def test_empty_union(self):
642 result = self.set | empty_set
643 self.assertEqual(result, self.dup)
644
645 def test_union_empty(self):
646 result = empty_set | self.set
647 self.assertEqual(result, self.dup)
648
649 def test_self_intersection(self):
650 result = self.set & self.set
651 self.assertEqual(result, self.dup)
652
653 def test_empty_intersection(self):
654 result = self.set & empty_set
655 self.assertEqual(result, empty_set)
656
657 def test_intersection_empty(self):
658 result = empty_set & self.set
659 self.assertEqual(result, empty_set)
660
661 def test_self_symmetric_difference(self):
662 result = self.set ^ self.set
663 self.assertEqual(result, empty_set)
664
665 def checkempty_symmetric_difference(self):
666 result = self.set ^ empty_set
667 self.assertEqual(result, self.set)
668
669 def test_self_difference(self):
670 result = self.set - self.set
671 self.assertEqual(result, empty_set)
672
673 def test_empty_difference(self):
674 result = self.set - empty_set
675 self.assertEqual(result, self.dup)
676
677 def test_empty_difference_rev(self):
678 result = empty_set - self.set
679 self.assertEqual(result, empty_set)
680
681 def test_iteration(self):
682 for v in self.set:
683 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000684 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000685 # note: __length_hint__ is an internal undocumented API,
686 # don't rely on it in your own programs
687 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000688
689 def test_pickling(self):
690 p = pickle.dumps(self.set)
691 copy = pickle.loads(p)
692 self.assertEqual(self.set, copy,
693 "%s != %s" % (self.set, copy))
694
695#------------------------------------------------------------------------------
696
697class TestBasicOpsEmpty(TestBasicOps):
698 def setUp(self):
699 self.case = "empty set"
700 self.values = []
701 self.set = set(self.values)
702 self.dup = set(self.values)
703 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000704 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000705
706#------------------------------------------------------------------------------
707
708class TestBasicOpsSingleton(TestBasicOps):
709 def setUp(self):
710 self.case = "unit set (number)"
711 self.values = [3]
712 self.set = set(self.values)
713 self.dup = set(self.values)
714 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000715 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000716
717 def test_in(self):
718 self.failUnless(3 in self.set)
719
720 def test_not_in(self):
721 self.failUnless(2 not in self.set)
722
723#------------------------------------------------------------------------------
724
725class TestBasicOpsTuple(TestBasicOps):
726 def setUp(self):
727 self.case = "unit set (tuple)"
728 self.values = [(0, "zero")]
729 self.set = set(self.values)
730 self.dup = set(self.values)
731 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000732 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000733
734 def test_in(self):
735 self.failUnless((0, "zero") in self.set)
736
737 def test_not_in(self):
738 self.failUnless(9 not in self.set)
739
740#------------------------------------------------------------------------------
741
742class TestBasicOpsTriple(TestBasicOps):
743 def setUp(self):
744 self.case = "triple set"
745 self.values = [0, "zero", operator.add]
746 self.set = set(self.values)
747 self.dup = set(self.values)
748 self.length = 3
749 self.repr = None
750
751#==============================================================================
752
753def baditer():
754 raise TypeError
755 yield True
756
757def gooditer():
758 yield True
759
760class TestExceptionPropagation(unittest.TestCase):
761 """SF 628246: Set constructor should not trap iterator TypeErrors"""
762
763 def test_instanceWithException(self):
764 self.assertRaises(TypeError, set, baditer())
765
766 def test_instancesWithoutException(self):
767 # All of these iterables should load without exception.
768 set([1,2,3])
769 set((1,2,3))
770 set({'one':1, 'two':2, 'three':3})
771 set(xrange(3))
772 set('abc')
773 set(gooditer())
774
Neal Norwitzfcf44352005-11-27 20:37:43 +0000775 def test_changingSizeWhileIterating(self):
776 s = set([1,2,3])
777 try:
778 for i in s:
779 s.update([4])
780 except RuntimeError:
781 pass
782 else:
783 self.fail("no exception when changing size during iteration")
784
Raymond Hettingera690a992003-11-16 16:17:49 +0000785#==============================================================================
786
787class TestSetOfSets(unittest.TestCase):
788 def test_constructor(self):
789 inner = frozenset([1])
790 outer = set([inner])
791 element = outer.pop()
792 self.assertEqual(type(element), frozenset)
793 outer.add(inner) # Rebuild set of sets with .add method
794 outer.remove(inner)
795 self.assertEqual(outer, set()) # Verify that remove worked
796 outer.discard(inner) # Absence of KeyError indicates working fine
797
798#==============================================================================
799
800class TestBinaryOps(unittest.TestCase):
801 def setUp(self):
802 self.set = set((2, 4, 6))
803
804 def test_eq(self): # SF bug 643115
805 self.assertEqual(self.set, set({2:1,4:3,6:5}))
806
807 def test_union_subset(self):
808 result = self.set | set([2])
809 self.assertEqual(result, set((2, 4, 6)))
810
811 def test_union_superset(self):
812 result = self.set | set([2, 4, 6, 8])
813 self.assertEqual(result, set([2, 4, 6, 8]))
814
815 def test_union_overlap(self):
816 result = self.set | set([3, 4, 5])
817 self.assertEqual(result, set([2, 3, 4, 5, 6]))
818
819 def test_union_non_overlap(self):
820 result = self.set | set([8])
821 self.assertEqual(result, set([2, 4, 6, 8]))
822
823 def test_intersection_subset(self):
824 result = self.set & set((2, 4))
825 self.assertEqual(result, set((2, 4)))
826
827 def test_intersection_superset(self):
828 result = self.set & set([2, 4, 6, 8])
829 self.assertEqual(result, set([2, 4, 6]))
830
831 def test_intersection_overlap(self):
832 result = self.set & set([3, 4, 5])
833 self.assertEqual(result, set([4]))
834
835 def test_intersection_non_overlap(self):
836 result = self.set & set([8])
837 self.assertEqual(result, empty_set)
838
839 def test_sym_difference_subset(self):
840 result = self.set ^ set((2, 4))
841 self.assertEqual(result, set([6]))
842
843 def test_sym_difference_superset(self):
844 result = self.set ^ set((2, 4, 6, 8))
845 self.assertEqual(result, set([8]))
846
847 def test_sym_difference_overlap(self):
848 result = self.set ^ set((3, 4, 5))
849 self.assertEqual(result, set([2, 3, 5, 6]))
850
851 def test_sym_difference_non_overlap(self):
852 result = self.set ^ set([8])
853 self.assertEqual(result, set([2, 4, 6, 8]))
854
855 def test_cmp(self):
856 a, b = set('a'), set('b')
857 self.assertRaises(TypeError, cmp, a, b)
858
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000859 # In py3k, this works!
860 self.assertRaises(TypeError, cmp, a, a)
Raymond Hettingera690a992003-11-16 16:17:49 +0000861
862 self.assertRaises(TypeError, cmp, a, 12)
863 self.assertRaises(TypeError, cmp, "abc", a)
864
865#==============================================================================
866
867class TestUpdateOps(unittest.TestCase):
868 def setUp(self):
869 self.set = set((2, 4, 6))
870
871 def test_union_subset(self):
872 self.set |= set([2])
873 self.assertEqual(self.set, set((2, 4, 6)))
874
875 def test_union_superset(self):
876 self.set |= set([2, 4, 6, 8])
877 self.assertEqual(self.set, set([2, 4, 6, 8]))
878
879 def test_union_overlap(self):
880 self.set |= set([3, 4, 5])
881 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
882
883 def test_union_non_overlap(self):
884 self.set |= set([8])
885 self.assertEqual(self.set, set([2, 4, 6, 8]))
886
887 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000888 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000889 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
890
891 def test_intersection_subset(self):
892 self.set &= set((2, 4))
893 self.assertEqual(self.set, set((2, 4)))
894
895 def test_intersection_superset(self):
896 self.set &= set([2, 4, 6, 8])
897 self.assertEqual(self.set, set([2, 4, 6]))
898
899 def test_intersection_overlap(self):
900 self.set &= set([3, 4, 5])
901 self.assertEqual(self.set, set([4]))
902
903 def test_intersection_non_overlap(self):
904 self.set &= set([8])
905 self.assertEqual(self.set, empty_set)
906
907 def test_intersection_method_call(self):
908 self.set.intersection_update(set([3, 4, 5]))
909 self.assertEqual(self.set, set([4]))
910
911 def test_sym_difference_subset(self):
912 self.set ^= set((2, 4))
913 self.assertEqual(self.set, set([6]))
914
915 def test_sym_difference_superset(self):
916 self.set ^= set((2, 4, 6, 8))
917 self.assertEqual(self.set, set([8]))
918
919 def test_sym_difference_overlap(self):
920 self.set ^= set((3, 4, 5))
921 self.assertEqual(self.set, set([2, 3, 5, 6]))
922
923 def test_sym_difference_non_overlap(self):
924 self.set ^= set([8])
925 self.assertEqual(self.set, set([2, 4, 6, 8]))
926
927 def test_sym_difference_method_call(self):
928 self.set.symmetric_difference_update(set([3, 4, 5]))
929 self.assertEqual(self.set, set([2, 3, 5, 6]))
930
931 def test_difference_subset(self):
932 self.set -= set((2, 4))
933 self.assertEqual(self.set, set([6]))
934
935 def test_difference_superset(self):
936 self.set -= set((2, 4, 6, 8))
937 self.assertEqual(self.set, set([]))
938
939 def test_difference_overlap(self):
940 self.set -= set((3, 4, 5))
941 self.assertEqual(self.set, set([2, 6]))
942
943 def test_difference_non_overlap(self):
944 self.set -= set([8])
945 self.assertEqual(self.set, set([2, 4, 6]))
946
947 def test_difference_method_call(self):
948 self.set.difference_update(set([3, 4, 5]))
949 self.assertEqual(self.set, set([2, 6]))
950
951#==============================================================================
952
953class TestMutate(unittest.TestCase):
954 def setUp(self):
955 self.values = ["a", "b", "c"]
956 self.set = set(self.values)
957
958 def test_add_present(self):
959 self.set.add("c")
960 self.assertEqual(self.set, set("abc"))
961
962 def test_add_absent(self):
963 self.set.add("d")
964 self.assertEqual(self.set, set("abcd"))
965
966 def test_add_until_full(self):
967 tmp = set()
968 expected_len = 0
969 for v in self.values:
970 tmp.add(v)
971 expected_len += 1
972 self.assertEqual(len(tmp), expected_len)
973 self.assertEqual(tmp, self.set)
974
975 def test_remove_present(self):
976 self.set.remove("b")
977 self.assertEqual(self.set, set("ac"))
978
979 def test_remove_absent(self):
980 try:
981 self.set.remove("d")
982 self.fail("Removing missing element should have raised LookupError")
983 except LookupError:
984 pass
985
986 def test_remove_until_empty(self):
987 expected_len = len(self.set)
988 for v in self.values:
989 self.set.remove(v)
990 expected_len -= 1
991 self.assertEqual(len(self.set), expected_len)
992
993 def test_discard_present(self):
994 self.set.discard("c")
995 self.assertEqual(self.set, set("ab"))
996
997 def test_discard_absent(self):
998 self.set.discard("d")
999 self.assertEqual(self.set, set("abc"))
1000
1001 def test_clear(self):
1002 self.set.clear()
1003 self.assertEqual(len(self.set), 0)
1004
1005 def test_pop(self):
1006 popped = {}
1007 while self.set:
1008 popped[self.set.pop()] = None
1009 self.assertEqual(len(popped), len(self.values))
1010 for v in self.values:
1011 self.failUnless(v in popped)
1012
1013 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001014 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001015 self.assertEqual(self.set, set(self.values))
1016
1017 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001018 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001019 self.assertEqual(self.set, set(self.values))
1020
1021 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001022 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001023 self.assertEqual(self.set, set(self.values + ["z"]))
1024
1025#==============================================================================
1026
1027class TestSubsets(unittest.TestCase):
1028
1029 case2method = {"<=": "issubset",
1030 ">=": "issuperset",
1031 }
1032
1033 reverse = {"==": "==",
1034 "!=": "!=",
1035 "<": ">",
1036 ">": "<",
1037 "<=": ">=",
1038 ">=": "<=",
1039 }
1040
1041 def test_issubset(self):
1042 x = self.left
1043 y = self.right
1044 for case in "!=", "==", "<", "<=", ">", ">=":
1045 expected = case in self.cases
1046 # Test the binary infix spelling.
1047 result = eval("x" + case + "y", locals())
1048 self.assertEqual(result, expected)
1049 # Test the "friendly" method-name spelling, if one exists.
1050 if case in TestSubsets.case2method:
1051 method = getattr(x, TestSubsets.case2method[case])
1052 result = method(y)
1053 self.assertEqual(result, expected)
1054
1055 # Now do the same for the operands reversed.
1056 rcase = TestSubsets.reverse[case]
1057 result = eval("y" + rcase + "x", locals())
1058 self.assertEqual(result, expected)
1059 if rcase in TestSubsets.case2method:
1060 method = getattr(y, TestSubsets.case2method[rcase])
1061 result = method(x)
1062 self.assertEqual(result, expected)
1063#------------------------------------------------------------------------------
1064
1065class TestSubsetEqualEmpty(TestSubsets):
1066 left = set()
1067 right = set()
1068 name = "both empty"
1069 cases = "==", "<=", ">="
1070
1071#------------------------------------------------------------------------------
1072
1073class TestSubsetEqualNonEmpty(TestSubsets):
1074 left = set([1, 2])
1075 right = set([1, 2])
1076 name = "equal pair"
1077 cases = "==", "<=", ">="
1078
1079#------------------------------------------------------------------------------
1080
1081class TestSubsetEmptyNonEmpty(TestSubsets):
1082 left = set()
1083 right = set([1, 2])
1084 name = "one empty, one non-empty"
1085 cases = "!=", "<", "<="
1086
1087#------------------------------------------------------------------------------
1088
1089class TestSubsetPartial(TestSubsets):
1090 left = set([1])
1091 right = set([1, 2])
1092 name = "one a non-empty proper subset of other"
1093 cases = "!=", "<", "<="
1094
1095#------------------------------------------------------------------------------
1096
1097class TestSubsetNonOverlap(TestSubsets):
1098 left = set([1])
1099 right = set([2])
1100 name = "neither empty, neither contains"
1101 cases = "!="
1102
1103#==============================================================================
1104
1105class TestOnlySetsInBinaryOps(unittest.TestCase):
1106
1107 def test_eq_ne(self):
1108 # Unlike the others, this is testing that == and != *are* allowed.
1109 self.assertEqual(self.other == self.set, False)
1110 self.assertEqual(self.set == self.other, False)
1111 self.assertEqual(self.other != self.set, True)
1112 self.assertEqual(self.set != self.other, True)
1113
1114 def test_ge_gt_le_lt(self):
1115 self.assertRaises(TypeError, lambda: self.set < self.other)
1116 self.assertRaises(TypeError, lambda: self.set <= self.other)
1117 self.assertRaises(TypeError, lambda: self.set > self.other)
1118 self.assertRaises(TypeError, lambda: self.set >= self.other)
1119
1120 self.assertRaises(TypeError, lambda: self.other < self.set)
1121 self.assertRaises(TypeError, lambda: self.other <= self.set)
1122 self.assertRaises(TypeError, lambda: self.other > self.set)
1123 self.assertRaises(TypeError, lambda: self.other >= self.set)
1124
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001125 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001126 try:
1127 self.set |= self.other
1128 except TypeError:
1129 pass
1130 else:
1131 self.fail("expected TypeError")
1132
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001133 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001134 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001135 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001136 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001137 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001138
1139 def test_union(self):
1140 self.assertRaises(TypeError, lambda: self.set | self.other)
1141 self.assertRaises(TypeError, lambda: self.other | self.set)
1142 if self.otherIsIterable:
1143 self.set.union(self.other)
1144 else:
1145 self.assertRaises(TypeError, self.set.union, self.other)
1146
1147 def test_intersection_update_operator(self):
1148 try:
1149 self.set &= self.other
1150 except TypeError:
1151 pass
1152 else:
1153 self.fail("expected TypeError")
1154
1155 def test_intersection_update(self):
1156 if self.otherIsIterable:
1157 self.set.intersection_update(self.other)
1158 else:
1159 self.assertRaises(TypeError,
1160 self.set.intersection_update,
1161 self.other)
1162
1163 def test_intersection(self):
1164 self.assertRaises(TypeError, lambda: self.set & self.other)
1165 self.assertRaises(TypeError, lambda: self.other & self.set)
1166 if self.otherIsIterable:
1167 self.set.intersection(self.other)
1168 else:
1169 self.assertRaises(TypeError, self.set.intersection, self.other)
1170
1171 def test_sym_difference_update_operator(self):
1172 try:
1173 self.set ^= self.other
1174 except TypeError:
1175 pass
1176 else:
1177 self.fail("expected TypeError")
1178
1179 def test_sym_difference_update(self):
1180 if self.otherIsIterable:
1181 self.set.symmetric_difference_update(self.other)
1182 else:
1183 self.assertRaises(TypeError,
1184 self.set.symmetric_difference_update,
1185 self.other)
1186
1187 def test_sym_difference(self):
1188 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1189 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1190 if self.otherIsIterable:
1191 self.set.symmetric_difference(self.other)
1192 else:
1193 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1194
1195 def test_difference_update_operator(self):
1196 try:
1197 self.set -= self.other
1198 except TypeError:
1199 pass
1200 else:
1201 self.fail("expected TypeError")
1202
1203 def test_difference_update(self):
1204 if self.otherIsIterable:
1205 self.set.difference_update(self.other)
1206 else:
1207 self.assertRaises(TypeError,
1208 self.set.difference_update,
1209 self.other)
1210
1211 def test_difference(self):
1212 self.assertRaises(TypeError, lambda: self.set - self.other)
1213 self.assertRaises(TypeError, lambda: self.other - self.set)
1214 if self.otherIsIterable:
1215 self.set.difference(self.other)
1216 else:
1217 self.assertRaises(TypeError, self.set.difference, self.other)
1218
1219#------------------------------------------------------------------------------
1220
1221class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1222 def setUp(self):
1223 self.set = set((1, 2, 3))
1224 self.other = 19
1225 self.otherIsIterable = False
1226
1227#------------------------------------------------------------------------------
1228
1229class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1230 def setUp(self):
1231 self.set = set((1, 2, 3))
1232 self.other = {1:2, 3:4}
1233 self.otherIsIterable = True
1234
1235#------------------------------------------------------------------------------
1236
1237class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1238 def setUp(self):
1239 self.set = set((1, 2, 3))
1240 self.other = operator.add
1241 self.otherIsIterable = False
1242
1243#------------------------------------------------------------------------------
1244
1245class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1246 def setUp(self):
1247 self.set = set((1, 2, 3))
1248 self.other = (2, 4, 6)
1249 self.otherIsIterable = True
1250
1251#------------------------------------------------------------------------------
1252
1253class TestOnlySetsString(TestOnlySetsInBinaryOps):
1254 def setUp(self):
1255 self.set = set((1, 2, 3))
1256 self.other = 'abc'
1257 self.otherIsIterable = True
1258
1259#------------------------------------------------------------------------------
1260
1261class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1262 def setUp(self):
1263 def gen():
1264 for i in xrange(0, 10, 2):
1265 yield i
1266 self.set = set((1, 2, 3))
1267 self.other = gen()
1268 self.otherIsIterable = True
1269
1270#==============================================================================
1271
1272class TestCopying(unittest.TestCase):
1273
1274 def test_copy(self):
1275 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001276 dup_list = sorted(dup, key=repr)
1277 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001278 self.assertEqual(len(dup_list), len(set_list))
1279 for i in range(len(dup_list)):
1280 self.failUnless(dup_list[i] is set_list[i])
1281
1282 def test_deep_copy(self):
1283 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001284 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001285 dup_list = sorted(dup, key=repr)
1286 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001287 self.assertEqual(len(dup_list), len(set_list))
1288 for i in range(len(dup_list)):
1289 self.assertEqual(dup_list[i], set_list[i])
1290
1291#------------------------------------------------------------------------------
1292
1293class TestCopyingEmpty(TestCopying):
1294 def setUp(self):
1295 self.set = set()
1296
1297#------------------------------------------------------------------------------
1298
1299class TestCopyingSingleton(TestCopying):
1300 def setUp(self):
1301 self.set = set(["hello"])
1302
1303#------------------------------------------------------------------------------
1304
1305class TestCopyingTriple(TestCopying):
1306 def setUp(self):
1307 self.set = set(["zero", 0, None])
1308
1309#------------------------------------------------------------------------------
1310
1311class TestCopyingTuple(TestCopying):
1312 def setUp(self):
1313 self.set = set([(1, 2)])
1314
1315#------------------------------------------------------------------------------
1316
1317class TestCopyingNested(TestCopying):
1318 def setUp(self):
1319 self.set = set([((1, 2), (3, 4))])
1320
1321#==============================================================================
1322
1323class TestIdentities(unittest.TestCase):
1324 def setUp(self):
1325 self.a = set('abracadabra')
1326 self.b = set('alacazam')
1327
1328 def test_binopsVsSubsets(self):
1329 a, b = self.a, self.b
1330 self.assert_(a - b < a)
1331 self.assert_(b - a < b)
1332 self.assert_(a & b < a)
1333 self.assert_(a & b < b)
1334 self.assert_(a | b > a)
1335 self.assert_(a | b > b)
1336 self.assert_(a ^ b < a | b)
1337
1338 def test_commutativity(self):
1339 a, b = self.a, self.b
1340 self.assertEqual(a&b, b&a)
1341 self.assertEqual(a|b, b|a)
1342 self.assertEqual(a^b, b^a)
1343 if a != b:
1344 self.assertNotEqual(a-b, b-a)
1345
1346 def test_summations(self):
1347 # check that sums of parts equal the whole
1348 a, b = self.a, self.b
1349 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1350 self.assertEqual((a&b)|(a^b), a|b)
1351 self.assertEqual(a|(b-a), a|b)
1352 self.assertEqual((a-b)|b, a|b)
1353 self.assertEqual((a-b)|(a&b), a)
1354 self.assertEqual((b-a)|(a&b), b)
1355 self.assertEqual((a-b)|(b-a), a^b)
1356
1357 def test_exclusion(self):
1358 # check that inverse operations show non-overlap
1359 a, b, zero = self.a, self.b, set()
1360 self.assertEqual((a-b)&b, zero)
1361 self.assertEqual((b-a)&a, zero)
1362 self.assertEqual((a&b)&(a^b), zero)
1363
1364# Tests derived from test_itertools.py =======================================
1365
1366def R(seqn):
1367 'Regular generator'
1368 for i in seqn:
1369 yield i
1370
1371class G:
1372 'Sequence using __getitem__'
1373 def __init__(self, seqn):
1374 self.seqn = seqn
1375 def __getitem__(self, i):
1376 return self.seqn[i]
1377
1378class I:
1379 'Sequence using iterator protocol'
1380 def __init__(self, seqn):
1381 self.seqn = seqn
1382 self.i = 0
1383 def __iter__(self):
1384 return self
1385 def next(self):
1386 if self.i >= len(self.seqn): raise StopIteration
1387 v = self.seqn[self.i]
1388 self.i += 1
1389 return v
1390
1391class Ig:
1392 'Sequence using iterator protocol defined with a generator'
1393 def __init__(self, seqn):
1394 self.seqn = seqn
1395 self.i = 0
1396 def __iter__(self):
1397 for val in self.seqn:
1398 yield val
1399
1400class X:
1401 'Missing __getitem__ and __iter__'
1402 def __init__(self, seqn):
1403 self.seqn = seqn
1404 self.i = 0
1405 def next(self):
1406 if self.i >= len(self.seqn): raise StopIteration
1407 v = self.seqn[self.i]
1408 self.i += 1
1409 return v
1410
1411class N:
1412 'Iterator missing next()'
1413 def __init__(self, seqn):
1414 self.seqn = seqn
1415 self.i = 0
1416 def __iter__(self):
1417 return self
1418
1419class E:
1420 'Test propagation of exceptions'
1421 def __init__(self, seqn):
1422 self.seqn = seqn
1423 self.i = 0
1424 def __iter__(self):
1425 return self
1426 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001427 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001428
1429class S:
1430 'Test immediate stop'
1431 def __init__(self, seqn):
1432 pass
1433 def __iter__(self):
1434 return self
1435 def next(self):
1436 raise StopIteration
1437
1438from itertools import chain, imap
1439def L(seqn):
1440 'Test multiple tiers of iterators'
1441 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1442
1443class TestVariousIteratorArgs(unittest.TestCase):
1444
1445 def test_constructor(self):
1446 for cons in (set, frozenset):
1447 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1448 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001449 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001450 self.assertRaises(TypeError, cons , X(s))
1451 self.assertRaises(TypeError, cons , N(s))
1452 self.assertRaises(ZeroDivisionError, cons , E(s))
1453
1454 def test_inline_methods(self):
1455 s = set('november')
1456 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1457 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1458 for g in (G, I, Ig, L, R):
1459 expected = meth(data)
1460 actual = meth(G(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001461 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001462 self.assertRaises(TypeError, meth, X(s))
1463 self.assertRaises(TypeError, meth, N(s))
1464 self.assertRaises(ZeroDivisionError, meth, E(s))
1465
1466 def test_inplace_methods(self):
1467 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001468 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001469 'difference_update', 'symmetric_difference_update'):
1470 for g in (G, I, Ig, S, L, R):
1471 s = set('january')
1472 t = s.copy()
1473 getattr(s, methname)(list(g(data)))
1474 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001475 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001476
1477 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1478 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1479 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1480
1481#==============================================================================
1482
1483def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001484 test_classes = (
1485 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001486 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001487 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001488 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001489 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001490 TestSetOfSets,
1491 TestExceptionPropagation,
1492 TestBasicOpsEmpty,
1493 TestBasicOpsSingleton,
1494 TestBasicOpsTuple,
1495 TestBasicOpsTriple,
1496 TestBinaryOps,
1497 TestUpdateOps,
1498 TestMutate,
1499 TestSubsetEqualEmpty,
1500 TestSubsetEqualNonEmpty,
1501 TestSubsetEmptyNonEmpty,
1502 TestSubsetPartial,
1503 TestSubsetNonOverlap,
1504 TestOnlySetsNumeric,
1505 TestOnlySetsDict,
1506 TestOnlySetsOperator,
1507 TestOnlySetsTuple,
1508 TestOnlySetsString,
1509 TestOnlySetsGenerator,
1510 TestCopyingEmpty,
1511 TestCopyingSingleton,
1512 TestCopyingTriple,
1513 TestCopyingTuple,
1514 TestCopyingNested,
1515 TestIdentities,
1516 TestVariousIteratorArgs,
1517 )
1518
1519 test_support.run_unittest(*test_classes)
1520
1521 # verify reference counting
1522 if verbose and hasattr(sys, "gettotalrefcount"):
1523 import gc
1524 counts = [None] * 5
1525 for i in xrange(len(counts)):
1526 test_support.run_unittest(*test_classes)
1527 gc.collect()
1528 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001529 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001530
1531if __name__ == "__main__":
1532 test_main(verbose=True)