blob: e6e0ba6b5b169171b9dc58edc0ba3f47822a48d4 [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)
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +0000291 self.assertEqual(sum(elem.hash_count for elem in d), n)
292 d2 = dict.fromkeys(set(d))
293 self.assertEqual(sum(elem.hash_count for elem in d), n)
294 d3 = dict.fromkeys(frozenset(d))
Tim Petersea5962f2007-03-12 18:07:52 +0000295 self.assertEqual(sum(elem.hash_count for elem in d), n)
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000296
Raymond Hettingera690a992003-11-16 16:17:49 +0000297class TestSet(TestJointOps):
298 thetype = set
299
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000300 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000301 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000302 s.__init__(self.word)
303 self.assertEqual(s, set(self.word))
304 s.__init__(self.otherword)
305 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000306 self.assertRaises(TypeError, s.__init__, s, 2);
307 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000308
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000309 def test_constructor_identity(self):
310 s = self.thetype(range(3))
311 t = self.thetype(s)
312 self.assertNotEqual(id(s), id(t))
313
Raymond Hettingera690a992003-11-16 16:17:49 +0000314 def test_hash(self):
315 self.assertRaises(TypeError, hash, self.s)
316
317 def test_clear(self):
318 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000319 self.assertEqual(self.s, set())
320 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000321
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000322 def test_copy(self):
323 dup = self.s.copy()
324 self.assertEqual(self.s, dup)
325 self.assertNotEqual(id(self.s), id(dup))
326
Raymond Hettingera690a992003-11-16 16:17:49 +0000327 def test_add(self):
328 self.s.add('Q')
329 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000330 dup = self.s.copy()
331 self.s.add('Q')
332 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000333 self.assertRaises(TypeError, self.s.add, [])
334
335 def test_remove(self):
336 self.s.remove('a')
337 self.assert_('a' not in self.s)
338 self.assertRaises(KeyError, self.s.remove, 'Q')
339 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000340 s = self.thetype([frozenset(self.word)])
341 self.assert_(self.thetype(self.word) in s)
342 s.remove(self.thetype(self.word))
343 self.assert_(self.thetype(self.word) not in s)
344 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000345
Raymond Hettingerc789f342006-12-08 17:35:25 +0000346 def test_remove_keyerror_unpacking(self):
347 # bug: www.python.org/sf/1576657
348 for v1 in ['Q', (1,)]:
349 try:
350 self.s.remove(v1)
351 except KeyError, e:
352 v2 = e.args[0]
353 self.assertEqual(v1, v2)
354 else:
355 self.fail()
356
Raymond Hettingera690a992003-11-16 16:17:49 +0000357 def test_discard(self):
358 self.s.discard('a')
359 self.assert_('a' not in self.s)
360 self.s.discard('Q')
361 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000362 s = self.thetype([frozenset(self.word)])
363 self.assert_(self.thetype(self.word) in s)
364 s.discard(self.thetype(self.word))
365 self.assert_(self.thetype(self.word) not in s)
366 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000367
368 def test_pop(self):
369 for i in xrange(len(self.s)):
370 elem = self.s.pop()
371 self.assert_(elem not in self.s)
372 self.assertRaises(KeyError, self.s.pop)
373
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000374 def test_update(self):
375 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000376 self.assertEqual(retval, None)
377 for c in (self.word + self.otherword):
378 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000379 self.assertRaises(PassThru, self.s.update, check_pass_thru())
380 self.assertRaises(TypeError, self.s.update, [[]])
381 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
382 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
383 s = self.thetype('abcba')
384 self.assertEqual(s.update(C(p)), None)
385 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000386
387 def test_ior(self):
388 self.s |= set(self.otherword)
389 for c in (self.word + self.otherword):
390 self.assert_(c in self.s)
391
392 def test_intersection_update(self):
393 retval = self.s.intersection_update(self.otherword)
394 self.assertEqual(retval, None)
395 for c in (self.word + self.otherword):
396 if c in self.otherword and c in self.word:
397 self.assert_(c in self.s)
398 else:
399 self.assert_(c not in self.s)
400 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
401 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000402 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
403 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
404 s = self.thetype('abcba')
405 self.assertEqual(s.intersection_update(C(p)), None)
406 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000407
408 def test_iand(self):
409 self.s &= set(self.otherword)
410 for c in (self.word + self.otherword):
411 if c in self.otherword and c in self.word:
412 self.assert_(c in self.s)
413 else:
414 self.assert_(c not in self.s)
415
416 def test_difference_update(self):
417 retval = self.s.difference_update(self.otherword)
418 self.assertEqual(retval, None)
419 for c in (self.word + self.otherword):
420 if c in self.word and c not in self.otherword:
421 self.assert_(c in self.s)
422 else:
423 self.assert_(c not in self.s)
424 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
425 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000426 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
427 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
428 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
429 s = self.thetype('abcba')
430 self.assertEqual(s.difference_update(C(p)), None)
431 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000432
433 def test_isub(self):
434 self.s -= set(self.otherword)
435 for c in (self.word + self.otherword):
436 if c in self.word and c not in self.otherword:
437 self.assert_(c in self.s)
438 else:
439 self.assert_(c not in self.s)
440
441 def test_symmetric_difference_update(self):
442 retval = self.s.symmetric_difference_update(self.otherword)
443 self.assertEqual(retval, None)
444 for c in (self.word + self.otherword):
445 if (c in self.word) ^ (c in self.otherword):
446 self.assert_(c in self.s)
447 else:
448 self.assert_(c not in self.s)
449 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
450 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000451 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
452 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
453 s = self.thetype('abcba')
454 self.assertEqual(s.symmetric_difference_update(C(p)), None)
455 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000456
457 def test_ixor(self):
458 self.s ^= set(self.otherword)
459 for c in (self.word + self.otherword):
460 if (c in self.word) ^ (c in self.otherword):
461 self.assert_(c in self.s)
462 else:
463 self.assert_(c not in self.s)
464
Raymond Hettingerc991db22005-08-11 07:58:45 +0000465 def test_inplace_on_self(self):
466 t = self.s.copy()
467 t |= t
468 self.assertEqual(t, self.s)
469 t &= t
470 self.assertEqual(t, self.s)
471 t -= t
472 self.assertEqual(t, self.thetype())
473 t = self.s.copy()
474 t ^= t
475 self.assertEqual(t, self.thetype())
476
Raymond Hettinger691d8052004-05-30 07:26:47 +0000477 def test_weakref(self):
478 s = self.thetype('gallahad')
479 p = proxy(s)
480 self.assertEqual(str(p), str(s))
481 s = None
482 self.assertRaises(ReferenceError, str, p)
483
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000484 # C API test only available in a debug build
Barry Warsaw176014f2006-03-30 22:45:35 +0000485 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000486 def test_c_api(self):
487 self.assertEqual(set('abc').test_c_api(), True)
488
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000489class SetSubclass(set):
490 pass
491
492class TestSetSubclass(TestSet):
493 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000494
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +0000495class SetSubclassWithKeywordArgs(set):
496 def __init__(self, iterable=[], newarg=None):
497 set.__init__(self, iterable)
498
499class TestSetSubclassWithKeywordArgs(TestSet):
Tim Petersf733abb2007-01-30 03:03:46 +0000500
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +0000501 def test_keywords_in_subclass(self):
502 'SF bug #1486663 -- this used to erroneously raise a TypeError'
503 SetSubclassWithKeywordArgs(newarg=1)
504
Raymond Hettingera690a992003-11-16 16:17:49 +0000505class TestFrozenSet(TestJointOps):
506 thetype = frozenset
507
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000508 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000509 s = self.thetype(self.word)
510 s.__init__(self.otherword)
511 self.assertEqual(s, set(self.word))
512
Raymond Hettingerd7946662005-08-01 21:39:29 +0000513 def test_singleton_empty_frozenset(self):
514 f = frozenset()
515 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
516 frozenset(), frozenset([]), frozenset(()), frozenset(''),
517 frozenset(xrange(0)), frozenset(frozenset()),
518 frozenset(f), f]
519 # All of the empty frozensets should have just one id()
520 self.assertEqual(len(set(map(id, efs))), 1)
521
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000522 def test_constructor_identity(self):
523 s = self.thetype(range(3))
524 t = self.thetype(s)
525 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000526
Raymond Hettingera690a992003-11-16 16:17:49 +0000527 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000528 self.assertEqual(hash(self.thetype('abcdeb')),
529 hash(self.thetype('ebecda')))
530
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000531 # make sure that all permutations give the same hash value
532 n = 100
533 seq = [randrange(n) for i in xrange(n)]
534 results = set()
535 for i in xrange(200):
536 shuffle(seq)
537 results.add(hash(self.thetype(seq)))
538 self.assertEqual(len(results), 1)
539
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000540 def test_copy(self):
541 dup = self.s.copy()
542 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000543
544 def test_frozen_as_dictkey(self):
545 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000546 key1 = self.thetype(seq)
547 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000548 self.assertEqual(key1, key2)
549 self.assertNotEqual(id(key1), id(key2))
550 d = {}
551 d[key1] = 42
552 self.assertEqual(d[key2], 42)
553
554 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000555 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000556 self.assertEqual(hash(f), hash(f))
557
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000558 def test_hash_effectiveness(self):
559 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000560 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000561 addhashvalue = hashvalues.add
562 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000563 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000564 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
565 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000566
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000567class FrozenSetSubclass(frozenset):
568 pass
569
570class TestFrozenSetSubclass(TestFrozenSet):
571 thetype = FrozenSetSubclass
572
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000573 def test_constructor_identity(self):
574 s = self.thetype(range(3))
575 t = self.thetype(s)
576 self.assertNotEqual(id(s), id(t))
577
578 def test_copy(self):
579 dup = self.s.copy()
580 self.assertNotEqual(id(self.s), id(dup))
581
582 def test_nested_empty_constructor(self):
583 s = self.thetype()
584 t = self.thetype(s)
585 self.assertEqual(s, t)
586
Raymond Hettingerd7946662005-08-01 21:39:29 +0000587 def test_singleton_empty_frozenset(self):
588 Frozenset = self.thetype
589 f = frozenset()
590 F = Frozenset()
591 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
592 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
593 Frozenset(xrange(0)), Frozenset(Frozenset()),
594 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
595 # All empty frozenset subclass instances should have different ids
596 self.assertEqual(len(set(map(id, efs))), len(efs))
597
Raymond Hettingera690a992003-11-16 16:17:49 +0000598# Tests taken from test_sets.py =============================================
599
600empty_set = set()
601
602#==============================================================================
603
604class TestBasicOps(unittest.TestCase):
605
606 def test_repr(self):
607 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000608 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000609
Raymond Hettingereae05de2004-07-09 04:51:24 +0000610 def test_print(self):
611 try:
612 fo = open(test_support.TESTFN, "wb")
613 print >> fo, self.set,
614 fo.close()
615 fo = open(test_support.TESTFN, "rb")
616 self.assertEqual(fo.read(), repr(self.set))
617 finally:
618 fo.close()
619 os.remove(test_support.TESTFN)
620
Raymond Hettingera690a992003-11-16 16:17:49 +0000621 def test_length(self):
622 self.assertEqual(len(self.set), self.length)
623
624 def test_self_equality(self):
625 self.assertEqual(self.set, self.set)
626
627 def test_equivalent_equality(self):
628 self.assertEqual(self.set, self.dup)
629
630 def test_copy(self):
631 self.assertEqual(self.set.copy(), self.dup)
632
633 def test_self_union(self):
634 result = self.set | self.set
635 self.assertEqual(result, self.dup)
636
637 def test_empty_union(self):
638 result = self.set | empty_set
639 self.assertEqual(result, self.dup)
640
641 def test_union_empty(self):
642 result = empty_set | self.set
643 self.assertEqual(result, self.dup)
644
645 def test_self_intersection(self):
646 result = self.set & self.set
647 self.assertEqual(result, self.dup)
648
649 def test_empty_intersection(self):
650 result = self.set & empty_set
651 self.assertEqual(result, empty_set)
652
653 def test_intersection_empty(self):
654 result = empty_set & self.set
655 self.assertEqual(result, empty_set)
656
657 def test_self_symmetric_difference(self):
658 result = self.set ^ self.set
659 self.assertEqual(result, empty_set)
660
661 def checkempty_symmetric_difference(self):
662 result = self.set ^ empty_set
663 self.assertEqual(result, self.set)
664
665 def test_self_difference(self):
666 result = self.set - self.set
667 self.assertEqual(result, empty_set)
668
669 def test_empty_difference(self):
670 result = self.set - empty_set
671 self.assertEqual(result, self.dup)
672
673 def test_empty_difference_rev(self):
674 result = empty_set - self.set
675 self.assertEqual(result, empty_set)
676
677 def test_iteration(self):
678 for v in self.set:
679 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000680 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000681 # note: __length_hint__ is an internal undocumented API,
682 # don't rely on it in your own programs
683 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000684
685 def test_pickling(self):
686 p = pickle.dumps(self.set)
687 copy = pickle.loads(p)
688 self.assertEqual(self.set, copy,
689 "%s != %s" % (self.set, copy))
690
691#------------------------------------------------------------------------------
692
693class TestBasicOpsEmpty(TestBasicOps):
694 def setUp(self):
695 self.case = "empty set"
696 self.values = []
697 self.set = set(self.values)
698 self.dup = set(self.values)
699 self.length = 0
700 self.repr = "set([])"
701
702#------------------------------------------------------------------------------
703
704class TestBasicOpsSingleton(TestBasicOps):
705 def setUp(self):
706 self.case = "unit set (number)"
707 self.values = [3]
708 self.set = set(self.values)
709 self.dup = set(self.values)
710 self.length = 1
711 self.repr = "set([3])"
712
713 def test_in(self):
714 self.failUnless(3 in self.set)
715
716 def test_not_in(self):
717 self.failUnless(2 not in self.set)
718
719#------------------------------------------------------------------------------
720
721class TestBasicOpsTuple(TestBasicOps):
722 def setUp(self):
723 self.case = "unit set (tuple)"
724 self.values = [(0, "zero")]
725 self.set = set(self.values)
726 self.dup = set(self.values)
727 self.length = 1
728 self.repr = "set([(0, 'zero')])"
729
730 def test_in(self):
731 self.failUnless((0, "zero") in self.set)
732
733 def test_not_in(self):
734 self.failUnless(9 not in self.set)
735
736#------------------------------------------------------------------------------
737
738class TestBasicOpsTriple(TestBasicOps):
739 def setUp(self):
740 self.case = "triple set"
741 self.values = [0, "zero", operator.add]
742 self.set = set(self.values)
743 self.dup = set(self.values)
744 self.length = 3
745 self.repr = None
746
747#==============================================================================
748
749def baditer():
750 raise TypeError
751 yield True
752
753def gooditer():
754 yield True
755
756class TestExceptionPropagation(unittest.TestCase):
757 """SF 628246: Set constructor should not trap iterator TypeErrors"""
758
759 def test_instanceWithException(self):
760 self.assertRaises(TypeError, set, baditer())
761
762 def test_instancesWithoutException(self):
763 # All of these iterables should load without exception.
764 set([1,2,3])
765 set((1,2,3))
766 set({'one':1, 'two':2, 'three':3})
767 set(xrange(3))
768 set('abc')
769 set(gooditer())
770
Neal Norwitzfcf44352005-11-27 20:37:43 +0000771 def test_changingSizeWhileIterating(self):
772 s = set([1,2,3])
773 try:
774 for i in s:
775 s.update([4])
776 except RuntimeError:
777 pass
778 else:
779 self.fail("no exception when changing size during iteration")
780
Raymond Hettingera690a992003-11-16 16:17:49 +0000781#==============================================================================
782
783class TestSetOfSets(unittest.TestCase):
784 def test_constructor(self):
785 inner = frozenset([1])
786 outer = set([inner])
787 element = outer.pop()
788 self.assertEqual(type(element), frozenset)
789 outer.add(inner) # Rebuild set of sets with .add method
790 outer.remove(inner)
791 self.assertEqual(outer, set()) # Verify that remove worked
792 outer.discard(inner) # Absence of KeyError indicates working fine
793
794#==============================================================================
795
796class TestBinaryOps(unittest.TestCase):
797 def setUp(self):
798 self.set = set((2, 4, 6))
799
800 def test_eq(self): # SF bug 643115
801 self.assertEqual(self.set, set({2:1,4:3,6:5}))
802
803 def test_union_subset(self):
804 result = self.set | set([2])
805 self.assertEqual(result, set((2, 4, 6)))
806
807 def test_union_superset(self):
808 result = self.set | set([2, 4, 6, 8])
809 self.assertEqual(result, set([2, 4, 6, 8]))
810
811 def test_union_overlap(self):
812 result = self.set | set([3, 4, 5])
813 self.assertEqual(result, set([2, 3, 4, 5, 6]))
814
815 def test_union_non_overlap(self):
816 result = self.set | set([8])
817 self.assertEqual(result, set([2, 4, 6, 8]))
818
819 def test_intersection_subset(self):
820 result = self.set & set((2, 4))
821 self.assertEqual(result, set((2, 4)))
822
823 def test_intersection_superset(self):
824 result = self.set & set([2, 4, 6, 8])
825 self.assertEqual(result, set([2, 4, 6]))
826
827 def test_intersection_overlap(self):
828 result = self.set & set([3, 4, 5])
829 self.assertEqual(result, set([4]))
830
831 def test_intersection_non_overlap(self):
832 result = self.set & set([8])
833 self.assertEqual(result, empty_set)
834
835 def test_sym_difference_subset(self):
836 result = self.set ^ set((2, 4))
837 self.assertEqual(result, set([6]))
838
839 def test_sym_difference_superset(self):
840 result = self.set ^ set((2, 4, 6, 8))
841 self.assertEqual(result, set([8]))
842
843 def test_sym_difference_overlap(self):
844 result = self.set ^ set((3, 4, 5))
845 self.assertEqual(result, set([2, 3, 5, 6]))
846
847 def test_sym_difference_non_overlap(self):
848 result = self.set ^ set([8])
849 self.assertEqual(result, set([2, 4, 6, 8]))
850
851 def test_cmp(self):
852 a, b = set('a'), set('b')
853 self.assertRaises(TypeError, cmp, a, b)
854
855 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
856 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
857 # which Python thinks is good enough to synthesize a cmp() result
858 # without calling __cmp__.
859 self.assertEqual(cmp(a, a), 0)
860
861 self.assertRaises(TypeError, cmp, a, 12)
862 self.assertRaises(TypeError, cmp, "abc", a)
863
864#==============================================================================
865
866class TestUpdateOps(unittest.TestCase):
867 def setUp(self):
868 self.set = set((2, 4, 6))
869
870 def test_union_subset(self):
871 self.set |= set([2])
872 self.assertEqual(self.set, set((2, 4, 6)))
873
874 def test_union_superset(self):
875 self.set |= set([2, 4, 6, 8])
876 self.assertEqual(self.set, set([2, 4, 6, 8]))
877
878 def test_union_overlap(self):
879 self.set |= set([3, 4, 5])
880 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
881
882 def test_union_non_overlap(self):
883 self.set |= set([8])
884 self.assertEqual(self.set, set([2, 4, 6, 8]))
885
886 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000887 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000888 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
889
890 def test_intersection_subset(self):
891 self.set &= set((2, 4))
892 self.assertEqual(self.set, set((2, 4)))
893
894 def test_intersection_superset(self):
895 self.set &= set([2, 4, 6, 8])
896 self.assertEqual(self.set, set([2, 4, 6]))
897
898 def test_intersection_overlap(self):
899 self.set &= set([3, 4, 5])
900 self.assertEqual(self.set, set([4]))
901
902 def test_intersection_non_overlap(self):
903 self.set &= set([8])
904 self.assertEqual(self.set, empty_set)
905
906 def test_intersection_method_call(self):
907 self.set.intersection_update(set([3, 4, 5]))
908 self.assertEqual(self.set, set([4]))
909
910 def test_sym_difference_subset(self):
911 self.set ^= set((2, 4))
912 self.assertEqual(self.set, set([6]))
913
914 def test_sym_difference_superset(self):
915 self.set ^= set((2, 4, 6, 8))
916 self.assertEqual(self.set, set([8]))
917
918 def test_sym_difference_overlap(self):
919 self.set ^= set((3, 4, 5))
920 self.assertEqual(self.set, set([2, 3, 5, 6]))
921
922 def test_sym_difference_non_overlap(self):
923 self.set ^= set([8])
924 self.assertEqual(self.set, set([2, 4, 6, 8]))
925
926 def test_sym_difference_method_call(self):
927 self.set.symmetric_difference_update(set([3, 4, 5]))
928 self.assertEqual(self.set, set([2, 3, 5, 6]))
929
930 def test_difference_subset(self):
931 self.set -= set((2, 4))
932 self.assertEqual(self.set, set([6]))
933
934 def test_difference_superset(self):
935 self.set -= set((2, 4, 6, 8))
936 self.assertEqual(self.set, set([]))
937
938 def test_difference_overlap(self):
939 self.set -= set((3, 4, 5))
940 self.assertEqual(self.set, set([2, 6]))
941
942 def test_difference_non_overlap(self):
943 self.set -= set([8])
944 self.assertEqual(self.set, set([2, 4, 6]))
945
946 def test_difference_method_call(self):
947 self.set.difference_update(set([3, 4, 5]))
948 self.assertEqual(self.set, set([2, 6]))
949
950#==============================================================================
951
952class TestMutate(unittest.TestCase):
953 def setUp(self):
954 self.values = ["a", "b", "c"]
955 self.set = set(self.values)
956
957 def test_add_present(self):
958 self.set.add("c")
959 self.assertEqual(self.set, set("abc"))
960
961 def test_add_absent(self):
962 self.set.add("d")
963 self.assertEqual(self.set, set("abcd"))
964
965 def test_add_until_full(self):
966 tmp = set()
967 expected_len = 0
968 for v in self.values:
969 tmp.add(v)
970 expected_len += 1
971 self.assertEqual(len(tmp), expected_len)
972 self.assertEqual(tmp, self.set)
973
974 def test_remove_present(self):
975 self.set.remove("b")
976 self.assertEqual(self.set, set("ac"))
977
978 def test_remove_absent(self):
979 try:
980 self.set.remove("d")
981 self.fail("Removing missing element should have raised LookupError")
982 except LookupError:
983 pass
984
985 def test_remove_until_empty(self):
986 expected_len = len(self.set)
987 for v in self.values:
988 self.set.remove(v)
989 expected_len -= 1
990 self.assertEqual(len(self.set), expected_len)
991
992 def test_discard_present(self):
993 self.set.discard("c")
994 self.assertEqual(self.set, set("ab"))
995
996 def test_discard_absent(self):
997 self.set.discard("d")
998 self.assertEqual(self.set, set("abc"))
999
1000 def test_clear(self):
1001 self.set.clear()
1002 self.assertEqual(len(self.set), 0)
1003
1004 def test_pop(self):
1005 popped = {}
1006 while self.set:
1007 popped[self.set.pop()] = None
1008 self.assertEqual(len(popped), len(self.values))
1009 for v in self.values:
1010 self.failUnless(v in popped)
1011
1012 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001013 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001014 self.assertEqual(self.set, set(self.values))
1015
1016 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001017 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001018 self.assertEqual(self.set, set(self.values))
1019
1020 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001021 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001022 self.assertEqual(self.set, set(self.values + ["z"]))
1023
1024#==============================================================================
1025
1026class TestSubsets(unittest.TestCase):
1027
1028 case2method = {"<=": "issubset",
1029 ">=": "issuperset",
1030 }
1031
1032 reverse = {"==": "==",
1033 "!=": "!=",
1034 "<": ">",
1035 ">": "<",
1036 "<=": ">=",
1037 ">=": "<=",
1038 }
1039
1040 def test_issubset(self):
1041 x = self.left
1042 y = self.right
1043 for case in "!=", "==", "<", "<=", ">", ">=":
1044 expected = case in self.cases
1045 # Test the binary infix spelling.
1046 result = eval("x" + case + "y", locals())
1047 self.assertEqual(result, expected)
1048 # Test the "friendly" method-name spelling, if one exists.
1049 if case in TestSubsets.case2method:
1050 method = getattr(x, TestSubsets.case2method[case])
1051 result = method(y)
1052 self.assertEqual(result, expected)
1053
1054 # Now do the same for the operands reversed.
1055 rcase = TestSubsets.reverse[case]
1056 result = eval("y" + rcase + "x", locals())
1057 self.assertEqual(result, expected)
1058 if rcase in TestSubsets.case2method:
1059 method = getattr(y, TestSubsets.case2method[rcase])
1060 result = method(x)
1061 self.assertEqual(result, expected)
1062#------------------------------------------------------------------------------
1063
1064class TestSubsetEqualEmpty(TestSubsets):
1065 left = set()
1066 right = set()
1067 name = "both empty"
1068 cases = "==", "<=", ">="
1069
1070#------------------------------------------------------------------------------
1071
1072class TestSubsetEqualNonEmpty(TestSubsets):
1073 left = set([1, 2])
1074 right = set([1, 2])
1075 name = "equal pair"
1076 cases = "==", "<=", ">="
1077
1078#------------------------------------------------------------------------------
1079
1080class TestSubsetEmptyNonEmpty(TestSubsets):
1081 left = set()
1082 right = set([1, 2])
1083 name = "one empty, one non-empty"
1084 cases = "!=", "<", "<="
1085
1086#------------------------------------------------------------------------------
1087
1088class TestSubsetPartial(TestSubsets):
1089 left = set([1])
1090 right = set([1, 2])
1091 name = "one a non-empty proper subset of other"
1092 cases = "!=", "<", "<="
1093
1094#------------------------------------------------------------------------------
1095
1096class TestSubsetNonOverlap(TestSubsets):
1097 left = set([1])
1098 right = set([2])
1099 name = "neither empty, neither contains"
1100 cases = "!="
1101
1102#==============================================================================
1103
1104class TestOnlySetsInBinaryOps(unittest.TestCase):
1105
1106 def test_eq_ne(self):
1107 # Unlike the others, this is testing that == and != *are* allowed.
1108 self.assertEqual(self.other == self.set, False)
1109 self.assertEqual(self.set == self.other, False)
1110 self.assertEqual(self.other != self.set, True)
1111 self.assertEqual(self.set != self.other, True)
1112
1113 def test_ge_gt_le_lt(self):
1114 self.assertRaises(TypeError, lambda: self.set < self.other)
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
1119 self.assertRaises(TypeError, lambda: self.other < self.set)
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
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001124 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001125 try:
1126 self.set |= self.other
1127 except TypeError:
1128 pass
1129 else:
1130 self.fail("expected TypeError")
1131
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001132 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001133 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001134 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001135 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001136 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001137
1138 def test_union(self):
1139 self.assertRaises(TypeError, lambda: self.set | self.other)
1140 self.assertRaises(TypeError, lambda: self.other | self.set)
1141 if self.otherIsIterable:
1142 self.set.union(self.other)
1143 else:
1144 self.assertRaises(TypeError, self.set.union, self.other)
1145
1146 def test_intersection_update_operator(self):
1147 try:
1148 self.set &= self.other
1149 except TypeError:
1150 pass
1151 else:
1152 self.fail("expected TypeError")
1153
1154 def test_intersection_update(self):
1155 if self.otherIsIterable:
1156 self.set.intersection_update(self.other)
1157 else:
1158 self.assertRaises(TypeError,
1159 self.set.intersection_update,
1160 self.other)
1161
1162 def test_intersection(self):
1163 self.assertRaises(TypeError, lambda: self.set & self.other)
1164 self.assertRaises(TypeError, lambda: self.other & self.set)
1165 if self.otherIsIterable:
1166 self.set.intersection(self.other)
1167 else:
1168 self.assertRaises(TypeError, self.set.intersection, self.other)
1169
1170 def test_sym_difference_update_operator(self):
1171 try:
1172 self.set ^= self.other
1173 except TypeError:
1174 pass
1175 else:
1176 self.fail("expected TypeError")
1177
1178 def test_sym_difference_update(self):
1179 if self.otherIsIterable:
1180 self.set.symmetric_difference_update(self.other)
1181 else:
1182 self.assertRaises(TypeError,
1183 self.set.symmetric_difference_update,
1184 self.other)
1185
1186 def test_sym_difference(self):
1187 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1188 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1189 if self.otherIsIterable:
1190 self.set.symmetric_difference(self.other)
1191 else:
1192 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1193
1194 def test_difference_update_operator(self):
1195 try:
1196 self.set -= self.other
1197 except TypeError:
1198 pass
1199 else:
1200 self.fail("expected TypeError")
1201
1202 def test_difference_update(self):
1203 if self.otherIsIterable:
1204 self.set.difference_update(self.other)
1205 else:
1206 self.assertRaises(TypeError,
1207 self.set.difference_update,
1208 self.other)
1209
1210 def test_difference(self):
1211 self.assertRaises(TypeError, lambda: self.set - self.other)
1212 self.assertRaises(TypeError, lambda: self.other - self.set)
1213 if self.otherIsIterable:
1214 self.set.difference(self.other)
1215 else:
1216 self.assertRaises(TypeError, self.set.difference, self.other)
1217
1218#------------------------------------------------------------------------------
1219
1220class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1221 def setUp(self):
1222 self.set = set((1, 2, 3))
1223 self.other = 19
1224 self.otherIsIterable = False
1225
1226#------------------------------------------------------------------------------
1227
1228class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1229 def setUp(self):
1230 self.set = set((1, 2, 3))
1231 self.other = {1:2, 3:4}
1232 self.otherIsIterable = True
1233
1234#------------------------------------------------------------------------------
1235
1236class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1237 def setUp(self):
1238 self.set = set((1, 2, 3))
1239 self.other = operator.add
1240 self.otherIsIterable = False
1241
1242#------------------------------------------------------------------------------
1243
1244class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1245 def setUp(self):
1246 self.set = set((1, 2, 3))
1247 self.other = (2, 4, 6)
1248 self.otherIsIterable = True
1249
1250#------------------------------------------------------------------------------
1251
1252class TestOnlySetsString(TestOnlySetsInBinaryOps):
1253 def setUp(self):
1254 self.set = set((1, 2, 3))
1255 self.other = 'abc'
1256 self.otherIsIterable = True
1257
1258#------------------------------------------------------------------------------
1259
1260class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1261 def setUp(self):
1262 def gen():
1263 for i in xrange(0, 10, 2):
1264 yield i
1265 self.set = set((1, 2, 3))
1266 self.other = gen()
1267 self.otherIsIterable = True
1268
1269#==============================================================================
1270
1271class TestCopying(unittest.TestCase):
1272
1273 def test_copy(self):
1274 dup = self.set.copy()
1275 dup_list = list(dup); dup_list.sort()
1276 set_list = list(self.set); set_list.sort()
1277 self.assertEqual(len(dup_list), len(set_list))
1278 for i in range(len(dup_list)):
1279 self.failUnless(dup_list[i] is set_list[i])
1280
1281 def test_deep_copy(self):
1282 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001283 ##print type(dup), repr(dup)
Raymond Hettingera690a992003-11-16 16:17:49 +00001284 dup_list = list(dup); dup_list.sort()
1285 set_list = list(self.set); set_list.sort()
1286 self.assertEqual(len(dup_list), len(set_list))
1287 for i in range(len(dup_list)):
1288 self.assertEqual(dup_list[i], set_list[i])
1289
1290#------------------------------------------------------------------------------
1291
1292class TestCopyingEmpty(TestCopying):
1293 def setUp(self):
1294 self.set = set()
1295
1296#------------------------------------------------------------------------------
1297
1298class TestCopyingSingleton(TestCopying):
1299 def setUp(self):
1300 self.set = set(["hello"])
1301
1302#------------------------------------------------------------------------------
1303
1304class TestCopyingTriple(TestCopying):
1305 def setUp(self):
1306 self.set = set(["zero", 0, None])
1307
1308#------------------------------------------------------------------------------
1309
1310class TestCopyingTuple(TestCopying):
1311 def setUp(self):
1312 self.set = set([(1, 2)])
1313
1314#------------------------------------------------------------------------------
1315
1316class TestCopyingNested(TestCopying):
1317 def setUp(self):
1318 self.set = set([((1, 2), (3, 4))])
1319
1320#==============================================================================
1321
1322class TestIdentities(unittest.TestCase):
1323 def setUp(self):
1324 self.a = set('abracadabra')
1325 self.b = set('alacazam')
1326
1327 def test_binopsVsSubsets(self):
1328 a, b = self.a, self.b
1329 self.assert_(a - b < a)
1330 self.assert_(b - a < b)
1331 self.assert_(a & b < a)
1332 self.assert_(a & b < b)
1333 self.assert_(a | b > a)
1334 self.assert_(a | b > b)
1335 self.assert_(a ^ b < a | b)
1336
1337 def test_commutativity(self):
1338 a, b = self.a, self.b
1339 self.assertEqual(a&b, b&a)
1340 self.assertEqual(a|b, b|a)
1341 self.assertEqual(a^b, b^a)
1342 if a != b:
1343 self.assertNotEqual(a-b, b-a)
1344
1345 def test_summations(self):
1346 # check that sums of parts equal the whole
1347 a, b = self.a, self.b
1348 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1349 self.assertEqual((a&b)|(a^b), a|b)
1350 self.assertEqual(a|(b-a), a|b)
1351 self.assertEqual((a-b)|b, a|b)
1352 self.assertEqual((a-b)|(a&b), a)
1353 self.assertEqual((b-a)|(a&b), b)
1354 self.assertEqual((a-b)|(b-a), a^b)
1355
1356 def test_exclusion(self):
1357 # check that inverse operations show non-overlap
1358 a, b, zero = self.a, self.b, set()
1359 self.assertEqual((a-b)&b, zero)
1360 self.assertEqual((b-a)&a, zero)
1361 self.assertEqual((a&b)&(a^b), zero)
1362
1363# Tests derived from test_itertools.py =======================================
1364
1365def R(seqn):
1366 'Regular generator'
1367 for i in seqn:
1368 yield i
1369
1370class G:
1371 'Sequence using __getitem__'
1372 def __init__(self, seqn):
1373 self.seqn = seqn
1374 def __getitem__(self, i):
1375 return self.seqn[i]
1376
1377class I:
1378 'Sequence using iterator protocol'
1379 def __init__(self, seqn):
1380 self.seqn = seqn
1381 self.i = 0
1382 def __iter__(self):
1383 return self
1384 def next(self):
1385 if self.i >= len(self.seqn): raise StopIteration
1386 v = self.seqn[self.i]
1387 self.i += 1
1388 return v
1389
1390class Ig:
1391 'Sequence using iterator protocol defined with a generator'
1392 def __init__(self, seqn):
1393 self.seqn = seqn
1394 self.i = 0
1395 def __iter__(self):
1396 for val in self.seqn:
1397 yield val
1398
1399class X:
1400 'Missing __getitem__ and __iter__'
1401 def __init__(self, seqn):
1402 self.seqn = seqn
1403 self.i = 0
1404 def next(self):
1405 if self.i >= len(self.seqn): raise StopIteration
1406 v = self.seqn[self.i]
1407 self.i += 1
1408 return v
1409
1410class N:
1411 'Iterator missing next()'
1412 def __init__(self, seqn):
1413 self.seqn = seqn
1414 self.i = 0
1415 def __iter__(self):
1416 return self
1417
1418class E:
1419 'Test propagation of exceptions'
1420 def __init__(self, seqn):
1421 self.seqn = seqn
1422 self.i = 0
1423 def __iter__(self):
1424 return self
1425 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001426 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001427
1428class S:
1429 'Test immediate stop'
1430 def __init__(self, seqn):
1431 pass
1432 def __iter__(self):
1433 return self
1434 def next(self):
1435 raise StopIteration
1436
1437from itertools import chain, imap
1438def L(seqn):
1439 'Test multiple tiers of iterators'
1440 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1441
1442class TestVariousIteratorArgs(unittest.TestCase):
1443
1444 def test_constructor(self):
1445 for cons in (set, frozenset):
1446 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1447 for g in (G, I, Ig, S, L, R):
Raymond Hettinger64958a12003-12-17 20:43:33 +00001448 self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
Raymond Hettingera690a992003-11-16 16:17:49 +00001449 self.assertRaises(TypeError, cons , X(s))
1450 self.assertRaises(TypeError, cons , N(s))
1451 self.assertRaises(ZeroDivisionError, cons , E(s))
1452
1453 def test_inline_methods(self):
1454 s = set('november')
1455 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1456 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1457 for g in (G, I, Ig, L, R):
1458 expected = meth(data)
1459 actual = meth(G(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001460 self.assertEqual(sorted(actual), sorted(expected))
Raymond Hettingera690a992003-11-16 16:17:49 +00001461 self.assertRaises(TypeError, meth, X(s))
1462 self.assertRaises(TypeError, meth, N(s))
1463 self.assertRaises(ZeroDivisionError, meth, E(s))
1464
1465 def test_inplace_methods(self):
1466 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001467 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001468 'difference_update', 'symmetric_difference_update'):
1469 for g in (G, I, Ig, S, L, R):
1470 s = set('january')
1471 t = s.copy()
1472 getattr(s, methname)(list(g(data)))
1473 getattr(t, methname)(g(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001474 self.assertEqual(sorted(s), sorted(t))
Raymond Hettingera690a992003-11-16 16:17:49 +00001475
1476 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1477 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1478 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1479
1480#==============================================================================
1481
1482def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001483 from test import test_sets
1484 test_classes = (
1485 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001486 TestSetSubclass,
Tim Petersf733abb2007-01-30 03:03:46 +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()
1529 print counts
1530
1531if __name__ == "__main__":
1532 test_main(verbose=True)