blob: 28924d49dd24d40c4e75b55fba071c421ce99cac [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 Hettingerd6fc72a2007-02-19 02:03:19 +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):
Tim Peters6902b442006-04-11 00:43:27 +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
Raymond Hettinger53999102006-12-30 04:01:17 +0000260 def test_cyclical_repr(self):
261 w = ReprWrapper()
262 s = self.thetype([w])
263 w.value = s
264 name = repr(s).partition('(')[0] # strip class name from repr string
265 self.assertEqual(repr(s), '%s([%s(...)])' % (name, name))
266
267 def test_cyclical_print(self):
268 w = ReprWrapper()
269 s = self.thetype([w])
270 w.value = s
271 try:
272 fo = open(test_support.TESTFN, "wb")
273 print >> fo, s,
274 fo.close()
275 fo = open(test_support.TESTFN, "rb")
276 self.assertEqual(fo.read(), repr(s))
277 finally:
278 fo.close()
279 os.remove(test_support.TESTFN)
280
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000281 def test_do_not_rehash_dict_keys(self):
282 n = 10
283 d = dict.fromkeys(map(HashCountingInt, xrange(n)))
284 self.assertEqual(sum(elem.hash_count for elem in d), n)
285 s = self.thetype(d)
286 self.assertEqual(sum(elem.hash_count for elem in d), n)
287 s.difference(d)
Tim Petersea5962f2007-03-12 18:07:52 +0000288 self.assertEqual(sum(elem.hash_count for elem in d), n)
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000289 if hasattr(s, 'symmetric_difference_update'):
290 s.symmetric_difference_update(d)
Tim Petersea5962f2007-03-12 18:07:52 +0000291 self.assertEqual(sum(elem.hash_count for elem in d), n)
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000292
Raymond Hettingera690a992003-11-16 16:17:49 +0000293class TestSet(TestJointOps):
294 thetype = set
295
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000296 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000297 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000298 s.__init__(self.word)
299 self.assertEqual(s, set(self.word))
300 s.__init__(self.otherword)
301 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000302 self.assertRaises(TypeError, s.__init__, s, 2);
303 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000304
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000305 def test_constructor_identity(self):
306 s = self.thetype(range(3))
307 t = self.thetype(s)
308 self.assertNotEqual(id(s), id(t))
309
Raymond Hettingera690a992003-11-16 16:17:49 +0000310 def test_hash(self):
311 self.assertRaises(TypeError, hash, self.s)
312
313 def test_clear(self):
314 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000315 self.assertEqual(self.s, set())
316 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000317
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000318 def test_copy(self):
319 dup = self.s.copy()
320 self.assertEqual(self.s, dup)
321 self.assertNotEqual(id(self.s), id(dup))
322
Raymond Hettingera690a992003-11-16 16:17:49 +0000323 def test_add(self):
324 self.s.add('Q')
325 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000326 dup = self.s.copy()
327 self.s.add('Q')
328 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000329 self.assertRaises(TypeError, self.s.add, [])
330
331 def test_remove(self):
332 self.s.remove('a')
333 self.assert_('a' not in self.s)
334 self.assertRaises(KeyError, self.s.remove, 'Q')
335 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000336 s = self.thetype([frozenset(self.word)])
337 self.assert_(self.thetype(self.word) in s)
338 s.remove(self.thetype(self.word))
339 self.assert_(self.thetype(self.word) not in s)
340 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000341
Raymond Hettingerc789f342006-12-08 17:35:25 +0000342 def test_remove_keyerror_unpacking(self):
343 # bug: www.python.org/sf/1576657
344 for v1 in ['Q', (1,)]:
345 try:
346 self.s.remove(v1)
347 except KeyError, e:
348 v2 = e.args[0]
349 self.assertEqual(v1, v2)
350 else:
351 self.fail()
352
Raymond Hettingera690a992003-11-16 16:17:49 +0000353 def test_discard(self):
354 self.s.discard('a')
355 self.assert_('a' not in self.s)
356 self.s.discard('Q')
357 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000358 s = self.thetype([frozenset(self.word)])
359 self.assert_(self.thetype(self.word) in s)
360 s.discard(self.thetype(self.word))
361 self.assert_(self.thetype(self.word) not in s)
362 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000363
364 def test_pop(self):
365 for i in xrange(len(self.s)):
366 elem = self.s.pop()
367 self.assert_(elem not in self.s)
368 self.assertRaises(KeyError, self.s.pop)
369
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000370 def test_update(self):
371 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000372 self.assertEqual(retval, None)
373 for c in (self.word + self.otherword):
374 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000375 self.assertRaises(PassThru, self.s.update, check_pass_thru())
376 self.assertRaises(TypeError, self.s.update, [[]])
377 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
378 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
379 s = self.thetype('abcba')
380 self.assertEqual(s.update(C(p)), None)
381 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000382
383 def test_ior(self):
384 self.s |= set(self.otherword)
385 for c in (self.word + self.otherword):
386 self.assert_(c in self.s)
387
388 def test_intersection_update(self):
389 retval = self.s.intersection_update(self.otherword)
390 self.assertEqual(retval, None)
391 for c in (self.word + self.otherword):
392 if c in self.otherword and c in self.word:
393 self.assert_(c in self.s)
394 else:
395 self.assert_(c not in self.s)
396 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
397 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000398 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
399 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
400 s = self.thetype('abcba')
401 self.assertEqual(s.intersection_update(C(p)), None)
402 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000403
404 def test_iand(self):
405 self.s &= set(self.otherword)
406 for c in (self.word + self.otherword):
407 if c in self.otherword and c in self.word:
408 self.assert_(c in self.s)
409 else:
410 self.assert_(c not in self.s)
411
412 def test_difference_update(self):
413 retval = self.s.difference_update(self.otherword)
414 self.assertEqual(retval, None)
415 for c in (self.word + self.otherword):
416 if c in self.word and c not in self.otherword:
417 self.assert_(c in self.s)
418 else:
419 self.assert_(c not in self.s)
420 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
421 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000422 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
423 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
424 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
425 s = self.thetype('abcba')
426 self.assertEqual(s.difference_update(C(p)), None)
427 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000428
429 def test_isub(self):
430 self.s -= set(self.otherword)
431 for c in (self.word + self.otherword):
432 if c in self.word and c not in self.otherword:
433 self.assert_(c in self.s)
434 else:
435 self.assert_(c not in self.s)
436
437 def test_symmetric_difference_update(self):
438 retval = self.s.symmetric_difference_update(self.otherword)
439 self.assertEqual(retval, None)
440 for c in (self.word + self.otherword):
441 if (c in self.word) ^ (c in self.otherword):
442 self.assert_(c in self.s)
443 else:
444 self.assert_(c not in self.s)
445 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
446 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000447 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
448 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
449 s = self.thetype('abcba')
450 self.assertEqual(s.symmetric_difference_update(C(p)), None)
451 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000452
453 def test_ixor(self):
454 self.s ^= set(self.otherword)
455 for c in (self.word + self.otherword):
456 if (c in self.word) ^ (c in self.otherword):
457 self.assert_(c in self.s)
458 else:
459 self.assert_(c not in self.s)
460
Raymond Hettingerc991db22005-08-11 07:58:45 +0000461 def test_inplace_on_self(self):
462 t = self.s.copy()
463 t |= t
464 self.assertEqual(t, self.s)
465 t &= t
466 self.assertEqual(t, self.s)
467 t -= t
468 self.assertEqual(t, self.thetype())
469 t = self.s.copy()
470 t ^= t
471 self.assertEqual(t, self.thetype())
472
Raymond Hettinger691d8052004-05-30 07:26:47 +0000473 def test_weakref(self):
474 s = self.thetype('gallahad')
475 p = proxy(s)
476 self.assertEqual(str(p), str(s))
477 s = None
478 self.assertRaises(ReferenceError, str, p)
479
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000480 # C API test only available in a debug build
Barry Warsaw176014f2006-03-30 22:45:35 +0000481 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000482 def test_c_api(self):
483 self.assertEqual(set('abc').test_c_api(), True)
484
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000485class SetSubclass(set):
486 pass
487
488class TestSetSubclass(TestSet):
489 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000490
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +0000491class SetSubclassWithKeywordArgs(set):
492 def __init__(self, iterable=[], newarg=None):
493 set.__init__(self, iterable)
494
495class TestSetSubclassWithKeywordArgs(TestSet):
Tim Petersf733abb2007-01-30 03:03:46 +0000496
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +0000497 def test_keywords_in_subclass(self):
498 'SF bug #1486663 -- this used to erroneously raise a TypeError'
499 SetSubclassWithKeywordArgs(newarg=1)
500
Raymond Hettingera690a992003-11-16 16:17:49 +0000501class TestFrozenSet(TestJointOps):
502 thetype = frozenset
503
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000504 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000505 s = self.thetype(self.word)
506 s.__init__(self.otherword)
507 self.assertEqual(s, set(self.word))
508
Raymond Hettingerd7946662005-08-01 21:39:29 +0000509 def test_singleton_empty_frozenset(self):
510 f = frozenset()
511 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
512 frozenset(), frozenset([]), frozenset(()), frozenset(''),
513 frozenset(xrange(0)), frozenset(frozenset()),
514 frozenset(f), f]
515 # All of the empty frozensets should have just one id()
516 self.assertEqual(len(set(map(id, efs))), 1)
517
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000518 def test_constructor_identity(self):
519 s = self.thetype(range(3))
520 t = self.thetype(s)
521 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000522
Raymond Hettingera690a992003-11-16 16:17:49 +0000523 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000524 self.assertEqual(hash(self.thetype('abcdeb')),
525 hash(self.thetype('ebecda')))
526
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000527 # make sure that all permutations give the same hash value
528 n = 100
529 seq = [randrange(n) for i in xrange(n)]
530 results = set()
531 for i in xrange(200):
532 shuffle(seq)
533 results.add(hash(self.thetype(seq)))
534 self.assertEqual(len(results), 1)
535
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000536 def test_copy(self):
537 dup = self.s.copy()
538 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000539
540 def test_frozen_as_dictkey(self):
541 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000542 key1 = self.thetype(seq)
543 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000544 self.assertEqual(key1, key2)
545 self.assertNotEqual(id(key1), id(key2))
546 d = {}
547 d[key1] = 42
548 self.assertEqual(d[key2], 42)
549
550 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000551 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000552 self.assertEqual(hash(f), hash(f))
553
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000554 def test_hash_effectiveness(self):
555 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000556 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000557 addhashvalue = hashvalues.add
558 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000559 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000560 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
561 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000562
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000563class FrozenSetSubclass(frozenset):
564 pass
565
566class TestFrozenSetSubclass(TestFrozenSet):
567 thetype = FrozenSetSubclass
568
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000569 def test_constructor_identity(self):
570 s = self.thetype(range(3))
571 t = self.thetype(s)
572 self.assertNotEqual(id(s), id(t))
573
574 def test_copy(self):
575 dup = self.s.copy()
576 self.assertNotEqual(id(self.s), id(dup))
577
578 def test_nested_empty_constructor(self):
579 s = self.thetype()
580 t = self.thetype(s)
581 self.assertEqual(s, t)
582
Raymond Hettingerd7946662005-08-01 21:39:29 +0000583 def test_singleton_empty_frozenset(self):
584 Frozenset = self.thetype
585 f = frozenset()
586 F = Frozenset()
587 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
588 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
589 Frozenset(xrange(0)), Frozenset(Frozenset()),
590 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
591 # All empty frozenset subclass instances should have different ids
592 self.assertEqual(len(set(map(id, efs))), len(efs))
593
Raymond Hettingera690a992003-11-16 16:17:49 +0000594# Tests taken from test_sets.py =============================================
595
596empty_set = set()
597
598#==============================================================================
599
600class TestBasicOps(unittest.TestCase):
601
602 def test_repr(self):
603 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000604 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000605
Raymond Hettingereae05de2004-07-09 04:51:24 +0000606 def test_print(self):
607 try:
608 fo = open(test_support.TESTFN, "wb")
609 print >> fo, self.set,
610 fo.close()
611 fo = open(test_support.TESTFN, "rb")
612 self.assertEqual(fo.read(), repr(self.set))
613 finally:
614 fo.close()
615 os.remove(test_support.TESTFN)
616
Raymond Hettingera690a992003-11-16 16:17:49 +0000617 def test_length(self):
618 self.assertEqual(len(self.set), self.length)
619
620 def test_self_equality(self):
621 self.assertEqual(self.set, self.set)
622
623 def test_equivalent_equality(self):
624 self.assertEqual(self.set, self.dup)
625
626 def test_copy(self):
627 self.assertEqual(self.set.copy(), self.dup)
628
629 def test_self_union(self):
630 result = self.set | self.set
631 self.assertEqual(result, self.dup)
632
633 def test_empty_union(self):
634 result = self.set | empty_set
635 self.assertEqual(result, self.dup)
636
637 def test_union_empty(self):
638 result = empty_set | self.set
639 self.assertEqual(result, self.dup)
640
641 def test_self_intersection(self):
642 result = self.set & self.set
643 self.assertEqual(result, self.dup)
644
645 def test_empty_intersection(self):
646 result = self.set & empty_set
647 self.assertEqual(result, empty_set)
648
649 def test_intersection_empty(self):
650 result = empty_set & self.set
651 self.assertEqual(result, empty_set)
652
653 def test_self_symmetric_difference(self):
654 result = self.set ^ self.set
655 self.assertEqual(result, empty_set)
656
657 def checkempty_symmetric_difference(self):
658 result = self.set ^ empty_set
659 self.assertEqual(result, self.set)
660
661 def test_self_difference(self):
662 result = self.set - self.set
663 self.assertEqual(result, empty_set)
664
665 def test_empty_difference(self):
666 result = self.set - empty_set
667 self.assertEqual(result, self.dup)
668
669 def test_empty_difference_rev(self):
670 result = empty_set - self.set
671 self.assertEqual(result, empty_set)
672
673 def test_iteration(self):
674 for v in self.set:
675 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000676 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000677 # note: __length_hint__ is an internal undocumented API,
678 # don't rely on it in your own programs
679 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000680
681 def test_pickling(self):
682 p = pickle.dumps(self.set)
683 copy = pickle.loads(p)
684 self.assertEqual(self.set, copy,
685 "%s != %s" % (self.set, copy))
686
687#------------------------------------------------------------------------------
688
689class TestBasicOpsEmpty(TestBasicOps):
690 def setUp(self):
691 self.case = "empty set"
692 self.values = []
693 self.set = set(self.values)
694 self.dup = set(self.values)
695 self.length = 0
696 self.repr = "set([])"
697
698#------------------------------------------------------------------------------
699
700class TestBasicOpsSingleton(TestBasicOps):
701 def setUp(self):
702 self.case = "unit set (number)"
703 self.values = [3]
704 self.set = set(self.values)
705 self.dup = set(self.values)
706 self.length = 1
707 self.repr = "set([3])"
708
709 def test_in(self):
710 self.failUnless(3 in self.set)
711
712 def test_not_in(self):
713 self.failUnless(2 not in self.set)
714
715#------------------------------------------------------------------------------
716
717class TestBasicOpsTuple(TestBasicOps):
718 def setUp(self):
719 self.case = "unit set (tuple)"
720 self.values = [(0, "zero")]
721 self.set = set(self.values)
722 self.dup = set(self.values)
723 self.length = 1
724 self.repr = "set([(0, 'zero')])"
725
726 def test_in(self):
727 self.failUnless((0, "zero") in self.set)
728
729 def test_not_in(self):
730 self.failUnless(9 not in self.set)
731
732#------------------------------------------------------------------------------
733
734class TestBasicOpsTriple(TestBasicOps):
735 def setUp(self):
736 self.case = "triple set"
737 self.values = [0, "zero", operator.add]
738 self.set = set(self.values)
739 self.dup = set(self.values)
740 self.length = 3
741 self.repr = None
742
743#==============================================================================
744
745def baditer():
746 raise TypeError
747 yield True
748
749def gooditer():
750 yield True
751
752class TestExceptionPropagation(unittest.TestCase):
753 """SF 628246: Set constructor should not trap iterator TypeErrors"""
754
755 def test_instanceWithException(self):
756 self.assertRaises(TypeError, set, baditer())
757
758 def test_instancesWithoutException(self):
759 # All of these iterables should load without exception.
760 set([1,2,3])
761 set((1,2,3))
762 set({'one':1, 'two':2, 'three':3})
763 set(xrange(3))
764 set('abc')
765 set(gooditer())
766
Neal Norwitzfcf44352005-11-27 20:37:43 +0000767 def test_changingSizeWhileIterating(self):
768 s = set([1,2,3])
769 try:
770 for i in s:
771 s.update([4])
772 except RuntimeError:
773 pass
774 else:
775 self.fail("no exception when changing size during iteration")
776
Raymond Hettingera690a992003-11-16 16:17:49 +0000777#==============================================================================
778
779class TestSetOfSets(unittest.TestCase):
780 def test_constructor(self):
781 inner = frozenset([1])
782 outer = set([inner])
783 element = outer.pop()
784 self.assertEqual(type(element), frozenset)
785 outer.add(inner) # Rebuild set of sets with .add method
786 outer.remove(inner)
787 self.assertEqual(outer, set()) # Verify that remove worked
788 outer.discard(inner) # Absence of KeyError indicates working fine
789
790#==============================================================================
791
792class TestBinaryOps(unittest.TestCase):
793 def setUp(self):
794 self.set = set((2, 4, 6))
795
796 def test_eq(self): # SF bug 643115
797 self.assertEqual(self.set, set({2:1,4:3,6:5}))
798
799 def test_union_subset(self):
800 result = self.set | set([2])
801 self.assertEqual(result, set((2, 4, 6)))
802
803 def test_union_superset(self):
804 result = self.set | set([2, 4, 6, 8])
805 self.assertEqual(result, set([2, 4, 6, 8]))
806
807 def test_union_overlap(self):
808 result = self.set | set([3, 4, 5])
809 self.assertEqual(result, set([2, 3, 4, 5, 6]))
810
811 def test_union_non_overlap(self):
812 result = self.set | set([8])
813 self.assertEqual(result, set([2, 4, 6, 8]))
814
815 def test_intersection_subset(self):
816 result = self.set & set((2, 4))
817 self.assertEqual(result, set((2, 4)))
818
819 def test_intersection_superset(self):
820 result = self.set & set([2, 4, 6, 8])
821 self.assertEqual(result, set([2, 4, 6]))
822
823 def test_intersection_overlap(self):
824 result = self.set & set([3, 4, 5])
825 self.assertEqual(result, set([4]))
826
827 def test_intersection_non_overlap(self):
828 result = self.set & set([8])
829 self.assertEqual(result, empty_set)
830
831 def test_sym_difference_subset(self):
832 result = self.set ^ set((2, 4))
833 self.assertEqual(result, set([6]))
834
835 def test_sym_difference_superset(self):
836 result = self.set ^ set((2, 4, 6, 8))
837 self.assertEqual(result, set([8]))
838
839 def test_sym_difference_overlap(self):
840 result = self.set ^ set((3, 4, 5))
841 self.assertEqual(result, set([2, 3, 5, 6]))
842
843 def test_sym_difference_non_overlap(self):
844 result = self.set ^ set([8])
845 self.assertEqual(result, set([2, 4, 6, 8]))
846
847 def test_cmp(self):
848 a, b = set('a'), set('b')
849 self.assertRaises(TypeError, cmp, a, b)
850
851 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
852 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
853 # which Python thinks is good enough to synthesize a cmp() result
854 # without calling __cmp__.
855 self.assertEqual(cmp(a, a), 0)
856
857 self.assertRaises(TypeError, cmp, a, 12)
858 self.assertRaises(TypeError, cmp, "abc", a)
859
860#==============================================================================
861
862class TestUpdateOps(unittest.TestCase):
863 def setUp(self):
864 self.set = set((2, 4, 6))
865
866 def test_union_subset(self):
867 self.set |= set([2])
868 self.assertEqual(self.set, set((2, 4, 6)))
869
870 def test_union_superset(self):
871 self.set |= set([2, 4, 6, 8])
872 self.assertEqual(self.set, set([2, 4, 6, 8]))
873
874 def test_union_overlap(self):
875 self.set |= set([3, 4, 5])
876 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
877
878 def test_union_non_overlap(self):
879 self.set |= set([8])
880 self.assertEqual(self.set, set([2, 4, 6, 8]))
881
882 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000883 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000884 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
885
886 def test_intersection_subset(self):
887 self.set &= set((2, 4))
888 self.assertEqual(self.set, set((2, 4)))
889
890 def test_intersection_superset(self):
891 self.set &= set([2, 4, 6, 8])
892 self.assertEqual(self.set, set([2, 4, 6]))
893
894 def test_intersection_overlap(self):
895 self.set &= set([3, 4, 5])
896 self.assertEqual(self.set, set([4]))
897
898 def test_intersection_non_overlap(self):
899 self.set &= set([8])
900 self.assertEqual(self.set, empty_set)
901
902 def test_intersection_method_call(self):
903 self.set.intersection_update(set([3, 4, 5]))
904 self.assertEqual(self.set, set([4]))
905
906 def test_sym_difference_subset(self):
907 self.set ^= set((2, 4))
908 self.assertEqual(self.set, set([6]))
909
910 def test_sym_difference_superset(self):
911 self.set ^= set((2, 4, 6, 8))
912 self.assertEqual(self.set, set([8]))
913
914 def test_sym_difference_overlap(self):
915 self.set ^= set((3, 4, 5))
916 self.assertEqual(self.set, set([2, 3, 5, 6]))
917
918 def test_sym_difference_non_overlap(self):
919 self.set ^= set([8])
920 self.assertEqual(self.set, set([2, 4, 6, 8]))
921
922 def test_sym_difference_method_call(self):
923 self.set.symmetric_difference_update(set([3, 4, 5]))
924 self.assertEqual(self.set, set([2, 3, 5, 6]))
925
926 def test_difference_subset(self):
927 self.set -= set((2, 4))
928 self.assertEqual(self.set, set([6]))
929
930 def test_difference_superset(self):
931 self.set -= set((2, 4, 6, 8))
932 self.assertEqual(self.set, set([]))
933
934 def test_difference_overlap(self):
935 self.set -= set((3, 4, 5))
936 self.assertEqual(self.set, set([2, 6]))
937
938 def test_difference_non_overlap(self):
939 self.set -= set([8])
940 self.assertEqual(self.set, set([2, 4, 6]))
941
942 def test_difference_method_call(self):
943 self.set.difference_update(set([3, 4, 5]))
944 self.assertEqual(self.set, set([2, 6]))
945
946#==============================================================================
947
948class TestMutate(unittest.TestCase):
949 def setUp(self):
950 self.values = ["a", "b", "c"]
951 self.set = set(self.values)
952
953 def test_add_present(self):
954 self.set.add("c")
955 self.assertEqual(self.set, set("abc"))
956
957 def test_add_absent(self):
958 self.set.add("d")
959 self.assertEqual(self.set, set("abcd"))
960
961 def test_add_until_full(self):
962 tmp = set()
963 expected_len = 0
964 for v in self.values:
965 tmp.add(v)
966 expected_len += 1
967 self.assertEqual(len(tmp), expected_len)
968 self.assertEqual(tmp, self.set)
969
970 def test_remove_present(self):
971 self.set.remove("b")
972 self.assertEqual(self.set, set("ac"))
973
974 def test_remove_absent(self):
975 try:
976 self.set.remove("d")
977 self.fail("Removing missing element should have raised LookupError")
978 except LookupError:
979 pass
980
981 def test_remove_until_empty(self):
982 expected_len = len(self.set)
983 for v in self.values:
984 self.set.remove(v)
985 expected_len -= 1
986 self.assertEqual(len(self.set), expected_len)
987
988 def test_discard_present(self):
989 self.set.discard("c")
990 self.assertEqual(self.set, set("ab"))
991
992 def test_discard_absent(self):
993 self.set.discard("d")
994 self.assertEqual(self.set, set("abc"))
995
996 def test_clear(self):
997 self.set.clear()
998 self.assertEqual(len(self.set), 0)
999
1000 def test_pop(self):
1001 popped = {}
1002 while self.set:
1003 popped[self.set.pop()] = None
1004 self.assertEqual(len(popped), len(self.values))
1005 for v in self.values:
1006 self.failUnless(v in popped)
1007
1008 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001009 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001010 self.assertEqual(self.set, set(self.values))
1011
1012 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001013 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001014 self.assertEqual(self.set, set(self.values))
1015
1016 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001017 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001018 self.assertEqual(self.set, set(self.values + ["z"]))
1019
1020#==============================================================================
1021
1022class TestSubsets(unittest.TestCase):
1023
1024 case2method = {"<=": "issubset",
1025 ">=": "issuperset",
1026 }
1027
1028 reverse = {"==": "==",
1029 "!=": "!=",
1030 "<": ">",
1031 ">": "<",
1032 "<=": ">=",
1033 ">=": "<=",
1034 }
1035
1036 def test_issubset(self):
1037 x = self.left
1038 y = self.right
1039 for case in "!=", "==", "<", "<=", ">", ">=":
1040 expected = case in self.cases
1041 # Test the binary infix spelling.
1042 result = eval("x" + case + "y", locals())
1043 self.assertEqual(result, expected)
1044 # Test the "friendly" method-name spelling, if one exists.
1045 if case in TestSubsets.case2method:
1046 method = getattr(x, TestSubsets.case2method[case])
1047 result = method(y)
1048 self.assertEqual(result, expected)
1049
1050 # Now do the same for the operands reversed.
1051 rcase = TestSubsets.reverse[case]
1052 result = eval("y" + rcase + "x", locals())
1053 self.assertEqual(result, expected)
1054 if rcase in TestSubsets.case2method:
1055 method = getattr(y, TestSubsets.case2method[rcase])
1056 result = method(x)
1057 self.assertEqual(result, expected)
1058#------------------------------------------------------------------------------
1059
1060class TestSubsetEqualEmpty(TestSubsets):
1061 left = set()
1062 right = set()
1063 name = "both empty"
1064 cases = "==", "<=", ">="
1065
1066#------------------------------------------------------------------------------
1067
1068class TestSubsetEqualNonEmpty(TestSubsets):
1069 left = set([1, 2])
1070 right = set([1, 2])
1071 name = "equal pair"
1072 cases = "==", "<=", ">="
1073
1074#------------------------------------------------------------------------------
1075
1076class TestSubsetEmptyNonEmpty(TestSubsets):
1077 left = set()
1078 right = set([1, 2])
1079 name = "one empty, one non-empty"
1080 cases = "!=", "<", "<="
1081
1082#------------------------------------------------------------------------------
1083
1084class TestSubsetPartial(TestSubsets):
1085 left = set([1])
1086 right = set([1, 2])
1087 name = "one a non-empty proper subset of other"
1088 cases = "!=", "<", "<="
1089
1090#------------------------------------------------------------------------------
1091
1092class TestSubsetNonOverlap(TestSubsets):
1093 left = set([1])
1094 right = set([2])
1095 name = "neither empty, neither contains"
1096 cases = "!="
1097
1098#==============================================================================
1099
1100class TestOnlySetsInBinaryOps(unittest.TestCase):
1101
1102 def test_eq_ne(self):
1103 # Unlike the others, this is testing that == and != *are* allowed.
1104 self.assertEqual(self.other == self.set, False)
1105 self.assertEqual(self.set == self.other, False)
1106 self.assertEqual(self.other != self.set, True)
1107 self.assertEqual(self.set != self.other, True)
1108
1109 def test_ge_gt_le_lt(self):
1110 self.assertRaises(TypeError, lambda: self.set < self.other)
1111 self.assertRaises(TypeError, lambda: self.set <= self.other)
1112 self.assertRaises(TypeError, lambda: self.set > self.other)
1113 self.assertRaises(TypeError, lambda: self.set >= self.other)
1114
1115 self.assertRaises(TypeError, lambda: self.other < self.set)
1116 self.assertRaises(TypeError, lambda: self.other <= self.set)
1117 self.assertRaises(TypeError, lambda: self.other > self.set)
1118 self.assertRaises(TypeError, lambda: self.other >= self.set)
1119
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001120 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001121 try:
1122 self.set |= self.other
1123 except TypeError:
1124 pass
1125 else:
1126 self.fail("expected TypeError")
1127
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001128 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001129 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001130 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001131 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001132 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001133
1134 def test_union(self):
1135 self.assertRaises(TypeError, lambda: self.set | self.other)
1136 self.assertRaises(TypeError, lambda: self.other | self.set)
1137 if self.otherIsIterable:
1138 self.set.union(self.other)
1139 else:
1140 self.assertRaises(TypeError, self.set.union, self.other)
1141
1142 def test_intersection_update_operator(self):
1143 try:
1144 self.set &= self.other
1145 except TypeError:
1146 pass
1147 else:
1148 self.fail("expected TypeError")
1149
1150 def test_intersection_update(self):
1151 if self.otherIsIterable:
1152 self.set.intersection_update(self.other)
1153 else:
1154 self.assertRaises(TypeError,
1155 self.set.intersection_update,
1156 self.other)
1157
1158 def test_intersection(self):
1159 self.assertRaises(TypeError, lambda: self.set & self.other)
1160 self.assertRaises(TypeError, lambda: self.other & self.set)
1161 if self.otherIsIterable:
1162 self.set.intersection(self.other)
1163 else:
1164 self.assertRaises(TypeError, self.set.intersection, self.other)
1165
1166 def test_sym_difference_update_operator(self):
1167 try:
1168 self.set ^= self.other
1169 except TypeError:
1170 pass
1171 else:
1172 self.fail("expected TypeError")
1173
1174 def test_sym_difference_update(self):
1175 if self.otherIsIterable:
1176 self.set.symmetric_difference_update(self.other)
1177 else:
1178 self.assertRaises(TypeError,
1179 self.set.symmetric_difference_update,
1180 self.other)
1181
1182 def test_sym_difference(self):
1183 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1184 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1185 if self.otherIsIterable:
1186 self.set.symmetric_difference(self.other)
1187 else:
1188 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1189
1190 def test_difference_update_operator(self):
1191 try:
1192 self.set -= self.other
1193 except TypeError:
1194 pass
1195 else:
1196 self.fail("expected TypeError")
1197
1198 def test_difference_update(self):
1199 if self.otherIsIterable:
1200 self.set.difference_update(self.other)
1201 else:
1202 self.assertRaises(TypeError,
1203 self.set.difference_update,
1204 self.other)
1205
1206 def test_difference(self):
1207 self.assertRaises(TypeError, lambda: self.set - self.other)
1208 self.assertRaises(TypeError, lambda: self.other - self.set)
1209 if self.otherIsIterable:
1210 self.set.difference(self.other)
1211 else:
1212 self.assertRaises(TypeError, self.set.difference, self.other)
1213
1214#------------------------------------------------------------------------------
1215
1216class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1217 def setUp(self):
1218 self.set = set((1, 2, 3))
1219 self.other = 19
1220 self.otherIsIterable = False
1221
1222#------------------------------------------------------------------------------
1223
1224class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1225 def setUp(self):
1226 self.set = set((1, 2, 3))
1227 self.other = {1:2, 3:4}
1228 self.otherIsIterable = True
1229
1230#------------------------------------------------------------------------------
1231
1232class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1233 def setUp(self):
1234 self.set = set((1, 2, 3))
1235 self.other = operator.add
1236 self.otherIsIterable = False
1237
1238#------------------------------------------------------------------------------
1239
1240class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1241 def setUp(self):
1242 self.set = set((1, 2, 3))
1243 self.other = (2, 4, 6)
1244 self.otherIsIterable = True
1245
1246#------------------------------------------------------------------------------
1247
1248class TestOnlySetsString(TestOnlySetsInBinaryOps):
1249 def setUp(self):
1250 self.set = set((1, 2, 3))
1251 self.other = 'abc'
1252 self.otherIsIterable = True
1253
1254#------------------------------------------------------------------------------
1255
1256class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1257 def setUp(self):
1258 def gen():
1259 for i in xrange(0, 10, 2):
1260 yield i
1261 self.set = set((1, 2, 3))
1262 self.other = gen()
1263 self.otherIsIterable = True
1264
1265#==============================================================================
1266
1267class TestCopying(unittest.TestCase):
1268
1269 def test_copy(self):
1270 dup = self.set.copy()
1271 dup_list = list(dup); dup_list.sort()
1272 set_list = list(self.set); set_list.sort()
1273 self.assertEqual(len(dup_list), len(set_list))
1274 for i in range(len(dup_list)):
1275 self.failUnless(dup_list[i] is set_list[i])
1276
1277 def test_deep_copy(self):
1278 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001279 ##print type(dup), repr(dup)
Raymond Hettingera690a992003-11-16 16:17:49 +00001280 dup_list = list(dup); dup_list.sort()
1281 set_list = list(self.set); set_list.sort()
1282 self.assertEqual(len(dup_list), len(set_list))
1283 for i in range(len(dup_list)):
1284 self.assertEqual(dup_list[i], set_list[i])
1285
1286#------------------------------------------------------------------------------
1287
1288class TestCopyingEmpty(TestCopying):
1289 def setUp(self):
1290 self.set = set()
1291
1292#------------------------------------------------------------------------------
1293
1294class TestCopyingSingleton(TestCopying):
1295 def setUp(self):
1296 self.set = set(["hello"])
1297
1298#------------------------------------------------------------------------------
1299
1300class TestCopyingTriple(TestCopying):
1301 def setUp(self):
1302 self.set = set(["zero", 0, None])
1303
1304#------------------------------------------------------------------------------
1305
1306class TestCopyingTuple(TestCopying):
1307 def setUp(self):
1308 self.set = set([(1, 2)])
1309
1310#------------------------------------------------------------------------------
1311
1312class TestCopyingNested(TestCopying):
1313 def setUp(self):
1314 self.set = set([((1, 2), (3, 4))])
1315
1316#==============================================================================
1317
1318class TestIdentities(unittest.TestCase):
1319 def setUp(self):
1320 self.a = set('abracadabra')
1321 self.b = set('alacazam')
1322
1323 def test_binopsVsSubsets(self):
1324 a, b = self.a, self.b
1325 self.assert_(a - b < a)
1326 self.assert_(b - a < b)
1327 self.assert_(a & b < a)
1328 self.assert_(a & b < b)
1329 self.assert_(a | b > a)
1330 self.assert_(a | b > b)
1331 self.assert_(a ^ b < a | b)
1332
1333 def test_commutativity(self):
1334 a, b = self.a, self.b
1335 self.assertEqual(a&b, b&a)
1336 self.assertEqual(a|b, b|a)
1337 self.assertEqual(a^b, b^a)
1338 if a != b:
1339 self.assertNotEqual(a-b, b-a)
1340
1341 def test_summations(self):
1342 # check that sums of parts equal the whole
1343 a, b = self.a, self.b
1344 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1345 self.assertEqual((a&b)|(a^b), a|b)
1346 self.assertEqual(a|(b-a), a|b)
1347 self.assertEqual((a-b)|b, a|b)
1348 self.assertEqual((a-b)|(a&b), a)
1349 self.assertEqual((b-a)|(a&b), b)
1350 self.assertEqual((a-b)|(b-a), a^b)
1351
1352 def test_exclusion(self):
1353 # check that inverse operations show non-overlap
1354 a, b, zero = self.a, self.b, set()
1355 self.assertEqual((a-b)&b, zero)
1356 self.assertEqual((b-a)&a, zero)
1357 self.assertEqual((a&b)&(a^b), zero)
1358
1359# Tests derived from test_itertools.py =======================================
1360
1361def R(seqn):
1362 'Regular generator'
1363 for i in seqn:
1364 yield i
1365
1366class G:
1367 'Sequence using __getitem__'
1368 def __init__(self, seqn):
1369 self.seqn = seqn
1370 def __getitem__(self, i):
1371 return self.seqn[i]
1372
1373class I:
1374 'Sequence using iterator protocol'
1375 def __init__(self, seqn):
1376 self.seqn = seqn
1377 self.i = 0
1378 def __iter__(self):
1379 return self
1380 def next(self):
1381 if self.i >= len(self.seqn): raise StopIteration
1382 v = self.seqn[self.i]
1383 self.i += 1
1384 return v
1385
1386class Ig:
1387 'Sequence using iterator protocol defined with a generator'
1388 def __init__(self, seqn):
1389 self.seqn = seqn
1390 self.i = 0
1391 def __iter__(self):
1392 for val in self.seqn:
1393 yield val
1394
1395class X:
1396 'Missing __getitem__ and __iter__'
1397 def __init__(self, seqn):
1398 self.seqn = seqn
1399 self.i = 0
1400 def next(self):
1401 if self.i >= len(self.seqn): raise StopIteration
1402 v = self.seqn[self.i]
1403 self.i += 1
1404 return v
1405
1406class N:
1407 'Iterator missing next()'
1408 def __init__(self, seqn):
1409 self.seqn = seqn
1410 self.i = 0
1411 def __iter__(self):
1412 return self
1413
1414class E:
1415 'Test propagation of exceptions'
1416 def __init__(self, seqn):
1417 self.seqn = seqn
1418 self.i = 0
1419 def __iter__(self):
1420 return self
1421 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001422 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001423
1424class S:
1425 'Test immediate stop'
1426 def __init__(self, seqn):
1427 pass
1428 def __iter__(self):
1429 return self
1430 def next(self):
1431 raise StopIteration
1432
1433from itertools import chain, imap
1434def L(seqn):
1435 'Test multiple tiers of iterators'
1436 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1437
1438class TestVariousIteratorArgs(unittest.TestCase):
1439
1440 def test_constructor(self):
1441 for cons in (set, frozenset):
1442 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1443 for g in (G, I, Ig, S, L, R):
Raymond Hettinger64958a12003-12-17 20:43:33 +00001444 self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
Raymond Hettingera690a992003-11-16 16:17:49 +00001445 self.assertRaises(TypeError, cons , X(s))
1446 self.assertRaises(TypeError, cons , N(s))
1447 self.assertRaises(ZeroDivisionError, cons , E(s))
1448
1449 def test_inline_methods(self):
1450 s = set('november')
1451 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1452 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1453 for g in (G, I, Ig, L, R):
1454 expected = meth(data)
1455 actual = meth(G(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001456 self.assertEqual(sorted(actual), sorted(expected))
Raymond Hettingera690a992003-11-16 16:17:49 +00001457 self.assertRaises(TypeError, meth, X(s))
1458 self.assertRaises(TypeError, meth, N(s))
1459 self.assertRaises(ZeroDivisionError, meth, E(s))
1460
1461 def test_inplace_methods(self):
1462 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001463 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001464 'difference_update', 'symmetric_difference_update'):
1465 for g in (G, I, Ig, S, L, R):
1466 s = set('january')
1467 t = s.copy()
1468 getattr(s, methname)(list(g(data)))
1469 getattr(t, methname)(g(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001470 self.assertEqual(sorted(s), sorted(t))
Raymond Hettingera690a992003-11-16 16:17:49 +00001471
1472 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1473 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1474 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1475
1476#==============================================================================
1477
1478def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001479 from test import test_sets
1480 test_classes = (
1481 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001482 TestSetSubclass,
Tim Petersf733abb2007-01-30 03:03:46 +00001483 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001484 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001485 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001486 TestSetOfSets,
1487 TestExceptionPropagation,
1488 TestBasicOpsEmpty,
1489 TestBasicOpsSingleton,
1490 TestBasicOpsTuple,
1491 TestBasicOpsTriple,
1492 TestBinaryOps,
1493 TestUpdateOps,
1494 TestMutate,
1495 TestSubsetEqualEmpty,
1496 TestSubsetEqualNonEmpty,
1497 TestSubsetEmptyNonEmpty,
1498 TestSubsetPartial,
1499 TestSubsetNonOverlap,
1500 TestOnlySetsNumeric,
1501 TestOnlySetsDict,
1502 TestOnlySetsOperator,
1503 TestOnlySetsTuple,
1504 TestOnlySetsString,
1505 TestOnlySetsGenerator,
1506 TestCopyingEmpty,
1507 TestCopyingSingleton,
1508 TestCopyingTriple,
1509 TestCopyingTuple,
1510 TestCopyingNested,
1511 TestIdentities,
1512 TestVariousIteratorArgs,
1513 )
1514
1515 test_support.run_unittest(*test_classes)
1516
1517 # verify reference counting
1518 if verbose and hasattr(sys, "gettotalrefcount"):
1519 import gc
1520 counts = [None] * 5
1521 for i in xrange(len(counts)):
1522 test_support.run_unittest(*test_classes)
1523 gc.collect()
1524 counts[i] = sys.gettotalrefcount()
1525 print counts
1526
1527if __name__ == "__main__":
1528 test_main(verbose=True)