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