blob: 77df31b622d310e7f9f16118a8983a42e43a2b25 [file] [log] [blame]
Raymond Hettingera690a992003-11-16 16:17:49 +00001import unittest
2from test import test_support
Raymond Hettinger691d8052004-05-30 07:26:47 +00003from weakref import proxy
Raymond Hettingera690a992003-11-16 16:17:49 +00004import operator
5import copy
6import pickle
Raymond Hettingereae05de2004-07-09 04:51:24 +00007import os
Raymond Hettinger82cb9a22005-07-05 05:34:43 +00008from random import randrange, shuffle
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00009import sys
Raymond Hettingera690a992003-11-16 16:17:49 +000010
11class PassThru(Exception):
12 pass
13
14def check_pass_thru():
15 raise PassThru
16 yield 1
17
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000018class BadCmp:
19 def __hash__(self):
20 return 1
21 def __cmp__(self, other):
22 raise RuntimeError
23
Raymond 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):
227 return id(self)
228 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
424 if hasattr(sys, "gettotalrefcount"):
425 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)
609
610 def test_pickling(self):
611 p = pickle.dumps(self.set)
612 copy = pickle.loads(p)
613 self.assertEqual(self.set, copy,
614 "%s != %s" % (self.set, copy))
615
616#------------------------------------------------------------------------------
617
618class TestBasicOpsEmpty(TestBasicOps):
619 def setUp(self):
620 self.case = "empty set"
621 self.values = []
622 self.set = set(self.values)
623 self.dup = set(self.values)
624 self.length = 0
625 self.repr = "set([])"
626
627#------------------------------------------------------------------------------
628
629class TestBasicOpsSingleton(TestBasicOps):
630 def setUp(self):
631 self.case = "unit set (number)"
632 self.values = [3]
633 self.set = set(self.values)
634 self.dup = set(self.values)
635 self.length = 1
636 self.repr = "set([3])"
637
638 def test_in(self):
639 self.failUnless(3 in self.set)
640
641 def test_not_in(self):
642 self.failUnless(2 not in self.set)
643
644#------------------------------------------------------------------------------
645
646class TestBasicOpsTuple(TestBasicOps):
647 def setUp(self):
648 self.case = "unit set (tuple)"
649 self.values = [(0, "zero")]
650 self.set = set(self.values)
651 self.dup = set(self.values)
652 self.length = 1
653 self.repr = "set([(0, 'zero')])"
654
655 def test_in(self):
656 self.failUnless((0, "zero") in self.set)
657
658 def test_not_in(self):
659 self.failUnless(9 not in self.set)
660
661#------------------------------------------------------------------------------
662
663class TestBasicOpsTriple(TestBasicOps):
664 def setUp(self):
665 self.case = "triple set"
666 self.values = [0, "zero", operator.add]
667 self.set = set(self.values)
668 self.dup = set(self.values)
669 self.length = 3
670 self.repr = None
671
672#==============================================================================
673
674def baditer():
675 raise TypeError
676 yield True
677
678def gooditer():
679 yield True
680
681class TestExceptionPropagation(unittest.TestCase):
682 """SF 628246: Set constructor should not trap iterator TypeErrors"""
683
684 def test_instanceWithException(self):
685 self.assertRaises(TypeError, set, baditer())
686
687 def test_instancesWithoutException(self):
688 # All of these iterables should load without exception.
689 set([1,2,3])
690 set((1,2,3))
691 set({'one':1, 'two':2, 'three':3})
692 set(xrange(3))
693 set('abc')
694 set(gooditer())
695
696#==============================================================================
697
698class TestSetOfSets(unittest.TestCase):
699 def test_constructor(self):
700 inner = frozenset([1])
701 outer = set([inner])
702 element = outer.pop()
703 self.assertEqual(type(element), frozenset)
704 outer.add(inner) # Rebuild set of sets with .add method
705 outer.remove(inner)
706 self.assertEqual(outer, set()) # Verify that remove worked
707 outer.discard(inner) # Absence of KeyError indicates working fine
708
709#==============================================================================
710
711class TestBinaryOps(unittest.TestCase):
712 def setUp(self):
713 self.set = set((2, 4, 6))
714
715 def test_eq(self): # SF bug 643115
716 self.assertEqual(self.set, set({2:1,4:3,6:5}))
717
718 def test_union_subset(self):
719 result = self.set | set([2])
720 self.assertEqual(result, set((2, 4, 6)))
721
722 def test_union_superset(self):
723 result = self.set | set([2, 4, 6, 8])
724 self.assertEqual(result, set([2, 4, 6, 8]))
725
726 def test_union_overlap(self):
727 result = self.set | set([3, 4, 5])
728 self.assertEqual(result, set([2, 3, 4, 5, 6]))
729
730 def test_union_non_overlap(self):
731 result = self.set | set([8])
732 self.assertEqual(result, set([2, 4, 6, 8]))
733
734 def test_intersection_subset(self):
735 result = self.set & set((2, 4))
736 self.assertEqual(result, set((2, 4)))
737
738 def test_intersection_superset(self):
739 result = self.set & set([2, 4, 6, 8])
740 self.assertEqual(result, set([2, 4, 6]))
741
742 def test_intersection_overlap(self):
743 result = self.set & set([3, 4, 5])
744 self.assertEqual(result, set([4]))
745
746 def test_intersection_non_overlap(self):
747 result = self.set & set([8])
748 self.assertEqual(result, empty_set)
749
750 def test_sym_difference_subset(self):
751 result = self.set ^ set((2, 4))
752 self.assertEqual(result, set([6]))
753
754 def test_sym_difference_superset(self):
755 result = self.set ^ set((2, 4, 6, 8))
756 self.assertEqual(result, set([8]))
757
758 def test_sym_difference_overlap(self):
759 result = self.set ^ set((3, 4, 5))
760 self.assertEqual(result, set([2, 3, 5, 6]))
761
762 def test_sym_difference_non_overlap(self):
763 result = self.set ^ set([8])
764 self.assertEqual(result, set([2, 4, 6, 8]))
765
766 def test_cmp(self):
767 a, b = set('a'), set('b')
768 self.assertRaises(TypeError, cmp, a, b)
769
770 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
771 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
772 # which Python thinks is good enough to synthesize a cmp() result
773 # without calling __cmp__.
774 self.assertEqual(cmp(a, a), 0)
775
776 self.assertRaises(TypeError, cmp, a, 12)
777 self.assertRaises(TypeError, cmp, "abc", a)
778
779#==============================================================================
780
781class TestUpdateOps(unittest.TestCase):
782 def setUp(self):
783 self.set = set((2, 4, 6))
784
785 def test_union_subset(self):
786 self.set |= set([2])
787 self.assertEqual(self.set, set((2, 4, 6)))
788
789 def test_union_superset(self):
790 self.set |= set([2, 4, 6, 8])
791 self.assertEqual(self.set, set([2, 4, 6, 8]))
792
793 def test_union_overlap(self):
794 self.set |= set([3, 4, 5])
795 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
796
797 def test_union_non_overlap(self):
798 self.set |= set([8])
799 self.assertEqual(self.set, set([2, 4, 6, 8]))
800
801 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000802 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000803 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
804
805 def test_intersection_subset(self):
806 self.set &= set((2, 4))
807 self.assertEqual(self.set, set((2, 4)))
808
809 def test_intersection_superset(self):
810 self.set &= set([2, 4, 6, 8])
811 self.assertEqual(self.set, set([2, 4, 6]))
812
813 def test_intersection_overlap(self):
814 self.set &= set([3, 4, 5])
815 self.assertEqual(self.set, set([4]))
816
817 def test_intersection_non_overlap(self):
818 self.set &= set([8])
819 self.assertEqual(self.set, empty_set)
820
821 def test_intersection_method_call(self):
822 self.set.intersection_update(set([3, 4, 5]))
823 self.assertEqual(self.set, set([4]))
824
825 def test_sym_difference_subset(self):
826 self.set ^= set((2, 4))
827 self.assertEqual(self.set, set([6]))
828
829 def test_sym_difference_superset(self):
830 self.set ^= set((2, 4, 6, 8))
831 self.assertEqual(self.set, set([8]))
832
833 def test_sym_difference_overlap(self):
834 self.set ^= set((3, 4, 5))
835 self.assertEqual(self.set, set([2, 3, 5, 6]))
836
837 def test_sym_difference_non_overlap(self):
838 self.set ^= set([8])
839 self.assertEqual(self.set, set([2, 4, 6, 8]))
840
841 def test_sym_difference_method_call(self):
842 self.set.symmetric_difference_update(set([3, 4, 5]))
843 self.assertEqual(self.set, set([2, 3, 5, 6]))
844
845 def test_difference_subset(self):
846 self.set -= set((2, 4))
847 self.assertEqual(self.set, set([6]))
848
849 def test_difference_superset(self):
850 self.set -= set((2, 4, 6, 8))
851 self.assertEqual(self.set, set([]))
852
853 def test_difference_overlap(self):
854 self.set -= set((3, 4, 5))
855 self.assertEqual(self.set, set([2, 6]))
856
857 def test_difference_non_overlap(self):
858 self.set -= set([8])
859 self.assertEqual(self.set, set([2, 4, 6]))
860
861 def test_difference_method_call(self):
862 self.set.difference_update(set([3, 4, 5]))
863 self.assertEqual(self.set, set([2, 6]))
864
865#==============================================================================
866
867class TestMutate(unittest.TestCase):
868 def setUp(self):
869 self.values = ["a", "b", "c"]
870 self.set = set(self.values)
871
872 def test_add_present(self):
873 self.set.add("c")
874 self.assertEqual(self.set, set("abc"))
875
876 def test_add_absent(self):
877 self.set.add("d")
878 self.assertEqual(self.set, set("abcd"))
879
880 def test_add_until_full(self):
881 tmp = set()
882 expected_len = 0
883 for v in self.values:
884 tmp.add(v)
885 expected_len += 1
886 self.assertEqual(len(tmp), expected_len)
887 self.assertEqual(tmp, self.set)
888
889 def test_remove_present(self):
890 self.set.remove("b")
891 self.assertEqual(self.set, set("ac"))
892
893 def test_remove_absent(self):
894 try:
895 self.set.remove("d")
896 self.fail("Removing missing element should have raised LookupError")
897 except LookupError:
898 pass
899
900 def test_remove_until_empty(self):
901 expected_len = len(self.set)
902 for v in self.values:
903 self.set.remove(v)
904 expected_len -= 1
905 self.assertEqual(len(self.set), expected_len)
906
907 def test_discard_present(self):
908 self.set.discard("c")
909 self.assertEqual(self.set, set("ab"))
910
911 def test_discard_absent(self):
912 self.set.discard("d")
913 self.assertEqual(self.set, set("abc"))
914
915 def test_clear(self):
916 self.set.clear()
917 self.assertEqual(len(self.set), 0)
918
919 def test_pop(self):
920 popped = {}
921 while self.set:
922 popped[self.set.pop()] = None
923 self.assertEqual(len(popped), len(self.values))
924 for v in self.values:
925 self.failUnless(v in popped)
926
927 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000928 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +0000929 self.assertEqual(self.set, set(self.values))
930
931 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000932 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +0000933 self.assertEqual(self.set, set(self.values))
934
935 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000936 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +0000937 self.assertEqual(self.set, set(self.values + ["z"]))
938
939#==============================================================================
940
941class TestSubsets(unittest.TestCase):
942
943 case2method = {"<=": "issubset",
944 ">=": "issuperset",
945 }
946
947 reverse = {"==": "==",
948 "!=": "!=",
949 "<": ">",
950 ">": "<",
951 "<=": ">=",
952 ">=": "<=",
953 }
954
955 def test_issubset(self):
956 x = self.left
957 y = self.right
958 for case in "!=", "==", "<", "<=", ">", ">=":
959 expected = case in self.cases
960 # Test the binary infix spelling.
961 result = eval("x" + case + "y", locals())
962 self.assertEqual(result, expected)
963 # Test the "friendly" method-name spelling, if one exists.
964 if case in TestSubsets.case2method:
965 method = getattr(x, TestSubsets.case2method[case])
966 result = method(y)
967 self.assertEqual(result, expected)
968
969 # Now do the same for the operands reversed.
970 rcase = TestSubsets.reverse[case]
971 result = eval("y" + rcase + "x", locals())
972 self.assertEqual(result, expected)
973 if rcase in TestSubsets.case2method:
974 method = getattr(y, TestSubsets.case2method[rcase])
975 result = method(x)
976 self.assertEqual(result, expected)
977#------------------------------------------------------------------------------
978
979class TestSubsetEqualEmpty(TestSubsets):
980 left = set()
981 right = set()
982 name = "both empty"
983 cases = "==", "<=", ">="
984
985#------------------------------------------------------------------------------
986
987class TestSubsetEqualNonEmpty(TestSubsets):
988 left = set([1, 2])
989 right = set([1, 2])
990 name = "equal pair"
991 cases = "==", "<=", ">="
992
993#------------------------------------------------------------------------------
994
995class TestSubsetEmptyNonEmpty(TestSubsets):
996 left = set()
997 right = set([1, 2])
998 name = "one empty, one non-empty"
999 cases = "!=", "<", "<="
1000
1001#------------------------------------------------------------------------------
1002
1003class TestSubsetPartial(TestSubsets):
1004 left = set([1])
1005 right = set([1, 2])
1006 name = "one a non-empty proper subset of other"
1007 cases = "!=", "<", "<="
1008
1009#------------------------------------------------------------------------------
1010
1011class TestSubsetNonOverlap(TestSubsets):
1012 left = set([1])
1013 right = set([2])
1014 name = "neither empty, neither contains"
1015 cases = "!="
1016
1017#==============================================================================
1018
1019class TestOnlySetsInBinaryOps(unittest.TestCase):
1020
1021 def test_eq_ne(self):
1022 # Unlike the others, this is testing that == and != *are* allowed.
1023 self.assertEqual(self.other == self.set, False)
1024 self.assertEqual(self.set == self.other, False)
1025 self.assertEqual(self.other != self.set, True)
1026 self.assertEqual(self.set != self.other, True)
1027
1028 def test_ge_gt_le_lt(self):
1029 self.assertRaises(TypeError, lambda: self.set < self.other)
1030 self.assertRaises(TypeError, lambda: self.set <= self.other)
1031 self.assertRaises(TypeError, lambda: self.set > self.other)
1032 self.assertRaises(TypeError, lambda: self.set >= self.other)
1033
1034 self.assertRaises(TypeError, lambda: self.other < self.set)
1035 self.assertRaises(TypeError, lambda: self.other <= self.set)
1036 self.assertRaises(TypeError, lambda: self.other > self.set)
1037 self.assertRaises(TypeError, lambda: self.other >= self.set)
1038
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001039 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001040 try:
1041 self.set |= self.other
1042 except TypeError:
1043 pass
1044 else:
1045 self.fail("expected TypeError")
1046
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001047 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001048 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001049 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001050 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001051 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001052
1053 def test_union(self):
1054 self.assertRaises(TypeError, lambda: self.set | self.other)
1055 self.assertRaises(TypeError, lambda: self.other | self.set)
1056 if self.otherIsIterable:
1057 self.set.union(self.other)
1058 else:
1059 self.assertRaises(TypeError, self.set.union, self.other)
1060
1061 def test_intersection_update_operator(self):
1062 try:
1063 self.set &= self.other
1064 except TypeError:
1065 pass
1066 else:
1067 self.fail("expected TypeError")
1068
1069 def test_intersection_update(self):
1070 if self.otherIsIterable:
1071 self.set.intersection_update(self.other)
1072 else:
1073 self.assertRaises(TypeError,
1074 self.set.intersection_update,
1075 self.other)
1076
1077 def test_intersection(self):
1078 self.assertRaises(TypeError, lambda: self.set & self.other)
1079 self.assertRaises(TypeError, lambda: self.other & self.set)
1080 if self.otherIsIterable:
1081 self.set.intersection(self.other)
1082 else:
1083 self.assertRaises(TypeError, self.set.intersection, self.other)
1084
1085 def test_sym_difference_update_operator(self):
1086 try:
1087 self.set ^= self.other
1088 except TypeError:
1089 pass
1090 else:
1091 self.fail("expected TypeError")
1092
1093 def test_sym_difference_update(self):
1094 if self.otherIsIterable:
1095 self.set.symmetric_difference_update(self.other)
1096 else:
1097 self.assertRaises(TypeError,
1098 self.set.symmetric_difference_update,
1099 self.other)
1100
1101 def test_sym_difference(self):
1102 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1103 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1104 if self.otherIsIterable:
1105 self.set.symmetric_difference(self.other)
1106 else:
1107 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1108
1109 def test_difference_update_operator(self):
1110 try:
1111 self.set -= self.other
1112 except TypeError:
1113 pass
1114 else:
1115 self.fail("expected TypeError")
1116
1117 def test_difference_update(self):
1118 if self.otherIsIterable:
1119 self.set.difference_update(self.other)
1120 else:
1121 self.assertRaises(TypeError,
1122 self.set.difference_update,
1123 self.other)
1124
1125 def test_difference(self):
1126 self.assertRaises(TypeError, lambda: self.set - self.other)
1127 self.assertRaises(TypeError, lambda: self.other - self.set)
1128 if self.otherIsIterable:
1129 self.set.difference(self.other)
1130 else:
1131 self.assertRaises(TypeError, self.set.difference, self.other)
1132
1133#------------------------------------------------------------------------------
1134
1135class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1136 def setUp(self):
1137 self.set = set((1, 2, 3))
1138 self.other = 19
1139 self.otherIsIterable = False
1140
1141#------------------------------------------------------------------------------
1142
1143class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1144 def setUp(self):
1145 self.set = set((1, 2, 3))
1146 self.other = {1:2, 3:4}
1147 self.otherIsIterable = True
1148
1149#------------------------------------------------------------------------------
1150
1151class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1152 def setUp(self):
1153 self.set = set((1, 2, 3))
1154 self.other = operator.add
1155 self.otherIsIterable = False
1156
1157#------------------------------------------------------------------------------
1158
1159class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1160 def setUp(self):
1161 self.set = set((1, 2, 3))
1162 self.other = (2, 4, 6)
1163 self.otherIsIterable = True
1164
1165#------------------------------------------------------------------------------
1166
1167class TestOnlySetsString(TestOnlySetsInBinaryOps):
1168 def setUp(self):
1169 self.set = set((1, 2, 3))
1170 self.other = 'abc'
1171 self.otherIsIterable = True
1172
1173#------------------------------------------------------------------------------
1174
1175class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1176 def setUp(self):
1177 def gen():
1178 for i in xrange(0, 10, 2):
1179 yield i
1180 self.set = set((1, 2, 3))
1181 self.other = gen()
1182 self.otherIsIterable = True
1183
1184#==============================================================================
1185
1186class TestCopying(unittest.TestCase):
1187
1188 def test_copy(self):
1189 dup = self.set.copy()
1190 dup_list = list(dup); dup_list.sort()
1191 set_list = list(self.set); set_list.sort()
1192 self.assertEqual(len(dup_list), len(set_list))
1193 for i in range(len(dup_list)):
1194 self.failUnless(dup_list[i] is set_list[i])
1195
1196 def test_deep_copy(self):
1197 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001198 ##print type(dup), repr(dup)
Raymond Hettingera690a992003-11-16 16:17:49 +00001199 dup_list = list(dup); dup_list.sort()
1200 set_list = list(self.set); set_list.sort()
1201 self.assertEqual(len(dup_list), len(set_list))
1202 for i in range(len(dup_list)):
1203 self.assertEqual(dup_list[i], set_list[i])
1204
1205#------------------------------------------------------------------------------
1206
1207class TestCopyingEmpty(TestCopying):
1208 def setUp(self):
1209 self.set = set()
1210
1211#------------------------------------------------------------------------------
1212
1213class TestCopyingSingleton(TestCopying):
1214 def setUp(self):
1215 self.set = set(["hello"])
1216
1217#------------------------------------------------------------------------------
1218
1219class TestCopyingTriple(TestCopying):
1220 def setUp(self):
1221 self.set = set(["zero", 0, None])
1222
1223#------------------------------------------------------------------------------
1224
1225class TestCopyingTuple(TestCopying):
1226 def setUp(self):
1227 self.set = set([(1, 2)])
1228
1229#------------------------------------------------------------------------------
1230
1231class TestCopyingNested(TestCopying):
1232 def setUp(self):
1233 self.set = set([((1, 2), (3, 4))])
1234
1235#==============================================================================
1236
1237class TestIdentities(unittest.TestCase):
1238 def setUp(self):
1239 self.a = set('abracadabra')
1240 self.b = set('alacazam')
1241
1242 def test_binopsVsSubsets(self):
1243 a, b = self.a, self.b
1244 self.assert_(a - b < a)
1245 self.assert_(b - a < b)
1246 self.assert_(a & b < a)
1247 self.assert_(a & b < b)
1248 self.assert_(a | b > a)
1249 self.assert_(a | b > b)
1250 self.assert_(a ^ b < a | b)
1251
1252 def test_commutativity(self):
1253 a, b = self.a, self.b
1254 self.assertEqual(a&b, b&a)
1255 self.assertEqual(a|b, b|a)
1256 self.assertEqual(a^b, b^a)
1257 if a != b:
1258 self.assertNotEqual(a-b, b-a)
1259
1260 def test_summations(self):
1261 # check that sums of parts equal the whole
1262 a, b = self.a, self.b
1263 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1264 self.assertEqual((a&b)|(a^b), a|b)
1265 self.assertEqual(a|(b-a), a|b)
1266 self.assertEqual((a-b)|b, a|b)
1267 self.assertEqual((a-b)|(a&b), a)
1268 self.assertEqual((b-a)|(a&b), b)
1269 self.assertEqual((a-b)|(b-a), a^b)
1270
1271 def test_exclusion(self):
1272 # check that inverse operations show non-overlap
1273 a, b, zero = self.a, self.b, set()
1274 self.assertEqual((a-b)&b, zero)
1275 self.assertEqual((b-a)&a, zero)
1276 self.assertEqual((a&b)&(a^b), zero)
1277
1278# Tests derived from test_itertools.py =======================================
1279
1280def R(seqn):
1281 'Regular generator'
1282 for i in seqn:
1283 yield i
1284
1285class G:
1286 'Sequence using __getitem__'
1287 def __init__(self, seqn):
1288 self.seqn = seqn
1289 def __getitem__(self, i):
1290 return self.seqn[i]
1291
1292class I:
1293 'Sequence using iterator protocol'
1294 def __init__(self, seqn):
1295 self.seqn = seqn
1296 self.i = 0
1297 def __iter__(self):
1298 return self
1299 def next(self):
1300 if self.i >= len(self.seqn): raise StopIteration
1301 v = self.seqn[self.i]
1302 self.i += 1
1303 return v
1304
1305class Ig:
1306 'Sequence using iterator protocol defined with a generator'
1307 def __init__(self, seqn):
1308 self.seqn = seqn
1309 self.i = 0
1310 def __iter__(self):
1311 for val in self.seqn:
1312 yield val
1313
1314class X:
1315 'Missing __getitem__ and __iter__'
1316 def __init__(self, seqn):
1317 self.seqn = seqn
1318 self.i = 0
1319 def next(self):
1320 if self.i >= len(self.seqn): raise StopIteration
1321 v = self.seqn[self.i]
1322 self.i += 1
1323 return v
1324
1325class N:
1326 'Iterator missing next()'
1327 def __init__(self, seqn):
1328 self.seqn = seqn
1329 self.i = 0
1330 def __iter__(self):
1331 return self
1332
1333class E:
1334 'Test propagation of exceptions'
1335 def __init__(self, seqn):
1336 self.seqn = seqn
1337 self.i = 0
1338 def __iter__(self):
1339 return self
1340 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001341 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001342
1343class S:
1344 'Test immediate stop'
1345 def __init__(self, seqn):
1346 pass
1347 def __iter__(self):
1348 return self
1349 def next(self):
1350 raise StopIteration
1351
1352from itertools import chain, imap
1353def L(seqn):
1354 'Test multiple tiers of iterators'
1355 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1356
1357class TestVariousIteratorArgs(unittest.TestCase):
1358
1359 def test_constructor(self):
1360 for cons in (set, frozenset):
1361 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1362 for g in (G, I, Ig, S, L, R):
Raymond Hettinger64958a12003-12-17 20:43:33 +00001363 self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
Raymond Hettingera690a992003-11-16 16:17:49 +00001364 self.assertRaises(TypeError, cons , X(s))
1365 self.assertRaises(TypeError, cons , N(s))
1366 self.assertRaises(ZeroDivisionError, cons , E(s))
1367
1368 def test_inline_methods(self):
1369 s = set('november')
1370 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1371 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1372 for g in (G, I, Ig, L, R):
1373 expected = meth(data)
1374 actual = meth(G(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001375 self.assertEqual(sorted(actual), sorted(expected))
Raymond Hettingera690a992003-11-16 16:17:49 +00001376 self.assertRaises(TypeError, meth, X(s))
1377 self.assertRaises(TypeError, meth, N(s))
1378 self.assertRaises(ZeroDivisionError, meth, E(s))
1379
1380 def test_inplace_methods(self):
1381 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001382 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001383 'difference_update', 'symmetric_difference_update'):
1384 for g in (G, I, Ig, S, L, R):
1385 s = set('january')
1386 t = s.copy()
1387 getattr(s, methname)(list(g(data)))
1388 getattr(t, methname)(g(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001389 self.assertEqual(sorted(s), sorted(t))
Raymond Hettingera690a992003-11-16 16:17:49 +00001390
1391 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1392 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1393 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1394
1395#==============================================================================
1396
1397def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001398 from test import test_sets
1399 test_classes = (
1400 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001401 TestSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001402 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001403 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001404 TestSetOfSets,
1405 TestExceptionPropagation,
1406 TestBasicOpsEmpty,
1407 TestBasicOpsSingleton,
1408 TestBasicOpsTuple,
1409 TestBasicOpsTriple,
1410 TestBinaryOps,
1411 TestUpdateOps,
1412 TestMutate,
1413 TestSubsetEqualEmpty,
1414 TestSubsetEqualNonEmpty,
1415 TestSubsetEmptyNonEmpty,
1416 TestSubsetPartial,
1417 TestSubsetNonOverlap,
1418 TestOnlySetsNumeric,
1419 TestOnlySetsDict,
1420 TestOnlySetsOperator,
1421 TestOnlySetsTuple,
1422 TestOnlySetsString,
1423 TestOnlySetsGenerator,
1424 TestCopyingEmpty,
1425 TestCopyingSingleton,
1426 TestCopyingTriple,
1427 TestCopyingTuple,
1428 TestCopyingNested,
1429 TestIdentities,
1430 TestVariousIteratorArgs,
1431 )
1432
1433 test_support.run_unittest(*test_classes)
1434
1435 # verify reference counting
1436 if verbose and hasattr(sys, "gettotalrefcount"):
1437 import gc
1438 counts = [None] * 5
1439 for i in xrange(len(counts)):
1440 test_support.run_unittest(*test_classes)
1441 gc.collect()
1442 counts[i] = sys.gettotalrefcount()
1443 print counts
1444
1445if __name__ == "__main__":
1446 test_main(verbose=True)