blob: b32d953a84fdbe087af4bc0f98895778e3645499 [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 Hettingera690a992003-11-16 16:17:49 +0000152
153 def test_sub(self):
154 i = self.s.difference(self.otherword)
155 self.assertEqual(self.s - set(self.otherword), i)
156 self.assertEqual(self.s - frozenset(self.otherword), i)
157 try:
158 self.s - self.otherword
159 except TypeError:
160 pass
161 else:
162 self.fail("s-t did not screen-out general iterables")
163
164 def test_symmetric_difference(self):
165 i = self.s.symmetric_difference(self.otherword)
166 for c in self.letters:
167 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000168 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000169 self.assertEqual(type(i), self.thetype)
170 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
171 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000172 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
173 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
174 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
175 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
176 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000177
178 def test_xor(self):
179 i = self.s.symmetric_difference(self.otherword)
180 self.assertEqual(self.s ^ set(self.otherword), i)
181 self.assertEqual(self.s ^ frozenset(self.otherword), i)
182 try:
183 self.s ^ self.otherword
184 except TypeError:
185 pass
186 else:
187 self.fail("s^t did not screen-out general iterables")
188
189 def test_equality(self):
190 self.assertEqual(self.s, set(self.word))
191 self.assertEqual(self.s, frozenset(self.word))
192 self.assertEqual(self.s == self.word, False)
193 self.assertNotEqual(self.s, set(self.otherword))
194 self.assertNotEqual(self.s, frozenset(self.otherword))
195 self.assertEqual(self.s != self.word, True)
196
197 def test_setOfFrozensets(self):
198 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
199 s = self.thetype(t)
200 self.assertEqual(len(s), 3)
201
202 def test_compare(self):
203 self.assertRaises(TypeError, self.s.__cmp__, self.s)
204
205 def test_sub_and_super(self):
206 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
207 self.assert_(p < q)
208 self.assert_(p <= q)
209 self.assert_(q <= q)
210 self.assert_(q > p)
211 self.assert_(q >= p)
212 self.failIf(q < r)
213 self.failIf(q <= r)
214 self.failIf(q > r)
215 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000216 self.assert_(set('a').issubset('abc'))
217 self.assert_(set('abc').issuperset('a'))
218 self.failIf(set('a').issubset('cbs'))
219 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000220
221 def test_pickling(self):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000222 for i in (0, 1, 2):
223 p = pickle.dumps(self.s, i)
224 dup = pickle.loads(p)
225 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
226 if type(self.s) not in (set, frozenset):
227 self.s.x = 10
228 p = pickle.dumps(self.s)
229 dup = pickle.loads(p)
230 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000231
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000232 def test_deepcopy(self):
233 class Tracer:
234 def __init__(self, value):
235 self.value = value
236 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000237 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000238 def __deepcopy__(self, memo=None):
239 return Tracer(self.value + 1)
240 t = Tracer(10)
241 s = self.thetype([t])
242 dup = copy.deepcopy(s)
243 self.assertNotEqual(id(s), id(dup))
244 for elem in dup:
245 newt = elem
246 self.assertNotEqual(id(t), id(newt))
247 self.assertEqual(t.value + 1, newt.value)
248
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000249 def test_gc(self):
250 # Create a nest of cycles to exercise overall ref count check
251 class A:
252 pass
253 s = set(A() for i in xrange(1000))
254 for elem in s:
255 elem.cycle = s
256 elem.sub = elem
257 elem.set = set([elem])
258
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000259 def test_subclass_with_custom_hash(self):
260 # Bug #1257731
261 class H(self.thetype):
262 def __hash__(self):
Tim Peters6902b442006-04-11 00:43:27 +0000263 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000264 s=H()
265 f=set()
266 f.add(s)
267 self.assert_(s in f)
268 f.remove(s)
269 f.add(s)
270 f.discard(s)
271
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000272 def test_badcmp(self):
273 s = self.thetype([BadCmp()])
274 # Detect comparison errors during insertion and lookup
275 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
276 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
277 # Detect errors during mutating operations
278 if hasattr(s, 'add'):
279 self.assertRaises(RuntimeError, s.add, BadCmp())
280 self.assertRaises(RuntimeError, s.discard, BadCmp())
281 self.assertRaises(RuntimeError, s.remove, BadCmp())
282
Raymond Hettinger53999102006-12-30 04:01:17 +0000283 def test_cyclical_repr(self):
284 w = ReprWrapper()
285 s = self.thetype([w])
286 w.value = s
287 name = repr(s).partition('(')[0] # strip class name from repr string
288 self.assertEqual(repr(s), '%s([%s(...)])' % (name, name))
289
290 def test_cyclical_print(self):
291 w = ReprWrapper()
292 s = self.thetype([w])
293 w.value = s
Neal Norwitzbe9160b2008-03-25 06:35:10 +0000294 fo = open(test_support.TESTFN, "wb")
Raymond Hettinger53999102006-12-30 04:01:17 +0000295 try:
Raymond Hettinger53999102006-12-30 04:01:17 +0000296 print >> fo, s,
297 fo.close()
298 fo = open(test_support.TESTFN, "rb")
299 self.assertEqual(fo.read(), repr(s))
300 finally:
301 fo.close()
Neal Norwitzbe9160b2008-03-25 06:35:10 +0000302 test_support.unlink(test_support.TESTFN)
Raymond Hettinger53999102006-12-30 04:01:17 +0000303
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000304 def test_do_not_rehash_dict_keys(self):
305 n = 10
306 d = dict.fromkeys(map(HashCountingInt, xrange(n)))
307 self.assertEqual(sum(elem.hash_count for elem in d), n)
308 s = self.thetype(d)
309 self.assertEqual(sum(elem.hash_count for elem in d), n)
310 s.difference(d)
Tim Petersea5962f2007-03-12 18:07:52 +0000311 self.assertEqual(sum(elem.hash_count for elem in d), n)
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000312 if hasattr(s, 'symmetric_difference_update'):
313 s.symmetric_difference_update(d)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000314 self.assertEqual(sum(elem.hash_count for elem in d), n)
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +0000315 d2 = dict.fromkeys(set(d))
316 self.assertEqual(sum(elem.hash_count for elem in d), n)
317 d3 = dict.fromkeys(frozenset(d))
Tim Petersea5962f2007-03-12 18:07:52 +0000318 self.assertEqual(sum(elem.hash_count for elem in d), n)
Raymond Hettingere3146f52007-03-21 20:33:57 +0000319 d3 = dict.fromkeys(frozenset(d), 123)
320 self.assertEqual(sum(elem.hash_count for elem in d), n)
321 self.assertEqual(d3, dict.fromkeys(d, 123))
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000322
Raymond Hettingera690a992003-11-16 16:17:49 +0000323class TestSet(TestJointOps):
324 thetype = set
325
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000326 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000327 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000328 s.__init__(self.word)
329 self.assertEqual(s, set(self.word))
330 s.__init__(self.otherword)
331 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000332 self.assertRaises(TypeError, s.__init__, s, 2);
333 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000334
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000335 def test_constructor_identity(self):
336 s = self.thetype(range(3))
337 t = self.thetype(s)
338 self.assertNotEqual(id(s), id(t))
339
Raymond Hettingera690a992003-11-16 16:17:49 +0000340 def test_hash(self):
341 self.assertRaises(TypeError, hash, self.s)
342
343 def test_clear(self):
344 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000345 self.assertEqual(self.s, set())
346 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000347
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000348 def test_copy(self):
349 dup = self.s.copy()
350 self.assertEqual(self.s, dup)
351 self.assertNotEqual(id(self.s), id(dup))
352
Raymond Hettingera690a992003-11-16 16:17:49 +0000353 def test_add(self):
354 self.s.add('Q')
355 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000356 dup = self.s.copy()
357 self.s.add('Q')
358 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000359 self.assertRaises(TypeError, self.s.add, [])
360
361 def test_remove(self):
362 self.s.remove('a')
363 self.assert_('a' not in self.s)
364 self.assertRaises(KeyError, self.s.remove, 'Q')
365 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000366 s = self.thetype([frozenset(self.word)])
367 self.assert_(self.thetype(self.word) in s)
368 s.remove(self.thetype(self.word))
369 self.assert_(self.thetype(self.word) not in s)
370 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000371
Raymond Hettingerc789f342006-12-08 17:35:25 +0000372 def test_remove_keyerror_unpacking(self):
373 # bug: www.python.org/sf/1576657
374 for v1 in ['Q', (1,)]:
375 try:
376 self.s.remove(v1)
377 except KeyError, e:
378 v2 = e.args[0]
379 self.assertEqual(v1, v2)
380 else:
381 self.fail()
382
Raymond Hettingera690a992003-11-16 16:17:49 +0000383 def test_discard(self):
384 self.s.discard('a')
385 self.assert_('a' not in self.s)
386 self.s.discard('Q')
387 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000388 s = self.thetype([frozenset(self.word)])
389 self.assert_(self.thetype(self.word) in s)
390 s.discard(self.thetype(self.word))
391 self.assert_(self.thetype(self.word) not in s)
392 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000393
394 def test_pop(self):
395 for i in xrange(len(self.s)):
396 elem = self.s.pop()
397 self.assert_(elem not in self.s)
398 self.assertRaises(KeyError, self.s.pop)
399
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000400 def test_update(self):
401 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000402 self.assertEqual(retval, None)
403 for c in (self.word + self.otherword):
404 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000405 self.assertRaises(PassThru, self.s.update, check_pass_thru())
406 self.assertRaises(TypeError, self.s.update, [[]])
407 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
408 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
409 s = self.thetype('abcba')
410 self.assertEqual(s.update(C(p)), None)
411 self.assertEqual(s, set(q))
Raymond Hettingeree4bcad2008-06-09 08:33:37 +0000412 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
413 q = 'ahi'
414 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
415 s = self.thetype('abcba')
416 self.assertEqual(s.update(C(p), C(q)), None)
417 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000418
419 def test_ior(self):
420 self.s |= set(self.otherword)
421 for c in (self.word + self.otherword):
422 self.assert_(c in self.s)
423
424 def test_intersection_update(self):
425 retval = self.s.intersection_update(self.otherword)
426 self.assertEqual(retval, None)
427 for c in (self.word + self.otherword):
428 if c in self.otherword and c in self.word:
429 self.assert_(c in self.s)
430 else:
431 self.assert_(c not in self.s)
432 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
433 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000434 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
435 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
436 s = self.thetype('abcba')
437 self.assertEqual(s.intersection_update(C(p)), None)
438 self.assertEqual(s, set(q))
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +0000439 ss = 'abcba'
440 s = self.thetype(ss)
441 t = 'cbc'
442 self.assertEqual(s.intersection_update(C(p), C(t)), None)
443 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000444
445 def test_iand(self):
446 self.s &= set(self.otherword)
447 for c in (self.word + self.otherword):
448 if c in self.otherword and c in self.word:
449 self.assert_(c in self.s)
450 else:
451 self.assert_(c not in self.s)
452
453 def test_difference_update(self):
454 retval = self.s.difference_update(self.otherword)
455 self.assertEqual(retval, None)
456 for c in (self.word + self.otherword):
457 if c in self.word and c not in self.otherword:
458 self.assert_(c in self.s)
459 else:
460 self.assert_(c not in self.s)
461 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
462 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000463 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
464 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
465 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
466 s = self.thetype('abcba')
467 self.assertEqual(s.difference_update(C(p)), None)
468 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000469
470 def test_isub(self):
471 self.s -= set(self.otherword)
472 for c in (self.word + self.otherword):
473 if c in self.word and c not in self.otherword:
474 self.assert_(c in self.s)
475 else:
476 self.assert_(c not in self.s)
477
478 def test_symmetric_difference_update(self):
479 retval = self.s.symmetric_difference_update(self.otherword)
480 self.assertEqual(retval, None)
481 for c in (self.word + self.otherword):
482 if (c in self.word) ^ (c in self.otherword):
483 self.assert_(c in self.s)
484 else:
485 self.assert_(c not in self.s)
486 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
487 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000488 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
489 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
490 s = self.thetype('abcba')
491 self.assertEqual(s.symmetric_difference_update(C(p)), None)
492 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000493
494 def test_ixor(self):
495 self.s ^= set(self.otherword)
496 for c in (self.word + self.otherword):
497 if (c in self.word) ^ (c in self.otherword):
498 self.assert_(c in self.s)
499 else:
500 self.assert_(c not in self.s)
501
Raymond Hettingerc991db22005-08-11 07:58:45 +0000502 def test_inplace_on_self(self):
503 t = self.s.copy()
504 t |= t
505 self.assertEqual(t, self.s)
506 t &= t
507 self.assertEqual(t, self.s)
508 t -= t
509 self.assertEqual(t, self.thetype())
510 t = self.s.copy()
511 t ^= t
512 self.assertEqual(t, self.thetype())
513
Raymond Hettinger691d8052004-05-30 07:26:47 +0000514 def test_weakref(self):
515 s = self.thetype('gallahad')
516 p = proxy(s)
517 self.assertEqual(str(p), str(s))
518 s = None
519 self.assertRaises(ReferenceError, str, p)
520
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000521 # C API test only available in a debug build
Barry Warsaw176014f2006-03-30 22:45:35 +0000522 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000523 def test_c_api(self):
524 self.assertEqual(set('abc').test_c_api(), True)
525
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000526class SetSubclass(set):
527 pass
528
529class TestSetSubclass(TestSet):
530 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000531
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +0000532class SetSubclassWithKeywordArgs(set):
533 def __init__(self, iterable=[], newarg=None):
534 set.__init__(self, iterable)
535
536class TestSetSubclassWithKeywordArgs(TestSet):
Tim Petersf733abb2007-01-30 03:03:46 +0000537
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +0000538 def test_keywords_in_subclass(self):
539 'SF bug #1486663 -- this used to erroneously raise a TypeError'
540 SetSubclassWithKeywordArgs(newarg=1)
541
Raymond Hettingera690a992003-11-16 16:17:49 +0000542class TestFrozenSet(TestJointOps):
543 thetype = frozenset
544
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000545 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000546 s = self.thetype(self.word)
547 s.__init__(self.otherword)
548 self.assertEqual(s, set(self.word))
549
Raymond Hettingerd7946662005-08-01 21:39:29 +0000550 def test_singleton_empty_frozenset(self):
551 f = frozenset()
552 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
553 frozenset(), frozenset([]), frozenset(()), frozenset(''),
554 frozenset(xrange(0)), frozenset(frozenset()),
555 frozenset(f), f]
556 # All of the empty frozensets should have just one id()
557 self.assertEqual(len(set(map(id, efs))), 1)
558
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000559 def test_constructor_identity(self):
560 s = self.thetype(range(3))
561 t = self.thetype(s)
562 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000563
Raymond Hettingera690a992003-11-16 16:17:49 +0000564 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000565 self.assertEqual(hash(self.thetype('abcdeb')),
566 hash(self.thetype('ebecda')))
567
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000568 # make sure that all permutations give the same hash value
569 n = 100
570 seq = [randrange(n) for i in xrange(n)]
571 results = set()
572 for i in xrange(200):
573 shuffle(seq)
574 results.add(hash(self.thetype(seq)))
575 self.assertEqual(len(results), 1)
576
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000577 def test_copy(self):
578 dup = self.s.copy()
579 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000580
581 def test_frozen_as_dictkey(self):
582 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000583 key1 = self.thetype(seq)
584 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000585 self.assertEqual(key1, key2)
586 self.assertNotEqual(id(key1), id(key2))
587 d = {}
588 d[key1] = 42
589 self.assertEqual(d[key2], 42)
590
591 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000592 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000593 self.assertEqual(hash(f), hash(f))
594
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000595 def test_hash_effectiveness(self):
596 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000597 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000598 addhashvalue = hashvalues.add
599 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000600 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000601 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
602 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000603
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000604class FrozenSetSubclass(frozenset):
605 pass
606
607class TestFrozenSetSubclass(TestFrozenSet):
608 thetype = FrozenSetSubclass
609
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000610 def test_constructor_identity(self):
611 s = self.thetype(range(3))
612 t = self.thetype(s)
613 self.assertNotEqual(id(s), id(t))
614
615 def test_copy(self):
616 dup = self.s.copy()
617 self.assertNotEqual(id(self.s), id(dup))
618
619 def test_nested_empty_constructor(self):
620 s = self.thetype()
621 t = self.thetype(s)
622 self.assertEqual(s, t)
623
Raymond Hettingerd7946662005-08-01 21:39:29 +0000624 def test_singleton_empty_frozenset(self):
625 Frozenset = self.thetype
626 f = frozenset()
627 F = Frozenset()
628 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
629 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
630 Frozenset(xrange(0)), Frozenset(Frozenset()),
631 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
632 # All empty frozenset subclass instances should have different ids
633 self.assertEqual(len(set(map(id, efs))), len(efs))
634
Raymond Hettingera690a992003-11-16 16:17:49 +0000635# Tests taken from test_sets.py =============================================
636
637empty_set = set()
638
639#==============================================================================
640
641class TestBasicOps(unittest.TestCase):
642
643 def test_repr(self):
644 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000645 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000646
Raymond Hettingereae05de2004-07-09 04:51:24 +0000647 def test_print(self):
Neal Norwitzbe9160b2008-03-25 06:35:10 +0000648 fo = open(test_support.TESTFN, "wb")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000649 try:
Raymond Hettingereae05de2004-07-09 04:51:24 +0000650 print >> fo, self.set,
651 fo.close()
652 fo = open(test_support.TESTFN, "rb")
653 self.assertEqual(fo.read(), repr(self.set))
654 finally:
655 fo.close()
Neal Norwitzbe9160b2008-03-25 06:35:10 +0000656 test_support.unlink(test_support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000657
Raymond Hettingera690a992003-11-16 16:17:49 +0000658 def test_length(self):
659 self.assertEqual(len(self.set), self.length)
660
661 def test_self_equality(self):
662 self.assertEqual(self.set, self.set)
663
664 def test_equivalent_equality(self):
665 self.assertEqual(self.set, self.dup)
666
667 def test_copy(self):
668 self.assertEqual(self.set.copy(), self.dup)
669
670 def test_self_union(self):
671 result = self.set | self.set
672 self.assertEqual(result, self.dup)
673
674 def test_empty_union(self):
675 result = self.set | empty_set
676 self.assertEqual(result, self.dup)
677
678 def test_union_empty(self):
679 result = empty_set | self.set
680 self.assertEqual(result, self.dup)
681
682 def test_self_intersection(self):
683 result = self.set & self.set
684 self.assertEqual(result, self.dup)
685
686 def test_empty_intersection(self):
687 result = self.set & empty_set
688 self.assertEqual(result, empty_set)
689
690 def test_intersection_empty(self):
691 result = empty_set & self.set
692 self.assertEqual(result, empty_set)
693
Raymond Hettinger1760c8a2007-11-08 02:52:43 +0000694 def test_self_isdisjoint(self):
695 result = self.set.isdisjoint(self.set)
696 self.assertEqual(result, not self.set)
697
698 def test_empty_isdisjoint(self):
699 result = self.set.isdisjoint(empty_set)
700 self.assertEqual(result, True)
701
702 def test_isdisjoint_empty(self):
703 result = empty_set.isdisjoint(self.set)
704 self.assertEqual(result, True)
705
Raymond Hettingera690a992003-11-16 16:17:49 +0000706 def test_self_symmetric_difference(self):
707 result = self.set ^ self.set
708 self.assertEqual(result, empty_set)
709
710 def checkempty_symmetric_difference(self):
711 result = self.set ^ empty_set
712 self.assertEqual(result, self.set)
713
714 def test_self_difference(self):
715 result = self.set - self.set
716 self.assertEqual(result, empty_set)
717
718 def test_empty_difference(self):
719 result = self.set - empty_set
720 self.assertEqual(result, self.dup)
721
722 def test_empty_difference_rev(self):
723 result = empty_set - self.set
724 self.assertEqual(result, empty_set)
725
726 def test_iteration(self):
727 for v in self.set:
728 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000729 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000730 # note: __length_hint__ is an internal undocumented API,
731 # don't rely on it in your own programs
732 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000733
734 def test_pickling(self):
735 p = pickle.dumps(self.set)
736 copy = pickle.loads(p)
737 self.assertEqual(self.set, copy,
738 "%s != %s" % (self.set, copy))
739
740#------------------------------------------------------------------------------
741
742class TestBasicOpsEmpty(TestBasicOps):
743 def setUp(self):
744 self.case = "empty set"
745 self.values = []
746 self.set = set(self.values)
747 self.dup = set(self.values)
748 self.length = 0
749 self.repr = "set([])"
750
751#------------------------------------------------------------------------------
752
753class TestBasicOpsSingleton(TestBasicOps):
754 def setUp(self):
755 self.case = "unit set (number)"
756 self.values = [3]
757 self.set = set(self.values)
758 self.dup = set(self.values)
759 self.length = 1
760 self.repr = "set([3])"
761
762 def test_in(self):
763 self.failUnless(3 in self.set)
764
765 def test_not_in(self):
766 self.failUnless(2 not in self.set)
767
768#------------------------------------------------------------------------------
769
770class TestBasicOpsTuple(TestBasicOps):
771 def setUp(self):
772 self.case = "unit set (tuple)"
773 self.values = [(0, "zero")]
774 self.set = set(self.values)
775 self.dup = set(self.values)
776 self.length = 1
777 self.repr = "set([(0, 'zero')])"
778
779 def test_in(self):
780 self.failUnless((0, "zero") in self.set)
781
782 def test_not_in(self):
783 self.failUnless(9 not in self.set)
784
785#------------------------------------------------------------------------------
786
787class TestBasicOpsTriple(TestBasicOps):
788 def setUp(self):
789 self.case = "triple set"
790 self.values = [0, "zero", operator.add]
791 self.set = set(self.values)
792 self.dup = set(self.values)
793 self.length = 3
794 self.repr = None
795
796#==============================================================================
797
798def baditer():
799 raise TypeError
800 yield True
801
802def gooditer():
803 yield True
804
805class TestExceptionPropagation(unittest.TestCase):
806 """SF 628246: Set constructor should not trap iterator TypeErrors"""
807
808 def test_instanceWithException(self):
809 self.assertRaises(TypeError, set, baditer())
810
811 def test_instancesWithoutException(self):
812 # All of these iterables should load without exception.
813 set([1,2,3])
814 set((1,2,3))
815 set({'one':1, 'two':2, 'three':3})
816 set(xrange(3))
817 set('abc')
818 set(gooditer())
819
Neal Norwitzfcf44352005-11-27 20:37:43 +0000820 def test_changingSizeWhileIterating(self):
821 s = set([1,2,3])
822 try:
823 for i in s:
824 s.update([4])
825 except RuntimeError:
826 pass
827 else:
828 self.fail("no exception when changing size during iteration")
829
Raymond Hettingera690a992003-11-16 16:17:49 +0000830#==============================================================================
831
832class TestSetOfSets(unittest.TestCase):
833 def test_constructor(self):
834 inner = frozenset([1])
835 outer = set([inner])
836 element = outer.pop()
837 self.assertEqual(type(element), frozenset)
838 outer.add(inner) # Rebuild set of sets with .add method
839 outer.remove(inner)
840 self.assertEqual(outer, set()) # Verify that remove worked
841 outer.discard(inner) # Absence of KeyError indicates working fine
842
843#==============================================================================
844
845class TestBinaryOps(unittest.TestCase):
846 def setUp(self):
847 self.set = set((2, 4, 6))
848
849 def test_eq(self): # SF bug 643115
850 self.assertEqual(self.set, set({2:1,4:3,6:5}))
851
852 def test_union_subset(self):
853 result = self.set | set([2])
854 self.assertEqual(result, set((2, 4, 6)))
855
856 def test_union_superset(self):
857 result = self.set | set([2, 4, 6, 8])
858 self.assertEqual(result, set([2, 4, 6, 8]))
859
860 def test_union_overlap(self):
861 result = self.set | set([3, 4, 5])
862 self.assertEqual(result, set([2, 3, 4, 5, 6]))
863
864 def test_union_non_overlap(self):
865 result = self.set | set([8])
866 self.assertEqual(result, set([2, 4, 6, 8]))
867
868 def test_intersection_subset(self):
869 result = self.set & set((2, 4))
870 self.assertEqual(result, set((2, 4)))
871
872 def test_intersection_superset(self):
873 result = self.set & set([2, 4, 6, 8])
874 self.assertEqual(result, set([2, 4, 6]))
875
876 def test_intersection_overlap(self):
877 result = self.set & set([3, 4, 5])
878 self.assertEqual(result, set([4]))
879
880 def test_intersection_non_overlap(self):
881 result = self.set & set([8])
882 self.assertEqual(result, empty_set)
883
Raymond Hettinger1760c8a2007-11-08 02:52:43 +0000884 def test_isdisjoint_subset(self):
885 result = self.set.isdisjoint(set((2, 4)))
886 self.assertEqual(result, False)
887
888 def test_isdisjoint_superset(self):
889 result = self.set.isdisjoint(set([2, 4, 6, 8]))
890 self.assertEqual(result, False)
891
892 def test_isdisjoint_overlap(self):
893 result = self.set.isdisjoint(set([3, 4, 5]))
894 self.assertEqual(result, False)
895
896 def test_isdisjoint_non_overlap(self):
897 result = self.set.isdisjoint(set([8]))
898 self.assertEqual(result, True)
899
Raymond Hettingera690a992003-11-16 16:17:49 +0000900 def test_sym_difference_subset(self):
901 result = self.set ^ set((2, 4))
902 self.assertEqual(result, set([6]))
903
904 def test_sym_difference_superset(self):
905 result = self.set ^ set((2, 4, 6, 8))
906 self.assertEqual(result, set([8]))
907
908 def test_sym_difference_overlap(self):
909 result = self.set ^ set((3, 4, 5))
910 self.assertEqual(result, set([2, 3, 5, 6]))
911
912 def test_sym_difference_non_overlap(self):
913 result = self.set ^ set([8])
914 self.assertEqual(result, set([2, 4, 6, 8]))
915
916 def test_cmp(self):
917 a, b = set('a'), set('b')
918 self.assertRaises(TypeError, cmp, a, b)
919
920 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
921 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
922 # which Python thinks is good enough to synthesize a cmp() result
923 # without calling __cmp__.
924 self.assertEqual(cmp(a, a), 0)
925
926 self.assertRaises(TypeError, cmp, a, 12)
927 self.assertRaises(TypeError, cmp, "abc", a)
928
929#==============================================================================
930
931class TestUpdateOps(unittest.TestCase):
932 def setUp(self):
933 self.set = set((2, 4, 6))
934
935 def test_union_subset(self):
936 self.set |= set([2])
937 self.assertEqual(self.set, set((2, 4, 6)))
938
939 def test_union_superset(self):
940 self.set |= set([2, 4, 6, 8])
941 self.assertEqual(self.set, set([2, 4, 6, 8]))
942
943 def test_union_overlap(self):
944 self.set |= set([3, 4, 5])
945 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
946
947 def test_union_non_overlap(self):
948 self.set |= set([8])
949 self.assertEqual(self.set, set([2, 4, 6, 8]))
950
951 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000952 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000953 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
954
955 def test_intersection_subset(self):
956 self.set &= set((2, 4))
957 self.assertEqual(self.set, set((2, 4)))
958
959 def test_intersection_superset(self):
960 self.set &= set([2, 4, 6, 8])
961 self.assertEqual(self.set, set([2, 4, 6]))
962
963 def test_intersection_overlap(self):
964 self.set &= set([3, 4, 5])
965 self.assertEqual(self.set, set([4]))
966
967 def test_intersection_non_overlap(self):
968 self.set &= set([8])
969 self.assertEqual(self.set, empty_set)
970
971 def test_intersection_method_call(self):
972 self.set.intersection_update(set([3, 4, 5]))
973 self.assertEqual(self.set, set([4]))
974
975 def test_sym_difference_subset(self):
976 self.set ^= set((2, 4))
977 self.assertEqual(self.set, set([6]))
978
979 def test_sym_difference_superset(self):
980 self.set ^= set((2, 4, 6, 8))
981 self.assertEqual(self.set, set([8]))
982
983 def test_sym_difference_overlap(self):
984 self.set ^= set((3, 4, 5))
985 self.assertEqual(self.set, set([2, 3, 5, 6]))
986
987 def test_sym_difference_non_overlap(self):
988 self.set ^= set([8])
989 self.assertEqual(self.set, set([2, 4, 6, 8]))
990
991 def test_sym_difference_method_call(self):
992 self.set.symmetric_difference_update(set([3, 4, 5]))
993 self.assertEqual(self.set, set([2, 3, 5, 6]))
994
995 def test_difference_subset(self):
996 self.set -= set((2, 4))
997 self.assertEqual(self.set, set([6]))
998
999 def test_difference_superset(self):
1000 self.set -= set((2, 4, 6, 8))
1001 self.assertEqual(self.set, set([]))
1002
1003 def test_difference_overlap(self):
1004 self.set -= set((3, 4, 5))
1005 self.assertEqual(self.set, set([2, 6]))
1006
1007 def test_difference_non_overlap(self):
1008 self.set -= set([8])
1009 self.assertEqual(self.set, set([2, 4, 6]))
1010
1011 def test_difference_method_call(self):
1012 self.set.difference_update(set([3, 4, 5]))
1013 self.assertEqual(self.set, set([2, 6]))
1014
1015#==============================================================================
1016
1017class TestMutate(unittest.TestCase):
1018 def setUp(self):
1019 self.values = ["a", "b", "c"]
1020 self.set = set(self.values)
1021
1022 def test_add_present(self):
1023 self.set.add("c")
1024 self.assertEqual(self.set, set("abc"))
1025
1026 def test_add_absent(self):
1027 self.set.add("d")
1028 self.assertEqual(self.set, set("abcd"))
1029
1030 def test_add_until_full(self):
1031 tmp = set()
1032 expected_len = 0
1033 for v in self.values:
1034 tmp.add(v)
1035 expected_len += 1
1036 self.assertEqual(len(tmp), expected_len)
1037 self.assertEqual(tmp, self.set)
1038
1039 def test_remove_present(self):
1040 self.set.remove("b")
1041 self.assertEqual(self.set, set("ac"))
1042
1043 def test_remove_absent(self):
1044 try:
1045 self.set.remove("d")
1046 self.fail("Removing missing element should have raised LookupError")
1047 except LookupError:
1048 pass
1049
1050 def test_remove_until_empty(self):
1051 expected_len = len(self.set)
1052 for v in self.values:
1053 self.set.remove(v)
1054 expected_len -= 1
1055 self.assertEqual(len(self.set), expected_len)
1056
1057 def test_discard_present(self):
1058 self.set.discard("c")
1059 self.assertEqual(self.set, set("ab"))
1060
1061 def test_discard_absent(self):
1062 self.set.discard("d")
1063 self.assertEqual(self.set, set("abc"))
1064
1065 def test_clear(self):
1066 self.set.clear()
1067 self.assertEqual(len(self.set), 0)
1068
1069 def test_pop(self):
1070 popped = {}
1071 while self.set:
1072 popped[self.set.pop()] = None
1073 self.assertEqual(len(popped), len(self.values))
1074 for v in self.values:
1075 self.failUnless(v in popped)
1076
1077 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001078 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001079 self.assertEqual(self.set, set(self.values))
1080
1081 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001082 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001083 self.assertEqual(self.set, set(self.values))
1084
1085 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001086 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001087 self.assertEqual(self.set, set(self.values + ["z"]))
1088
1089#==============================================================================
1090
1091class TestSubsets(unittest.TestCase):
1092
1093 case2method = {"<=": "issubset",
1094 ">=": "issuperset",
1095 }
1096
1097 reverse = {"==": "==",
1098 "!=": "!=",
1099 "<": ">",
1100 ">": "<",
1101 "<=": ">=",
1102 ">=": "<=",
1103 }
1104
1105 def test_issubset(self):
1106 x = self.left
1107 y = self.right
1108 for case in "!=", "==", "<", "<=", ">", ">=":
1109 expected = case in self.cases
1110 # Test the binary infix spelling.
1111 result = eval("x" + case + "y", locals())
1112 self.assertEqual(result, expected)
1113 # Test the "friendly" method-name spelling, if one exists.
1114 if case in TestSubsets.case2method:
1115 method = getattr(x, TestSubsets.case2method[case])
1116 result = method(y)
1117 self.assertEqual(result, expected)
1118
1119 # Now do the same for the operands reversed.
1120 rcase = TestSubsets.reverse[case]
1121 result = eval("y" + rcase + "x", locals())
1122 self.assertEqual(result, expected)
1123 if rcase in TestSubsets.case2method:
1124 method = getattr(y, TestSubsets.case2method[rcase])
1125 result = method(x)
1126 self.assertEqual(result, expected)
1127#------------------------------------------------------------------------------
1128
1129class TestSubsetEqualEmpty(TestSubsets):
1130 left = set()
1131 right = set()
1132 name = "both empty"
1133 cases = "==", "<=", ">="
1134
1135#------------------------------------------------------------------------------
1136
1137class TestSubsetEqualNonEmpty(TestSubsets):
1138 left = set([1, 2])
1139 right = set([1, 2])
1140 name = "equal pair"
1141 cases = "==", "<=", ">="
1142
1143#------------------------------------------------------------------------------
1144
1145class TestSubsetEmptyNonEmpty(TestSubsets):
1146 left = set()
1147 right = set([1, 2])
1148 name = "one empty, one non-empty"
1149 cases = "!=", "<", "<="
1150
1151#------------------------------------------------------------------------------
1152
1153class TestSubsetPartial(TestSubsets):
1154 left = set([1])
1155 right = set([1, 2])
1156 name = "one a non-empty proper subset of other"
1157 cases = "!=", "<", "<="
1158
1159#------------------------------------------------------------------------------
1160
1161class TestSubsetNonOverlap(TestSubsets):
1162 left = set([1])
1163 right = set([2])
1164 name = "neither empty, neither contains"
1165 cases = "!="
1166
1167#==============================================================================
1168
1169class TestOnlySetsInBinaryOps(unittest.TestCase):
1170
1171 def test_eq_ne(self):
1172 # Unlike the others, this is testing that == and != *are* allowed.
1173 self.assertEqual(self.other == self.set, False)
1174 self.assertEqual(self.set == self.other, False)
1175 self.assertEqual(self.other != self.set, True)
1176 self.assertEqual(self.set != self.other, True)
1177
1178 def test_ge_gt_le_lt(self):
1179 self.assertRaises(TypeError, lambda: self.set < self.other)
1180 self.assertRaises(TypeError, lambda: self.set <= self.other)
1181 self.assertRaises(TypeError, lambda: self.set > self.other)
1182 self.assertRaises(TypeError, lambda: self.set >= self.other)
1183
1184 self.assertRaises(TypeError, lambda: self.other < self.set)
1185 self.assertRaises(TypeError, lambda: self.other <= self.set)
1186 self.assertRaises(TypeError, lambda: self.other > self.set)
1187 self.assertRaises(TypeError, lambda: self.other >= self.set)
1188
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001189 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001190 try:
1191 self.set |= self.other
1192 except TypeError:
1193 pass
1194 else:
1195 self.fail("expected TypeError")
1196
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001197 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001198 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001199 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001200 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001201 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001202
1203 def test_union(self):
1204 self.assertRaises(TypeError, lambda: self.set | self.other)
1205 self.assertRaises(TypeError, lambda: self.other | self.set)
1206 if self.otherIsIterable:
1207 self.set.union(self.other)
1208 else:
1209 self.assertRaises(TypeError, self.set.union, self.other)
1210
1211 def test_intersection_update_operator(self):
1212 try:
1213 self.set &= self.other
1214 except TypeError:
1215 pass
1216 else:
1217 self.fail("expected TypeError")
1218
1219 def test_intersection_update(self):
1220 if self.otherIsIterable:
1221 self.set.intersection_update(self.other)
1222 else:
1223 self.assertRaises(TypeError,
1224 self.set.intersection_update,
1225 self.other)
1226
1227 def test_intersection(self):
1228 self.assertRaises(TypeError, lambda: self.set & self.other)
1229 self.assertRaises(TypeError, lambda: self.other & self.set)
1230 if self.otherIsIterable:
1231 self.set.intersection(self.other)
1232 else:
1233 self.assertRaises(TypeError, self.set.intersection, self.other)
1234
1235 def test_sym_difference_update_operator(self):
1236 try:
1237 self.set ^= self.other
1238 except TypeError:
1239 pass
1240 else:
1241 self.fail("expected TypeError")
1242
1243 def test_sym_difference_update(self):
1244 if self.otherIsIterable:
1245 self.set.symmetric_difference_update(self.other)
1246 else:
1247 self.assertRaises(TypeError,
1248 self.set.symmetric_difference_update,
1249 self.other)
1250
1251 def test_sym_difference(self):
1252 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1253 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1254 if self.otherIsIterable:
1255 self.set.symmetric_difference(self.other)
1256 else:
1257 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1258
1259 def test_difference_update_operator(self):
1260 try:
1261 self.set -= self.other
1262 except TypeError:
1263 pass
1264 else:
1265 self.fail("expected TypeError")
1266
1267 def test_difference_update(self):
1268 if self.otherIsIterable:
1269 self.set.difference_update(self.other)
1270 else:
1271 self.assertRaises(TypeError,
1272 self.set.difference_update,
1273 self.other)
1274
1275 def test_difference(self):
1276 self.assertRaises(TypeError, lambda: self.set - self.other)
1277 self.assertRaises(TypeError, lambda: self.other - self.set)
1278 if self.otherIsIterable:
1279 self.set.difference(self.other)
1280 else:
1281 self.assertRaises(TypeError, self.set.difference, self.other)
1282
1283#------------------------------------------------------------------------------
1284
1285class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1286 def setUp(self):
1287 self.set = set((1, 2, 3))
1288 self.other = 19
1289 self.otherIsIterable = False
1290
1291#------------------------------------------------------------------------------
1292
1293class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1294 def setUp(self):
1295 self.set = set((1, 2, 3))
1296 self.other = {1:2, 3:4}
1297 self.otherIsIterable = True
1298
1299#------------------------------------------------------------------------------
1300
1301class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1302 def setUp(self):
1303 self.set = set((1, 2, 3))
1304 self.other = operator.add
1305 self.otherIsIterable = False
1306
1307#------------------------------------------------------------------------------
1308
1309class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1310 def setUp(self):
1311 self.set = set((1, 2, 3))
1312 self.other = (2, 4, 6)
1313 self.otherIsIterable = True
1314
1315#------------------------------------------------------------------------------
1316
1317class TestOnlySetsString(TestOnlySetsInBinaryOps):
1318 def setUp(self):
1319 self.set = set((1, 2, 3))
1320 self.other = 'abc'
1321 self.otherIsIterable = True
1322
1323#------------------------------------------------------------------------------
1324
1325class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1326 def setUp(self):
1327 def gen():
1328 for i in xrange(0, 10, 2):
1329 yield i
1330 self.set = set((1, 2, 3))
1331 self.other = gen()
1332 self.otherIsIterable = True
1333
1334#==============================================================================
1335
1336class TestCopying(unittest.TestCase):
1337
1338 def test_copy(self):
1339 dup = self.set.copy()
1340 dup_list = list(dup); dup_list.sort()
1341 set_list = list(self.set); set_list.sort()
1342 self.assertEqual(len(dup_list), len(set_list))
1343 for i in range(len(dup_list)):
1344 self.failUnless(dup_list[i] is set_list[i])
1345
1346 def test_deep_copy(self):
1347 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001348 ##print type(dup), repr(dup)
Raymond Hettingera690a992003-11-16 16:17:49 +00001349 dup_list = list(dup); dup_list.sort()
1350 set_list = list(self.set); set_list.sort()
1351 self.assertEqual(len(dup_list), len(set_list))
1352 for i in range(len(dup_list)):
1353 self.assertEqual(dup_list[i], set_list[i])
1354
1355#------------------------------------------------------------------------------
1356
1357class TestCopyingEmpty(TestCopying):
1358 def setUp(self):
1359 self.set = set()
1360
1361#------------------------------------------------------------------------------
1362
1363class TestCopyingSingleton(TestCopying):
1364 def setUp(self):
1365 self.set = set(["hello"])
1366
1367#------------------------------------------------------------------------------
1368
1369class TestCopyingTriple(TestCopying):
1370 def setUp(self):
1371 self.set = set(["zero", 0, None])
1372
1373#------------------------------------------------------------------------------
1374
1375class TestCopyingTuple(TestCopying):
1376 def setUp(self):
1377 self.set = set([(1, 2)])
1378
1379#------------------------------------------------------------------------------
1380
1381class TestCopyingNested(TestCopying):
1382 def setUp(self):
1383 self.set = set([((1, 2), (3, 4))])
1384
1385#==============================================================================
1386
1387class TestIdentities(unittest.TestCase):
1388 def setUp(self):
1389 self.a = set('abracadabra')
1390 self.b = set('alacazam')
1391
1392 def test_binopsVsSubsets(self):
1393 a, b = self.a, self.b
1394 self.assert_(a - b < a)
1395 self.assert_(b - a < b)
1396 self.assert_(a & b < a)
1397 self.assert_(a & b < b)
1398 self.assert_(a | b > a)
1399 self.assert_(a | b > b)
1400 self.assert_(a ^ b < a | b)
1401
1402 def test_commutativity(self):
1403 a, b = self.a, self.b
1404 self.assertEqual(a&b, b&a)
1405 self.assertEqual(a|b, b|a)
1406 self.assertEqual(a^b, b^a)
1407 if a != b:
1408 self.assertNotEqual(a-b, b-a)
1409
1410 def test_summations(self):
1411 # check that sums of parts equal the whole
1412 a, b = self.a, self.b
1413 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1414 self.assertEqual((a&b)|(a^b), a|b)
1415 self.assertEqual(a|(b-a), a|b)
1416 self.assertEqual((a-b)|b, a|b)
1417 self.assertEqual((a-b)|(a&b), a)
1418 self.assertEqual((b-a)|(a&b), b)
1419 self.assertEqual((a-b)|(b-a), a^b)
1420
1421 def test_exclusion(self):
1422 # check that inverse operations show non-overlap
1423 a, b, zero = self.a, self.b, set()
1424 self.assertEqual((a-b)&b, zero)
1425 self.assertEqual((b-a)&a, zero)
1426 self.assertEqual((a&b)&(a^b), zero)
1427
1428# Tests derived from test_itertools.py =======================================
1429
1430def R(seqn):
1431 'Regular generator'
1432 for i in seqn:
1433 yield i
1434
1435class G:
1436 'Sequence using __getitem__'
1437 def __init__(self, seqn):
1438 self.seqn = seqn
1439 def __getitem__(self, i):
1440 return self.seqn[i]
1441
1442class I:
1443 'Sequence using iterator protocol'
1444 def __init__(self, seqn):
1445 self.seqn = seqn
1446 self.i = 0
1447 def __iter__(self):
1448 return self
1449 def next(self):
1450 if self.i >= len(self.seqn): raise StopIteration
1451 v = self.seqn[self.i]
1452 self.i += 1
1453 return v
1454
1455class Ig:
1456 'Sequence using iterator protocol defined with a generator'
1457 def __init__(self, seqn):
1458 self.seqn = seqn
1459 self.i = 0
1460 def __iter__(self):
1461 for val in self.seqn:
1462 yield val
1463
1464class X:
1465 'Missing __getitem__ and __iter__'
1466 def __init__(self, seqn):
1467 self.seqn = seqn
1468 self.i = 0
1469 def next(self):
1470 if self.i >= len(self.seqn): raise StopIteration
1471 v = self.seqn[self.i]
1472 self.i += 1
1473 return v
1474
1475class N:
1476 'Iterator missing next()'
1477 def __init__(self, seqn):
1478 self.seqn = seqn
1479 self.i = 0
1480 def __iter__(self):
1481 return self
1482
1483class E:
1484 'Test propagation of exceptions'
1485 def __init__(self, seqn):
1486 self.seqn = seqn
1487 self.i = 0
1488 def __iter__(self):
1489 return self
1490 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001491 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001492
1493class S:
1494 'Test immediate stop'
1495 def __init__(self, seqn):
1496 pass
1497 def __iter__(self):
1498 return self
1499 def next(self):
1500 raise StopIteration
1501
1502from itertools import chain, imap
1503def L(seqn):
1504 'Test multiple tiers of iterators'
1505 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1506
1507class TestVariousIteratorArgs(unittest.TestCase):
1508
1509 def test_constructor(self):
1510 for cons in (set, frozenset):
1511 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1512 for g in (G, I, Ig, S, L, R):
Raymond Hettinger64958a12003-12-17 20:43:33 +00001513 self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
Raymond Hettingera690a992003-11-16 16:17:49 +00001514 self.assertRaises(TypeError, cons , X(s))
1515 self.assertRaises(TypeError, cons , N(s))
1516 self.assertRaises(ZeroDivisionError, cons , E(s))
1517
1518 def test_inline_methods(self):
1519 s = set('november')
1520 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001521 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001522 for g in (G, I, Ig, L, R):
1523 expected = meth(data)
1524 actual = meth(G(data))
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001525 if isinstance(expected, bool):
1526 self.assertEqual(actual, expected)
1527 else:
1528 self.assertEqual(sorted(actual), sorted(expected))
Raymond Hettingera690a992003-11-16 16:17:49 +00001529 self.assertRaises(TypeError, meth, X(s))
1530 self.assertRaises(TypeError, meth, N(s))
1531 self.assertRaises(ZeroDivisionError, meth, E(s))
1532
1533 def test_inplace_methods(self):
1534 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001535 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001536 'difference_update', 'symmetric_difference_update'):
1537 for g in (G, I, Ig, S, L, R):
1538 s = set('january')
1539 t = s.copy()
1540 getattr(s, methname)(list(g(data)))
1541 getattr(t, methname)(g(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001542 self.assertEqual(sorted(s), sorted(t))
Raymond Hettingera690a992003-11-16 16:17:49 +00001543
1544 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1545 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1546 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1547
Raymond Hettinger61708742008-01-24 21:23:58 +00001548# Application tests (based on David Eppstein's graph recipes ====================================
1549
1550def powerset(U):
1551 """Generates all subsets of a set or sequence U."""
1552 U = iter(U)
1553 try:
1554 x = frozenset([U.next()])
1555 for S in powerset(U):
1556 yield S
1557 yield S | x
1558 except StopIteration:
1559 yield frozenset()
1560
1561def cube(n):
1562 """Graph of n-dimensional hypercube."""
1563 singletons = [frozenset([x]) for x in range(n)]
1564 return dict([(x, frozenset([x^s for s in singletons]))
1565 for x in powerset(range(n))])
1566
1567def linegraph(G):
1568 """Graph, the vertices of which are edges of G,
1569 with two vertices being adjacent iff the corresponding
1570 edges share a vertex."""
1571 L = {}
1572 for x in G:
1573 for y in G[x]:
1574 nx = [frozenset([x,z]) for z in G[x] if z != y]
1575 ny = [frozenset([y,z]) for z in G[y] if z != x]
1576 L[frozenset([x,y])] = frozenset(nx+ny)
1577 return L
1578
1579def faces(G):
1580 'Return a set of faces in G. Where a face is a set of vertices on that face'
1581 # currently limited to triangles,squares, and pentagons
1582 f = set()
1583 for v1, edges in G.items():
1584 for v2 in edges:
1585 for v3 in G[v2]:
1586 if v1 == v3:
1587 continue
1588 if v1 in G[v3]:
1589 f.add(frozenset([v1, v2, v3]))
1590 else:
1591 for v4 in G[v3]:
1592 if v4 == v2:
1593 continue
1594 if v1 in G[v4]:
1595 f.add(frozenset([v1, v2, v3, v4]))
1596 else:
1597 for v5 in G[v4]:
1598 if v5 == v3 or v5 == v2:
1599 continue
1600 if v1 in G[v5]:
1601 f.add(frozenset([v1, v2, v3, v4, v5]))
1602 return f
1603
1604
1605class TestGraphs(unittest.TestCase):
1606
1607 def test_cube(self):
1608
1609 g = cube(3) # vert --> {v1, v2, v3}
1610 vertices1 = set(g)
1611 self.assertEqual(len(vertices1), 8) # eight vertices
1612 for edge in g.values():
1613 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1614 vertices2 = set(v for edges in g.values() for v in edges)
1615 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1616
1617 cubefaces = faces(g)
1618 self.assertEqual(len(cubefaces), 6) # six faces
1619 for face in cubefaces:
1620 self.assertEqual(len(face), 4) # each face is a square
1621
1622 def test_cuboctahedron(self):
1623
1624 # http://en.wikipedia.org/wiki/Cuboctahedron
1625 # 8 triangular faces and 6 square faces
1626 # 12 indentical vertices each connecting a triangle and square
1627
1628 g = cube(3)
1629 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1630 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1631
1632 vertices = set(cuboctahedron)
1633 for edges in cuboctahedron.values():
1634 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1635 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1636 self.assertEqual(vertices, othervertices) # edge vertices in original set
1637
1638 cubofaces = faces(cuboctahedron)
1639 facesizes = collections.defaultdict(int)
1640 for face in cubofaces:
1641 facesizes[len(face)] += 1
1642 self.assertEqual(facesizes[3], 8) # eight triangular faces
1643 self.assertEqual(facesizes[4], 6) # six square faces
1644
1645 for vertex in cuboctahedron:
1646 edge = vertex # Cuboctahedron vertices are edges in Cube
1647 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1648 for cubevert in edge:
1649 self.assert_(cubevert in g)
1650
1651
Raymond Hettingera690a992003-11-16 16:17:49 +00001652#==============================================================================
1653
1654def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001655 from test import test_sets
1656 test_classes = (
1657 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001658 TestSetSubclass,
Tim Petersf733abb2007-01-30 03:03:46 +00001659 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001660 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001661 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001662 TestSetOfSets,
1663 TestExceptionPropagation,
1664 TestBasicOpsEmpty,
1665 TestBasicOpsSingleton,
1666 TestBasicOpsTuple,
1667 TestBasicOpsTriple,
1668 TestBinaryOps,
1669 TestUpdateOps,
1670 TestMutate,
1671 TestSubsetEqualEmpty,
1672 TestSubsetEqualNonEmpty,
1673 TestSubsetEmptyNonEmpty,
1674 TestSubsetPartial,
1675 TestSubsetNonOverlap,
1676 TestOnlySetsNumeric,
1677 TestOnlySetsDict,
1678 TestOnlySetsOperator,
1679 TestOnlySetsTuple,
1680 TestOnlySetsString,
1681 TestOnlySetsGenerator,
1682 TestCopyingEmpty,
1683 TestCopyingSingleton,
1684 TestCopyingTriple,
1685 TestCopyingTuple,
1686 TestCopyingNested,
1687 TestIdentities,
1688 TestVariousIteratorArgs,
Raymond Hettinger61708742008-01-24 21:23:58 +00001689 TestGraphs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001690 )
1691
1692 test_support.run_unittest(*test_classes)
1693
1694 # verify reference counting
1695 if verbose and hasattr(sys, "gettotalrefcount"):
1696 import gc
1697 counts = [None] * 5
1698 for i in xrange(len(counts)):
1699 test_support.run_unittest(*test_classes)
1700 gc.collect()
1701 counts[i] = sys.gettotalrefcount()
1702 print counts
1703
1704if __name__ == "__main__":
1705 test_main(verbose=True)