blob: 03621a67fd2b8e35736528ee707a444a5178f59c [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
301 def test_discard(self):
302 self.s.discard('a')
303 self.assert_('a' not in self.s)
304 self.s.discard('Q')
305 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000306 s = self.thetype([frozenset(self.word)])
307 self.assert_(self.thetype(self.word) in s)
308 s.discard(self.thetype(self.word))
309 self.assert_(self.thetype(self.word) not in s)
310 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000311
312 def test_pop(self):
313 for i in xrange(len(self.s)):
314 elem = self.s.pop()
315 self.assert_(elem not in self.s)
316 self.assertRaises(KeyError, self.s.pop)
317
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000318 def test_update(self):
319 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000320 self.assertEqual(retval, None)
321 for c in (self.word + self.otherword):
322 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000323 self.assertRaises(PassThru, self.s.update, check_pass_thru())
324 self.assertRaises(TypeError, self.s.update, [[]])
325 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
326 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
327 s = self.thetype('abcba')
328 self.assertEqual(s.update(C(p)), None)
329 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000330
331 def test_ior(self):
332 self.s |= set(self.otherword)
333 for c in (self.word + self.otherword):
334 self.assert_(c in self.s)
335
336 def test_intersection_update(self):
337 retval = self.s.intersection_update(self.otherword)
338 self.assertEqual(retval, None)
339 for c in (self.word + self.otherword):
340 if c in self.otherword and c in self.word:
341 self.assert_(c in self.s)
342 else:
343 self.assert_(c not in self.s)
344 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
345 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000346 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
347 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
348 s = self.thetype('abcba')
349 self.assertEqual(s.intersection_update(C(p)), None)
350 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000351
352 def test_iand(self):
353 self.s &= set(self.otherword)
354 for c in (self.word + self.otherword):
355 if c in self.otherword and c in self.word:
356 self.assert_(c in self.s)
357 else:
358 self.assert_(c not in self.s)
359
360 def test_difference_update(self):
361 retval = self.s.difference_update(self.otherword)
362 self.assertEqual(retval, None)
363 for c in (self.word + self.otherword):
364 if c in self.word and c not in self.otherword:
365 self.assert_(c in self.s)
366 else:
367 self.assert_(c not in self.s)
368 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
369 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000370 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
371 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
372 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
373 s = self.thetype('abcba')
374 self.assertEqual(s.difference_update(C(p)), None)
375 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000376
377 def test_isub(self):
378 self.s -= set(self.otherword)
379 for c in (self.word + self.otherword):
380 if c in self.word and c not in self.otherword:
381 self.assert_(c in self.s)
382 else:
383 self.assert_(c not in self.s)
384
385 def test_symmetric_difference_update(self):
386 retval = self.s.symmetric_difference_update(self.otherword)
387 self.assertEqual(retval, None)
388 for c in (self.word + self.otherword):
389 if (c in self.word) ^ (c in self.otherword):
390 self.assert_(c in self.s)
391 else:
392 self.assert_(c not in self.s)
393 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
394 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000395 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
396 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
397 s = self.thetype('abcba')
398 self.assertEqual(s.symmetric_difference_update(C(p)), None)
399 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000400
401 def test_ixor(self):
402 self.s ^= set(self.otherword)
403 for c in (self.word + self.otherword):
404 if (c in self.word) ^ (c in self.otherword):
405 self.assert_(c in self.s)
406 else:
407 self.assert_(c not in self.s)
408
Raymond Hettingerc991db22005-08-11 07:58:45 +0000409 def test_inplace_on_self(self):
410 t = self.s.copy()
411 t |= t
412 self.assertEqual(t, self.s)
413 t &= t
414 self.assertEqual(t, self.s)
415 t -= t
416 self.assertEqual(t, self.thetype())
417 t = self.s.copy()
418 t ^= t
419 self.assertEqual(t, self.thetype())
420
Raymond Hettinger691d8052004-05-30 07:26:47 +0000421 def test_weakref(self):
422 s = self.thetype('gallahad')
423 p = proxy(s)
424 self.assertEqual(str(p), str(s))
425 s = None
426 self.assertRaises(ReferenceError, str, p)
427
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000428 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000429 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000430 def test_c_api(self):
431 self.assertEqual(set('abc').test_c_api(), True)
432
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000433class SetSubclass(set):
434 pass
435
436class TestSetSubclass(TestSet):
437 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000438
439class TestFrozenSet(TestJointOps):
440 thetype = frozenset
441
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000442 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000443 s = self.thetype(self.word)
444 s.__init__(self.otherword)
445 self.assertEqual(s, set(self.word))
446
Raymond Hettingerd7946662005-08-01 21:39:29 +0000447 def test_singleton_empty_frozenset(self):
448 f = frozenset()
449 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
450 frozenset(), frozenset([]), frozenset(()), frozenset(''),
451 frozenset(xrange(0)), frozenset(frozenset()),
452 frozenset(f), f]
453 # All of the empty frozensets should have just one id()
454 self.assertEqual(len(set(map(id, efs))), 1)
455
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000456 def test_constructor_identity(self):
457 s = self.thetype(range(3))
458 t = self.thetype(s)
459 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000460
Raymond Hettingera690a992003-11-16 16:17:49 +0000461 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000462 self.assertEqual(hash(self.thetype('abcdeb')),
463 hash(self.thetype('ebecda')))
464
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000465 # make sure that all permutations give the same hash value
466 n = 100
467 seq = [randrange(n) for i in xrange(n)]
468 results = set()
469 for i in xrange(200):
470 shuffle(seq)
471 results.add(hash(self.thetype(seq)))
472 self.assertEqual(len(results), 1)
473
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000474 def test_copy(self):
475 dup = self.s.copy()
476 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000477
478 def test_frozen_as_dictkey(self):
479 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000480 key1 = self.thetype(seq)
481 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000482 self.assertEqual(key1, key2)
483 self.assertNotEqual(id(key1), id(key2))
484 d = {}
485 d[key1] = 42
486 self.assertEqual(d[key2], 42)
487
488 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000489 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000490 self.assertEqual(hash(f), hash(f))
491
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000492 def test_hash_effectiveness(self):
493 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000494 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000495 addhashvalue = hashvalues.add
496 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000497 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000498 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
499 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000500
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000501class FrozenSetSubclass(frozenset):
502 pass
503
504class TestFrozenSetSubclass(TestFrozenSet):
505 thetype = FrozenSetSubclass
506
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000507 def test_constructor_identity(self):
508 s = self.thetype(range(3))
509 t = self.thetype(s)
510 self.assertNotEqual(id(s), id(t))
511
512 def test_copy(self):
513 dup = self.s.copy()
514 self.assertNotEqual(id(self.s), id(dup))
515
516 def test_nested_empty_constructor(self):
517 s = self.thetype()
518 t = self.thetype(s)
519 self.assertEqual(s, t)
520
Raymond Hettingerd7946662005-08-01 21:39:29 +0000521 def test_singleton_empty_frozenset(self):
522 Frozenset = self.thetype
523 f = frozenset()
524 F = Frozenset()
525 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
526 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
527 Frozenset(xrange(0)), Frozenset(Frozenset()),
528 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
529 # All empty frozenset subclass instances should have different ids
530 self.assertEqual(len(set(map(id, efs))), len(efs))
531
Raymond Hettingera690a992003-11-16 16:17:49 +0000532# Tests taken from test_sets.py =============================================
533
534empty_set = set()
535
536#==============================================================================
537
538class TestBasicOps(unittest.TestCase):
539
540 def test_repr(self):
541 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000542 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000543
Raymond Hettingereae05de2004-07-09 04:51:24 +0000544 def test_print(self):
545 try:
546 fo = open(test_support.TESTFN, "wb")
547 print >> fo, self.set,
548 fo.close()
549 fo = open(test_support.TESTFN, "rb")
550 self.assertEqual(fo.read(), repr(self.set))
551 finally:
552 fo.close()
553 os.remove(test_support.TESTFN)
554
Raymond Hettingera690a992003-11-16 16:17:49 +0000555 def test_length(self):
556 self.assertEqual(len(self.set), self.length)
557
558 def test_self_equality(self):
559 self.assertEqual(self.set, self.set)
560
561 def test_equivalent_equality(self):
562 self.assertEqual(self.set, self.dup)
563
564 def test_copy(self):
565 self.assertEqual(self.set.copy(), self.dup)
566
567 def test_self_union(self):
568 result = self.set | self.set
569 self.assertEqual(result, self.dup)
570
571 def test_empty_union(self):
572 result = self.set | empty_set
573 self.assertEqual(result, self.dup)
574
575 def test_union_empty(self):
576 result = empty_set | self.set
577 self.assertEqual(result, self.dup)
578
579 def test_self_intersection(self):
580 result = self.set & self.set
581 self.assertEqual(result, self.dup)
582
583 def test_empty_intersection(self):
584 result = self.set & empty_set
585 self.assertEqual(result, empty_set)
586
587 def test_intersection_empty(self):
588 result = empty_set & self.set
589 self.assertEqual(result, empty_set)
590
591 def test_self_symmetric_difference(self):
592 result = self.set ^ self.set
593 self.assertEqual(result, empty_set)
594
595 def checkempty_symmetric_difference(self):
596 result = self.set ^ empty_set
597 self.assertEqual(result, self.set)
598
599 def test_self_difference(self):
600 result = self.set - self.set
601 self.assertEqual(result, empty_set)
602
603 def test_empty_difference(self):
604 result = self.set - empty_set
605 self.assertEqual(result, self.dup)
606
607 def test_empty_difference_rev(self):
608 result = empty_set - self.set
609 self.assertEqual(result, empty_set)
610
611 def test_iteration(self):
612 for v in self.set:
613 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000614 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000615 # note: __length_hint__ is an internal undocumented API,
616 # don't rely on it in your own programs
617 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000618
619 def test_pickling(self):
620 p = pickle.dumps(self.set)
621 copy = pickle.loads(p)
622 self.assertEqual(self.set, copy,
623 "%s != %s" % (self.set, copy))
624
625#------------------------------------------------------------------------------
626
627class TestBasicOpsEmpty(TestBasicOps):
628 def setUp(self):
629 self.case = "empty set"
630 self.values = []
631 self.set = set(self.values)
632 self.dup = set(self.values)
633 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000634 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000635
636#------------------------------------------------------------------------------
637
638class TestBasicOpsSingleton(TestBasicOps):
639 def setUp(self):
640 self.case = "unit set (number)"
641 self.values = [3]
642 self.set = set(self.values)
643 self.dup = set(self.values)
644 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000645 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000646
647 def test_in(self):
648 self.failUnless(3 in self.set)
649
650 def test_not_in(self):
651 self.failUnless(2 not in self.set)
652
653#------------------------------------------------------------------------------
654
655class TestBasicOpsTuple(TestBasicOps):
656 def setUp(self):
657 self.case = "unit set (tuple)"
658 self.values = [(0, "zero")]
659 self.set = set(self.values)
660 self.dup = set(self.values)
661 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000662 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000663
664 def test_in(self):
665 self.failUnless((0, "zero") in self.set)
666
667 def test_not_in(self):
668 self.failUnless(9 not in self.set)
669
670#------------------------------------------------------------------------------
671
672class TestBasicOpsTriple(TestBasicOps):
673 def setUp(self):
674 self.case = "triple set"
675 self.values = [0, "zero", operator.add]
676 self.set = set(self.values)
677 self.dup = set(self.values)
678 self.length = 3
679 self.repr = None
680
681#==============================================================================
682
683def baditer():
684 raise TypeError
685 yield True
686
687def gooditer():
688 yield True
689
690class TestExceptionPropagation(unittest.TestCase):
691 """SF 628246: Set constructor should not trap iterator TypeErrors"""
692
693 def test_instanceWithException(self):
694 self.assertRaises(TypeError, set, baditer())
695
696 def test_instancesWithoutException(self):
697 # All of these iterables should load without exception.
698 set([1,2,3])
699 set((1,2,3))
700 set({'one':1, 'two':2, 'three':3})
701 set(xrange(3))
702 set('abc')
703 set(gooditer())
704
Neal Norwitzfcf44352005-11-27 20:37:43 +0000705 def test_changingSizeWhileIterating(self):
706 s = set([1,2,3])
707 try:
708 for i in s:
709 s.update([4])
710 except RuntimeError:
711 pass
712 else:
713 self.fail("no exception when changing size during iteration")
714
Raymond Hettingera690a992003-11-16 16:17:49 +0000715#==============================================================================
716
717class TestSetOfSets(unittest.TestCase):
718 def test_constructor(self):
719 inner = frozenset([1])
720 outer = set([inner])
721 element = outer.pop()
722 self.assertEqual(type(element), frozenset)
723 outer.add(inner) # Rebuild set of sets with .add method
724 outer.remove(inner)
725 self.assertEqual(outer, set()) # Verify that remove worked
726 outer.discard(inner) # Absence of KeyError indicates working fine
727
728#==============================================================================
729
730class TestBinaryOps(unittest.TestCase):
731 def setUp(self):
732 self.set = set((2, 4, 6))
733
734 def test_eq(self): # SF bug 643115
735 self.assertEqual(self.set, set({2:1,4:3,6:5}))
736
737 def test_union_subset(self):
738 result = self.set | set([2])
739 self.assertEqual(result, set((2, 4, 6)))
740
741 def test_union_superset(self):
742 result = self.set | set([2, 4, 6, 8])
743 self.assertEqual(result, set([2, 4, 6, 8]))
744
745 def test_union_overlap(self):
746 result = self.set | set([3, 4, 5])
747 self.assertEqual(result, set([2, 3, 4, 5, 6]))
748
749 def test_union_non_overlap(self):
750 result = self.set | set([8])
751 self.assertEqual(result, set([2, 4, 6, 8]))
752
753 def test_intersection_subset(self):
754 result = self.set & set((2, 4))
755 self.assertEqual(result, set((2, 4)))
756
757 def test_intersection_superset(self):
758 result = self.set & set([2, 4, 6, 8])
759 self.assertEqual(result, set([2, 4, 6]))
760
761 def test_intersection_overlap(self):
762 result = self.set & set([3, 4, 5])
763 self.assertEqual(result, set([4]))
764
765 def test_intersection_non_overlap(self):
766 result = self.set & set([8])
767 self.assertEqual(result, empty_set)
768
769 def test_sym_difference_subset(self):
770 result = self.set ^ set((2, 4))
771 self.assertEqual(result, set([6]))
772
773 def test_sym_difference_superset(self):
774 result = self.set ^ set((2, 4, 6, 8))
775 self.assertEqual(result, set([8]))
776
777 def test_sym_difference_overlap(self):
778 result = self.set ^ set((3, 4, 5))
779 self.assertEqual(result, set([2, 3, 5, 6]))
780
781 def test_sym_difference_non_overlap(self):
782 result = self.set ^ set([8])
783 self.assertEqual(result, set([2, 4, 6, 8]))
784
785 def test_cmp(self):
786 a, b = set('a'), set('b')
787 self.assertRaises(TypeError, cmp, a, b)
788
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000789 # In py3k, this works!
790 self.assertRaises(TypeError, cmp, a, a)
Raymond Hettingera690a992003-11-16 16:17:49 +0000791
792 self.assertRaises(TypeError, cmp, a, 12)
793 self.assertRaises(TypeError, cmp, "abc", a)
794
795#==============================================================================
796
797class TestUpdateOps(unittest.TestCase):
798 def setUp(self):
799 self.set = set((2, 4, 6))
800
801 def test_union_subset(self):
802 self.set |= set([2])
803 self.assertEqual(self.set, set((2, 4, 6)))
804
805 def test_union_superset(self):
806 self.set |= set([2, 4, 6, 8])
807 self.assertEqual(self.set, set([2, 4, 6, 8]))
808
809 def test_union_overlap(self):
810 self.set |= set([3, 4, 5])
811 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
812
813 def test_union_non_overlap(self):
814 self.set |= set([8])
815 self.assertEqual(self.set, set([2, 4, 6, 8]))
816
817 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000818 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000819 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
820
821 def test_intersection_subset(self):
822 self.set &= set((2, 4))
823 self.assertEqual(self.set, set((2, 4)))
824
825 def test_intersection_superset(self):
826 self.set &= set([2, 4, 6, 8])
827 self.assertEqual(self.set, set([2, 4, 6]))
828
829 def test_intersection_overlap(self):
830 self.set &= set([3, 4, 5])
831 self.assertEqual(self.set, set([4]))
832
833 def test_intersection_non_overlap(self):
834 self.set &= set([8])
835 self.assertEqual(self.set, empty_set)
836
837 def test_intersection_method_call(self):
838 self.set.intersection_update(set([3, 4, 5]))
839 self.assertEqual(self.set, set([4]))
840
841 def test_sym_difference_subset(self):
842 self.set ^= set((2, 4))
843 self.assertEqual(self.set, set([6]))
844
845 def test_sym_difference_superset(self):
846 self.set ^= set((2, 4, 6, 8))
847 self.assertEqual(self.set, set([8]))
848
849 def test_sym_difference_overlap(self):
850 self.set ^= set((3, 4, 5))
851 self.assertEqual(self.set, set([2, 3, 5, 6]))
852
853 def test_sym_difference_non_overlap(self):
854 self.set ^= set([8])
855 self.assertEqual(self.set, set([2, 4, 6, 8]))
856
857 def test_sym_difference_method_call(self):
858 self.set.symmetric_difference_update(set([3, 4, 5]))
859 self.assertEqual(self.set, set([2, 3, 5, 6]))
860
861 def test_difference_subset(self):
862 self.set -= set((2, 4))
863 self.assertEqual(self.set, set([6]))
864
865 def test_difference_superset(self):
866 self.set -= set((2, 4, 6, 8))
867 self.assertEqual(self.set, set([]))
868
869 def test_difference_overlap(self):
870 self.set -= set((3, 4, 5))
871 self.assertEqual(self.set, set([2, 6]))
872
873 def test_difference_non_overlap(self):
874 self.set -= set([8])
875 self.assertEqual(self.set, set([2, 4, 6]))
876
877 def test_difference_method_call(self):
878 self.set.difference_update(set([3, 4, 5]))
879 self.assertEqual(self.set, set([2, 6]))
880
881#==============================================================================
882
883class TestMutate(unittest.TestCase):
884 def setUp(self):
885 self.values = ["a", "b", "c"]
886 self.set = set(self.values)
887
888 def test_add_present(self):
889 self.set.add("c")
890 self.assertEqual(self.set, set("abc"))
891
892 def test_add_absent(self):
893 self.set.add("d")
894 self.assertEqual(self.set, set("abcd"))
895
896 def test_add_until_full(self):
897 tmp = set()
898 expected_len = 0
899 for v in self.values:
900 tmp.add(v)
901 expected_len += 1
902 self.assertEqual(len(tmp), expected_len)
903 self.assertEqual(tmp, self.set)
904
905 def test_remove_present(self):
906 self.set.remove("b")
907 self.assertEqual(self.set, set("ac"))
908
909 def test_remove_absent(self):
910 try:
911 self.set.remove("d")
912 self.fail("Removing missing element should have raised LookupError")
913 except LookupError:
914 pass
915
916 def test_remove_until_empty(self):
917 expected_len = len(self.set)
918 for v in self.values:
919 self.set.remove(v)
920 expected_len -= 1
921 self.assertEqual(len(self.set), expected_len)
922
923 def test_discard_present(self):
924 self.set.discard("c")
925 self.assertEqual(self.set, set("ab"))
926
927 def test_discard_absent(self):
928 self.set.discard("d")
929 self.assertEqual(self.set, set("abc"))
930
931 def test_clear(self):
932 self.set.clear()
933 self.assertEqual(len(self.set), 0)
934
935 def test_pop(self):
936 popped = {}
937 while self.set:
938 popped[self.set.pop()] = None
939 self.assertEqual(len(popped), len(self.values))
940 for v in self.values:
941 self.failUnless(v in popped)
942
943 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000944 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +0000945 self.assertEqual(self.set, set(self.values))
946
947 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000948 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +0000949 self.assertEqual(self.set, set(self.values))
950
951 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000952 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +0000953 self.assertEqual(self.set, set(self.values + ["z"]))
954
955#==============================================================================
956
957class TestSubsets(unittest.TestCase):
958
959 case2method = {"<=": "issubset",
960 ">=": "issuperset",
961 }
962
963 reverse = {"==": "==",
964 "!=": "!=",
965 "<": ">",
966 ">": "<",
967 "<=": ">=",
968 ">=": "<=",
969 }
970
971 def test_issubset(self):
972 x = self.left
973 y = self.right
974 for case in "!=", "==", "<", "<=", ">", ">=":
975 expected = case in self.cases
976 # Test the binary infix spelling.
977 result = eval("x" + case + "y", locals())
978 self.assertEqual(result, expected)
979 # Test the "friendly" method-name spelling, if one exists.
980 if case in TestSubsets.case2method:
981 method = getattr(x, TestSubsets.case2method[case])
982 result = method(y)
983 self.assertEqual(result, expected)
984
985 # Now do the same for the operands reversed.
986 rcase = TestSubsets.reverse[case]
987 result = eval("y" + rcase + "x", locals())
988 self.assertEqual(result, expected)
989 if rcase in TestSubsets.case2method:
990 method = getattr(y, TestSubsets.case2method[rcase])
991 result = method(x)
992 self.assertEqual(result, expected)
993#------------------------------------------------------------------------------
994
995class TestSubsetEqualEmpty(TestSubsets):
996 left = set()
997 right = set()
998 name = "both empty"
999 cases = "==", "<=", ">="
1000
1001#------------------------------------------------------------------------------
1002
1003class TestSubsetEqualNonEmpty(TestSubsets):
1004 left = set([1, 2])
1005 right = set([1, 2])
1006 name = "equal pair"
1007 cases = "==", "<=", ">="
1008
1009#------------------------------------------------------------------------------
1010
1011class TestSubsetEmptyNonEmpty(TestSubsets):
1012 left = set()
1013 right = set([1, 2])
1014 name = "one empty, one non-empty"
1015 cases = "!=", "<", "<="
1016
1017#------------------------------------------------------------------------------
1018
1019class TestSubsetPartial(TestSubsets):
1020 left = set([1])
1021 right = set([1, 2])
1022 name = "one a non-empty proper subset of other"
1023 cases = "!=", "<", "<="
1024
1025#------------------------------------------------------------------------------
1026
1027class TestSubsetNonOverlap(TestSubsets):
1028 left = set([1])
1029 right = set([2])
1030 name = "neither empty, neither contains"
1031 cases = "!="
1032
1033#==============================================================================
1034
1035class TestOnlySetsInBinaryOps(unittest.TestCase):
1036
1037 def test_eq_ne(self):
1038 # Unlike the others, this is testing that == and != *are* allowed.
1039 self.assertEqual(self.other == self.set, False)
1040 self.assertEqual(self.set == self.other, False)
1041 self.assertEqual(self.other != self.set, True)
1042 self.assertEqual(self.set != self.other, True)
1043
1044 def test_ge_gt_le_lt(self):
1045 self.assertRaises(TypeError, lambda: self.set < self.other)
1046 self.assertRaises(TypeError, lambda: self.set <= self.other)
1047 self.assertRaises(TypeError, lambda: self.set > self.other)
1048 self.assertRaises(TypeError, lambda: self.set >= self.other)
1049
1050 self.assertRaises(TypeError, lambda: self.other < self.set)
1051 self.assertRaises(TypeError, lambda: self.other <= self.set)
1052 self.assertRaises(TypeError, lambda: self.other > self.set)
1053 self.assertRaises(TypeError, lambda: self.other >= self.set)
1054
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001055 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001056 try:
1057 self.set |= self.other
1058 except TypeError:
1059 pass
1060 else:
1061 self.fail("expected TypeError")
1062
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001063 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001064 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001065 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001066 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001067 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001068
1069 def test_union(self):
1070 self.assertRaises(TypeError, lambda: self.set | self.other)
1071 self.assertRaises(TypeError, lambda: self.other | self.set)
1072 if self.otherIsIterable:
1073 self.set.union(self.other)
1074 else:
1075 self.assertRaises(TypeError, self.set.union, self.other)
1076
1077 def test_intersection_update_operator(self):
1078 try:
1079 self.set &= self.other
1080 except TypeError:
1081 pass
1082 else:
1083 self.fail("expected TypeError")
1084
1085 def test_intersection_update(self):
1086 if self.otherIsIterable:
1087 self.set.intersection_update(self.other)
1088 else:
1089 self.assertRaises(TypeError,
1090 self.set.intersection_update,
1091 self.other)
1092
1093 def test_intersection(self):
1094 self.assertRaises(TypeError, lambda: self.set & self.other)
1095 self.assertRaises(TypeError, lambda: self.other & self.set)
1096 if self.otherIsIterable:
1097 self.set.intersection(self.other)
1098 else:
1099 self.assertRaises(TypeError, self.set.intersection, self.other)
1100
1101 def test_sym_difference_update_operator(self):
1102 try:
1103 self.set ^= self.other
1104 except TypeError:
1105 pass
1106 else:
1107 self.fail("expected TypeError")
1108
1109 def test_sym_difference_update(self):
1110 if self.otherIsIterable:
1111 self.set.symmetric_difference_update(self.other)
1112 else:
1113 self.assertRaises(TypeError,
1114 self.set.symmetric_difference_update,
1115 self.other)
1116
1117 def test_sym_difference(self):
1118 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1119 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1120 if self.otherIsIterable:
1121 self.set.symmetric_difference(self.other)
1122 else:
1123 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1124
1125 def test_difference_update_operator(self):
1126 try:
1127 self.set -= self.other
1128 except TypeError:
1129 pass
1130 else:
1131 self.fail("expected TypeError")
1132
1133 def test_difference_update(self):
1134 if self.otherIsIterable:
1135 self.set.difference_update(self.other)
1136 else:
1137 self.assertRaises(TypeError,
1138 self.set.difference_update,
1139 self.other)
1140
1141 def test_difference(self):
1142 self.assertRaises(TypeError, lambda: self.set - self.other)
1143 self.assertRaises(TypeError, lambda: self.other - self.set)
1144 if self.otherIsIterable:
1145 self.set.difference(self.other)
1146 else:
1147 self.assertRaises(TypeError, self.set.difference, self.other)
1148
1149#------------------------------------------------------------------------------
1150
1151class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1152 def setUp(self):
1153 self.set = set((1, 2, 3))
1154 self.other = 19
1155 self.otherIsIterable = False
1156
1157#------------------------------------------------------------------------------
1158
1159class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1160 def setUp(self):
1161 self.set = set((1, 2, 3))
1162 self.other = {1:2, 3:4}
1163 self.otherIsIterable = True
1164
1165#------------------------------------------------------------------------------
1166
1167class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1168 def setUp(self):
1169 self.set = set((1, 2, 3))
1170 self.other = operator.add
1171 self.otherIsIterable = False
1172
1173#------------------------------------------------------------------------------
1174
1175class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1176 def setUp(self):
1177 self.set = set((1, 2, 3))
1178 self.other = (2, 4, 6)
1179 self.otherIsIterable = True
1180
1181#------------------------------------------------------------------------------
1182
1183class TestOnlySetsString(TestOnlySetsInBinaryOps):
1184 def setUp(self):
1185 self.set = set((1, 2, 3))
1186 self.other = 'abc'
1187 self.otherIsIterable = True
1188
1189#------------------------------------------------------------------------------
1190
1191class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1192 def setUp(self):
1193 def gen():
1194 for i in xrange(0, 10, 2):
1195 yield i
1196 self.set = set((1, 2, 3))
1197 self.other = gen()
1198 self.otherIsIterable = True
1199
1200#==============================================================================
1201
1202class TestCopying(unittest.TestCase):
1203
1204 def test_copy(self):
1205 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001206 dup_list = sorted(dup, key=repr)
1207 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001208 self.assertEqual(len(dup_list), len(set_list))
1209 for i in range(len(dup_list)):
1210 self.failUnless(dup_list[i] is set_list[i])
1211
1212 def test_deep_copy(self):
1213 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001214 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001215 dup_list = sorted(dup, key=repr)
1216 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001217 self.assertEqual(len(dup_list), len(set_list))
1218 for i in range(len(dup_list)):
1219 self.assertEqual(dup_list[i], set_list[i])
1220
1221#------------------------------------------------------------------------------
1222
1223class TestCopyingEmpty(TestCopying):
1224 def setUp(self):
1225 self.set = set()
1226
1227#------------------------------------------------------------------------------
1228
1229class TestCopyingSingleton(TestCopying):
1230 def setUp(self):
1231 self.set = set(["hello"])
1232
1233#------------------------------------------------------------------------------
1234
1235class TestCopyingTriple(TestCopying):
1236 def setUp(self):
1237 self.set = set(["zero", 0, None])
1238
1239#------------------------------------------------------------------------------
1240
1241class TestCopyingTuple(TestCopying):
1242 def setUp(self):
1243 self.set = set([(1, 2)])
1244
1245#------------------------------------------------------------------------------
1246
1247class TestCopyingNested(TestCopying):
1248 def setUp(self):
1249 self.set = set([((1, 2), (3, 4))])
1250
1251#==============================================================================
1252
1253class TestIdentities(unittest.TestCase):
1254 def setUp(self):
1255 self.a = set('abracadabra')
1256 self.b = set('alacazam')
1257
1258 def test_binopsVsSubsets(self):
1259 a, b = self.a, self.b
1260 self.assert_(a - b < a)
1261 self.assert_(b - a < b)
1262 self.assert_(a & b < a)
1263 self.assert_(a & b < b)
1264 self.assert_(a | b > a)
1265 self.assert_(a | b > b)
1266 self.assert_(a ^ b < a | b)
1267
1268 def test_commutativity(self):
1269 a, b = self.a, self.b
1270 self.assertEqual(a&b, b&a)
1271 self.assertEqual(a|b, b|a)
1272 self.assertEqual(a^b, b^a)
1273 if a != b:
1274 self.assertNotEqual(a-b, b-a)
1275
1276 def test_summations(self):
1277 # check that sums of parts equal the whole
1278 a, b = self.a, self.b
1279 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1280 self.assertEqual((a&b)|(a^b), a|b)
1281 self.assertEqual(a|(b-a), a|b)
1282 self.assertEqual((a-b)|b, a|b)
1283 self.assertEqual((a-b)|(a&b), a)
1284 self.assertEqual((b-a)|(a&b), b)
1285 self.assertEqual((a-b)|(b-a), a^b)
1286
1287 def test_exclusion(self):
1288 # check that inverse operations show non-overlap
1289 a, b, zero = self.a, self.b, set()
1290 self.assertEqual((a-b)&b, zero)
1291 self.assertEqual((b-a)&a, zero)
1292 self.assertEqual((a&b)&(a^b), zero)
1293
1294# Tests derived from test_itertools.py =======================================
1295
1296def R(seqn):
1297 'Regular generator'
1298 for i in seqn:
1299 yield i
1300
1301class G:
1302 'Sequence using __getitem__'
1303 def __init__(self, seqn):
1304 self.seqn = seqn
1305 def __getitem__(self, i):
1306 return self.seqn[i]
1307
1308class I:
1309 'Sequence using iterator protocol'
1310 def __init__(self, seqn):
1311 self.seqn = seqn
1312 self.i = 0
1313 def __iter__(self):
1314 return self
1315 def next(self):
1316 if self.i >= len(self.seqn): raise StopIteration
1317 v = self.seqn[self.i]
1318 self.i += 1
1319 return v
1320
1321class Ig:
1322 'Sequence using iterator protocol defined with a generator'
1323 def __init__(self, seqn):
1324 self.seqn = seqn
1325 self.i = 0
1326 def __iter__(self):
1327 for val in self.seqn:
1328 yield val
1329
1330class X:
1331 'Missing __getitem__ and __iter__'
1332 def __init__(self, seqn):
1333 self.seqn = seqn
1334 self.i = 0
1335 def next(self):
1336 if self.i >= len(self.seqn): raise StopIteration
1337 v = self.seqn[self.i]
1338 self.i += 1
1339 return v
1340
1341class N:
1342 'Iterator missing next()'
1343 def __init__(self, seqn):
1344 self.seqn = seqn
1345 self.i = 0
1346 def __iter__(self):
1347 return self
1348
1349class E:
1350 'Test propagation of exceptions'
1351 def __init__(self, seqn):
1352 self.seqn = seqn
1353 self.i = 0
1354 def __iter__(self):
1355 return self
1356 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001357 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001358
1359class S:
1360 'Test immediate stop'
1361 def __init__(self, seqn):
1362 pass
1363 def __iter__(self):
1364 return self
1365 def next(self):
1366 raise StopIteration
1367
1368from itertools import chain, imap
1369def L(seqn):
1370 'Test multiple tiers of iterators'
1371 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1372
1373class TestVariousIteratorArgs(unittest.TestCase):
1374
1375 def test_constructor(self):
1376 for cons in (set, frozenset):
1377 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1378 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001379 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001380 self.assertRaises(TypeError, cons , X(s))
1381 self.assertRaises(TypeError, cons , N(s))
1382 self.assertRaises(ZeroDivisionError, cons , E(s))
1383
1384 def test_inline_methods(self):
1385 s = set('november')
1386 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1387 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1388 for g in (G, I, Ig, L, R):
1389 expected = meth(data)
1390 actual = meth(G(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001391 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001392 self.assertRaises(TypeError, meth, X(s))
1393 self.assertRaises(TypeError, meth, N(s))
1394 self.assertRaises(ZeroDivisionError, meth, E(s))
1395
1396 def test_inplace_methods(self):
1397 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001398 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001399 'difference_update', 'symmetric_difference_update'):
1400 for g in (G, I, Ig, S, L, R):
1401 s = set('january')
1402 t = s.copy()
1403 getattr(s, methname)(list(g(data)))
1404 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001405 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001406
1407 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1408 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1409 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1410
1411#==============================================================================
1412
1413def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001414 from test import test_sets
1415 test_classes = (
1416 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001417 TestSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001418 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001419 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001420 TestSetOfSets,
1421 TestExceptionPropagation,
1422 TestBasicOpsEmpty,
1423 TestBasicOpsSingleton,
1424 TestBasicOpsTuple,
1425 TestBasicOpsTriple,
1426 TestBinaryOps,
1427 TestUpdateOps,
1428 TestMutate,
1429 TestSubsetEqualEmpty,
1430 TestSubsetEqualNonEmpty,
1431 TestSubsetEmptyNonEmpty,
1432 TestSubsetPartial,
1433 TestSubsetNonOverlap,
1434 TestOnlySetsNumeric,
1435 TestOnlySetsDict,
1436 TestOnlySetsOperator,
1437 TestOnlySetsTuple,
1438 TestOnlySetsString,
1439 TestOnlySetsGenerator,
1440 TestCopyingEmpty,
1441 TestCopyingSingleton,
1442 TestCopyingTriple,
1443 TestCopyingTuple,
1444 TestCopyingNested,
1445 TestIdentities,
1446 TestVariousIteratorArgs,
1447 )
1448
1449 test_support.run_unittest(*test_classes)
1450
1451 # verify reference counting
1452 if verbose and hasattr(sys, "gettotalrefcount"):
1453 import gc
1454 counts = [None] * 5
1455 for i in xrange(len(counts)):
1456 test_support.run_unittest(*test_classes)
1457 gc.collect()
1458 counts[i] = sys.gettotalrefcount()
1459 print counts
1460
1461if __name__ == "__main__":
1462 test_main(verbose=True)