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