blob: f393712b84f1c1e8cbb814f405916fccef8784e7 [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 Hettingera690a992003-11-16 16:17:49 +00009
10class PassThru(Exception):
11 pass
12
13def check_pass_thru():
14 raise PassThru
15 yield 1
16
17class TestJointOps(unittest.TestCase):
18 # Tests common to both set and frozenset
19
20 def setUp(self):
21 self.word = word = 'simsalabim'
22 self.otherword = 'madagascar'
23 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
24 self.s = self.thetype(word)
25 self.d = dict.fromkeys(word)
26
Raymond Hettinger6429a472004-09-28 01:51:35 +000027 def test_new_or_init(self):
28 self.assertRaises(TypeError, self.thetype, [], 2)
29
Raymond Hettingera690a992003-11-16 16:17:49 +000030 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000031 actual = sorted(self.s)
32 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000033 self.assertEqual(actual, expected)
34 self.assertRaises(PassThru, self.thetype, check_pass_thru())
35 self.assertRaises(TypeError, self.thetype, [[]])
36
37 def test_len(self):
38 self.assertEqual(len(self.s), len(self.d))
39
40 def test_contains(self):
41 for c in self.letters:
42 self.assertEqual(c in self.s, c in self.d)
43 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000044 s = self.thetype([frozenset(self.letters)])
45 self.assert_(self.thetype(self.letters) in s)
Raymond Hettingera690a992003-11-16 16:17:49 +000046
Raymond Hettingera690a992003-11-16 16:17:49 +000047 def test_union(self):
48 u = self.s.union(self.otherword)
49 for c in self.letters:
50 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000051 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000052 self.assertEqual(type(u), self.thetype)
53 self.assertRaises(PassThru, self.s.union, check_pass_thru())
54 self.assertRaises(TypeError, self.s.union, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000055 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
56 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
57 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
58 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
59 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +000060
61 def test_or(self):
62 i = self.s.union(self.otherword)
63 self.assertEqual(self.s | set(self.otherword), i)
64 self.assertEqual(self.s | frozenset(self.otherword), i)
65 try:
66 self.s | self.otherword
67 except TypeError:
68 pass
69 else:
70 self.fail("s|t did not screen-out general iterables")
71
72 def test_intersection(self):
73 i = self.s.intersection(self.otherword)
74 for c in self.letters:
75 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000076 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000077 self.assertEqual(type(i), self.thetype)
78 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000079 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
80 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
81 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
82 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
83 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Raymond Hettingera690a992003-11-16 16:17:49 +000084
85 def test_and(self):
86 i = self.s.intersection(self.otherword)
87 self.assertEqual(self.s & set(self.otherword), i)
88 self.assertEqual(self.s & frozenset(self.otherword), i)
89 try:
90 self.s & self.otherword
91 except TypeError:
92 pass
93 else:
94 self.fail("s&t did not screen-out general iterables")
95
96 def test_difference(self):
97 i = self.s.difference(self.otherword)
98 for c in self.letters:
99 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000100 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000101 self.assertEqual(type(i), self.thetype)
102 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
103 self.assertRaises(TypeError, self.s.difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000104 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
105 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
106 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
107 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
108 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000109
110 def test_sub(self):
111 i = self.s.difference(self.otherword)
112 self.assertEqual(self.s - set(self.otherword), i)
113 self.assertEqual(self.s - frozenset(self.otherword), i)
114 try:
115 self.s - self.otherword
116 except TypeError:
117 pass
118 else:
119 self.fail("s-t did not screen-out general iterables")
120
121 def test_symmetric_difference(self):
122 i = self.s.symmetric_difference(self.otherword)
123 for c in self.letters:
124 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000125 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000126 self.assertEqual(type(i), self.thetype)
127 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
128 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000129 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
130 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
131 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
132 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
133 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000134
135 def test_xor(self):
136 i = self.s.symmetric_difference(self.otherword)
137 self.assertEqual(self.s ^ set(self.otherword), i)
138 self.assertEqual(self.s ^ frozenset(self.otherword), i)
139 try:
140 self.s ^ self.otherword
141 except TypeError:
142 pass
143 else:
144 self.fail("s^t did not screen-out general iterables")
145
146 def test_equality(self):
147 self.assertEqual(self.s, set(self.word))
148 self.assertEqual(self.s, frozenset(self.word))
149 self.assertEqual(self.s == self.word, False)
150 self.assertNotEqual(self.s, set(self.otherword))
151 self.assertNotEqual(self.s, frozenset(self.otherword))
152 self.assertEqual(self.s != self.word, True)
153
154 def test_setOfFrozensets(self):
155 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
156 s = self.thetype(t)
157 self.assertEqual(len(s), 3)
158
159 def test_compare(self):
160 self.assertRaises(TypeError, self.s.__cmp__, self.s)
161
162 def test_sub_and_super(self):
163 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
164 self.assert_(p < q)
165 self.assert_(p <= q)
166 self.assert_(q <= q)
167 self.assert_(q > p)
168 self.assert_(q >= p)
169 self.failIf(q < r)
170 self.failIf(q <= r)
171 self.failIf(q > r)
172 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000173 self.assert_(set('a').issubset('abc'))
174 self.assert_(set('abc').issuperset('a'))
175 self.failIf(set('a').issubset('cbs'))
176 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000177
178 def test_pickling(self):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000179 for i in (0, 1, 2):
180 p = pickle.dumps(self.s, i)
181 dup = pickle.loads(p)
182 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
183 if type(self.s) not in (set, frozenset):
184 self.s.x = 10
185 p = pickle.dumps(self.s)
186 dup = pickle.loads(p)
187 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000188
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000189 def test_deepcopy(self):
190 class Tracer:
191 def __init__(self, value):
192 self.value = value
193 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000194 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000195 def __deepcopy__(self, memo=None):
196 return Tracer(self.value + 1)
197 t = Tracer(10)
198 s = self.thetype([t])
199 dup = copy.deepcopy(s)
200 self.assertNotEqual(id(s), id(dup))
201 for elem in dup:
202 newt = elem
203 self.assertNotEqual(id(t), id(newt))
204 self.assertEqual(t.value + 1, newt.value)
205
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000206 def test_gc(self):
207 # Create a nest of cycles to exercise overall ref count check
208 class A:
209 pass
210 s = set(A() for i in xrange(1000))
211 for elem in s:
212 elem.cycle = s
213 elem.sub = elem
214 elem.set = set([elem])
215
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000216 def test_subclass_with_custom_hash(self):
217 # Bug #1257731
218 class H(self.thetype):
219 def __hash__(self):
220 return id(self)
221 s=H()
222 f=set()
223 f.add(s)
224 self.assert_(s in f)
225 f.remove(s)
226 f.add(s)
227 f.discard(s)
228
Raymond Hettingera690a992003-11-16 16:17:49 +0000229class TestSet(TestJointOps):
230 thetype = set
231
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000232 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000233 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000234 s.__init__(self.word)
235 self.assertEqual(s, set(self.word))
236 s.__init__(self.otherword)
237 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000238 self.assertRaises(TypeError, s.__init__, s, 2);
239 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000240
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000241 def test_constructor_identity(self):
242 s = self.thetype(range(3))
243 t = self.thetype(s)
244 self.assertNotEqual(id(s), id(t))
245
Raymond Hettingera690a992003-11-16 16:17:49 +0000246 def test_hash(self):
247 self.assertRaises(TypeError, hash, self.s)
248
249 def test_clear(self):
250 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000251 self.assertEqual(self.s, set())
252 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000253
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000254 def test_copy(self):
255 dup = self.s.copy()
256 self.assertEqual(self.s, dup)
257 self.assertNotEqual(id(self.s), id(dup))
258
Raymond Hettingera690a992003-11-16 16:17:49 +0000259 def test_add(self):
260 self.s.add('Q')
261 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000262 dup = self.s.copy()
263 self.s.add('Q')
264 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000265 self.assertRaises(TypeError, self.s.add, [])
266
267 def test_remove(self):
268 self.s.remove('a')
269 self.assert_('a' not in self.s)
270 self.assertRaises(KeyError, self.s.remove, 'Q')
271 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000272 s = self.thetype([frozenset(self.word)])
273 self.assert_(self.thetype(self.word) in s)
274 s.remove(self.thetype(self.word))
275 self.assert_(self.thetype(self.word) not in s)
276 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000277
278 def test_discard(self):
279 self.s.discard('a')
280 self.assert_('a' not in self.s)
281 self.s.discard('Q')
282 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000283 s = self.thetype([frozenset(self.word)])
284 self.assert_(self.thetype(self.word) in s)
285 s.discard(self.thetype(self.word))
286 self.assert_(self.thetype(self.word) not in s)
287 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000288
289 def test_pop(self):
290 for i in xrange(len(self.s)):
291 elem = self.s.pop()
292 self.assert_(elem not in self.s)
293 self.assertRaises(KeyError, self.s.pop)
294
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000295 def test_update(self):
296 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000297 self.assertEqual(retval, None)
298 for c in (self.word + self.otherword):
299 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000300 self.assertRaises(PassThru, self.s.update, check_pass_thru())
301 self.assertRaises(TypeError, self.s.update, [[]])
302 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
303 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
304 s = self.thetype('abcba')
305 self.assertEqual(s.update(C(p)), None)
306 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000307
308 def test_ior(self):
309 self.s |= set(self.otherword)
310 for c in (self.word + self.otherword):
311 self.assert_(c in self.s)
312
313 def test_intersection_update(self):
314 retval = self.s.intersection_update(self.otherword)
315 self.assertEqual(retval, None)
316 for c in (self.word + self.otherword):
317 if c in self.otherword and c in self.word:
318 self.assert_(c in self.s)
319 else:
320 self.assert_(c not in self.s)
321 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
322 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000323 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
324 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
325 s = self.thetype('abcba')
326 self.assertEqual(s.intersection_update(C(p)), None)
327 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000328
329 def test_iand(self):
330 self.s &= set(self.otherword)
331 for c in (self.word + self.otherword):
332 if c in self.otherword and c in self.word:
333 self.assert_(c in self.s)
334 else:
335 self.assert_(c not in self.s)
336
337 def test_difference_update(self):
338 retval = self.s.difference_update(self.otherword)
339 self.assertEqual(retval, None)
340 for c in (self.word + self.otherword):
341 if c in self.word and c not in self.otherword:
342 self.assert_(c in self.s)
343 else:
344 self.assert_(c not in self.s)
345 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
346 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000347 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
348 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
349 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
350 s = self.thetype('abcba')
351 self.assertEqual(s.difference_update(C(p)), None)
352 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000353
354 def test_isub(self):
355 self.s -= set(self.otherword)
356 for c in (self.word + self.otherword):
357 if c in self.word and c not in self.otherword:
358 self.assert_(c in self.s)
359 else:
360 self.assert_(c not in self.s)
361
362 def test_symmetric_difference_update(self):
363 retval = self.s.symmetric_difference_update(self.otherword)
364 self.assertEqual(retval, None)
365 for c in (self.word + self.otherword):
366 if (c in self.word) ^ (c in self.otherword):
367 self.assert_(c in self.s)
368 else:
369 self.assert_(c not in self.s)
370 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
371 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000372 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
373 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
374 s = self.thetype('abcba')
375 self.assertEqual(s.symmetric_difference_update(C(p)), None)
376 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000377
378 def test_ixor(self):
379 self.s ^= set(self.otherword)
380 for c in (self.word + self.otherword):
381 if (c in self.word) ^ (c in self.otherword):
382 self.assert_(c in self.s)
383 else:
384 self.assert_(c not in self.s)
385
Raymond Hettingerc991db22005-08-11 07:58:45 +0000386 def test_inplace_on_self(self):
387 t = self.s.copy()
388 t |= t
389 self.assertEqual(t, self.s)
390 t &= t
391 self.assertEqual(t, self.s)
392 t -= t
393 self.assertEqual(t, self.thetype())
394 t = self.s.copy()
395 t ^= t
396 self.assertEqual(t, self.thetype())
397
Raymond Hettinger691d8052004-05-30 07:26:47 +0000398 def test_weakref(self):
399 s = self.thetype('gallahad')
400 p = proxy(s)
401 self.assertEqual(str(p), str(s))
402 s = None
403 self.assertRaises(ReferenceError, str, p)
404
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000405class SetSubclass(set):
406 pass
407
408class TestSetSubclass(TestSet):
409 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000410
411class TestFrozenSet(TestJointOps):
412 thetype = frozenset
413
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000414 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000415 s = self.thetype(self.word)
416 s.__init__(self.otherword)
417 self.assertEqual(s, set(self.word))
418
Raymond Hettingerd7946662005-08-01 21:39:29 +0000419 def test_singleton_empty_frozenset(self):
420 f = frozenset()
421 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
422 frozenset(), frozenset([]), frozenset(()), frozenset(''),
423 frozenset(xrange(0)), frozenset(frozenset()),
424 frozenset(f), f]
425 # All of the empty frozensets should have just one id()
426 self.assertEqual(len(set(map(id, efs))), 1)
427
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000428 def test_constructor_identity(self):
429 s = self.thetype(range(3))
430 t = self.thetype(s)
431 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000432
Raymond Hettingera690a992003-11-16 16:17:49 +0000433 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000434 self.assertEqual(hash(self.thetype('abcdeb')),
435 hash(self.thetype('ebecda')))
436
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000437 # make sure that all permutations give the same hash value
438 n = 100
439 seq = [randrange(n) for i in xrange(n)]
440 results = set()
441 for i in xrange(200):
442 shuffle(seq)
443 results.add(hash(self.thetype(seq)))
444 self.assertEqual(len(results), 1)
445
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000446 def test_copy(self):
447 dup = self.s.copy()
448 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000449
450 def test_frozen_as_dictkey(self):
451 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000452 key1 = self.thetype(seq)
453 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000454 self.assertEqual(key1, key2)
455 self.assertNotEqual(id(key1), id(key2))
456 d = {}
457 d[key1] = 42
458 self.assertEqual(d[key2], 42)
459
460 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000461 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000462 self.assertEqual(hash(f), hash(f))
463
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000464 def test_hash_effectiveness(self):
465 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000466 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000467 addhashvalue = hashvalues.add
468 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000469 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000470 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
471 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000472
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000473class FrozenSetSubclass(frozenset):
474 pass
475
476class TestFrozenSetSubclass(TestFrozenSet):
477 thetype = FrozenSetSubclass
478
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000479 def test_constructor_identity(self):
480 s = self.thetype(range(3))
481 t = self.thetype(s)
482 self.assertNotEqual(id(s), id(t))
483
484 def test_copy(self):
485 dup = self.s.copy()
486 self.assertNotEqual(id(self.s), id(dup))
487
488 def test_nested_empty_constructor(self):
489 s = self.thetype()
490 t = self.thetype(s)
491 self.assertEqual(s, t)
492
Raymond Hettingerd7946662005-08-01 21:39:29 +0000493 def test_singleton_empty_frozenset(self):
494 Frozenset = self.thetype
495 f = frozenset()
496 F = Frozenset()
497 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
498 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
499 Frozenset(xrange(0)), Frozenset(Frozenset()),
500 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
501 # All empty frozenset subclass instances should have different ids
502 self.assertEqual(len(set(map(id, efs))), len(efs))
503
Raymond Hettingera690a992003-11-16 16:17:49 +0000504# Tests taken from test_sets.py =============================================
505
506empty_set = set()
507
508#==============================================================================
509
510class TestBasicOps(unittest.TestCase):
511
512 def test_repr(self):
513 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000514 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000515
Raymond Hettingereae05de2004-07-09 04:51:24 +0000516 def test_print(self):
517 try:
518 fo = open(test_support.TESTFN, "wb")
519 print >> fo, self.set,
520 fo.close()
521 fo = open(test_support.TESTFN, "rb")
522 self.assertEqual(fo.read(), repr(self.set))
523 finally:
524 fo.close()
525 os.remove(test_support.TESTFN)
526
Raymond Hettingera690a992003-11-16 16:17:49 +0000527 def test_length(self):
528 self.assertEqual(len(self.set), self.length)
529
530 def test_self_equality(self):
531 self.assertEqual(self.set, self.set)
532
533 def test_equivalent_equality(self):
534 self.assertEqual(self.set, self.dup)
535
536 def test_copy(self):
537 self.assertEqual(self.set.copy(), self.dup)
538
539 def test_self_union(self):
540 result = self.set | self.set
541 self.assertEqual(result, self.dup)
542
543 def test_empty_union(self):
544 result = self.set | empty_set
545 self.assertEqual(result, self.dup)
546
547 def test_union_empty(self):
548 result = empty_set | self.set
549 self.assertEqual(result, self.dup)
550
551 def test_self_intersection(self):
552 result = self.set & self.set
553 self.assertEqual(result, self.dup)
554
555 def test_empty_intersection(self):
556 result = self.set & empty_set
557 self.assertEqual(result, empty_set)
558
559 def test_intersection_empty(self):
560 result = empty_set & self.set
561 self.assertEqual(result, empty_set)
562
563 def test_self_symmetric_difference(self):
564 result = self.set ^ self.set
565 self.assertEqual(result, empty_set)
566
567 def checkempty_symmetric_difference(self):
568 result = self.set ^ empty_set
569 self.assertEqual(result, self.set)
570
571 def test_self_difference(self):
572 result = self.set - self.set
573 self.assertEqual(result, empty_set)
574
575 def test_empty_difference(self):
576 result = self.set - empty_set
577 self.assertEqual(result, self.dup)
578
579 def test_empty_difference_rev(self):
580 result = empty_set - self.set
581 self.assertEqual(result, empty_set)
582
583 def test_iteration(self):
584 for v in self.set:
585 self.assert_(v in self.values)
586
587 def test_pickling(self):
588 p = pickle.dumps(self.set)
589 copy = pickle.loads(p)
590 self.assertEqual(self.set, copy,
591 "%s != %s" % (self.set, copy))
592
593#------------------------------------------------------------------------------
594
595class TestBasicOpsEmpty(TestBasicOps):
596 def setUp(self):
597 self.case = "empty set"
598 self.values = []
599 self.set = set(self.values)
600 self.dup = set(self.values)
601 self.length = 0
602 self.repr = "set([])"
603
604#------------------------------------------------------------------------------
605
606class TestBasicOpsSingleton(TestBasicOps):
607 def setUp(self):
608 self.case = "unit set (number)"
609 self.values = [3]
610 self.set = set(self.values)
611 self.dup = set(self.values)
612 self.length = 1
613 self.repr = "set([3])"
614
615 def test_in(self):
616 self.failUnless(3 in self.set)
617
618 def test_not_in(self):
619 self.failUnless(2 not in self.set)
620
621#------------------------------------------------------------------------------
622
623class TestBasicOpsTuple(TestBasicOps):
624 def setUp(self):
625 self.case = "unit set (tuple)"
626 self.values = [(0, "zero")]
627 self.set = set(self.values)
628 self.dup = set(self.values)
629 self.length = 1
630 self.repr = "set([(0, 'zero')])"
631
632 def test_in(self):
633 self.failUnless((0, "zero") in self.set)
634
635 def test_not_in(self):
636 self.failUnless(9 not in self.set)
637
638#------------------------------------------------------------------------------
639
640class TestBasicOpsTriple(TestBasicOps):
641 def setUp(self):
642 self.case = "triple set"
643 self.values = [0, "zero", operator.add]
644 self.set = set(self.values)
645 self.dup = set(self.values)
646 self.length = 3
647 self.repr = None
648
649#==============================================================================
650
651def baditer():
652 raise TypeError
653 yield True
654
655def gooditer():
656 yield True
657
658class TestExceptionPropagation(unittest.TestCase):
659 """SF 628246: Set constructor should not trap iterator TypeErrors"""
660
661 def test_instanceWithException(self):
662 self.assertRaises(TypeError, set, baditer())
663
664 def test_instancesWithoutException(self):
665 # All of these iterables should load without exception.
666 set([1,2,3])
667 set((1,2,3))
668 set({'one':1, 'two':2, 'three':3})
669 set(xrange(3))
670 set('abc')
671 set(gooditer())
672
673#==============================================================================
674
675class TestSetOfSets(unittest.TestCase):
676 def test_constructor(self):
677 inner = frozenset([1])
678 outer = set([inner])
679 element = outer.pop()
680 self.assertEqual(type(element), frozenset)
681 outer.add(inner) # Rebuild set of sets with .add method
682 outer.remove(inner)
683 self.assertEqual(outer, set()) # Verify that remove worked
684 outer.discard(inner) # Absence of KeyError indicates working fine
685
686#==============================================================================
687
688class TestBinaryOps(unittest.TestCase):
689 def setUp(self):
690 self.set = set((2, 4, 6))
691
692 def test_eq(self): # SF bug 643115
693 self.assertEqual(self.set, set({2:1,4:3,6:5}))
694
695 def test_union_subset(self):
696 result = self.set | set([2])
697 self.assertEqual(result, set((2, 4, 6)))
698
699 def test_union_superset(self):
700 result = self.set | set([2, 4, 6, 8])
701 self.assertEqual(result, set([2, 4, 6, 8]))
702
703 def test_union_overlap(self):
704 result = self.set | set([3, 4, 5])
705 self.assertEqual(result, set([2, 3, 4, 5, 6]))
706
707 def test_union_non_overlap(self):
708 result = self.set | set([8])
709 self.assertEqual(result, set([2, 4, 6, 8]))
710
711 def test_intersection_subset(self):
712 result = self.set & set((2, 4))
713 self.assertEqual(result, set((2, 4)))
714
715 def test_intersection_superset(self):
716 result = self.set & set([2, 4, 6, 8])
717 self.assertEqual(result, set([2, 4, 6]))
718
719 def test_intersection_overlap(self):
720 result = self.set & set([3, 4, 5])
721 self.assertEqual(result, set([4]))
722
723 def test_intersection_non_overlap(self):
724 result = self.set & set([8])
725 self.assertEqual(result, empty_set)
726
727 def test_sym_difference_subset(self):
728 result = self.set ^ set((2, 4))
729 self.assertEqual(result, set([6]))
730
731 def test_sym_difference_superset(self):
732 result = self.set ^ set((2, 4, 6, 8))
733 self.assertEqual(result, set([8]))
734
735 def test_sym_difference_overlap(self):
736 result = self.set ^ set((3, 4, 5))
737 self.assertEqual(result, set([2, 3, 5, 6]))
738
739 def test_sym_difference_non_overlap(self):
740 result = self.set ^ set([8])
741 self.assertEqual(result, set([2, 4, 6, 8]))
742
743 def test_cmp(self):
744 a, b = set('a'), set('b')
745 self.assertRaises(TypeError, cmp, a, b)
746
747 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
748 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
749 # which Python thinks is good enough to synthesize a cmp() result
750 # without calling __cmp__.
751 self.assertEqual(cmp(a, a), 0)
752
753 self.assertRaises(TypeError, cmp, a, 12)
754 self.assertRaises(TypeError, cmp, "abc", a)
755
756#==============================================================================
757
758class TestUpdateOps(unittest.TestCase):
759 def setUp(self):
760 self.set = set((2, 4, 6))
761
762 def test_union_subset(self):
763 self.set |= set([2])
764 self.assertEqual(self.set, set((2, 4, 6)))
765
766 def test_union_superset(self):
767 self.set |= set([2, 4, 6, 8])
768 self.assertEqual(self.set, set([2, 4, 6, 8]))
769
770 def test_union_overlap(self):
771 self.set |= set([3, 4, 5])
772 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
773
774 def test_union_non_overlap(self):
775 self.set |= set([8])
776 self.assertEqual(self.set, set([2, 4, 6, 8]))
777
778 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000779 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000780 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
781
782 def test_intersection_subset(self):
783 self.set &= set((2, 4))
784 self.assertEqual(self.set, set((2, 4)))
785
786 def test_intersection_superset(self):
787 self.set &= set([2, 4, 6, 8])
788 self.assertEqual(self.set, set([2, 4, 6]))
789
790 def test_intersection_overlap(self):
791 self.set &= set([3, 4, 5])
792 self.assertEqual(self.set, set([4]))
793
794 def test_intersection_non_overlap(self):
795 self.set &= set([8])
796 self.assertEqual(self.set, empty_set)
797
798 def test_intersection_method_call(self):
799 self.set.intersection_update(set([3, 4, 5]))
800 self.assertEqual(self.set, set([4]))
801
802 def test_sym_difference_subset(self):
803 self.set ^= set((2, 4))
804 self.assertEqual(self.set, set([6]))
805
806 def test_sym_difference_superset(self):
807 self.set ^= set((2, 4, 6, 8))
808 self.assertEqual(self.set, set([8]))
809
810 def test_sym_difference_overlap(self):
811 self.set ^= set((3, 4, 5))
812 self.assertEqual(self.set, set([2, 3, 5, 6]))
813
814 def test_sym_difference_non_overlap(self):
815 self.set ^= set([8])
816 self.assertEqual(self.set, set([2, 4, 6, 8]))
817
818 def test_sym_difference_method_call(self):
819 self.set.symmetric_difference_update(set([3, 4, 5]))
820 self.assertEqual(self.set, set([2, 3, 5, 6]))
821
822 def test_difference_subset(self):
823 self.set -= set((2, 4))
824 self.assertEqual(self.set, set([6]))
825
826 def test_difference_superset(self):
827 self.set -= set((2, 4, 6, 8))
828 self.assertEqual(self.set, set([]))
829
830 def test_difference_overlap(self):
831 self.set -= set((3, 4, 5))
832 self.assertEqual(self.set, set([2, 6]))
833
834 def test_difference_non_overlap(self):
835 self.set -= set([8])
836 self.assertEqual(self.set, set([2, 4, 6]))
837
838 def test_difference_method_call(self):
839 self.set.difference_update(set([3, 4, 5]))
840 self.assertEqual(self.set, set([2, 6]))
841
842#==============================================================================
843
844class TestMutate(unittest.TestCase):
845 def setUp(self):
846 self.values = ["a", "b", "c"]
847 self.set = set(self.values)
848
849 def test_add_present(self):
850 self.set.add("c")
851 self.assertEqual(self.set, set("abc"))
852
853 def test_add_absent(self):
854 self.set.add("d")
855 self.assertEqual(self.set, set("abcd"))
856
857 def test_add_until_full(self):
858 tmp = set()
859 expected_len = 0
860 for v in self.values:
861 tmp.add(v)
862 expected_len += 1
863 self.assertEqual(len(tmp), expected_len)
864 self.assertEqual(tmp, self.set)
865
866 def test_remove_present(self):
867 self.set.remove("b")
868 self.assertEqual(self.set, set("ac"))
869
870 def test_remove_absent(self):
871 try:
872 self.set.remove("d")
873 self.fail("Removing missing element should have raised LookupError")
874 except LookupError:
875 pass
876
877 def test_remove_until_empty(self):
878 expected_len = len(self.set)
879 for v in self.values:
880 self.set.remove(v)
881 expected_len -= 1
882 self.assertEqual(len(self.set), expected_len)
883
884 def test_discard_present(self):
885 self.set.discard("c")
886 self.assertEqual(self.set, set("ab"))
887
888 def test_discard_absent(self):
889 self.set.discard("d")
890 self.assertEqual(self.set, set("abc"))
891
892 def test_clear(self):
893 self.set.clear()
894 self.assertEqual(len(self.set), 0)
895
896 def test_pop(self):
897 popped = {}
898 while self.set:
899 popped[self.set.pop()] = None
900 self.assertEqual(len(popped), len(self.values))
901 for v in self.values:
902 self.failUnless(v in popped)
903
904 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000905 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +0000906 self.assertEqual(self.set, set(self.values))
907
908 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000909 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +0000910 self.assertEqual(self.set, set(self.values))
911
912 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000913 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +0000914 self.assertEqual(self.set, set(self.values + ["z"]))
915
916#==============================================================================
917
918class TestSubsets(unittest.TestCase):
919
920 case2method = {"<=": "issubset",
921 ">=": "issuperset",
922 }
923
924 reverse = {"==": "==",
925 "!=": "!=",
926 "<": ">",
927 ">": "<",
928 "<=": ">=",
929 ">=": "<=",
930 }
931
932 def test_issubset(self):
933 x = self.left
934 y = self.right
935 for case in "!=", "==", "<", "<=", ">", ">=":
936 expected = case in self.cases
937 # Test the binary infix spelling.
938 result = eval("x" + case + "y", locals())
939 self.assertEqual(result, expected)
940 # Test the "friendly" method-name spelling, if one exists.
941 if case in TestSubsets.case2method:
942 method = getattr(x, TestSubsets.case2method[case])
943 result = method(y)
944 self.assertEqual(result, expected)
945
946 # Now do the same for the operands reversed.
947 rcase = TestSubsets.reverse[case]
948 result = eval("y" + rcase + "x", locals())
949 self.assertEqual(result, expected)
950 if rcase in TestSubsets.case2method:
951 method = getattr(y, TestSubsets.case2method[rcase])
952 result = method(x)
953 self.assertEqual(result, expected)
954#------------------------------------------------------------------------------
955
956class TestSubsetEqualEmpty(TestSubsets):
957 left = set()
958 right = set()
959 name = "both empty"
960 cases = "==", "<=", ">="
961
962#------------------------------------------------------------------------------
963
964class TestSubsetEqualNonEmpty(TestSubsets):
965 left = set([1, 2])
966 right = set([1, 2])
967 name = "equal pair"
968 cases = "==", "<=", ">="
969
970#------------------------------------------------------------------------------
971
972class TestSubsetEmptyNonEmpty(TestSubsets):
973 left = set()
974 right = set([1, 2])
975 name = "one empty, one non-empty"
976 cases = "!=", "<", "<="
977
978#------------------------------------------------------------------------------
979
980class TestSubsetPartial(TestSubsets):
981 left = set([1])
982 right = set([1, 2])
983 name = "one a non-empty proper subset of other"
984 cases = "!=", "<", "<="
985
986#------------------------------------------------------------------------------
987
988class TestSubsetNonOverlap(TestSubsets):
989 left = set([1])
990 right = set([2])
991 name = "neither empty, neither contains"
992 cases = "!="
993
994#==============================================================================
995
996class TestOnlySetsInBinaryOps(unittest.TestCase):
997
998 def test_eq_ne(self):
999 # Unlike the others, this is testing that == and != *are* allowed.
1000 self.assertEqual(self.other == self.set, False)
1001 self.assertEqual(self.set == self.other, False)
1002 self.assertEqual(self.other != self.set, True)
1003 self.assertEqual(self.set != self.other, True)
1004
1005 def test_ge_gt_le_lt(self):
1006 self.assertRaises(TypeError, lambda: self.set < self.other)
1007 self.assertRaises(TypeError, lambda: self.set <= self.other)
1008 self.assertRaises(TypeError, lambda: self.set > self.other)
1009 self.assertRaises(TypeError, lambda: self.set >= self.other)
1010
1011 self.assertRaises(TypeError, lambda: self.other < self.set)
1012 self.assertRaises(TypeError, lambda: self.other <= self.set)
1013 self.assertRaises(TypeError, lambda: self.other > self.set)
1014 self.assertRaises(TypeError, lambda: self.other >= self.set)
1015
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001016 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001017 try:
1018 self.set |= self.other
1019 except TypeError:
1020 pass
1021 else:
1022 self.fail("expected TypeError")
1023
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001024 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001025 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001026 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001027 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001028 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001029
1030 def test_union(self):
1031 self.assertRaises(TypeError, lambda: self.set | self.other)
1032 self.assertRaises(TypeError, lambda: self.other | self.set)
1033 if self.otherIsIterable:
1034 self.set.union(self.other)
1035 else:
1036 self.assertRaises(TypeError, self.set.union, self.other)
1037
1038 def test_intersection_update_operator(self):
1039 try:
1040 self.set &= self.other
1041 except TypeError:
1042 pass
1043 else:
1044 self.fail("expected TypeError")
1045
1046 def test_intersection_update(self):
1047 if self.otherIsIterable:
1048 self.set.intersection_update(self.other)
1049 else:
1050 self.assertRaises(TypeError,
1051 self.set.intersection_update,
1052 self.other)
1053
1054 def test_intersection(self):
1055 self.assertRaises(TypeError, lambda: self.set & self.other)
1056 self.assertRaises(TypeError, lambda: self.other & self.set)
1057 if self.otherIsIterable:
1058 self.set.intersection(self.other)
1059 else:
1060 self.assertRaises(TypeError, self.set.intersection, self.other)
1061
1062 def test_sym_difference_update_operator(self):
1063 try:
1064 self.set ^= self.other
1065 except TypeError:
1066 pass
1067 else:
1068 self.fail("expected TypeError")
1069
1070 def test_sym_difference_update(self):
1071 if self.otherIsIterable:
1072 self.set.symmetric_difference_update(self.other)
1073 else:
1074 self.assertRaises(TypeError,
1075 self.set.symmetric_difference_update,
1076 self.other)
1077
1078 def test_sym_difference(self):
1079 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1080 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1081 if self.otherIsIterable:
1082 self.set.symmetric_difference(self.other)
1083 else:
1084 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1085
1086 def test_difference_update_operator(self):
1087 try:
1088 self.set -= self.other
1089 except TypeError:
1090 pass
1091 else:
1092 self.fail("expected TypeError")
1093
1094 def test_difference_update(self):
1095 if self.otherIsIterable:
1096 self.set.difference_update(self.other)
1097 else:
1098 self.assertRaises(TypeError,
1099 self.set.difference_update,
1100 self.other)
1101
1102 def test_difference(self):
1103 self.assertRaises(TypeError, lambda: self.set - self.other)
1104 self.assertRaises(TypeError, lambda: self.other - self.set)
1105 if self.otherIsIterable:
1106 self.set.difference(self.other)
1107 else:
1108 self.assertRaises(TypeError, self.set.difference, self.other)
1109
1110#------------------------------------------------------------------------------
1111
1112class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1113 def setUp(self):
1114 self.set = set((1, 2, 3))
1115 self.other = 19
1116 self.otherIsIterable = False
1117
1118#------------------------------------------------------------------------------
1119
1120class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1121 def setUp(self):
1122 self.set = set((1, 2, 3))
1123 self.other = {1:2, 3:4}
1124 self.otherIsIterable = True
1125
1126#------------------------------------------------------------------------------
1127
1128class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1129 def setUp(self):
1130 self.set = set((1, 2, 3))
1131 self.other = operator.add
1132 self.otherIsIterable = False
1133
1134#------------------------------------------------------------------------------
1135
1136class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1137 def setUp(self):
1138 self.set = set((1, 2, 3))
1139 self.other = (2, 4, 6)
1140 self.otherIsIterable = True
1141
1142#------------------------------------------------------------------------------
1143
1144class TestOnlySetsString(TestOnlySetsInBinaryOps):
1145 def setUp(self):
1146 self.set = set((1, 2, 3))
1147 self.other = 'abc'
1148 self.otherIsIterable = True
1149
1150#------------------------------------------------------------------------------
1151
1152class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1153 def setUp(self):
1154 def gen():
1155 for i in xrange(0, 10, 2):
1156 yield i
1157 self.set = set((1, 2, 3))
1158 self.other = gen()
1159 self.otherIsIterable = True
1160
1161#==============================================================================
1162
1163class TestCopying(unittest.TestCase):
1164
1165 def test_copy(self):
1166 dup = self.set.copy()
1167 dup_list = list(dup); dup_list.sort()
1168 set_list = list(self.set); set_list.sort()
1169 self.assertEqual(len(dup_list), len(set_list))
1170 for i in range(len(dup_list)):
1171 self.failUnless(dup_list[i] is set_list[i])
1172
1173 def test_deep_copy(self):
1174 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001175 ##print type(dup), repr(dup)
Raymond Hettingera690a992003-11-16 16:17:49 +00001176 dup_list = list(dup); dup_list.sort()
1177 set_list = list(self.set); set_list.sort()
1178 self.assertEqual(len(dup_list), len(set_list))
1179 for i in range(len(dup_list)):
1180 self.assertEqual(dup_list[i], set_list[i])
1181
1182#------------------------------------------------------------------------------
1183
1184class TestCopyingEmpty(TestCopying):
1185 def setUp(self):
1186 self.set = set()
1187
1188#------------------------------------------------------------------------------
1189
1190class TestCopyingSingleton(TestCopying):
1191 def setUp(self):
1192 self.set = set(["hello"])
1193
1194#------------------------------------------------------------------------------
1195
1196class TestCopyingTriple(TestCopying):
1197 def setUp(self):
1198 self.set = set(["zero", 0, None])
1199
1200#------------------------------------------------------------------------------
1201
1202class TestCopyingTuple(TestCopying):
1203 def setUp(self):
1204 self.set = set([(1, 2)])
1205
1206#------------------------------------------------------------------------------
1207
1208class TestCopyingNested(TestCopying):
1209 def setUp(self):
1210 self.set = set([((1, 2), (3, 4))])
1211
1212#==============================================================================
1213
1214class TestIdentities(unittest.TestCase):
1215 def setUp(self):
1216 self.a = set('abracadabra')
1217 self.b = set('alacazam')
1218
1219 def test_binopsVsSubsets(self):
1220 a, b = self.a, self.b
1221 self.assert_(a - b < a)
1222 self.assert_(b - a < b)
1223 self.assert_(a & b < a)
1224 self.assert_(a & b < b)
1225 self.assert_(a | b > a)
1226 self.assert_(a | b > b)
1227 self.assert_(a ^ b < a | b)
1228
1229 def test_commutativity(self):
1230 a, b = self.a, self.b
1231 self.assertEqual(a&b, b&a)
1232 self.assertEqual(a|b, b|a)
1233 self.assertEqual(a^b, b^a)
1234 if a != b:
1235 self.assertNotEqual(a-b, b-a)
1236
1237 def test_summations(self):
1238 # check that sums of parts equal the whole
1239 a, b = self.a, self.b
1240 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1241 self.assertEqual((a&b)|(a^b), a|b)
1242 self.assertEqual(a|(b-a), a|b)
1243 self.assertEqual((a-b)|b, a|b)
1244 self.assertEqual((a-b)|(a&b), a)
1245 self.assertEqual((b-a)|(a&b), b)
1246 self.assertEqual((a-b)|(b-a), a^b)
1247
1248 def test_exclusion(self):
1249 # check that inverse operations show non-overlap
1250 a, b, zero = self.a, self.b, set()
1251 self.assertEqual((a-b)&b, zero)
1252 self.assertEqual((b-a)&a, zero)
1253 self.assertEqual((a&b)&(a^b), zero)
1254
1255# Tests derived from test_itertools.py =======================================
1256
1257def R(seqn):
1258 'Regular generator'
1259 for i in seqn:
1260 yield i
1261
1262class G:
1263 'Sequence using __getitem__'
1264 def __init__(self, seqn):
1265 self.seqn = seqn
1266 def __getitem__(self, i):
1267 return self.seqn[i]
1268
1269class I:
1270 'Sequence using iterator protocol'
1271 def __init__(self, seqn):
1272 self.seqn = seqn
1273 self.i = 0
1274 def __iter__(self):
1275 return self
1276 def next(self):
1277 if self.i >= len(self.seqn): raise StopIteration
1278 v = self.seqn[self.i]
1279 self.i += 1
1280 return v
1281
1282class Ig:
1283 'Sequence using iterator protocol defined with a generator'
1284 def __init__(self, seqn):
1285 self.seqn = seqn
1286 self.i = 0
1287 def __iter__(self):
1288 for val in self.seqn:
1289 yield val
1290
1291class X:
1292 'Missing __getitem__ and __iter__'
1293 def __init__(self, seqn):
1294 self.seqn = seqn
1295 self.i = 0
1296 def next(self):
1297 if self.i >= len(self.seqn): raise StopIteration
1298 v = self.seqn[self.i]
1299 self.i += 1
1300 return v
1301
1302class N:
1303 'Iterator missing next()'
1304 def __init__(self, seqn):
1305 self.seqn = seqn
1306 self.i = 0
1307 def __iter__(self):
1308 return self
1309
1310class E:
1311 'Test propagation of exceptions'
1312 def __init__(self, seqn):
1313 self.seqn = seqn
1314 self.i = 0
1315 def __iter__(self):
1316 return self
1317 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001318 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001319
1320class S:
1321 'Test immediate stop'
1322 def __init__(self, seqn):
1323 pass
1324 def __iter__(self):
1325 return self
1326 def next(self):
1327 raise StopIteration
1328
1329from itertools import chain, imap
1330def L(seqn):
1331 'Test multiple tiers of iterators'
1332 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1333
1334class TestVariousIteratorArgs(unittest.TestCase):
1335
1336 def test_constructor(self):
1337 for cons in (set, frozenset):
1338 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1339 for g in (G, I, Ig, S, L, R):
Raymond Hettinger64958a12003-12-17 20:43:33 +00001340 self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
Raymond Hettingera690a992003-11-16 16:17:49 +00001341 self.assertRaises(TypeError, cons , X(s))
1342 self.assertRaises(TypeError, cons , N(s))
1343 self.assertRaises(ZeroDivisionError, cons , E(s))
1344
1345 def test_inline_methods(self):
1346 s = set('november')
1347 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1348 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1349 for g in (G, I, Ig, L, R):
1350 expected = meth(data)
1351 actual = meth(G(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001352 self.assertEqual(sorted(actual), sorted(expected))
Raymond Hettingera690a992003-11-16 16:17:49 +00001353 self.assertRaises(TypeError, meth, X(s))
1354 self.assertRaises(TypeError, meth, N(s))
1355 self.assertRaises(ZeroDivisionError, meth, E(s))
1356
1357 def test_inplace_methods(self):
1358 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001359 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001360 'difference_update', 'symmetric_difference_update'):
1361 for g in (G, I, Ig, S, L, R):
1362 s = set('january')
1363 t = s.copy()
1364 getattr(s, methname)(list(g(data)))
1365 getattr(t, methname)(g(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001366 self.assertEqual(sorted(s), sorted(t))
Raymond Hettingera690a992003-11-16 16:17:49 +00001367
1368 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1369 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1370 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1371
1372#==============================================================================
1373
1374def test_main(verbose=None):
1375 import sys
1376 from test import test_sets
1377 test_classes = (
1378 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001379 TestSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001380 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001381 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001382 TestSetOfSets,
1383 TestExceptionPropagation,
1384 TestBasicOpsEmpty,
1385 TestBasicOpsSingleton,
1386 TestBasicOpsTuple,
1387 TestBasicOpsTriple,
1388 TestBinaryOps,
1389 TestUpdateOps,
1390 TestMutate,
1391 TestSubsetEqualEmpty,
1392 TestSubsetEqualNonEmpty,
1393 TestSubsetEmptyNonEmpty,
1394 TestSubsetPartial,
1395 TestSubsetNonOverlap,
1396 TestOnlySetsNumeric,
1397 TestOnlySetsDict,
1398 TestOnlySetsOperator,
1399 TestOnlySetsTuple,
1400 TestOnlySetsString,
1401 TestOnlySetsGenerator,
1402 TestCopyingEmpty,
1403 TestCopyingSingleton,
1404 TestCopyingTriple,
1405 TestCopyingTuple,
1406 TestCopyingNested,
1407 TestIdentities,
1408 TestVariousIteratorArgs,
1409 )
1410
1411 test_support.run_unittest(*test_classes)
1412
1413 # verify reference counting
1414 if verbose and hasattr(sys, "gettotalrefcount"):
1415 import gc
1416 counts = [None] * 5
1417 for i in xrange(len(counts)):
1418 test_support.run_unittest(*test_classes)
1419 gc.collect()
1420 counts[i] = sys.gettotalrefcount()
1421 print counts
1422
1423if __name__ == "__main__":
1424 test_main(verbose=True)