blob: 1b01954108e848ae5440a9503ddc2ffd15cb20b9 [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 Hettinger61708742008-01-24 21:23:58 +000010import collections
Raymond Hettingera690a992003-11-16 16:17:49 +000011
12class PassThru(Exception):
13 pass
14
15def check_pass_thru():
16 raise PassThru
17 yield 1
18
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000019class BadCmp:
20 def __hash__(self):
21 return 1
22 def __cmp__(self, other):
23 raise RuntimeError
24
Raymond Hettinger53999102006-12-30 04:01:17 +000025class ReprWrapper:
26 'Used to test self-referential repr() calls'
27 def __repr__(self):
28 return repr(self.value)
29
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +000030class HashCountingInt(int):
31 'int-like object that counts the number of times __hash__ is called'
32 def __init__(self, *args):
33 self.hash_count = 0
34 def __hash__(self):
35 self.hash_count += 1
36 return int.__hash__(self)
37
Raymond Hettingera690a992003-11-16 16:17:49 +000038class TestJointOps(unittest.TestCase):
39 # Tests common to both set and frozenset
40
41 def setUp(self):
42 self.word = word = 'simsalabim'
43 self.otherword = 'madagascar'
44 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
45 self.s = self.thetype(word)
46 self.d = dict.fromkeys(word)
47
Raymond Hettinger6429a472004-09-28 01:51:35 +000048 def test_new_or_init(self):
49 self.assertRaises(TypeError, self.thetype, [], 2)
50
Raymond Hettingera690a992003-11-16 16:17:49 +000051 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000052 actual = sorted(self.s)
53 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000054 self.assertEqual(actual, expected)
55 self.assertRaises(PassThru, self.thetype, check_pass_thru())
56 self.assertRaises(TypeError, self.thetype, [[]])
57
58 def test_len(self):
59 self.assertEqual(len(self.s), len(self.d))
60
61 def test_contains(self):
62 for c in self.letters:
63 self.assertEqual(c in self.s, c in self.d)
64 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000065 s = self.thetype([frozenset(self.letters)])
66 self.assert_(self.thetype(self.letters) in s)
Raymond Hettingera690a992003-11-16 16:17:49 +000067
Raymond Hettingera690a992003-11-16 16:17:49 +000068 def test_union(self):
69 u = self.s.union(self.otherword)
70 for c in self.letters:
71 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000072 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000073 self.assertEqual(type(u), self.thetype)
74 self.assertRaises(PassThru, self.s.union, check_pass_thru())
75 self.assertRaises(TypeError, self.s.union, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000076 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
77 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
78 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
79 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
80 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Raymond Hettingeree4bcad2008-06-09 08:33:37 +000081 self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
Raymond Hettingera690a992003-11-16 16:17:49 +000082
83 def test_or(self):
84 i = self.s.union(self.otherword)
85 self.assertEqual(self.s | set(self.otherword), i)
86 self.assertEqual(self.s | frozenset(self.otherword), i)
87 try:
88 self.s | self.otherword
89 except TypeError:
90 pass
91 else:
92 self.fail("s|t did not screen-out general iterables")
93
94 def test_intersection(self):
95 i = self.s.intersection(self.otherword)
96 for c in self.letters:
97 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000098 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000099 self.assertEqual(type(i), self.thetype)
100 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000101 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
102 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
103 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
104 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
105 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +0000106 self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
Raymond Hettinger610a93e2008-06-11 00:44:47 +0000107 s = self.thetype('abcba')
108 z = s.intersection()
109 if self.thetype == frozenset():
110 self.assertEqual(id(s), id(z))
111 else:
112 self.assertNotEqual(id(s), id(z))
Raymond Hettingera690a992003-11-16 16:17:49 +0000113
Raymond Hettinger1760c8a2007-11-08 02:52:43 +0000114 def test_isdisjoint(self):
115 def f(s1, s2):
116 'Pure python equivalent of isdisjoint()'
117 return not set(s1).intersection(s2)
118 for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
119 s1 = self.thetype(larg)
120 for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
121 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
122 s2 = C(rarg)
123 actual = s1.isdisjoint(s2)
124 expected = f(s1, s2)
125 self.assertEqual(actual, expected)
126 self.assert_(actual is True or actual is False)
127
Raymond Hettingera690a992003-11-16 16:17:49 +0000128 def test_and(self):
129 i = self.s.intersection(self.otherword)
130 self.assertEqual(self.s & set(self.otherword), i)
131 self.assertEqual(self.s & frozenset(self.otherword), i)
132 try:
133 self.s & self.otherword
134 except TypeError:
135 pass
136 else:
137 self.fail("s&t did not screen-out general iterables")
138
139 def test_difference(self):
140 i = self.s.difference(self.otherword)
141 for c in self.letters:
142 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000143 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000144 self.assertEqual(type(i), self.thetype)
145 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
146 self.assertRaises(TypeError, self.s.difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000147 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
148 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
149 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
150 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
151 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Raymond Hettinger4267be62008-06-11 10:30:54 +0000152 self.assertEqual(self.thetype('abcba').difference(), set('abc'))
153 self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000154
155 def test_sub(self):
156 i = self.s.difference(self.otherword)
157 self.assertEqual(self.s - set(self.otherword), i)
158 self.assertEqual(self.s - frozenset(self.otherword), i)
159 try:
160 self.s - self.otherword
161 except TypeError:
162 pass
163 else:
164 self.fail("s-t did not screen-out general iterables")
165
166 def test_symmetric_difference(self):
167 i = self.s.symmetric_difference(self.otherword)
168 for c in self.letters:
169 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000170 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000171 self.assertEqual(type(i), self.thetype)
172 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
173 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000174 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
175 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
176 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
177 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
178 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000179
180 def test_xor(self):
181 i = self.s.symmetric_difference(self.otherword)
182 self.assertEqual(self.s ^ set(self.otherword), i)
183 self.assertEqual(self.s ^ frozenset(self.otherword), i)
184 try:
185 self.s ^ self.otherword
186 except TypeError:
187 pass
188 else:
189 self.fail("s^t did not screen-out general iterables")
190
191 def test_equality(self):
192 self.assertEqual(self.s, set(self.word))
193 self.assertEqual(self.s, frozenset(self.word))
194 self.assertEqual(self.s == self.word, False)
195 self.assertNotEqual(self.s, set(self.otherword))
196 self.assertNotEqual(self.s, frozenset(self.otherword))
197 self.assertEqual(self.s != self.word, True)
198
199 def test_setOfFrozensets(self):
200 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
201 s = self.thetype(t)
202 self.assertEqual(len(s), 3)
203
204 def test_compare(self):
205 self.assertRaises(TypeError, self.s.__cmp__, self.s)
206
207 def test_sub_and_super(self):
208 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
209 self.assert_(p < q)
210 self.assert_(p <= q)
211 self.assert_(q <= q)
212 self.assert_(q > p)
213 self.assert_(q >= p)
214 self.failIf(q < r)
215 self.failIf(q <= r)
216 self.failIf(q > r)
217 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000218 self.assert_(set('a').issubset('abc'))
219 self.assert_(set('abc').issuperset('a'))
220 self.failIf(set('a').issubset('cbs'))
221 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000222
223 def test_pickling(self):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000224 for i in (0, 1, 2):
225 p = pickle.dumps(self.s, i)
226 dup = pickle.loads(p)
227 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
228 if type(self.s) not in (set, frozenset):
229 self.s.x = 10
230 p = pickle.dumps(self.s)
231 dup = pickle.loads(p)
232 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000233
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000234 def test_deepcopy(self):
235 class Tracer:
236 def __init__(self, value):
237 self.value = value
238 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000239 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000240 def __deepcopy__(self, memo=None):
241 return Tracer(self.value + 1)
242 t = Tracer(10)
243 s = self.thetype([t])
244 dup = copy.deepcopy(s)
245 self.assertNotEqual(id(s), id(dup))
246 for elem in dup:
247 newt = elem
248 self.assertNotEqual(id(t), id(newt))
249 self.assertEqual(t.value + 1, newt.value)
250
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000251 def test_gc(self):
252 # Create a nest of cycles to exercise overall ref count check
253 class A:
254 pass
255 s = set(A() for i in xrange(1000))
256 for elem in s:
257 elem.cycle = s
258 elem.sub = elem
259 elem.set = set([elem])
260
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000261 def test_subclass_with_custom_hash(self):
262 # Bug #1257731
263 class H(self.thetype):
264 def __hash__(self):
Tim Peters6902b442006-04-11 00:43:27 +0000265 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000266 s=H()
267 f=set()
268 f.add(s)
269 self.assert_(s in f)
270 f.remove(s)
271 f.add(s)
272 f.discard(s)
273
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000274 def test_badcmp(self):
275 s = self.thetype([BadCmp()])
276 # Detect comparison errors during insertion and lookup
277 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
278 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
279 # Detect errors during mutating operations
280 if hasattr(s, 'add'):
281 self.assertRaises(RuntimeError, s.add, BadCmp())
282 self.assertRaises(RuntimeError, s.discard, BadCmp())
283 self.assertRaises(RuntimeError, s.remove, BadCmp())
284
Raymond Hettinger53999102006-12-30 04:01:17 +0000285 def test_cyclical_repr(self):
286 w = ReprWrapper()
287 s = self.thetype([w])
288 w.value = s
289 name = repr(s).partition('(')[0] # strip class name from repr string
290 self.assertEqual(repr(s), '%s([%s(...)])' % (name, name))
291
292 def test_cyclical_print(self):
293 w = ReprWrapper()
294 s = self.thetype([w])
295 w.value = s
Neal Norwitzbe9160b2008-03-25 06:35:10 +0000296 fo = open(test_support.TESTFN, "wb")
Raymond Hettinger53999102006-12-30 04:01:17 +0000297 try:
Raymond Hettinger53999102006-12-30 04:01:17 +0000298 print >> fo, s,
299 fo.close()
300 fo = open(test_support.TESTFN, "rb")
301 self.assertEqual(fo.read(), repr(s))
302 finally:
303 fo.close()
Neal Norwitzbe9160b2008-03-25 06:35:10 +0000304 test_support.unlink(test_support.TESTFN)
Raymond Hettinger53999102006-12-30 04:01:17 +0000305
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000306 def test_do_not_rehash_dict_keys(self):
307 n = 10
308 d = dict.fromkeys(map(HashCountingInt, xrange(n)))
309 self.assertEqual(sum(elem.hash_count for elem in d), n)
310 s = self.thetype(d)
311 self.assertEqual(sum(elem.hash_count for elem in d), n)
312 s.difference(d)
Tim Petersea5962f2007-03-12 18:07:52 +0000313 self.assertEqual(sum(elem.hash_count for elem in d), n)
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000314 if hasattr(s, 'symmetric_difference_update'):
315 s.symmetric_difference_update(d)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000316 self.assertEqual(sum(elem.hash_count for elem in d), n)
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +0000317 d2 = dict.fromkeys(set(d))
318 self.assertEqual(sum(elem.hash_count for elem in d), n)
319 d3 = dict.fromkeys(frozenset(d))
Tim Petersea5962f2007-03-12 18:07:52 +0000320 self.assertEqual(sum(elem.hash_count for elem in d), n)
Raymond Hettingere3146f52007-03-21 20:33:57 +0000321 d3 = dict.fromkeys(frozenset(d), 123)
322 self.assertEqual(sum(elem.hash_count for elem in d), n)
323 self.assertEqual(d3, dict.fromkeys(d, 123))
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000324
Raymond Hettingera690a992003-11-16 16:17:49 +0000325class TestSet(TestJointOps):
326 thetype = set
327
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000328 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000329 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000330 s.__init__(self.word)
331 self.assertEqual(s, set(self.word))
332 s.__init__(self.otherword)
333 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000334 self.assertRaises(TypeError, s.__init__, s, 2);
335 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000336
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000337 def test_constructor_identity(self):
338 s = self.thetype(range(3))
339 t = self.thetype(s)
340 self.assertNotEqual(id(s), id(t))
341
Raymond Hettingera690a992003-11-16 16:17:49 +0000342 def test_hash(self):
343 self.assertRaises(TypeError, hash, self.s)
344
345 def test_clear(self):
346 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000347 self.assertEqual(self.s, set())
348 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000349
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000350 def test_copy(self):
351 dup = self.s.copy()
352 self.assertEqual(self.s, dup)
353 self.assertNotEqual(id(self.s), id(dup))
354
Raymond Hettingera690a992003-11-16 16:17:49 +0000355 def test_add(self):
356 self.s.add('Q')
357 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000358 dup = self.s.copy()
359 self.s.add('Q')
360 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000361 self.assertRaises(TypeError, self.s.add, [])
362
363 def test_remove(self):
364 self.s.remove('a')
365 self.assert_('a' not in self.s)
366 self.assertRaises(KeyError, self.s.remove, 'Q')
367 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000368 s = self.thetype([frozenset(self.word)])
369 self.assert_(self.thetype(self.word) in s)
370 s.remove(self.thetype(self.word))
371 self.assert_(self.thetype(self.word) not in s)
372 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000373
Raymond Hettingerc789f342006-12-08 17:35:25 +0000374 def test_remove_keyerror_unpacking(self):
375 # bug: www.python.org/sf/1576657
376 for v1 in ['Q', (1,)]:
377 try:
378 self.s.remove(v1)
379 except KeyError, e:
380 v2 = e.args[0]
381 self.assertEqual(v1, v2)
382 else:
383 self.fail()
384
Raymond Hettingera690a992003-11-16 16:17:49 +0000385 def test_discard(self):
386 self.s.discard('a')
387 self.assert_('a' not in self.s)
388 self.s.discard('Q')
389 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000390 s = self.thetype([frozenset(self.word)])
391 self.assert_(self.thetype(self.word) in s)
392 s.discard(self.thetype(self.word))
393 self.assert_(self.thetype(self.word) not in s)
394 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000395
396 def test_pop(self):
397 for i in xrange(len(self.s)):
398 elem = self.s.pop()
399 self.assert_(elem not in self.s)
400 self.assertRaises(KeyError, self.s.pop)
401
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000402 def test_update(self):
403 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000404 self.assertEqual(retval, None)
405 for c in (self.word + self.otherword):
406 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000407 self.assertRaises(PassThru, self.s.update, check_pass_thru())
408 self.assertRaises(TypeError, self.s.update, [[]])
409 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
410 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
411 s = self.thetype('abcba')
412 self.assertEqual(s.update(C(p)), None)
413 self.assertEqual(s, set(q))
Raymond Hettingeree4bcad2008-06-09 08:33:37 +0000414 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
415 q = 'ahi'
416 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
417 s = self.thetype('abcba')
418 self.assertEqual(s.update(C(p), C(q)), None)
419 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000420
421 def test_ior(self):
422 self.s |= set(self.otherword)
423 for c in (self.word + self.otherword):
424 self.assert_(c in self.s)
425
426 def test_intersection_update(self):
427 retval = self.s.intersection_update(self.otherword)
428 self.assertEqual(retval, None)
429 for c in (self.word + self.otherword):
430 if c in self.otherword and c in self.word:
431 self.assert_(c in self.s)
432 else:
433 self.assert_(c not in self.s)
434 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
435 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000436 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
437 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
438 s = self.thetype('abcba')
439 self.assertEqual(s.intersection_update(C(p)), None)
440 self.assertEqual(s, set(q))
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +0000441 ss = 'abcba'
442 s = self.thetype(ss)
443 t = 'cbc'
444 self.assertEqual(s.intersection_update(C(p), C(t)), None)
445 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000446
447 def test_iand(self):
448 self.s &= set(self.otherword)
449 for c in (self.word + self.otherword):
450 if c in self.otherword and c in self.word:
451 self.assert_(c in self.s)
452 else:
453 self.assert_(c not in self.s)
454
455 def test_difference_update(self):
456 retval = self.s.difference_update(self.otherword)
457 self.assertEqual(retval, None)
458 for c in (self.word + self.otherword):
459 if c in self.word and c not in self.otherword:
460 self.assert_(c in self.s)
461 else:
462 self.assert_(c not in self.s)
463 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
464 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000465 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
466 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
467 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
468 s = self.thetype('abcba')
469 self.assertEqual(s.difference_update(C(p)), None)
470 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000471
Raymond Hettinger4267be62008-06-11 10:30:54 +0000472 s = self.thetype('abcdefghih')
473 s.difference_update()
474 self.assertEqual(s, self.thetype('abcdefghih'))
475
476 s = self.thetype('abcdefghih')
477 s.difference_update(C('aba'))
478 self.assertEqual(s, self.thetype('cdefghih'))
479
480 s = self.thetype('abcdefghih')
481 s.difference_update(C('cdc'), C('aba'))
482 self.assertEqual(s, self.thetype('efghih'))
483
Raymond Hettingera690a992003-11-16 16:17:49 +0000484 def test_isub(self):
485 self.s -= set(self.otherword)
486 for c in (self.word + self.otherword):
487 if c in self.word and c not in self.otherword:
488 self.assert_(c in self.s)
489 else:
490 self.assert_(c not in self.s)
491
492 def test_symmetric_difference_update(self):
493 retval = self.s.symmetric_difference_update(self.otherword)
494 self.assertEqual(retval, None)
495 for c in (self.word + self.otherword):
496 if (c in self.word) ^ (c in self.otherword):
497 self.assert_(c in self.s)
498 else:
499 self.assert_(c not in self.s)
500 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
501 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000502 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
503 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
504 s = self.thetype('abcba')
505 self.assertEqual(s.symmetric_difference_update(C(p)), None)
506 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000507
508 def test_ixor(self):
509 self.s ^= set(self.otherword)
510 for c in (self.word + self.otherword):
511 if (c in self.word) ^ (c in self.otherword):
512 self.assert_(c in self.s)
513 else:
514 self.assert_(c not in self.s)
515
Raymond Hettingerc991db22005-08-11 07:58:45 +0000516 def test_inplace_on_self(self):
517 t = self.s.copy()
518 t |= t
519 self.assertEqual(t, self.s)
520 t &= t
521 self.assertEqual(t, self.s)
522 t -= t
523 self.assertEqual(t, self.thetype())
524 t = self.s.copy()
525 t ^= t
526 self.assertEqual(t, self.thetype())
527
Raymond Hettinger691d8052004-05-30 07:26:47 +0000528 def test_weakref(self):
529 s = self.thetype('gallahad')
530 p = proxy(s)
531 self.assertEqual(str(p), str(s))
532 s = None
533 self.assertRaises(ReferenceError, str, p)
534
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000535 # C API test only available in a debug build
Barry Warsaw176014f2006-03-30 22:45:35 +0000536 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000537 def test_c_api(self):
538 self.assertEqual(set('abc').test_c_api(), True)
539
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000540class SetSubclass(set):
541 pass
542
543class TestSetSubclass(TestSet):
544 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000545
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +0000546class SetSubclassWithKeywordArgs(set):
547 def __init__(self, iterable=[], newarg=None):
548 set.__init__(self, iterable)
549
550class TestSetSubclassWithKeywordArgs(TestSet):
Tim Petersf733abb2007-01-30 03:03:46 +0000551
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +0000552 def test_keywords_in_subclass(self):
553 'SF bug #1486663 -- this used to erroneously raise a TypeError'
554 SetSubclassWithKeywordArgs(newarg=1)
555
Raymond Hettingera690a992003-11-16 16:17:49 +0000556class TestFrozenSet(TestJointOps):
557 thetype = frozenset
558
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000559 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000560 s = self.thetype(self.word)
561 s.__init__(self.otherword)
562 self.assertEqual(s, set(self.word))
563
Raymond Hettingerd7946662005-08-01 21:39:29 +0000564 def test_singleton_empty_frozenset(self):
565 f = frozenset()
566 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
567 frozenset(), frozenset([]), frozenset(()), frozenset(''),
568 frozenset(xrange(0)), frozenset(frozenset()),
569 frozenset(f), f]
570 # All of the empty frozensets should have just one id()
571 self.assertEqual(len(set(map(id, efs))), 1)
572
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000573 def test_constructor_identity(self):
574 s = self.thetype(range(3))
575 t = self.thetype(s)
576 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000577
Raymond Hettingera690a992003-11-16 16:17:49 +0000578 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000579 self.assertEqual(hash(self.thetype('abcdeb')),
580 hash(self.thetype('ebecda')))
581
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000582 # make sure that all permutations give the same hash value
583 n = 100
584 seq = [randrange(n) for i in xrange(n)]
585 results = set()
586 for i in xrange(200):
587 shuffle(seq)
588 results.add(hash(self.thetype(seq)))
589 self.assertEqual(len(results), 1)
590
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000591 def test_copy(self):
592 dup = self.s.copy()
593 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000594
595 def test_frozen_as_dictkey(self):
596 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000597 key1 = self.thetype(seq)
598 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000599 self.assertEqual(key1, key2)
600 self.assertNotEqual(id(key1), id(key2))
601 d = {}
602 d[key1] = 42
603 self.assertEqual(d[key2], 42)
604
605 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000606 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000607 self.assertEqual(hash(f), hash(f))
608
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000609 def test_hash_effectiveness(self):
610 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000611 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000612 addhashvalue = hashvalues.add
613 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000614 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000615 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
616 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000617
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000618class FrozenSetSubclass(frozenset):
619 pass
620
621class TestFrozenSetSubclass(TestFrozenSet):
622 thetype = FrozenSetSubclass
623
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000624 def test_constructor_identity(self):
625 s = self.thetype(range(3))
626 t = self.thetype(s)
627 self.assertNotEqual(id(s), id(t))
628
629 def test_copy(self):
630 dup = self.s.copy()
631 self.assertNotEqual(id(self.s), id(dup))
632
633 def test_nested_empty_constructor(self):
634 s = self.thetype()
635 t = self.thetype(s)
636 self.assertEqual(s, t)
637
Raymond Hettingerd7946662005-08-01 21:39:29 +0000638 def test_singleton_empty_frozenset(self):
639 Frozenset = self.thetype
640 f = frozenset()
641 F = Frozenset()
642 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
643 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
644 Frozenset(xrange(0)), Frozenset(Frozenset()),
645 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
646 # All empty frozenset subclass instances should have different ids
647 self.assertEqual(len(set(map(id, efs))), len(efs))
648
Raymond Hettingera690a992003-11-16 16:17:49 +0000649# Tests taken from test_sets.py =============================================
650
651empty_set = set()
652
653#==============================================================================
654
655class TestBasicOps(unittest.TestCase):
656
657 def test_repr(self):
658 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000659 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000660
Raymond Hettingereae05de2004-07-09 04:51:24 +0000661 def test_print(self):
Neal Norwitzbe9160b2008-03-25 06:35:10 +0000662 fo = open(test_support.TESTFN, "wb")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000663 try:
Raymond Hettingereae05de2004-07-09 04:51:24 +0000664 print >> fo, self.set,
665 fo.close()
666 fo = open(test_support.TESTFN, "rb")
667 self.assertEqual(fo.read(), repr(self.set))
668 finally:
669 fo.close()
Neal Norwitzbe9160b2008-03-25 06:35:10 +0000670 test_support.unlink(test_support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000671
Raymond Hettingera690a992003-11-16 16:17:49 +0000672 def test_length(self):
673 self.assertEqual(len(self.set), self.length)
674
675 def test_self_equality(self):
676 self.assertEqual(self.set, self.set)
677
678 def test_equivalent_equality(self):
679 self.assertEqual(self.set, self.dup)
680
681 def test_copy(self):
682 self.assertEqual(self.set.copy(), self.dup)
683
684 def test_self_union(self):
685 result = self.set | self.set
686 self.assertEqual(result, self.dup)
687
688 def test_empty_union(self):
689 result = self.set | empty_set
690 self.assertEqual(result, self.dup)
691
692 def test_union_empty(self):
693 result = empty_set | self.set
694 self.assertEqual(result, self.dup)
695
696 def test_self_intersection(self):
697 result = self.set & self.set
698 self.assertEqual(result, self.dup)
699
700 def test_empty_intersection(self):
701 result = self.set & empty_set
702 self.assertEqual(result, empty_set)
703
704 def test_intersection_empty(self):
705 result = empty_set & self.set
706 self.assertEqual(result, empty_set)
707
Raymond Hettinger1760c8a2007-11-08 02:52:43 +0000708 def test_self_isdisjoint(self):
709 result = self.set.isdisjoint(self.set)
710 self.assertEqual(result, not self.set)
711
712 def test_empty_isdisjoint(self):
713 result = self.set.isdisjoint(empty_set)
714 self.assertEqual(result, True)
715
716 def test_isdisjoint_empty(self):
717 result = empty_set.isdisjoint(self.set)
718 self.assertEqual(result, True)
719
Raymond Hettingera690a992003-11-16 16:17:49 +0000720 def test_self_symmetric_difference(self):
721 result = self.set ^ self.set
722 self.assertEqual(result, empty_set)
723
724 def checkempty_symmetric_difference(self):
725 result = self.set ^ empty_set
726 self.assertEqual(result, self.set)
727
728 def test_self_difference(self):
729 result = self.set - self.set
730 self.assertEqual(result, empty_set)
731
732 def test_empty_difference(self):
733 result = self.set - empty_set
734 self.assertEqual(result, self.dup)
735
736 def test_empty_difference_rev(self):
737 result = empty_set - self.set
738 self.assertEqual(result, empty_set)
739
740 def test_iteration(self):
741 for v in self.set:
742 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000743 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000744 # note: __length_hint__ is an internal undocumented API,
745 # don't rely on it in your own programs
746 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000747
748 def test_pickling(self):
749 p = pickle.dumps(self.set)
750 copy = pickle.loads(p)
751 self.assertEqual(self.set, copy,
752 "%s != %s" % (self.set, copy))
753
754#------------------------------------------------------------------------------
755
756class TestBasicOpsEmpty(TestBasicOps):
757 def setUp(self):
758 self.case = "empty set"
759 self.values = []
760 self.set = set(self.values)
761 self.dup = set(self.values)
762 self.length = 0
763 self.repr = "set([])"
764
765#------------------------------------------------------------------------------
766
767class TestBasicOpsSingleton(TestBasicOps):
768 def setUp(self):
769 self.case = "unit set (number)"
770 self.values = [3]
771 self.set = set(self.values)
772 self.dup = set(self.values)
773 self.length = 1
774 self.repr = "set([3])"
775
776 def test_in(self):
777 self.failUnless(3 in self.set)
778
779 def test_not_in(self):
780 self.failUnless(2 not in self.set)
781
782#------------------------------------------------------------------------------
783
784class TestBasicOpsTuple(TestBasicOps):
785 def setUp(self):
786 self.case = "unit set (tuple)"
787 self.values = [(0, "zero")]
788 self.set = set(self.values)
789 self.dup = set(self.values)
790 self.length = 1
791 self.repr = "set([(0, 'zero')])"
792
793 def test_in(self):
794 self.failUnless((0, "zero") in self.set)
795
796 def test_not_in(self):
797 self.failUnless(9 not in self.set)
798
799#------------------------------------------------------------------------------
800
801class TestBasicOpsTriple(TestBasicOps):
802 def setUp(self):
803 self.case = "triple set"
804 self.values = [0, "zero", operator.add]
805 self.set = set(self.values)
806 self.dup = set(self.values)
807 self.length = 3
808 self.repr = None
809
810#==============================================================================
811
812def baditer():
813 raise TypeError
814 yield True
815
816def gooditer():
817 yield True
818
819class TestExceptionPropagation(unittest.TestCase):
820 """SF 628246: Set constructor should not trap iterator TypeErrors"""
821
822 def test_instanceWithException(self):
823 self.assertRaises(TypeError, set, baditer())
824
825 def test_instancesWithoutException(self):
826 # All of these iterables should load without exception.
827 set([1,2,3])
828 set((1,2,3))
829 set({'one':1, 'two':2, 'three':3})
830 set(xrange(3))
831 set('abc')
832 set(gooditer())
833
Neal Norwitzfcf44352005-11-27 20:37:43 +0000834 def test_changingSizeWhileIterating(self):
835 s = set([1,2,3])
836 try:
837 for i in s:
838 s.update([4])
839 except RuntimeError:
840 pass
841 else:
842 self.fail("no exception when changing size during iteration")
843
Raymond Hettingera690a992003-11-16 16:17:49 +0000844#==============================================================================
845
846class TestSetOfSets(unittest.TestCase):
847 def test_constructor(self):
848 inner = frozenset([1])
849 outer = set([inner])
850 element = outer.pop()
851 self.assertEqual(type(element), frozenset)
852 outer.add(inner) # Rebuild set of sets with .add method
853 outer.remove(inner)
854 self.assertEqual(outer, set()) # Verify that remove worked
855 outer.discard(inner) # Absence of KeyError indicates working fine
856
857#==============================================================================
858
859class TestBinaryOps(unittest.TestCase):
860 def setUp(self):
861 self.set = set((2, 4, 6))
862
863 def test_eq(self): # SF bug 643115
864 self.assertEqual(self.set, set({2:1,4:3,6:5}))
865
866 def test_union_subset(self):
867 result = self.set | set([2])
868 self.assertEqual(result, set((2, 4, 6)))
869
870 def test_union_superset(self):
871 result = self.set | set([2, 4, 6, 8])
872 self.assertEqual(result, set([2, 4, 6, 8]))
873
874 def test_union_overlap(self):
875 result = self.set | set([3, 4, 5])
876 self.assertEqual(result, set([2, 3, 4, 5, 6]))
877
878 def test_union_non_overlap(self):
879 result = self.set | set([8])
880 self.assertEqual(result, set([2, 4, 6, 8]))
881
882 def test_intersection_subset(self):
883 result = self.set & set((2, 4))
884 self.assertEqual(result, set((2, 4)))
885
886 def test_intersection_superset(self):
887 result = self.set & set([2, 4, 6, 8])
888 self.assertEqual(result, set([2, 4, 6]))
889
890 def test_intersection_overlap(self):
891 result = self.set & set([3, 4, 5])
892 self.assertEqual(result, set([4]))
893
894 def test_intersection_non_overlap(self):
895 result = self.set & set([8])
896 self.assertEqual(result, empty_set)
897
Raymond Hettinger1760c8a2007-11-08 02:52:43 +0000898 def test_isdisjoint_subset(self):
899 result = self.set.isdisjoint(set((2, 4)))
900 self.assertEqual(result, False)
901
902 def test_isdisjoint_superset(self):
903 result = self.set.isdisjoint(set([2, 4, 6, 8]))
904 self.assertEqual(result, False)
905
906 def test_isdisjoint_overlap(self):
907 result = self.set.isdisjoint(set([3, 4, 5]))
908 self.assertEqual(result, False)
909
910 def test_isdisjoint_non_overlap(self):
911 result = self.set.isdisjoint(set([8]))
912 self.assertEqual(result, True)
913
Raymond Hettingera690a992003-11-16 16:17:49 +0000914 def test_sym_difference_subset(self):
915 result = self.set ^ set((2, 4))
916 self.assertEqual(result, set([6]))
917
918 def test_sym_difference_superset(self):
919 result = self.set ^ set((2, 4, 6, 8))
920 self.assertEqual(result, set([8]))
921
922 def test_sym_difference_overlap(self):
923 result = self.set ^ set((3, 4, 5))
924 self.assertEqual(result, set([2, 3, 5, 6]))
925
926 def test_sym_difference_non_overlap(self):
927 result = self.set ^ set([8])
928 self.assertEqual(result, set([2, 4, 6, 8]))
929
930 def test_cmp(self):
931 a, b = set('a'), set('b')
932 self.assertRaises(TypeError, cmp, a, b)
933
934 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
935 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
936 # which Python thinks is good enough to synthesize a cmp() result
937 # without calling __cmp__.
938 self.assertEqual(cmp(a, a), 0)
939
940 self.assertRaises(TypeError, cmp, a, 12)
941 self.assertRaises(TypeError, cmp, "abc", a)
942
943#==============================================================================
944
945class TestUpdateOps(unittest.TestCase):
946 def setUp(self):
947 self.set = set((2, 4, 6))
948
949 def test_union_subset(self):
950 self.set |= set([2])
951 self.assertEqual(self.set, set((2, 4, 6)))
952
953 def test_union_superset(self):
954 self.set |= set([2, 4, 6, 8])
955 self.assertEqual(self.set, set([2, 4, 6, 8]))
956
957 def test_union_overlap(self):
958 self.set |= set([3, 4, 5])
959 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
960
961 def test_union_non_overlap(self):
962 self.set |= set([8])
963 self.assertEqual(self.set, set([2, 4, 6, 8]))
964
965 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000966 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000967 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
968
969 def test_intersection_subset(self):
970 self.set &= set((2, 4))
971 self.assertEqual(self.set, set((2, 4)))
972
973 def test_intersection_superset(self):
974 self.set &= set([2, 4, 6, 8])
975 self.assertEqual(self.set, set([2, 4, 6]))
976
977 def test_intersection_overlap(self):
978 self.set &= set([3, 4, 5])
979 self.assertEqual(self.set, set([4]))
980
981 def test_intersection_non_overlap(self):
982 self.set &= set([8])
983 self.assertEqual(self.set, empty_set)
984
985 def test_intersection_method_call(self):
986 self.set.intersection_update(set([3, 4, 5]))
987 self.assertEqual(self.set, set([4]))
988
989 def test_sym_difference_subset(self):
990 self.set ^= set((2, 4))
991 self.assertEqual(self.set, set([6]))
992
993 def test_sym_difference_superset(self):
994 self.set ^= set((2, 4, 6, 8))
995 self.assertEqual(self.set, set([8]))
996
997 def test_sym_difference_overlap(self):
998 self.set ^= set((3, 4, 5))
999 self.assertEqual(self.set, set([2, 3, 5, 6]))
1000
1001 def test_sym_difference_non_overlap(self):
1002 self.set ^= set([8])
1003 self.assertEqual(self.set, set([2, 4, 6, 8]))
1004
1005 def test_sym_difference_method_call(self):
1006 self.set.symmetric_difference_update(set([3, 4, 5]))
1007 self.assertEqual(self.set, set([2, 3, 5, 6]))
1008
1009 def test_difference_subset(self):
1010 self.set -= set((2, 4))
1011 self.assertEqual(self.set, set([6]))
1012
1013 def test_difference_superset(self):
1014 self.set -= set((2, 4, 6, 8))
1015 self.assertEqual(self.set, set([]))
1016
1017 def test_difference_overlap(self):
1018 self.set -= set((3, 4, 5))
1019 self.assertEqual(self.set, set([2, 6]))
1020
1021 def test_difference_non_overlap(self):
1022 self.set -= set([8])
1023 self.assertEqual(self.set, set([2, 4, 6]))
1024
1025 def test_difference_method_call(self):
1026 self.set.difference_update(set([3, 4, 5]))
1027 self.assertEqual(self.set, set([2, 6]))
1028
1029#==============================================================================
1030
1031class TestMutate(unittest.TestCase):
1032 def setUp(self):
1033 self.values = ["a", "b", "c"]
1034 self.set = set(self.values)
1035
1036 def test_add_present(self):
1037 self.set.add("c")
1038 self.assertEqual(self.set, set("abc"))
1039
1040 def test_add_absent(self):
1041 self.set.add("d")
1042 self.assertEqual(self.set, set("abcd"))
1043
1044 def test_add_until_full(self):
1045 tmp = set()
1046 expected_len = 0
1047 for v in self.values:
1048 tmp.add(v)
1049 expected_len += 1
1050 self.assertEqual(len(tmp), expected_len)
1051 self.assertEqual(tmp, self.set)
1052
1053 def test_remove_present(self):
1054 self.set.remove("b")
1055 self.assertEqual(self.set, set("ac"))
1056
1057 def test_remove_absent(self):
1058 try:
1059 self.set.remove("d")
1060 self.fail("Removing missing element should have raised LookupError")
1061 except LookupError:
1062 pass
1063
1064 def test_remove_until_empty(self):
1065 expected_len = len(self.set)
1066 for v in self.values:
1067 self.set.remove(v)
1068 expected_len -= 1
1069 self.assertEqual(len(self.set), expected_len)
1070
1071 def test_discard_present(self):
1072 self.set.discard("c")
1073 self.assertEqual(self.set, set("ab"))
1074
1075 def test_discard_absent(self):
1076 self.set.discard("d")
1077 self.assertEqual(self.set, set("abc"))
1078
1079 def test_clear(self):
1080 self.set.clear()
1081 self.assertEqual(len(self.set), 0)
1082
1083 def test_pop(self):
1084 popped = {}
1085 while self.set:
1086 popped[self.set.pop()] = None
1087 self.assertEqual(len(popped), len(self.values))
1088 for v in self.values:
1089 self.failUnless(v in popped)
1090
1091 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001092 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001093 self.assertEqual(self.set, set(self.values))
1094
1095 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001096 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001097 self.assertEqual(self.set, set(self.values))
1098
1099 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001100 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001101 self.assertEqual(self.set, set(self.values + ["z"]))
1102
1103#==============================================================================
1104
1105class TestSubsets(unittest.TestCase):
1106
1107 case2method = {"<=": "issubset",
1108 ">=": "issuperset",
1109 }
1110
1111 reverse = {"==": "==",
1112 "!=": "!=",
1113 "<": ">",
1114 ">": "<",
1115 "<=": ">=",
1116 ">=": "<=",
1117 }
1118
1119 def test_issubset(self):
1120 x = self.left
1121 y = self.right
1122 for case in "!=", "==", "<", "<=", ">", ">=":
1123 expected = case in self.cases
1124 # Test the binary infix spelling.
1125 result = eval("x" + case + "y", locals())
1126 self.assertEqual(result, expected)
1127 # Test the "friendly" method-name spelling, if one exists.
1128 if case in TestSubsets.case2method:
1129 method = getattr(x, TestSubsets.case2method[case])
1130 result = method(y)
1131 self.assertEqual(result, expected)
1132
1133 # Now do the same for the operands reversed.
1134 rcase = TestSubsets.reverse[case]
1135 result = eval("y" + rcase + "x", locals())
1136 self.assertEqual(result, expected)
1137 if rcase in TestSubsets.case2method:
1138 method = getattr(y, TestSubsets.case2method[rcase])
1139 result = method(x)
1140 self.assertEqual(result, expected)
1141#------------------------------------------------------------------------------
1142
1143class TestSubsetEqualEmpty(TestSubsets):
1144 left = set()
1145 right = set()
1146 name = "both empty"
1147 cases = "==", "<=", ">="
1148
1149#------------------------------------------------------------------------------
1150
1151class TestSubsetEqualNonEmpty(TestSubsets):
1152 left = set([1, 2])
1153 right = set([1, 2])
1154 name = "equal pair"
1155 cases = "==", "<=", ">="
1156
1157#------------------------------------------------------------------------------
1158
1159class TestSubsetEmptyNonEmpty(TestSubsets):
1160 left = set()
1161 right = set([1, 2])
1162 name = "one empty, one non-empty"
1163 cases = "!=", "<", "<="
1164
1165#------------------------------------------------------------------------------
1166
1167class TestSubsetPartial(TestSubsets):
1168 left = set([1])
1169 right = set([1, 2])
1170 name = "one a non-empty proper subset of other"
1171 cases = "!=", "<", "<="
1172
1173#------------------------------------------------------------------------------
1174
1175class TestSubsetNonOverlap(TestSubsets):
1176 left = set([1])
1177 right = set([2])
1178 name = "neither empty, neither contains"
1179 cases = "!="
1180
1181#==============================================================================
1182
1183class TestOnlySetsInBinaryOps(unittest.TestCase):
1184
1185 def test_eq_ne(self):
1186 # Unlike the others, this is testing that == and != *are* allowed.
1187 self.assertEqual(self.other == self.set, False)
1188 self.assertEqual(self.set == self.other, False)
1189 self.assertEqual(self.other != self.set, True)
1190 self.assertEqual(self.set != self.other, True)
1191
1192 def test_ge_gt_le_lt(self):
1193 self.assertRaises(TypeError, lambda: self.set < self.other)
1194 self.assertRaises(TypeError, lambda: self.set <= self.other)
1195 self.assertRaises(TypeError, lambda: self.set > self.other)
1196 self.assertRaises(TypeError, lambda: self.set >= self.other)
1197
1198 self.assertRaises(TypeError, lambda: self.other < self.set)
1199 self.assertRaises(TypeError, lambda: self.other <= self.set)
1200 self.assertRaises(TypeError, lambda: self.other > self.set)
1201 self.assertRaises(TypeError, lambda: self.other >= self.set)
1202
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001203 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001204 try:
1205 self.set |= self.other
1206 except TypeError:
1207 pass
1208 else:
1209 self.fail("expected TypeError")
1210
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001211 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001212 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001213 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001214 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001215 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001216
1217 def test_union(self):
1218 self.assertRaises(TypeError, lambda: self.set | self.other)
1219 self.assertRaises(TypeError, lambda: self.other | self.set)
1220 if self.otherIsIterable:
1221 self.set.union(self.other)
1222 else:
1223 self.assertRaises(TypeError, self.set.union, self.other)
1224
1225 def test_intersection_update_operator(self):
1226 try:
1227 self.set &= self.other
1228 except TypeError:
1229 pass
1230 else:
1231 self.fail("expected TypeError")
1232
1233 def test_intersection_update(self):
1234 if self.otherIsIterable:
1235 self.set.intersection_update(self.other)
1236 else:
1237 self.assertRaises(TypeError,
1238 self.set.intersection_update,
1239 self.other)
1240
1241 def test_intersection(self):
1242 self.assertRaises(TypeError, lambda: self.set & self.other)
1243 self.assertRaises(TypeError, lambda: self.other & self.set)
1244 if self.otherIsIterable:
1245 self.set.intersection(self.other)
1246 else:
1247 self.assertRaises(TypeError, self.set.intersection, self.other)
1248
1249 def test_sym_difference_update_operator(self):
1250 try:
1251 self.set ^= self.other
1252 except TypeError:
1253 pass
1254 else:
1255 self.fail("expected TypeError")
1256
1257 def test_sym_difference_update(self):
1258 if self.otherIsIterable:
1259 self.set.symmetric_difference_update(self.other)
1260 else:
1261 self.assertRaises(TypeError,
1262 self.set.symmetric_difference_update,
1263 self.other)
1264
1265 def test_sym_difference(self):
1266 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1267 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1268 if self.otherIsIterable:
1269 self.set.symmetric_difference(self.other)
1270 else:
1271 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1272
1273 def test_difference_update_operator(self):
1274 try:
1275 self.set -= self.other
1276 except TypeError:
1277 pass
1278 else:
1279 self.fail("expected TypeError")
1280
1281 def test_difference_update(self):
1282 if self.otherIsIterable:
1283 self.set.difference_update(self.other)
1284 else:
1285 self.assertRaises(TypeError,
1286 self.set.difference_update,
1287 self.other)
1288
1289 def test_difference(self):
1290 self.assertRaises(TypeError, lambda: self.set - self.other)
1291 self.assertRaises(TypeError, lambda: self.other - self.set)
1292 if self.otherIsIterable:
1293 self.set.difference(self.other)
1294 else:
1295 self.assertRaises(TypeError, self.set.difference, self.other)
1296
1297#------------------------------------------------------------------------------
1298
1299class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1300 def setUp(self):
1301 self.set = set((1, 2, 3))
1302 self.other = 19
1303 self.otherIsIterable = False
1304
1305#------------------------------------------------------------------------------
1306
1307class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1308 def setUp(self):
1309 self.set = set((1, 2, 3))
1310 self.other = {1:2, 3:4}
1311 self.otherIsIterable = True
1312
1313#------------------------------------------------------------------------------
1314
1315class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1316 def setUp(self):
1317 self.set = set((1, 2, 3))
1318 self.other = operator.add
1319 self.otherIsIterable = False
1320
1321#------------------------------------------------------------------------------
1322
1323class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1324 def setUp(self):
1325 self.set = set((1, 2, 3))
1326 self.other = (2, 4, 6)
1327 self.otherIsIterable = True
1328
1329#------------------------------------------------------------------------------
1330
1331class TestOnlySetsString(TestOnlySetsInBinaryOps):
1332 def setUp(self):
1333 self.set = set((1, 2, 3))
1334 self.other = 'abc'
1335 self.otherIsIterable = True
1336
1337#------------------------------------------------------------------------------
1338
1339class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1340 def setUp(self):
1341 def gen():
1342 for i in xrange(0, 10, 2):
1343 yield i
1344 self.set = set((1, 2, 3))
1345 self.other = gen()
1346 self.otherIsIterable = True
1347
1348#==============================================================================
1349
1350class TestCopying(unittest.TestCase):
1351
1352 def test_copy(self):
1353 dup = self.set.copy()
1354 dup_list = list(dup); dup_list.sort()
1355 set_list = list(self.set); set_list.sort()
1356 self.assertEqual(len(dup_list), len(set_list))
1357 for i in range(len(dup_list)):
1358 self.failUnless(dup_list[i] is set_list[i])
1359
1360 def test_deep_copy(self):
1361 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001362 ##print type(dup), repr(dup)
Raymond Hettingera690a992003-11-16 16:17:49 +00001363 dup_list = list(dup); dup_list.sort()
1364 set_list = list(self.set); set_list.sort()
1365 self.assertEqual(len(dup_list), len(set_list))
1366 for i in range(len(dup_list)):
1367 self.assertEqual(dup_list[i], set_list[i])
1368
1369#------------------------------------------------------------------------------
1370
1371class TestCopyingEmpty(TestCopying):
1372 def setUp(self):
1373 self.set = set()
1374
1375#------------------------------------------------------------------------------
1376
1377class TestCopyingSingleton(TestCopying):
1378 def setUp(self):
1379 self.set = set(["hello"])
1380
1381#------------------------------------------------------------------------------
1382
1383class TestCopyingTriple(TestCopying):
1384 def setUp(self):
1385 self.set = set(["zero", 0, None])
1386
1387#------------------------------------------------------------------------------
1388
1389class TestCopyingTuple(TestCopying):
1390 def setUp(self):
1391 self.set = set([(1, 2)])
1392
1393#------------------------------------------------------------------------------
1394
1395class TestCopyingNested(TestCopying):
1396 def setUp(self):
1397 self.set = set([((1, 2), (3, 4))])
1398
1399#==============================================================================
1400
1401class TestIdentities(unittest.TestCase):
1402 def setUp(self):
1403 self.a = set('abracadabra')
1404 self.b = set('alacazam')
1405
1406 def test_binopsVsSubsets(self):
1407 a, b = self.a, self.b
1408 self.assert_(a - b < a)
1409 self.assert_(b - a < b)
1410 self.assert_(a & b < a)
1411 self.assert_(a & b < b)
1412 self.assert_(a | b > a)
1413 self.assert_(a | b > b)
1414 self.assert_(a ^ b < a | b)
1415
1416 def test_commutativity(self):
1417 a, b = self.a, self.b
1418 self.assertEqual(a&b, b&a)
1419 self.assertEqual(a|b, b|a)
1420 self.assertEqual(a^b, b^a)
1421 if a != b:
1422 self.assertNotEqual(a-b, b-a)
1423
1424 def test_summations(self):
1425 # check that sums of parts equal the whole
1426 a, b = self.a, self.b
1427 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1428 self.assertEqual((a&b)|(a^b), a|b)
1429 self.assertEqual(a|(b-a), a|b)
1430 self.assertEqual((a-b)|b, a|b)
1431 self.assertEqual((a-b)|(a&b), a)
1432 self.assertEqual((b-a)|(a&b), b)
1433 self.assertEqual((a-b)|(b-a), a^b)
1434
1435 def test_exclusion(self):
1436 # check that inverse operations show non-overlap
1437 a, b, zero = self.a, self.b, set()
1438 self.assertEqual((a-b)&b, zero)
1439 self.assertEqual((b-a)&a, zero)
1440 self.assertEqual((a&b)&(a^b), zero)
1441
1442# Tests derived from test_itertools.py =======================================
1443
1444def R(seqn):
1445 'Regular generator'
1446 for i in seqn:
1447 yield i
1448
1449class G:
1450 'Sequence using __getitem__'
1451 def __init__(self, seqn):
1452 self.seqn = seqn
1453 def __getitem__(self, i):
1454 return self.seqn[i]
1455
1456class I:
1457 'Sequence using iterator protocol'
1458 def __init__(self, seqn):
1459 self.seqn = seqn
1460 self.i = 0
1461 def __iter__(self):
1462 return self
1463 def next(self):
1464 if self.i >= len(self.seqn): raise StopIteration
1465 v = self.seqn[self.i]
1466 self.i += 1
1467 return v
1468
1469class Ig:
1470 'Sequence using iterator protocol defined with a generator'
1471 def __init__(self, seqn):
1472 self.seqn = seqn
1473 self.i = 0
1474 def __iter__(self):
1475 for val in self.seqn:
1476 yield val
1477
1478class X:
1479 'Missing __getitem__ and __iter__'
1480 def __init__(self, seqn):
1481 self.seqn = seqn
1482 self.i = 0
1483 def next(self):
1484 if self.i >= len(self.seqn): raise StopIteration
1485 v = self.seqn[self.i]
1486 self.i += 1
1487 return v
1488
1489class N:
1490 'Iterator missing next()'
1491 def __init__(self, seqn):
1492 self.seqn = seqn
1493 self.i = 0
1494 def __iter__(self):
1495 return self
1496
1497class E:
1498 'Test propagation of exceptions'
1499 def __init__(self, seqn):
1500 self.seqn = seqn
1501 self.i = 0
1502 def __iter__(self):
1503 return self
1504 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001505 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001506
1507class S:
1508 'Test immediate stop'
1509 def __init__(self, seqn):
1510 pass
1511 def __iter__(self):
1512 return self
1513 def next(self):
1514 raise StopIteration
1515
1516from itertools import chain, imap
1517def L(seqn):
1518 'Test multiple tiers of iterators'
1519 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1520
1521class TestVariousIteratorArgs(unittest.TestCase):
1522
1523 def test_constructor(self):
1524 for cons in (set, frozenset):
1525 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1526 for g in (G, I, Ig, S, L, R):
Raymond Hettinger64958a12003-12-17 20:43:33 +00001527 self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
Raymond Hettingera690a992003-11-16 16:17:49 +00001528 self.assertRaises(TypeError, cons , X(s))
1529 self.assertRaises(TypeError, cons , N(s))
1530 self.assertRaises(ZeroDivisionError, cons , E(s))
1531
1532 def test_inline_methods(self):
1533 s = set('november')
1534 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001535 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001536 for g in (G, I, Ig, L, R):
1537 expected = meth(data)
1538 actual = meth(G(data))
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001539 if isinstance(expected, bool):
1540 self.assertEqual(actual, expected)
1541 else:
1542 self.assertEqual(sorted(actual), sorted(expected))
Raymond Hettingera690a992003-11-16 16:17:49 +00001543 self.assertRaises(TypeError, meth, X(s))
1544 self.assertRaises(TypeError, meth, N(s))
1545 self.assertRaises(ZeroDivisionError, meth, E(s))
1546
1547 def test_inplace_methods(self):
1548 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001549 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001550 'difference_update', 'symmetric_difference_update'):
1551 for g in (G, I, Ig, S, L, R):
1552 s = set('january')
1553 t = s.copy()
1554 getattr(s, methname)(list(g(data)))
1555 getattr(t, methname)(g(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001556 self.assertEqual(sorted(s), sorted(t))
Raymond Hettingera690a992003-11-16 16:17:49 +00001557
1558 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1559 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1560 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1561
Raymond Hettinger61708742008-01-24 21:23:58 +00001562# Application tests (based on David Eppstein's graph recipes ====================================
1563
1564def powerset(U):
1565 """Generates all subsets of a set or sequence U."""
1566 U = iter(U)
1567 try:
1568 x = frozenset([U.next()])
1569 for S in powerset(U):
1570 yield S
1571 yield S | x
1572 except StopIteration:
1573 yield frozenset()
1574
1575def cube(n):
1576 """Graph of n-dimensional hypercube."""
1577 singletons = [frozenset([x]) for x in range(n)]
1578 return dict([(x, frozenset([x^s for s in singletons]))
1579 for x in powerset(range(n))])
1580
1581def linegraph(G):
1582 """Graph, the vertices of which are edges of G,
1583 with two vertices being adjacent iff the corresponding
1584 edges share a vertex."""
1585 L = {}
1586 for x in G:
1587 for y in G[x]:
1588 nx = [frozenset([x,z]) for z in G[x] if z != y]
1589 ny = [frozenset([y,z]) for z in G[y] if z != x]
1590 L[frozenset([x,y])] = frozenset(nx+ny)
1591 return L
1592
1593def faces(G):
1594 'Return a set of faces in G. Where a face is a set of vertices on that face'
1595 # currently limited to triangles,squares, and pentagons
1596 f = set()
1597 for v1, edges in G.items():
1598 for v2 in edges:
1599 for v3 in G[v2]:
1600 if v1 == v3:
1601 continue
1602 if v1 in G[v3]:
1603 f.add(frozenset([v1, v2, v3]))
1604 else:
1605 for v4 in G[v3]:
1606 if v4 == v2:
1607 continue
1608 if v1 in G[v4]:
1609 f.add(frozenset([v1, v2, v3, v4]))
1610 else:
1611 for v5 in G[v4]:
1612 if v5 == v3 or v5 == v2:
1613 continue
1614 if v1 in G[v5]:
1615 f.add(frozenset([v1, v2, v3, v4, v5]))
1616 return f
1617
1618
1619class TestGraphs(unittest.TestCase):
1620
1621 def test_cube(self):
1622
1623 g = cube(3) # vert --> {v1, v2, v3}
1624 vertices1 = set(g)
1625 self.assertEqual(len(vertices1), 8) # eight vertices
1626 for edge in g.values():
1627 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1628 vertices2 = set(v for edges in g.values() for v in edges)
1629 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1630
1631 cubefaces = faces(g)
1632 self.assertEqual(len(cubefaces), 6) # six faces
1633 for face in cubefaces:
1634 self.assertEqual(len(face), 4) # each face is a square
1635
1636 def test_cuboctahedron(self):
1637
1638 # http://en.wikipedia.org/wiki/Cuboctahedron
1639 # 8 triangular faces and 6 square faces
1640 # 12 indentical vertices each connecting a triangle and square
1641
1642 g = cube(3)
1643 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1644 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1645
1646 vertices = set(cuboctahedron)
1647 for edges in cuboctahedron.values():
1648 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1649 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1650 self.assertEqual(vertices, othervertices) # edge vertices in original set
1651
1652 cubofaces = faces(cuboctahedron)
1653 facesizes = collections.defaultdict(int)
1654 for face in cubofaces:
1655 facesizes[len(face)] += 1
1656 self.assertEqual(facesizes[3], 8) # eight triangular faces
1657 self.assertEqual(facesizes[4], 6) # six square faces
1658
1659 for vertex in cuboctahedron:
1660 edge = vertex # Cuboctahedron vertices are edges in Cube
1661 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1662 for cubevert in edge:
1663 self.assert_(cubevert in g)
1664
1665
Raymond Hettingera690a992003-11-16 16:17:49 +00001666#==============================================================================
1667
1668def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001669 from test import test_sets
1670 test_classes = (
1671 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001672 TestSetSubclass,
Tim Petersf733abb2007-01-30 03:03:46 +00001673 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001674 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001675 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001676 TestSetOfSets,
1677 TestExceptionPropagation,
1678 TestBasicOpsEmpty,
1679 TestBasicOpsSingleton,
1680 TestBasicOpsTuple,
1681 TestBasicOpsTriple,
1682 TestBinaryOps,
1683 TestUpdateOps,
1684 TestMutate,
1685 TestSubsetEqualEmpty,
1686 TestSubsetEqualNonEmpty,
1687 TestSubsetEmptyNonEmpty,
1688 TestSubsetPartial,
1689 TestSubsetNonOverlap,
1690 TestOnlySetsNumeric,
1691 TestOnlySetsDict,
1692 TestOnlySetsOperator,
1693 TestOnlySetsTuple,
1694 TestOnlySetsString,
1695 TestOnlySetsGenerator,
1696 TestCopyingEmpty,
1697 TestCopyingSingleton,
1698 TestCopyingTriple,
1699 TestCopyingTuple,
1700 TestCopyingNested,
1701 TestIdentities,
1702 TestVariousIteratorArgs,
Raymond Hettinger61708742008-01-24 21:23:58 +00001703 TestGraphs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001704 )
1705
1706 test_support.run_unittest(*test_classes)
1707
1708 # verify reference counting
1709 if verbose and hasattr(sys, "gettotalrefcount"):
1710 import gc
1711 counts = [None] * 5
1712 for i in xrange(len(counts)):
1713 test_support.run_unittest(*test_classes)
1714 gc.collect()
1715 counts[i] = sys.gettotalrefcount()
1716 print counts
1717
1718if __name__ == "__main__":
1719 test_main(verbose=True)