blob: a4830d483b208a1f228f89d64c2810b96b9638f4 [file] [log] [blame]
Raymond Hettingera690a992003-11-16 16:17:49 +00001import unittest
2from test import test_support
Raymond Hettinger691d8052004-05-30 07:26:47 +00003from weakref import proxy
Raymond Hettingera690a992003-11-16 16:17:49 +00004import operator
5import copy
6import pickle
Raymond Hettingereae05de2004-07-09 04:51:24 +00007import os
Raymond Hettinger82cb9a22005-07-05 05:34:43 +00008from random import randrange, shuffle
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00009import sys
Raymond Hettingera690a992003-11-16 16:17:49 +000010
11class PassThru(Exception):
12 pass
13
14def check_pass_thru():
15 raise PassThru
16 yield 1
17
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000018class BadCmp:
19 def __hash__(self):
20 return 1
Guido van Rossum47b9ff62006-08-24 00:41:19 +000021 def __eq__(self, other):
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000022 raise RuntimeError
23
Raymond Hettingera690a992003-11-16 16:17:49 +000024class TestJointOps(unittest.TestCase):
25 # Tests common to both set and frozenset
26
27 def setUp(self):
28 self.word = word = 'simsalabim'
29 self.otherword = 'madagascar'
30 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
31 self.s = self.thetype(word)
32 self.d = dict.fromkeys(word)
33
Raymond Hettinger6429a472004-09-28 01:51:35 +000034 def test_new_or_init(self):
35 self.assertRaises(TypeError, self.thetype, [], 2)
36
Raymond Hettingera690a992003-11-16 16:17:49 +000037 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000038 actual = sorted(self.s)
39 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000040 self.assertEqual(actual, expected)
41 self.assertRaises(PassThru, self.thetype, check_pass_thru())
42 self.assertRaises(TypeError, self.thetype, [[]])
43
44 def test_len(self):
45 self.assertEqual(len(self.s), len(self.d))
46
47 def test_contains(self):
48 for c in self.letters:
49 self.assertEqual(c in self.s, c in self.d)
50 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000051 s = self.thetype([frozenset(self.letters)])
52 self.assert_(self.thetype(self.letters) in s)
Raymond Hettingera690a992003-11-16 16:17:49 +000053
Raymond Hettingera690a992003-11-16 16:17:49 +000054 def test_union(self):
55 u = self.s.union(self.otherword)
56 for c in self.letters:
57 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000058 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000059 self.assertEqual(type(u), self.thetype)
60 self.assertRaises(PassThru, self.s.union, check_pass_thru())
61 self.assertRaises(TypeError, self.s.union, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000062 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
63 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
64 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
65 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
66 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +000067
68 def test_or(self):
69 i = self.s.union(self.otherword)
70 self.assertEqual(self.s | set(self.otherword), i)
71 self.assertEqual(self.s | frozenset(self.otherword), i)
72 try:
73 self.s | self.otherword
74 except TypeError:
75 pass
76 else:
77 self.fail("s|t did not screen-out general iterables")
78
79 def test_intersection(self):
80 i = self.s.intersection(self.otherword)
81 for c in self.letters:
82 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000083 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000084 self.assertEqual(type(i), self.thetype)
85 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000086 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
87 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
88 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
89 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
90 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Raymond Hettingera690a992003-11-16 16:17:49 +000091
92 def test_and(self):
93 i = self.s.intersection(self.otherword)
94 self.assertEqual(self.s & set(self.otherword), i)
95 self.assertEqual(self.s & frozenset(self.otherword), i)
96 try:
97 self.s & self.otherword
98 except TypeError:
99 pass
100 else:
101 self.fail("s&t did not screen-out general iterables")
102
103 def test_difference(self):
104 i = self.s.difference(self.otherword)
105 for c in self.letters:
106 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000107 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000108 self.assertEqual(type(i), self.thetype)
109 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
110 self.assertRaises(TypeError, self.s.difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000111 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
112 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
113 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
114 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
115 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000116
117 def test_sub(self):
118 i = self.s.difference(self.otherword)
119 self.assertEqual(self.s - set(self.otherword), i)
120 self.assertEqual(self.s - frozenset(self.otherword), i)
121 try:
122 self.s - self.otherword
123 except TypeError:
124 pass
125 else:
126 self.fail("s-t did not screen-out general iterables")
127
128 def test_symmetric_difference(self):
129 i = self.s.symmetric_difference(self.otherword)
130 for c in self.letters:
131 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000132 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000133 self.assertEqual(type(i), self.thetype)
134 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
135 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000136 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
137 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
138 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
139 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
140 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000141
142 def test_xor(self):
143 i = self.s.symmetric_difference(self.otherword)
144 self.assertEqual(self.s ^ set(self.otherword), i)
145 self.assertEqual(self.s ^ frozenset(self.otherword), i)
146 try:
147 self.s ^ self.otherword
148 except TypeError:
149 pass
150 else:
151 self.fail("s^t did not screen-out general iterables")
152
153 def test_equality(self):
154 self.assertEqual(self.s, set(self.word))
155 self.assertEqual(self.s, frozenset(self.word))
156 self.assertEqual(self.s == self.word, False)
157 self.assertNotEqual(self.s, set(self.otherword))
158 self.assertNotEqual(self.s, frozenset(self.otherword))
159 self.assertEqual(self.s != self.word, True)
160
161 def test_setOfFrozensets(self):
162 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
163 s = self.thetype(t)
164 self.assertEqual(len(s), 3)
165
166 def test_compare(self):
167 self.assertRaises(TypeError, self.s.__cmp__, self.s)
168
169 def test_sub_and_super(self):
170 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
171 self.assert_(p < q)
172 self.assert_(p <= q)
173 self.assert_(q <= q)
174 self.assert_(q > p)
175 self.assert_(q >= p)
176 self.failIf(q < r)
177 self.failIf(q <= r)
178 self.failIf(q > r)
179 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000180 self.assert_(set('a').issubset('abc'))
181 self.assert_(set('abc').issuperset('a'))
182 self.failIf(set('a').issubset('cbs'))
183 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000184
185 def test_pickling(self):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000186 for i in (0, 1, 2):
187 p = pickle.dumps(self.s, i)
188 dup = pickle.loads(p)
189 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
190 if type(self.s) not in (set, frozenset):
191 self.s.x = 10
192 p = pickle.dumps(self.s)
193 dup = pickle.loads(p)
194 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000195
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000196 def test_deepcopy(self):
197 class Tracer:
198 def __init__(self, value):
199 self.value = value
200 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000201 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000202 def __deepcopy__(self, memo=None):
203 return Tracer(self.value + 1)
204 t = Tracer(10)
205 s = self.thetype([t])
206 dup = copy.deepcopy(s)
207 self.assertNotEqual(id(s), id(dup))
208 for elem in dup:
209 newt = elem
210 self.assertNotEqual(id(t), id(newt))
211 self.assertEqual(t.value + 1, newt.value)
212
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000213 def test_gc(self):
214 # Create a nest of cycles to exercise overall ref count check
215 class A:
216 pass
217 s = set(A() for i in xrange(1000))
218 for elem in s:
219 elem.cycle = s
220 elem.sub = elem
221 elem.set = set([elem])
222
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000223 def test_subclass_with_custom_hash(self):
224 # Bug #1257731
225 class H(self.thetype):
226 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000227 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000228 s=H()
229 f=set()
230 f.add(s)
231 self.assert_(s in f)
232 f.remove(s)
233 f.add(s)
234 f.discard(s)
235
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000236 def test_badcmp(self):
237 s = self.thetype([BadCmp()])
238 # Detect comparison errors during insertion and lookup
239 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
240 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
241 # Detect errors during mutating operations
242 if hasattr(s, 'add'):
243 self.assertRaises(RuntimeError, s.add, BadCmp())
244 self.assertRaises(RuntimeError, s.discard, BadCmp())
245 self.assertRaises(RuntimeError, s.remove, BadCmp())
246
Raymond Hettingera690a992003-11-16 16:17:49 +0000247class TestSet(TestJointOps):
248 thetype = set
249
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000250 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000251 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000252 s.__init__(self.word)
253 self.assertEqual(s, set(self.word))
254 s.__init__(self.otherword)
255 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000256 self.assertRaises(TypeError, s.__init__, s, 2);
257 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000258
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000259 def test_constructor_identity(self):
260 s = self.thetype(range(3))
261 t = self.thetype(s)
262 self.assertNotEqual(id(s), id(t))
263
Guido van Rossum86e58e22006-08-28 15:27:34 +0000264 def test_set_literal(self):
265 s = set([1,2,3])
266 t = {1,2,3}
267 self.assertEqual(s, t)
268
Raymond Hettingera690a992003-11-16 16:17:49 +0000269 def test_hash(self):
270 self.assertRaises(TypeError, hash, self.s)
271
272 def test_clear(self):
273 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000274 self.assertEqual(self.s, set())
275 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000276
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000277 def test_copy(self):
278 dup = self.s.copy()
279 self.assertEqual(self.s, dup)
280 self.assertNotEqual(id(self.s), id(dup))
281
Raymond Hettingera690a992003-11-16 16:17:49 +0000282 def test_add(self):
283 self.s.add('Q')
284 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000285 dup = self.s.copy()
286 self.s.add('Q')
287 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000288 self.assertRaises(TypeError, self.s.add, [])
289
290 def test_remove(self):
291 self.s.remove('a')
292 self.assert_('a' not in self.s)
293 self.assertRaises(KeyError, self.s.remove, 'Q')
294 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000295 s = self.thetype([frozenset(self.word)])
296 self.assert_(self.thetype(self.word) in s)
297 s.remove(self.thetype(self.word))
298 self.assert_(self.thetype(self.word) not in s)
299 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000300
Thomas Wouters89f507f2006-12-13 04:49:30 +0000301 def test_remove_keyerror_unpacking(self):
302 # bug: www.python.org/sf/1576657
303 for v1 in ['Q', (1,)]:
304 try:
305 self.s.remove(v1)
306 except KeyError, e:
307 v2 = e.args[0]
308 self.assertEqual(v1, v2)
309 else:
310 self.fail()
311
Raymond Hettingera690a992003-11-16 16:17:49 +0000312 def test_discard(self):
313 self.s.discard('a')
314 self.assert_('a' not in self.s)
315 self.s.discard('Q')
316 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000317 s = self.thetype([frozenset(self.word)])
318 self.assert_(self.thetype(self.word) in s)
319 s.discard(self.thetype(self.word))
320 self.assert_(self.thetype(self.word) not in s)
321 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000322
323 def test_pop(self):
324 for i in xrange(len(self.s)):
325 elem = self.s.pop()
326 self.assert_(elem not in self.s)
327 self.assertRaises(KeyError, self.s.pop)
328
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000329 def test_update(self):
330 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000331 self.assertEqual(retval, None)
332 for c in (self.word + self.otherword):
333 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000334 self.assertRaises(PassThru, self.s.update, check_pass_thru())
335 self.assertRaises(TypeError, self.s.update, [[]])
336 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
337 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
338 s = self.thetype('abcba')
339 self.assertEqual(s.update(C(p)), None)
340 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000341
342 def test_ior(self):
343 self.s |= set(self.otherword)
344 for c in (self.word + self.otherword):
345 self.assert_(c in self.s)
346
347 def test_intersection_update(self):
348 retval = self.s.intersection_update(self.otherword)
349 self.assertEqual(retval, None)
350 for c in (self.word + self.otherword):
351 if c in self.otherword and c in self.word:
352 self.assert_(c in self.s)
353 else:
354 self.assert_(c not in self.s)
355 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
356 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000357 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
358 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
359 s = self.thetype('abcba')
360 self.assertEqual(s.intersection_update(C(p)), None)
361 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000362
363 def test_iand(self):
364 self.s &= set(self.otherword)
365 for c in (self.word + self.otherword):
366 if c in self.otherword and c in self.word:
367 self.assert_(c in self.s)
368 else:
369 self.assert_(c not in self.s)
370
371 def test_difference_update(self):
372 retval = self.s.difference_update(self.otherword)
373 self.assertEqual(retval, None)
374 for c in (self.word + self.otherword):
375 if c in self.word and c not in self.otherword:
376 self.assert_(c in self.s)
377 else:
378 self.assert_(c not in self.s)
379 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
380 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000381 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
382 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
383 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
384 s = self.thetype('abcba')
385 self.assertEqual(s.difference_update(C(p)), None)
386 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000387
388 def test_isub(self):
389 self.s -= set(self.otherword)
390 for c in (self.word + self.otherword):
391 if c in self.word and c not in self.otherword:
392 self.assert_(c in self.s)
393 else:
394 self.assert_(c not in self.s)
395
396 def test_symmetric_difference_update(self):
397 retval = self.s.symmetric_difference_update(self.otherword)
398 self.assertEqual(retval, None)
399 for c in (self.word + self.otherword):
400 if (c in self.word) ^ (c in self.otherword):
401 self.assert_(c in self.s)
402 else:
403 self.assert_(c not in self.s)
404 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
405 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000406 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
407 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
408 s = self.thetype('abcba')
409 self.assertEqual(s.symmetric_difference_update(C(p)), None)
410 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000411
412 def test_ixor(self):
413 self.s ^= set(self.otherword)
414 for c in (self.word + self.otherword):
415 if (c in self.word) ^ (c in self.otherword):
416 self.assert_(c in self.s)
417 else:
418 self.assert_(c not in self.s)
419
Raymond Hettingerc991db22005-08-11 07:58:45 +0000420 def test_inplace_on_self(self):
421 t = self.s.copy()
422 t |= t
423 self.assertEqual(t, self.s)
424 t &= t
425 self.assertEqual(t, self.s)
426 t -= t
427 self.assertEqual(t, self.thetype())
428 t = self.s.copy()
429 t ^= t
430 self.assertEqual(t, self.thetype())
431
Raymond Hettinger691d8052004-05-30 07:26:47 +0000432 def test_weakref(self):
433 s = self.thetype('gallahad')
434 p = proxy(s)
435 self.assertEqual(str(p), str(s))
436 s = None
437 self.assertRaises(ReferenceError, str, p)
438
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000439 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000440 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000441 def test_c_api(self):
442 self.assertEqual(set('abc').test_c_api(), True)
443
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000444class SetSubclass(set):
445 pass
446
447class TestSetSubclass(TestSet):
448 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000449
450class TestFrozenSet(TestJointOps):
451 thetype = frozenset
452
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000453 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000454 s = self.thetype(self.word)
455 s.__init__(self.otherword)
456 self.assertEqual(s, set(self.word))
457
Raymond Hettingerd7946662005-08-01 21:39:29 +0000458 def test_singleton_empty_frozenset(self):
459 f = frozenset()
460 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
461 frozenset(), frozenset([]), frozenset(()), frozenset(''),
462 frozenset(xrange(0)), frozenset(frozenset()),
463 frozenset(f), f]
464 # All of the empty frozensets should have just one id()
465 self.assertEqual(len(set(map(id, efs))), 1)
466
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000467 def test_constructor_identity(self):
468 s = self.thetype(range(3))
469 t = self.thetype(s)
470 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000471
Raymond Hettingera690a992003-11-16 16:17:49 +0000472 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000473 self.assertEqual(hash(self.thetype('abcdeb')),
474 hash(self.thetype('ebecda')))
475
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000476 # make sure that all permutations give the same hash value
477 n = 100
478 seq = [randrange(n) for i in xrange(n)]
479 results = set()
480 for i in xrange(200):
481 shuffle(seq)
482 results.add(hash(self.thetype(seq)))
483 self.assertEqual(len(results), 1)
484
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000485 def test_copy(self):
486 dup = self.s.copy()
487 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000488
489 def test_frozen_as_dictkey(self):
490 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000491 key1 = self.thetype(seq)
492 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000493 self.assertEqual(key1, key2)
494 self.assertNotEqual(id(key1), id(key2))
495 d = {}
496 d[key1] = 42
497 self.assertEqual(d[key2], 42)
498
499 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000500 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000501 self.assertEqual(hash(f), hash(f))
502
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000503 def test_hash_effectiveness(self):
504 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000505 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000506 addhashvalue = hashvalues.add
507 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000508 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000509 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
510 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000511
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000512class FrozenSetSubclass(frozenset):
513 pass
514
515class TestFrozenSetSubclass(TestFrozenSet):
516 thetype = FrozenSetSubclass
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.assertNotEqual(id(s), id(t))
522
523 def test_copy(self):
524 dup = self.s.copy()
525 self.assertNotEqual(id(self.s), id(dup))
526
527 def test_nested_empty_constructor(self):
528 s = self.thetype()
529 t = self.thetype(s)
530 self.assertEqual(s, t)
531
Raymond Hettingerd7946662005-08-01 21:39:29 +0000532 def test_singleton_empty_frozenset(self):
533 Frozenset = self.thetype
534 f = frozenset()
535 F = Frozenset()
536 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
537 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
538 Frozenset(xrange(0)), Frozenset(Frozenset()),
539 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
540 # All empty frozenset subclass instances should have different ids
541 self.assertEqual(len(set(map(id, efs))), len(efs))
542
Raymond Hettingera690a992003-11-16 16:17:49 +0000543# Tests taken from test_sets.py =============================================
544
545empty_set = set()
546
547#==============================================================================
548
549class TestBasicOps(unittest.TestCase):
550
551 def test_repr(self):
552 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000553 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000554
Raymond Hettingereae05de2004-07-09 04:51:24 +0000555 def test_print(self):
556 try:
557 fo = open(test_support.TESTFN, "wb")
558 print >> fo, self.set,
559 fo.close()
560 fo = open(test_support.TESTFN, "rb")
561 self.assertEqual(fo.read(), repr(self.set))
562 finally:
563 fo.close()
564 os.remove(test_support.TESTFN)
565
Raymond Hettingera690a992003-11-16 16:17:49 +0000566 def test_length(self):
567 self.assertEqual(len(self.set), self.length)
568
569 def test_self_equality(self):
570 self.assertEqual(self.set, self.set)
571
572 def test_equivalent_equality(self):
573 self.assertEqual(self.set, self.dup)
574
575 def test_copy(self):
576 self.assertEqual(self.set.copy(), self.dup)
577
578 def test_self_union(self):
579 result = self.set | self.set
580 self.assertEqual(result, self.dup)
581
582 def test_empty_union(self):
583 result = self.set | empty_set
584 self.assertEqual(result, self.dup)
585
586 def test_union_empty(self):
587 result = empty_set | self.set
588 self.assertEqual(result, self.dup)
589
590 def test_self_intersection(self):
591 result = self.set & self.set
592 self.assertEqual(result, self.dup)
593
594 def test_empty_intersection(self):
595 result = self.set & empty_set
596 self.assertEqual(result, empty_set)
597
598 def test_intersection_empty(self):
599 result = empty_set & self.set
600 self.assertEqual(result, empty_set)
601
602 def test_self_symmetric_difference(self):
603 result = self.set ^ self.set
604 self.assertEqual(result, empty_set)
605
606 def checkempty_symmetric_difference(self):
607 result = self.set ^ empty_set
608 self.assertEqual(result, self.set)
609
610 def test_self_difference(self):
611 result = self.set - self.set
612 self.assertEqual(result, empty_set)
613
614 def test_empty_difference(self):
615 result = self.set - empty_set
616 self.assertEqual(result, self.dup)
617
618 def test_empty_difference_rev(self):
619 result = empty_set - self.set
620 self.assertEqual(result, empty_set)
621
622 def test_iteration(self):
623 for v in self.set:
624 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000625 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000626 # note: __length_hint__ is an internal undocumented API,
627 # don't rely on it in your own programs
628 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000629
630 def test_pickling(self):
631 p = pickle.dumps(self.set)
632 copy = pickle.loads(p)
633 self.assertEqual(self.set, copy,
634 "%s != %s" % (self.set, copy))
635
636#------------------------------------------------------------------------------
637
638class TestBasicOpsEmpty(TestBasicOps):
639 def setUp(self):
640 self.case = "empty set"
641 self.values = []
642 self.set = set(self.values)
643 self.dup = set(self.values)
644 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000645 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000646
647#------------------------------------------------------------------------------
648
649class TestBasicOpsSingleton(TestBasicOps):
650 def setUp(self):
651 self.case = "unit set (number)"
652 self.values = [3]
653 self.set = set(self.values)
654 self.dup = set(self.values)
655 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000656 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000657
658 def test_in(self):
659 self.failUnless(3 in self.set)
660
661 def test_not_in(self):
662 self.failUnless(2 not in self.set)
663
664#------------------------------------------------------------------------------
665
666class TestBasicOpsTuple(TestBasicOps):
667 def setUp(self):
668 self.case = "unit set (tuple)"
669 self.values = [(0, "zero")]
670 self.set = set(self.values)
671 self.dup = set(self.values)
672 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000673 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000674
675 def test_in(self):
676 self.failUnless((0, "zero") in self.set)
677
678 def test_not_in(self):
679 self.failUnless(9 not in self.set)
680
681#------------------------------------------------------------------------------
682
683class TestBasicOpsTriple(TestBasicOps):
684 def setUp(self):
685 self.case = "triple set"
686 self.values = [0, "zero", operator.add]
687 self.set = set(self.values)
688 self.dup = set(self.values)
689 self.length = 3
690 self.repr = None
691
692#==============================================================================
693
694def baditer():
695 raise TypeError
696 yield True
697
698def gooditer():
699 yield True
700
701class TestExceptionPropagation(unittest.TestCase):
702 """SF 628246: Set constructor should not trap iterator TypeErrors"""
703
704 def test_instanceWithException(self):
705 self.assertRaises(TypeError, set, baditer())
706
707 def test_instancesWithoutException(self):
708 # All of these iterables should load without exception.
709 set([1,2,3])
710 set((1,2,3))
711 set({'one':1, 'two':2, 'three':3})
712 set(xrange(3))
713 set('abc')
714 set(gooditer())
715
Neal Norwitzfcf44352005-11-27 20:37:43 +0000716 def test_changingSizeWhileIterating(self):
717 s = set([1,2,3])
718 try:
719 for i in s:
720 s.update([4])
721 except RuntimeError:
722 pass
723 else:
724 self.fail("no exception when changing size during iteration")
725
Raymond Hettingera690a992003-11-16 16:17:49 +0000726#==============================================================================
727
728class TestSetOfSets(unittest.TestCase):
729 def test_constructor(self):
730 inner = frozenset([1])
731 outer = set([inner])
732 element = outer.pop()
733 self.assertEqual(type(element), frozenset)
734 outer.add(inner) # Rebuild set of sets with .add method
735 outer.remove(inner)
736 self.assertEqual(outer, set()) # Verify that remove worked
737 outer.discard(inner) # Absence of KeyError indicates working fine
738
739#==============================================================================
740
741class TestBinaryOps(unittest.TestCase):
742 def setUp(self):
743 self.set = set((2, 4, 6))
744
745 def test_eq(self): # SF bug 643115
746 self.assertEqual(self.set, set({2:1,4:3,6:5}))
747
748 def test_union_subset(self):
749 result = self.set | set([2])
750 self.assertEqual(result, set((2, 4, 6)))
751
752 def test_union_superset(self):
753 result = self.set | set([2, 4, 6, 8])
754 self.assertEqual(result, set([2, 4, 6, 8]))
755
756 def test_union_overlap(self):
757 result = self.set | set([3, 4, 5])
758 self.assertEqual(result, set([2, 3, 4, 5, 6]))
759
760 def test_union_non_overlap(self):
761 result = self.set | set([8])
762 self.assertEqual(result, set([2, 4, 6, 8]))
763
764 def test_intersection_subset(self):
765 result = self.set & set((2, 4))
766 self.assertEqual(result, set((2, 4)))
767
768 def test_intersection_superset(self):
769 result = self.set & set([2, 4, 6, 8])
770 self.assertEqual(result, set([2, 4, 6]))
771
772 def test_intersection_overlap(self):
773 result = self.set & set([3, 4, 5])
774 self.assertEqual(result, set([4]))
775
776 def test_intersection_non_overlap(self):
777 result = self.set & set([8])
778 self.assertEqual(result, empty_set)
779
780 def test_sym_difference_subset(self):
781 result = self.set ^ set((2, 4))
782 self.assertEqual(result, set([6]))
783
784 def test_sym_difference_superset(self):
785 result = self.set ^ set((2, 4, 6, 8))
786 self.assertEqual(result, set([8]))
787
788 def test_sym_difference_overlap(self):
789 result = self.set ^ set((3, 4, 5))
790 self.assertEqual(result, set([2, 3, 5, 6]))
791
792 def test_sym_difference_non_overlap(self):
793 result = self.set ^ set([8])
794 self.assertEqual(result, set([2, 4, 6, 8]))
795
796 def test_cmp(self):
797 a, b = set('a'), set('b')
798 self.assertRaises(TypeError, cmp, a, b)
799
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000800 # In py3k, this works!
801 self.assertRaises(TypeError, cmp, a, a)
Raymond Hettingera690a992003-11-16 16:17:49 +0000802
803 self.assertRaises(TypeError, cmp, a, 12)
804 self.assertRaises(TypeError, cmp, "abc", a)
805
806#==============================================================================
807
808class TestUpdateOps(unittest.TestCase):
809 def setUp(self):
810 self.set = set((2, 4, 6))
811
812 def test_union_subset(self):
813 self.set |= set([2])
814 self.assertEqual(self.set, set((2, 4, 6)))
815
816 def test_union_superset(self):
817 self.set |= set([2, 4, 6, 8])
818 self.assertEqual(self.set, set([2, 4, 6, 8]))
819
820 def test_union_overlap(self):
821 self.set |= set([3, 4, 5])
822 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
823
824 def test_union_non_overlap(self):
825 self.set |= set([8])
826 self.assertEqual(self.set, set([2, 4, 6, 8]))
827
828 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000829 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000830 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
831
832 def test_intersection_subset(self):
833 self.set &= set((2, 4))
834 self.assertEqual(self.set, set((2, 4)))
835
836 def test_intersection_superset(self):
837 self.set &= set([2, 4, 6, 8])
838 self.assertEqual(self.set, set([2, 4, 6]))
839
840 def test_intersection_overlap(self):
841 self.set &= set([3, 4, 5])
842 self.assertEqual(self.set, set([4]))
843
844 def test_intersection_non_overlap(self):
845 self.set &= set([8])
846 self.assertEqual(self.set, empty_set)
847
848 def test_intersection_method_call(self):
849 self.set.intersection_update(set([3, 4, 5]))
850 self.assertEqual(self.set, set([4]))
851
852 def test_sym_difference_subset(self):
853 self.set ^= set((2, 4))
854 self.assertEqual(self.set, set([6]))
855
856 def test_sym_difference_superset(self):
857 self.set ^= set((2, 4, 6, 8))
858 self.assertEqual(self.set, set([8]))
859
860 def test_sym_difference_overlap(self):
861 self.set ^= set((3, 4, 5))
862 self.assertEqual(self.set, set([2, 3, 5, 6]))
863
864 def test_sym_difference_non_overlap(self):
865 self.set ^= set([8])
866 self.assertEqual(self.set, set([2, 4, 6, 8]))
867
868 def test_sym_difference_method_call(self):
869 self.set.symmetric_difference_update(set([3, 4, 5]))
870 self.assertEqual(self.set, set([2, 3, 5, 6]))
871
872 def test_difference_subset(self):
873 self.set -= set((2, 4))
874 self.assertEqual(self.set, set([6]))
875
876 def test_difference_superset(self):
877 self.set -= set((2, 4, 6, 8))
878 self.assertEqual(self.set, set([]))
879
880 def test_difference_overlap(self):
881 self.set -= set((3, 4, 5))
882 self.assertEqual(self.set, set([2, 6]))
883
884 def test_difference_non_overlap(self):
885 self.set -= set([8])
886 self.assertEqual(self.set, set([2, 4, 6]))
887
888 def test_difference_method_call(self):
889 self.set.difference_update(set([3, 4, 5]))
890 self.assertEqual(self.set, set([2, 6]))
891
892#==============================================================================
893
894class TestMutate(unittest.TestCase):
895 def setUp(self):
896 self.values = ["a", "b", "c"]
897 self.set = set(self.values)
898
899 def test_add_present(self):
900 self.set.add("c")
901 self.assertEqual(self.set, set("abc"))
902
903 def test_add_absent(self):
904 self.set.add("d")
905 self.assertEqual(self.set, set("abcd"))
906
907 def test_add_until_full(self):
908 tmp = set()
909 expected_len = 0
910 for v in self.values:
911 tmp.add(v)
912 expected_len += 1
913 self.assertEqual(len(tmp), expected_len)
914 self.assertEqual(tmp, self.set)
915
916 def test_remove_present(self):
917 self.set.remove("b")
918 self.assertEqual(self.set, set("ac"))
919
920 def test_remove_absent(self):
921 try:
922 self.set.remove("d")
923 self.fail("Removing missing element should have raised LookupError")
924 except LookupError:
925 pass
926
927 def test_remove_until_empty(self):
928 expected_len = len(self.set)
929 for v in self.values:
930 self.set.remove(v)
931 expected_len -= 1
932 self.assertEqual(len(self.set), expected_len)
933
934 def test_discard_present(self):
935 self.set.discard("c")
936 self.assertEqual(self.set, set("ab"))
937
938 def test_discard_absent(self):
939 self.set.discard("d")
940 self.assertEqual(self.set, set("abc"))
941
942 def test_clear(self):
943 self.set.clear()
944 self.assertEqual(len(self.set), 0)
945
946 def test_pop(self):
947 popped = {}
948 while self.set:
949 popped[self.set.pop()] = None
950 self.assertEqual(len(popped), len(self.values))
951 for v in self.values:
952 self.failUnless(v in popped)
953
954 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000955 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +0000956 self.assertEqual(self.set, set(self.values))
957
958 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000959 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +0000960 self.assertEqual(self.set, set(self.values))
961
962 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000963 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +0000964 self.assertEqual(self.set, set(self.values + ["z"]))
965
966#==============================================================================
967
968class TestSubsets(unittest.TestCase):
969
970 case2method = {"<=": "issubset",
971 ">=": "issuperset",
972 }
973
974 reverse = {"==": "==",
975 "!=": "!=",
976 "<": ">",
977 ">": "<",
978 "<=": ">=",
979 ">=": "<=",
980 }
981
982 def test_issubset(self):
983 x = self.left
984 y = self.right
985 for case in "!=", "==", "<", "<=", ">", ">=":
986 expected = case in self.cases
987 # Test the binary infix spelling.
988 result = eval("x" + case + "y", locals())
989 self.assertEqual(result, expected)
990 # Test the "friendly" method-name spelling, if one exists.
991 if case in TestSubsets.case2method:
992 method = getattr(x, TestSubsets.case2method[case])
993 result = method(y)
994 self.assertEqual(result, expected)
995
996 # Now do the same for the operands reversed.
997 rcase = TestSubsets.reverse[case]
998 result = eval("y" + rcase + "x", locals())
999 self.assertEqual(result, expected)
1000 if rcase in TestSubsets.case2method:
1001 method = getattr(y, TestSubsets.case2method[rcase])
1002 result = method(x)
1003 self.assertEqual(result, expected)
1004#------------------------------------------------------------------------------
1005
1006class TestSubsetEqualEmpty(TestSubsets):
1007 left = set()
1008 right = set()
1009 name = "both empty"
1010 cases = "==", "<=", ">="
1011
1012#------------------------------------------------------------------------------
1013
1014class TestSubsetEqualNonEmpty(TestSubsets):
1015 left = set([1, 2])
1016 right = set([1, 2])
1017 name = "equal pair"
1018 cases = "==", "<=", ">="
1019
1020#------------------------------------------------------------------------------
1021
1022class TestSubsetEmptyNonEmpty(TestSubsets):
1023 left = set()
1024 right = set([1, 2])
1025 name = "one empty, one non-empty"
1026 cases = "!=", "<", "<="
1027
1028#------------------------------------------------------------------------------
1029
1030class TestSubsetPartial(TestSubsets):
1031 left = set([1])
1032 right = set([1, 2])
1033 name = "one a non-empty proper subset of other"
1034 cases = "!=", "<", "<="
1035
1036#------------------------------------------------------------------------------
1037
1038class TestSubsetNonOverlap(TestSubsets):
1039 left = set([1])
1040 right = set([2])
1041 name = "neither empty, neither contains"
1042 cases = "!="
1043
1044#==============================================================================
1045
1046class TestOnlySetsInBinaryOps(unittest.TestCase):
1047
1048 def test_eq_ne(self):
1049 # Unlike the others, this is testing that == and != *are* allowed.
1050 self.assertEqual(self.other == self.set, False)
1051 self.assertEqual(self.set == self.other, False)
1052 self.assertEqual(self.other != self.set, True)
1053 self.assertEqual(self.set != self.other, True)
1054
1055 def test_ge_gt_le_lt(self):
1056 self.assertRaises(TypeError, lambda: self.set < self.other)
1057 self.assertRaises(TypeError, lambda: self.set <= self.other)
1058 self.assertRaises(TypeError, lambda: self.set > self.other)
1059 self.assertRaises(TypeError, lambda: self.set >= self.other)
1060
1061 self.assertRaises(TypeError, lambda: self.other < self.set)
1062 self.assertRaises(TypeError, lambda: self.other <= self.set)
1063 self.assertRaises(TypeError, lambda: self.other > self.set)
1064 self.assertRaises(TypeError, lambda: self.other >= self.set)
1065
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001066 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001067 try:
1068 self.set |= self.other
1069 except TypeError:
1070 pass
1071 else:
1072 self.fail("expected TypeError")
1073
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001074 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001075 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001076 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001077 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001078 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001079
1080 def test_union(self):
1081 self.assertRaises(TypeError, lambda: self.set | self.other)
1082 self.assertRaises(TypeError, lambda: self.other | self.set)
1083 if self.otherIsIterable:
1084 self.set.union(self.other)
1085 else:
1086 self.assertRaises(TypeError, self.set.union, self.other)
1087
1088 def test_intersection_update_operator(self):
1089 try:
1090 self.set &= self.other
1091 except TypeError:
1092 pass
1093 else:
1094 self.fail("expected TypeError")
1095
1096 def test_intersection_update(self):
1097 if self.otherIsIterable:
1098 self.set.intersection_update(self.other)
1099 else:
1100 self.assertRaises(TypeError,
1101 self.set.intersection_update,
1102 self.other)
1103
1104 def test_intersection(self):
1105 self.assertRaises(TypeError, lambda: self.set & self.other)
1106 self.assertRaises(TypeError, lambda: self.other & self.set)
1107 if self.otherIsIterable:
1108 self.set.intersection(self.other)
1109 else:
1110 self.assertRaises(TypeError, self.set.intersection, self.other)
1111
1112 def test_sym_difference_update_operator(self):
1113 try:
1114 self.set ^= self.other
1115 except TypeError:
1116 pass
1117 else:
1118 self.fail("expected TypeError")
1119
1120 def test_sym_difference_update(self):
1121 if self.otherIsIterable:
1122 self.set.symmetric_difference_update(self.other)
1123 else:
1124 self.assertRaises(TypeError,
1125 self.set.symmetric_difference_update,
1126 self.other)
1127
1128 def test_sym_difference(self):
1129 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1130 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1131 if self.otherIsIterable:
1132 self.set.symmetric_difference(self.other)
1133 else:
1134 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1135
1136 def test_difference_update_operator(self):
1137 try:
1138 self.set -= self.other
1139 except TypeError:
1140 pass
1141 else:
1142 self.fail("expected TypeError")
1143
1144 def test_difference_update(self):
1145 if self.otherIsIterable:
1146 self.set.difference_update(self.other)
1147 else:
1148 self.assertRaises(TypeError,
1149 self.set.difference_update,
1150 self.other)
1151
1152 def test_difference(self):
1153 self.assertRaises(TypeError, lambda: self.set - self.other)
1154 self.assertRaises(TypeError, lambda: self.other - self.set)
1155 if self.otherIsIterable:
1156 self.set.difference(self.other)
1157 else:
1158 self.assertRaises(TypeError, self.set.difference, self.other)
1159
1160#------------------------------------------------------------------------------
1161
1162class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1163 def setUp(self):
1164 self.set = set((1, 2, 3))
1165 self.other = 19
1166 self.otherIsIterable = False
1167
1168#------------------------------------------------------------------------------
1169
1170class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1171 def setUp(self):
1172 self.set = set((1, 2, 3))
1173 self.other = {1:2, 3:4}
1174 self.otherIsIterable = True
1175
1176#------------------------------------------------------------------------------
1177
1178class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1179 def setUp(self):
1180 self.set = set((1, 2, 3))
1181 self.other = operator.add
1182 self.otherIsIterable = False
1183
1184#------------------------------------------------------------------------------
1185
1186class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1187 def setUp(self):
1188 self.set = set((1, 2, 3))
1189 self.other = (2, 4, 6)
1190 self.otherIsIterable = True
1191
1192#------------------------------------------------------------------------------
1193
1194class TestOnlySetsString(TestOnlySetsInBinaryOps):
1195 def setUp(self):
1196 self.set = set((1, 2, 3))
1197 self.other = 'abc'
1198 self.otherIsIterable = True
1199
1200#------------------------------------------------------------------------------
1201
1202class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1203 def setUp(self):
1204 def gen():
1205 for i in xrange(0, 10, 2):
1206 yield i
1207 self.set = set((1, 2, 3))
1208 self.other = gen()
1209 self.otherIsIterable = True
1210
1211#==============================================================================
1212
1213class TestCopying(unittest.TestCase):
1214
1215 def test_copy(self):
1216 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001217 dup_list = sorted(dup, key=repr)
1218 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001219 self.assertEqual(len(dup_list), len(set_list))
1220 for i in range(len(dup_list)):
1221 self.failUnless(dup_list[i] is set_list[i])
1222
1223 def test_deep_copy(self):
1224 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001225 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001226 dup_list = sorted(dup, key=repr)
1227 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001228 self.assertEqual(len(dup_list), len(set_list))
1229 for i in range(len(dup_list)):
1230 self.assertEqual(dup_list[i], set_list[i])
1231
1232#------------------------------------------------------------------------------
1233
1234class TestCopyingEmpty(TestCopying):
1235 def setUp(self):
1236 self.set = set()
1237
1238#------------------------------------------------------------------------------
1239
1240class TestCopyingSingleton(TestCopying):
1241 def setUp(self):
1242 self.set = set(["hello"])
1243
1244#------------------------------------------------------------------------------
1245
1246class TestCopyingTriple(TestCopying):
1247 def setUp(self):
1248 self.set = set(["zero", 0, None])
1249
1250#------------------------------------------------------------------------------
1251
1252class TestCopyingTuple(TestCopying):
1253 def setUp(self):
1254 self.set = set([(1, 2)])
1255
1256#------------------------------------------------------------------------------
1257
1258class TestCopyingNested(TestCopying):
1259 def setUp(self):
1260 self.set = set([((1, 2), (3, 4))])
1261
1262#==============================================================================
1263
1264class TestIdentities(unittest.TestCase):
1265 def setUp(self):
1266 self.a = set('abracadabra')
1267 self.b = set('alacazam')
1268
1269 def test_binopsVsSubsets(self):
1270 a, b = self.a, self.b
1271 self.assert_(a - b < a)
1272 self.assert_(b - a < b)
1273 self.assert_(a & b < a)
1274 self.assert_(a & b < b)
1275 self.assert_(a | b > a)
1276 self.assert_(a | b > b)
1277 self.assert_(a ^ b < a | b)
1278
1279 def test_commutativity(self):
1280 a, b = self.a, self.b
1281 self.assertEqual(a&b, b&a)
1282 self.assertEqual(a|b, b|a)
1283 self.assertEqual(a^b, b^a)
1284 if a != b:
1285 self.assertNotEqual(a-b, b-a)
1286
1287 def test_summations(self):
1288 # check that sums of parts equal the whole
1289 a, b = self.a, self.b
1290 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1291 self.assertEqual((a&b)|(a^b), a|b)
1292 self.assertEqual(a|(b-a), a|b)
1293 self.assertEqual((a-b)|b, a|b)
1294 self.assertEqual((a-b)|(a&b), a)
1295 self.assertEqual((b-a)|(a&b), b)
1296 self.assertEqual((a-b)|(b-a), a^b)
1297
1298 def test_exclusion(self):
1299 # check that inverse operations show non-overlap
1300 a, b, zero = self.a, self.b, set()
1301 self.assertEqual((a-b)&b, zero)
1302 self.assertEqual((b-a)&a, zero)
1303 self.assertEqual((a&b)&(a^b), zero)
1304
1305# Tests derived from test_itertools.py =======================================
1306
1307def R(seqn):
1308 'Regular generator'
1309 for i in seqn:
1310 yield i
1311
1312class G:
1313 'Sequence using __getitem__'
1314 def __init__(self, seqn):
1315 self.seqn = seqn
1316 def __getitem__(self, i):
1317 return self.seqn[i]
1318
1319class I:
1320 'Sequence using iterator protocol'
1321 def __init__(self, seqn):
1322 self.seqn = seqn
1323 self.i = 0
1324 def __iter__(self):
1325 return self
1326 def next(self):
1327 if self.i >= len(self.seqn): raise StopIteration
1328 v = self.seqn[self.i]
1329 self.i += 1
1330 return v
1331
1332class Ig:
1333 'Sequence using iterator protocol defined with a generator'
1334 def __init__(self, seqn):
1335 self.seqn = seqn
1336 self.i = 0
1337 def __iter__(self):
1338 for val in self.seqn:
1339 yield val
1340
1341class X:
1342 'Missing __getitem__ and __iter__'
1343 def __init__(self, seqn):
1344 self.seqn = seqn
1345 self.i = 0
1346 def next(self):
1347 if self.i >= len(self.seqn): raise StopIteration
1348 v = self.seqn[self.i]
1349 self.i += 1
1350 return v
1351
1352class N:
1353 'Iterator missing next()'
1354 def __init__(self, seqn):
1355 self.seqn = seqn
1356 self.i = 0
1357 def __iter__(self):
1358 return self
1359
1360class E:
1361 'Test propagation of exceptions'
1362 def __init__(self, seqn):
1363 self.seqn = seqn
1364 self.i = 0
1365 def __iter__(self):
1366 return self
1367 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001368 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001369
1370class S:
1371 'Test immediate stop'
1372 def __init__(self, seqn):
1373 pass
1374 def __iter__(self):
1375 return self
1376 def next(self):
1377 raise StopIteration
1378
1379from itertools import chain, imap
1380def L(seqn):
1381 'Test multiple tiers of iterators'
1382 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1383
1384class TestVariousIteratorArgs(unittest.TestCase):
1385
1386 def test_constructor(self):
1387 for cons in (set, frozenset):
1388 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1389 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001390 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001391 self.assertRaises(TypeError, cons , X(s))
1392 self.assertRaises(TypeError, cons , N(s))
1393 self.assertRaises(ZeroDivisionError, cons , E(s))
1394
1395 def test_inline_methods(self):
1396 s = set('november')
1397 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1398 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1399 for g in (G, I, Ig, L, R):
1400 expected = meth(data)
1401 actual = meth(G(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001402 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001403 self.assertRaises(TypeError, meth, X(s))
1404 self.assertRaises(TypeError, meth, N(s))
1405 self.assertRaises(ZeroDivisionError, meth, E(s))
1406
1407 def test_inplace_methods(self):
1408 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001409 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001410 'difference_update', 'symmetric_difference_update'):
1411 for g in (G, I, Ig, S, L, R):
1412 s = set('january')
1413 t = s.copy()
1414 getattr(s, methname)(list(g(data)))
1415 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001416 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001417
1418 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1419 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1420 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1421
1422#==============================================================================
1423
1424def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001425 from test import test_sets
1426 test_classes = (
1427 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001428 TestSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001429 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001430 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001431 TestSetOfSets,
1432 TestExceptionPropagation,
1433 TestBasicOpsEmpty,
1434 TestBasicOpsSingleton,
1435 TestBasicOpsTuple,
1436 TestBasicOpsTriple,
1437 TestBinaryOps,
1438 TestUpdateOps,
1439 TestMutate,
1440 TestSubsetEqualEmpty,
1441 TestSubsetEqualNonEmpty,
1442 TestSubsetEmptyNonEmpty,
1443 TestSubsetPartial,
1444 TestSubsetNonOverlap,
1445 TestOnlySetsNumeric,
1446 TestOnlySetsDict,
1447 TestOnlySetsOperator,
1448 TestOnlySetsTuple,
1449 TestOnlySetsString,
1450 TestOnlySetsGenerator,
1451 TestCopyingEmpty,
1452 TestCopyingSingleton,
1453 TestCopyingTriple,
1454 TestCopyingTuple,
1455 TestCopyingNested,
1456 TestIdentities,
1457 TestVariousIteratorArgs,
1458 )
1459
1460 test_support.run_unittest(*test_classes)
1461
1462 # verify reference counting
1463 if verbose and hasattr(sys, "gettotalrefcount"):
1464 import gc
1465 counts = [None] * 5
1466 for i in xrange(len(counts)):
1467 test_support.run_unittest(*test_classes)
1468 gc.collect()
1469 counts[i] = sys.gettotalrefcount()
1470 print counts
1471
1472if __name__ == "__main__":
1473 test_main(verbose=True)