blob: e761f19c1e8406e085334c05552a2243820aab75 [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
Christian Heimes0ded5b52007-12-10 15:50:56 +000010import warnings
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
Guido van Rossum47b9ff62006-08-24 00:41:19 +000022 def __eq__(self, other):
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000023 raise RuntimeError
24
Thomas Wouters902d6eb2007-01-09 23:18:33 +000025class ReprWrapper:
26 'Used to test self-referential repr() calls'
27 def __repr__(self):
28 return repr(self.value)
29
Thomas Wouterscf297e42007-02-23 15:07:44 +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, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +000076 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000077 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 Hettingera690a992003-11-16 16:17:49 +000081
82 def test_or(self):
83 i = self.s.union(self.otherword)
84 self.assertEqual(self.s | set(self.otherword), i)
85 self.assertEqual(self.s | frozenset(self.otherword), i)
86 try:
87 self.s | self.otherword
88 except TypeError:
89 pass
90 else:
91 self.fail("s|t did not screen-out general iterables")
92
93 def test_intersection(self):
94 i = self.s.intersection(self.otherword)
95 for c in self.letters:
96 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000097 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000098 self.assertEqual(type(i), self.thetype)
99 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Guido van Rossum75a902d2007-10-19 22:06:24 +0000100 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000101 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
102 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
103 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
104 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Raymond Hettingera690a992003-11-16 16:17:49 +0000105
Guido van Rossum58da9312007-11-10 23:39:45 +0000106 def test_isdisjoint(self):
107 def f(s1, s2):
108 'Pure python equivalent of isdisjoint()'
109 return not set(s1).intersection(s2)
110 for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
111 s1 = self.thetype(larg)
112 for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
113 for C in set, frozenset, dict.fromkeys, str, list, tuple:
114 s2 = C(rarg)
115 actual = s1.isdisjoint(s2)
116 expected = f(s1, s2)
117 self.assertEqual(actual, expected)
118 self.assert_(actual is True or actual is False)
119
Raymond Hettingera690a992003-11-16 16:17:49 +0000120 def test_and(self):
121 i = self.s.intersection(self.otherword)
122 self.assertEqual(self.s & set(self.otherword), i)
123 self.assertEqual(self.s & frozenset(self.otherword), i)
124 try:
125 self.s & self.otherword
126 except TypeError:
127 pass
128 else:
129 self.fail("s&t did not screen-out general iterables")
130
131 def test_difference(self):
132 i = self.s.difference(self.otherword)
133 for c in self.letters:
134 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000135 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000136 self.assertEqual(type(i), self.thetype)
137 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
138 self.assertRaises(TypeError, self.s.difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000139 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000140 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
141 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
142 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
143 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000144
145 def test_sub(self):
146 i = self.s.difference(self.otherword)
147 self.assertEqual(self.s - set(self.otherword), i)
148 self.assertEqual(self.s - frozenset(self.otherword), i)
149 try:
150 self.s - self.otherword
151 except TypeError:
152 pass
153 else:
154 self.fail("s-t did not screen-out general iterables")
155
156 def test_symmetric_difference(self):
157 i = self.s.symmetric_difference(self.otherword)
158 for c in self.letters:
159 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000160 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000161 self.assertEqual(type(i), self.thetype)
162 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
163 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000164 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000165 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
166 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
167 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
168 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000169
170 def test_xor(self):
171 i = self.s.symmetric_difference(self.otherword)
172 self.assertEqual(self.s ^ set(self.otherword), i)
173 self.assertEqual(self.s ^ frozenset(self.otherword), i)
174 try:
175 self.s ^ self.otherword
176 except TypeError:
177 pass
178 else:
179 self.fail("s^t did not screen-out general iterables")
180
181 def test_equality(self):
182 self.assertEqual(self.s, set(self.word))
183 self.assertEqual(self.s, frozenset(self.word))
184 self.assertEqual(self.s == self.word, False)
185 self.assertNotEqual(self.s, set(self.otherword))
186 self.assertNotEqual(self.s, frozenset(self.otherword))
187 self.assertEqual(self.s != self.word, True)
188
189 def test_setOfFrozensets(self):
190 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
191 s = self.thetype(t)
192 self.assertEqual(len(s), 3)
193
194 def test_compare(self):
195 self.assertRaises(TypeError, self.s.__cmp__, self.s)
196
197 def test_sub_and_super(self):
198 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
199 self.assert_(p < q)
200 self.assert_(p <= q)
201 self.assert_(q <= q)
202 self.assert_(q > p)
203 self.assert_(q >= p)
204 self.failIf(q < r)
205 self.failIf(q <= r)
206 self.failIf(q > r)
207 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000208 self.assert_(set('a').issubset('abc'))
209 self.assert_(set('abc').issuperset('a'))
210 self.failIf(set('a').issubset('cbs'))
211 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000212
213 def test_pickling(self):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000214 for i in (0, 1, 2):
215 p = pickle.dumps(self.s, i)
216 dup = pickle.loads(p)
217 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
218 if type(self.s) not in (set, frozenset):
219 self.s.x = 10
220 p = pickle.dumps(self.s)
221 dup = pickle.loads(p)
222 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000223
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000224 def test_deepcopy(self):
225 class Tracer:
226 def __init__(self, value):
227 self.value = value
228 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000229 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000230 def __deepcopy__(self, memo=None):
231 return Tracer(self.value + 1)
232 t = Tracer(10)
233 s = self.thetype([t])
234 dup = copy.deepcopy(s)
235 self.assertNotEqual(id(s), id(dup))
236 for elem in dup:
237 newt = elem
238 self.assertNotEqual(id(t), id(newt))
239 self.assertEqual(t.value + 1, newt.value)
240
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000241 def test_gc(self):
242 # Create a nest of cycles to exercise overall ref count check
243 class A:
244 pass
Guido van Rossum805365e2007-05-07 22:24:25 +0000245 s = set(A() for i in range(1000))
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000246 for elem in s:
247 elem.cycle = s
248 elem.sub = elem
249 elem.set = set([elem])
250
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000251 def test_subclass_with_custom_hash(self):
252 # Bug #1257731
253 class H(self.thetype):
254 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000255 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000256 s=H()
257 f=set()
258 f.add(s)
259 self.assert_(s in f)
260 f.remove(s)
261 f.add(s)
262 f.discard(s)
263
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000264 def test_badcmp(self):
265 s = self.thetype([BadCmp()])
266 # Detect comparison errors during insertion and lookup
267 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
268 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
269 # Detect errors during mutating operations
270 if hasattr(s, 'add'):
271 self.assertRaises(RuntimeError, s.add, BadCmp())
272 self.assertRaises(RuntimeError, s.discard, BadCmp())
273 self.assertRaises(RuntimeError, s.remove, BadCmp())
274
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000275 def test_cyclical_repr(self):
276 w = ReprWrapper()
277 s = self.thetype([w])
278 w.value = s
279 if self.thetype == set:
280 self.assertEqual(repr(s), '{set(...)}')
281 else:
282 name = repr(s).partition('(')[0] # strip class name
Guido van Rossumbdba5cf2007-08-07 22:44:20 +0000283 self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000284
285 def test_cyclical_print(self):
286 w = ReprWrapper()
287 s = self.thetype([w])
288 w.value = s
289 try:
Guido van Rossum292aa0d2007-05-24 18:00:35 +0000290 fo = open(test_support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000291 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000292 fo.close()
Guido van Rossum292aa0d2007-05-24 18:00:35 +0000293 fo = open(test_support.TESTFN, "r")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000294 self.assertEqual(fo.read(), repr(s))
295 finally:
296 fo.close()
297 os.remove(test_support.TESTFN)
298
Thomas Wouterscf297e42007-02-23 15:07:44 +0000299 def test_do_not_rehash_dict_keys(self):
300 n = 10
Guido van Rossum805365e2007-05-07 22:24:25 +0000301 d = dict.fromkeys(map(HashCountingInt, range(n)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000302 self.assertEqual(sum(elem.hash_count for elem in d), n)
303 s = self.thetype(d)
304 self.assertEqual(sum(elem.hash_count for elem in d), n)
305 s.difference(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000306 self.assertEqual(sum(elem.hash_count for elem in d), n)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000307 if hasattr(s, 'symmetric_difference_update'):
308 s.symmetric_difference_update(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000309 self.assertEqual(sum(elem.hash_count for elem in d), n)
310 d2 = dict.fromkeys(set(d))
311 self.assertEqual(sum(elem.hash_count for elem in d), n)
312 d3 = dict.fromkeys(frozenset(d))
313 self.assertEqual(sum(elem.hash_count for elem in d), n)
314 d3 = dict.fromkeys(frozenset(d), 123)
315 self.assertEqual(sum(elem.hash_count for elem in d), n)
316 self.assertEqual(d3, dict.fromkeys(d, 123))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000317
Raymond Hettingera690a992003-11-16 16:17:49 +0000318class TestSet(TestJointOps):
319 thetype = set
320
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000321 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000322 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000323 s.__init__(self.word)
324 self.assertEqual(s, set(self.word))
325 s.__init__(self.otherword)
326 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000327 self.assertRaises(TypeError, s.__init__, s, 2);
328 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000329
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000330 def test_constructor_identity(self):
331 s = self.thetype(range(3))
332 t = self.thetype(s)
333 self.assertNotEqual(id(s), id(t))
334
Guido van Rossum86e58e22006-08-28 15:27:34 +0000335 def test_set_literal(self):
336 s = set([1,2,3])
337 t = {1,2,3}
338 self.assertEqual(s, 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
Thomas Wouters89f507f2006-12-13 04:49:30 +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)
Guido van Rossumb940e112007-01-10 16:19:56 +0000377 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000378 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):
Guido van Rossum805365e2007-05-07 22:24:25 +0000395 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000396 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')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000408 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000409 s = self.thetype('abcba')
410 self.assertEqual(s.update(C(p)), None)
411 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000412
413 def test_ior(self):
414 self.s |= set(self.otherword)
415 for c in (self.word + self.otherword):
416 self.assert_(c in self.s)
417
418 def test_intersection_update(self):
419 retval = self.s.intersection_update(self.otherword)
420 self.assertEqual(retval, None)
421 for c in (self.word + self.otherword):
422 if c in self.otherword and c in self.word:
423 self.assert_(c in self.s)
424 else:
425 self.assert_(c not in self.s)
426 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
427 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000428 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000429 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000430 s = self.thetype('abcba')
431 self.assertEqual(s.intersection_update(C(p)), None)
432 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000433
434 def test_iand(self):
435 self.s &= set(self.otherword)
436 for c in (self.word + self.otherword):
437 if c in self.otherword and c in self.word:
438 self.assert_(c in self.s)
439 else:
440 self.assert_(c not in self.s)
441
442 def test_difference_update(self):
443 retval = self.s.difference_update(self.otherword)
444 self.assertEqual(retval, None)
445 for c in (self.word + self.otherword):
446 if c in self.word and c not in self.otherword:
447 self.assert_(c in self.s)
448 else:
449 self.assert_(c not in self.s)
450 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
451 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000452 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
453 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000454 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000455 s = self.thetype('abcba')
456 self.assertEqual(s.difference_update(C(p)), None)
457 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000458
459 def test_isub(self):
460 self.s -= set(self.otherword)
461 for c in (self.word + self.otherword):
462 if c in self.word and c not in self.otherword:
463 self.assert_(c in self.s)
464 else:
465 self.assert_(c not in self.s)
466
467 def test_symmetric_difference_update(self):
468 retval = self.s.symmetric_difference_update(self.otherword)
469 self.assertEqual(retval, None)
470 for c in (self.word + self.otherword):
471 if (c in self.word) ^ (c in self.otherword):
472 self.assert_(c in self.s)
473 else:
474 self.assert_(c not in self.s)
475 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
476 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000477 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000478 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000479 s = self.thetype('abcba')
480 self.assertEqual(s.symmetric_difference_update(C(p)), None)
481 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000482
483 def test_ixor(self):
484 self.s ^= set(self.otherword)
485 for c in (self.word + self.otherword):
486 if (c in self.word) ^ (c in self.otherword):
487 self.assert_(c in self.s)
488 else:
489 self.assert_(c not in self.s)
490
Raymond Hettingerc991db22005-08-11 07:58:45 +0000491 def test_inplace_on_self(self):
492 t = self.s.copy()
493 t |= t
494 self.assertEqual(t, self.s)
495 t &= t
496 self.assertEqual(t, self.s)
497 t -= t
498 self.assertEqual(t, self.thetype())
499 t = self.s.copy()
500 t ^= t
501 self.assertEqual(t, self.thetype())
502
Raymond Hettinger691d8052004-05-30 07:26:47 +0000503 def test_weakref(self):
504 s = self.thetype('gallahad')
505 p = proxy(s)
506 self.assertEqual(str(p), str(s))
507 s = None
508 self.assertRaises(ReferenceError, str, p)
509
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000510 def test_rich_compare(self):
511 class TestRichSetCompare:
512 def __gt__(self, some_set):
513 self.gt_called = True
514 return False
515 def __lt__(self, some_set):
516 self.lt_called = True
517 return False
518 def __ge__(self, some_set):
519 self.ge_called = True
520 return False
521 def __le__(self, some_set):
522 self.le_called = True
523 return False
524
525 # This first tries the bulitin rich set comparison, which doesn't know
526 # how to handle the custom object. Upon returning NotImplemented, the
527 # corresponding comparison on the right object is invoked.
528 myset = {1, 2, 3}
529
530 myobj = TestRichSetCompare()
531 myset < myobj
532 self.assert_(myobj.gt_called)
533
534 myobj = TestRichSetCompare()
535 myset > myobj
536 self.assert_(myobj.lt_called)
537
538 myobj = TestRichSetCompare()
539 myset <= myobj
540 self.assert_(myobj.ge_called)
541
542 myobj = TestRichSetCompare()
543 myset >= myobj
544 self.assert_(myobj.le_called)
545
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000546 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000547 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000548 def test_c_api(self):
549 self.assertEqual(set('abc').test_c_api(), True)
550
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000551class SetSubclass(set):
552 pass
553
554class TestSetSubclass(TestSet):
555 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000556
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000557class SetSubclassWithKeywordArgs(set):
558 def __init__(self, iterable=[], newarg=None):
559 set.__init__(self, iterable)
560
561class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000562
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000563 def test_keywords_in_subclass(self):
564 'SF bug #1486663 -- this used to erroneously raise a TypeError'
565 SetSubclassWithKeywordArgs(newarg=1)
566
Raymond Hettingera690a992003-11-16 16:17:49 +0000567class TestFrozenSet(TestJointOps):
568 thetype = frozenset
569
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000570 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000571 s = self.thetype(self.word)
572 s.__init__(self.otherword)
573 self.assertEqual(s, set(self.word))
574
Raymond Hettingerd7946662005-08-01 21:39:29 +0000575 def test_singleton_empty_frozenset(self):
576 f = frozenset()
577 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
578 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000579 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000580 frozenset(f), f]
581 # All of the empty frozensets should have just one id()
582 self.assertEqual(len(set(map(id, efs))), 1)
583
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000584 def test_constructor_identity(self):
585 s = self.thetype(range(3))
586 t = self.thetype(s)
587 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000588
Raymond Hettingera690a992003-11-16 16:17:49 +0000589 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000590 self.assertEqual(hash(self.thetype('abcdeb')),
591 hash(self.thetype('ebecda')))
592
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000593 # make sure that all permutations give the same hash value
594 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000595 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000596 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000597 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000598 shuffle(seq)
599 results.add(hash(self.thetype(seq)))
600 self.assertEqual(len(results), 1)
601
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000602 def test_copy(self):
603 dup = self.s.copy()
604 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000605
606 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000607 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000608 key1 = self.thetype(seq)
609 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000610 self.assertEqual(key1, key2)
611 self.assertNotEqual(id(key1), id(key2))
612 d = {}
613 d[key1] = 42
614 self.assertEqual(d[key2], 42)
615
616 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000617 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000618 self.assertEqual(hash(f), hash(f))
619
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000620 def test_hash_effectiveness(self):
621 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000622 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000623 addhashvalue = hashvalues.add
624 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000625 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000626 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
627 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000628
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000629class FrozenSetSubclass(frozenset):
630 pass
631
632class TestFrozenSetSubclass(TestFrozenSet):
633 thetype = FrozenSetSubclass
634
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000635 def test_constructor_identity(self):
636 s = self.thetype(range(3))
637 t = self.thetype(s)
638 self.assertNotEqual(id(s), id(t))
639
640 def test_copy(self):
641 dup = self.s.copy()
642 self.assertNotEqual(id(self.s), id(dup))
643
644 def test_nested_empty_constructor(self):
645 s = self.thetype()
646 t = self.thetype(s)
647 self.assertEqual(s, t)
648
Raymond Hettingerd7946662005-08-01 21:39:29 +0000649 def test_singleton_empty_frozenset(self):
650 Frozenset = self.thetype
651 f = frozenset()
652 F = Frozenset()
653 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
654 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000655 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000656 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
657 # All empty frozenset subclass instances should have different ids
658 self.assertEqual(len(set(map(id, efs))), len(efs))
659
Raymond Hettingera690a992003-11-16 16:17:49 +0000660# Tests taken from test_sets.py =============================================
661
662empty_set = set()
663
664#==============================================================================
665
666class TestBasicOps(unittest.TestCase):
667
668 def test_repr(self):
669 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000670 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000671
Raymond Hettingereae05de2004-07-09 04:51:24 +0000672 def test_print(self):
673 try:
Guido van Rossum292aa0d2007-05-24 18:00:35 +0000674 fo = open(test_support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000675 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000676 fo.close()
Guido van Rossum292aa0d2007-05-24 18:00:35 +0000677 fo = open(test_support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000678 self.assertEqual(fo.read(), repr(self.set))
679 finally:
680 fo.close()
681 os.remove(test_support.TESTFN)
682
Raymond Hettingera690a992003-11-16 16:17:49 +0000683 def test_length(self):
684 self.assertEqual(len(self.set), self.length)
685
686 def test_self_equality(self):
687 self.assertEqual(self.set, self.set)
688
689 def test_equivalent_equality(self):
690 self.assertEqual(self.set, self.dup)
691
692 def test_copy(self):
693 self.assertEqual(self.set.copy(), self.dup)
694
695 def test_self_union(self):
696 result = self.set | self.set
697 self.assertEqual(result, self.dup)
698
699 def test_empty_union(self):
700 result = self.set | empty_set
701 self.assertEqual(result, self.dup)
702
703 def test_union_empty(self):
704 result = empty_set | self.set
705 self.assertEqual(result, self.dup)
706
707 def test_self_intersection(self):
708 result = self.set & self.set
709 self.assertEqual(result, self.dup)
710
711 def test_empty_intersection(self):
712 result = self.set & empty_set
713 self.assertEqual(result, empty_set)
714
715 def test_intersection_empty(self):
716 result = empty_set & self.set
717 self.assertEqual(result, empty_set)
718
Guido van Rossum58da9312007-11-10 23:39:45 +0000719 def test_self_isdisjoint(self):
720 result = self.set.isdisjoint(self.set)
721 self.assertEqual(result, not self.set)
722
723 def test_empty_isdisjoint(self):
724 result = self.set.isdisjoint(empty_set)
725 self.assertEqual(result, True)
726
727 def test_isdisjoint_empty(self):
728 result = empty_set.isdisjoint(self.set)
729 self.assertEqual(result, True)
730
Raymond Hettingera690a992003-11-16 16:17:49 +0000731 def test_self_symmetric_difference(self):
732 result = self.set ^ self.set
733 self.assertEqual(result, empty_set)
734
735 def checkempty_symmetric_difference(self):
736 result = self.set ^ empty_set
737 self.assertEqual(result, self.set)
738
739 def test_self_difference(self):
740 result = self.set - self.set
741 self.assertEqual(result, empty_set)
742
743 def test_empty_difference(self):
744 result = self.set - empty_set
745 self.assertEqual(result, self.dup)
746
747 def test_empty_difference_rev(self):
748 result = empty_set - self.set
749 self.assertEqual(result, empty_set)
750
751 def test_iteration(self):
752 for v in self.set:
753 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000754 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000755 # note: __length_hint__ is an internal undocumented API,
756 # don't rely on it in your own programs
757 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000758
759 def test_pickling(self):
760 p = pickle.dumps(self.set)
761 copy = pickle.loads(p)
762 self.assertEqual(self.set, copy,
763 "%s != %s" % (self.set, copy))
764
765#------------------------------------------------------------------------------
766
767class TestBasicOpsEmpty(TestBasicOps):
768 def setUp(self):
769 self.case = "empty set"
770 self.values = []
771 self.set = set(self.values)
772 self.dup = set(self.values)
773 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000774 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000775
776#------------------------------------------------------------------------------
777
778class TestBasicOpsSingleton(TestBasicOps):
779 def setUp(self):
780 self.case = "unit set (number)"
781 self.values = [3]
782 self.set = set(self.values)
783 self.dup = set(self.values)
784 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000785 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000786
787 def test_in(self):
788 self.failUnless(3 in self.set)
789
790 def test_not_in(self):
791 self.failUnless(2 not in self.set)
792
793#------------------------------------------------------------------------------
794
795class TestBasicOpsTuple(TestBasicOps):
796 def setUp(self):
797 self.case = "unit set (tuple)"
798 self.values = [(0, "zero")]
799 self.set = set(self.values)
800 self.dup = set(self.values)
801 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000802 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000803
804 def test_in(self):
805 self.failUnless((0, "zero") in self.set)
806
807 def test_not_in(self):
808 self.failUnless(9 not in self.set)
809
810#------------------------------------------------------------------------------
811
812class TestBasicOpsTriple(TestBasicOps):
813 def setUp(self):
814 self.case = "triple set"
815 self.values = [0, "zero", operator.add]
816 self.set = set(self.values)
817 self.dup = set(self.values)
818 self.length = 3
819 self.repr = None
820
Christian Heimes0ded5b52007-12-10 15:50:56 +0000821#------------------------------------------------------------------------------
822
823class TestBasicOpsString(TestBasicOps):
824 def setUp(self):
825 self.case = "string set"
826 self.values = ["a", "b", "c"]
827 self.set = set(self.values)
828 self.dup = set(self.values)
829 self.length = 3
830 self.repr = "{'a', 'c', 'b'}"
831
832#------------------------------------------------------------------------------
833
834class TestBasicOpsBytes(TestBasicOps):
835 def setUp(self):
836 self.case = "string set"
837 self.values = [b"a", b"b", b"c"]
838 self.set = set(self.values)
839 self.dup = set(self.values)
840 self.length = 3
841 self.repr = "{b'a', b'c', b'b'}"
842
843#------------------------------------------------------------------------------
844
845class TestBasicOpsMixedStringBytes(TestBasicOps):
846 def setUp(self):
847 self.warning_filters = warnings.filters[:]
848 warnings.simplefilter('ignore', BytesWarning)
849 self.case = "string and bytes set"
850 self.values = ["a", "b", b"a", b"b"]
851 self.set = set(self.values)
852 self.dup = set(self.values)
853 self.length = 4
854 self.repr = "{'a', b'a', 'b', b'b'}"
855
856 def tearDown(self):
857 warnings.filters = self.warning_filters
858
Raymond Hettingera690a992003-11-16 16:17:49 +0000859#==============================================================================
860
861def baditer():
862 raise TypeError
863 yield True
864
865def gooditer():
866 yield True
867
868class TestExceptionPropagation(unittest.TestCase):
869 """SF 628246: Set constructor should not trap iterator TypeErrors"""
870
871 def test_instanceWithException(self):
872 self.assertRaises(TypeError, set, baditer())
873
874 def test_instancesWithoutException(self):
875 # All of these iterables should load without exception.
876 set([1,2,3])
877 set((1,2,3))
878 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000879 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000880 set('abc')
881 set(gooditer())
882
Neal Norwitzfcf44352005-11-27 20:37:43 +0000883 def test_changingSizeWhileIterating(self):
884 s = set([1,2,3])
885 try:
886 for i in s:
887 s.update([4])
888 except RuntimeError:
889 pass
890 else:
891 self.fail("no exception when changing size during iteration")
892
Raymond Hettingera690a992003-11-16 16:17:49 +0000893#==============================================================================
894
895class TestSetOfSets(unittest.TestCase):
896 def test_constructor(self):
897 inner = frozenset([1])
898 outer = set([inner])
899 element = outer.pop()
900 self.assertEqual(type(element), frozenset)
901 outer.add(inner) # Rebuild set of sets with .add method
902 outer.remove(inner)
903 self.assertEqual(outer, set()) # Verify that remove worked
904 outer.discard(inner) # Absence of KeyError indicates working fine
905
906#==============================================================================
907
908class TestBinaryOps(unittest.TestCase):
909 def setUp(self):
910 self.set = set((2, 4, 6))
911
912 def test_eq(self): # SF bug 643115
913 self.assertEqual(self.set, set({2:1,4:3,6:5}))
914
915 def test_union_subset(self):
916 result = self.set | set([2])
917 self.assertEqual(result, set((2, 4, 6)))
918
919 def test_union_superset(self):
920 result = self.set | set([2, 4, 6, 8])
921 self.assertEqual(result, set([2, 4, 6, 8]))
922
923 def test_union_overlap(self):
924 result = self.set | set([3, 4, 5])
925 self.assertEqual(result, set([2, 3, 4, 5, 6]))
926
927 def test_union_non_overlap(self):
928 result = self.set | set([8])
929 self.assertEqual(result, set([2, 4, 6, 8]))
930
931 def test_intersection_subset(self):
932 result = self.set & set((2, 4))
933 self.assertEqual(result, set((2, 4)))
934
935 def test_intersection_superset(self):
936 result = self.set & set([2, 4, 6, 8])
937 self.assertEqual(result, set([2, 4, 6]))
938
939 def test_intersection_overlap(self):
940 result = self.set & set([3, 4, 5])
941 self.assertEqual(result, set([4]))
942
943 def test_intersection_non_overlap(self):
944 result = self.set & set([8])
945 self.assertEqual(result, empty_set)
946
Guido van Rossum58da9312007-11-10 23:39:45 +0000947 def test_isdisjoint_subset(self):
948 result = self.set.isdisjoint(set((2, 4)))
949 self.assertEqual(result, False)
950
951 def test_isdisjoint_superset(self):
952 result = self.set.isdisjoint(set([2, 4, 6, 8]))
953 self.assertEqual(result, False)
954
955 def test_isdisjoint_overlap(self):
956 result = self.set.isdisjoint(set([3, 4, 5]))
957 self.assertEqual(result, False)
958
959 def test_isdisjoint_non_overlap(self):
960 result = self.set.isdisjoint(set([8]))
961 self.assertEqual(result, True)
962
Raymond Hettingera690a992003-11-16 16:17:49 +0000963 def test_sym_difference_subset(self):
964 result = self.set ^ set((2, 4))
965 self.assertEqual(result, set([6]))
966
967 def test_sym_difference_superset(self):
968 result = self.set ^ set((2, 4, 6, 8))
969 self.assertEqual(result, set([8]))
970
971 def test_sym_difference_overlap(self):
972 result = self.set ^ set((3, 4, 5))
973 self.assertEqual(result, set([2, 3, 5, 6]))
974
975 def test_sym_difference_non_overlap(self):
976 result = self.set ^ set([8])
977 self.assertEqual(result, set([2, 4, 6, 8]))
978
979 def test_cmp(self):
980 a, b = set('a'), set('b')
981 self.assertRaises(TypeError, cmp, a, b)
982
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000983 # In py3k, this works!
984 self.assertRaises(TypeError, cmp, a, a)
Raymond Hettingera690a992003-11-16 16:17:49 +0000985
986 self.assertRaises(TypeError, cmp, a, 12)
987 self.assertRaises(TypeError, cmp, "abc", a)
988
989#==============================================================================
990
991class TestUpdateOps(unittest.TestCase):
992 def setUp(self):
993 self.set = set((2, 4, 6))
994
995 def test_union_subset(self):
996 self.set |= set([2])
997 self.assertEqual(self.set, set((2, 4, 6)))
998
999 def test_union_superset(self):
1000 self.set |= set([2, 4, 6, 8])
1001 self.assertEqual(self.set, set([2, 4, 6, 8]))
1002
1003 def test_union_overlap(self):
1004 self.set |= set([3, 4, 5])
1005 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1006
1007 def test_union_non_overlap(self):
1008 self.set |= set([8])
1009 self.assertEqual(self.set, set([2, 4, 6, 8]))
1010
1011 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001012 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001013 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1014
1015 def test_intersection_subset(self):
1016 self.set &= set((2, 4))
1017 self.assertEqual(self.set, set((2, 4)))
1018
1019 def test_intersection_superset(self):
1020 self.set &= set([2, 4, 6, 8])
1021 self.assertEqual(self.set, set([2, 4, 6]))
1022
1023 def test_intersection_overlap(self):
1024 self.set &= set([3, 4, 5])
1025 self.assertEqual(self.set, set([4]))
1026
1027 def test_intersection_non_overlap(self):
1028 self.set &= set([8])
1029 self.assertEqual(self.set, empty_set)
1030
1031 def test_intersection_method_call(self):
1032 self.set.intersection_update(set([3, 4, 5]))
1033 self.assertEqual(self.set, set([4]))
1034
1035 def test_sym_difference_subset(self):
1036 self.set ^= set((2, 4))
1037 self.assertEqual(self.set, set([6]))
1038
1039 def test_sym_difference_superset(self):
1040 self.set ^= set((2, 4, 6, 8))
1041 self.assertEqual(self.set, set([8]))
1042
1043 def test_sym_difference_overlap(self):
1044 self.set ^= set((3, 4, 5))
1045 self.assertEqual(self.set, set([2, 3, 5, 6]))
1046
1047 def test_sym_difference_non_overlap(self):
1048 self.set ^= set([8])
1049 self.assertEqual(self.set, set([2, 4, 6, 8]))
1050
1051 def test_sym_difference_method_call(self):
1052 self.set.symmetric_difference_update(set([3, 4, 5]))
1053 self.assertEqual(self.set, set([2, 3, 5, 6]))
1054
1055 def test_difference_subset(self):
1056 self.set -= set((2, 4))
1057 self.assertEqual(self.set, set([6]))
1058
1059 def test_difference_superset(self):
1060 self.set -= set((2, 4, 6, 8))
1061 self.assertEqual(self.set, set([]))
1062
1063 def test_difference_overlap(self):
1064 self.set -= set((3, 4, 5))
1065 self.assertEqual(self.set, set([2, 6]))
1066
1067 def test_difference_non_overlap(self):
1068 self.set -= set([8])
1069 self.assertEqual(self.set, set([2, 4, 6]))
1070
1071 def test_difference_method_call(self):
1072 self.set.difference_update(set([3, 4, 5]))
1073 self.assertEqual(self.set, set([2, 6]))
1074
1075#==============================================================================
1076
1077class TestMutate(unittest.TestCase):
1078 def setUp(self):
1079 self.values = ["a", "b", "c"]
1080 self.set = set(self.values)
1081
1082 def test_add_present(self):
1083 self.set.add("c")
1084 self.assertEqual(self.set, set("abc"))
1085
1086 def test_add_absent(self):
1087 self.set.add("d")
1088 self.assertEqual(self.set, set("abcd"))
1089
1090 def test_add_until_full(self):
1091 tmp = set()
1092 expected_len = 0
1093 for v in self.values:
1094 tmp.add(v)
1095 expected_len += 1
1096 self.assertEqual(len(tmp), expected_len)
1097 self.assertEqual(tmp, self.set)
1098
1099 def test_remove_present(self):
1100 self.set.remove("b")
1101 self.assertEqual(self.set, set("ac"))
1102
1103 def test_remove_absent(self):
1104 try:
1105 self.set.remove("d")
1106 self.fail("Removing missing element should have raised LookupError")
1107 except LookupError:
1108 pass
1109
1110 def test_remove_until_empty(self):
1111 expected_len = len(self.set)
1112 for v in self.values:
1113 self.set.remove(v)
1114 expected_len -= 1
1115 self.assertEqual(len(self.set), expected_len)
1116
1117 def test_discard_present(self):
1118 self.set.discard("c")
1119 self.assertEqual(self.set, set("ab"))
1120
1121 def test_discard_absent(self):
1122 self.set.discard("d")
1123 self.assertEqual(self.set, set("abc"))
1124
1125 def test_clear(self):
1126 self.set.clear()
1127 self.assertEqual(len(self.set), 0)
1128
1129 def test_pop(self):
1130 popped = {}
1131 while self.set:
1132 popped[self.set.pop()] = None
1133 self.assertEqual(len(popped), len(self.values))
1134 for v in self.values:
1135 self.failUnless(v in popped)
1136
1137 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001138 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001139 self.assertEqual(self.set, set(self.values))
1140
1141 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001142 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001143 self.assertEqual(self.set, set(self.values))
1144
1145 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001146 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001147 self.assertEqual(self.set, set(self.values + ["z"]))
1148
1149#==============================================================================
1150
1151class TestSubsets(unittest.TestCase):
1152
1153 case2method = {"<=": "issubset",
1154 ">=": "issuperset",
1155 }
1156
1157 reverse = {"==": "==",
1158 "!=": "!=",
1159 "<": ">",
1160 ">": "<",
1161 "<=": ">=",
1162 ">=": "<=",
1163 }
1164
1165 def test_issubset(self):
1166 x = self.left
1167 y = self.right
1168 for case in "!=", "==", "<", "<=", ">", ">=":
1169 expected = case in self.cases
1170 # Test the binary infix spelling.
1171 result = eval("x" + case + "y", locals())
1172 self.assertEqual(result, expected)
1173 # Test the "friendly" method-name spelling, if one exists.
1174 if case in TestSubsets.case2method:
1175 method = getattr(x, TestSubsets.case2method[case])
1176 result = method(y)
1177 self.assertEqual(result, expected)
1178
1179 # Now do the same for the operands reversed.
1180 rcase = TestSubsets.reverse[case]
1181 result = eval("y" + rcase + "x", locals())
1182 self.assertEqual(result, expected)
1183 if rcase in TestSubsets.case2method:
1184 method = getattr(y, TestSubsets.case2method[rcase])
1185 result = method(x)
1186 self.assertEqual(result, expected)
1187#------------------------------------------------------------------------------
1188
1189class TestSubsetEqualEmpty(TestSubsets):
1190 left = set()
1191 right = set()
1192 name = "both empty"
1193 cases = "==", "<=", ">="
1194
1195#------------------------------------------------------------------------------
1196
1197class TestSubsetEqualNonEmpty(TestSubsets):
1198 left = set([1, 2])
1199 right = set([1, 2])
1200 name = "equal pair"
1201 cases = "==", "<=", ">="
1202
1203#------------------------------------------------------------------------------
1204
1205class TestSubsetEmptyNonEmpty(TestSubsets):
1206 left = set()
1207 right = set([1, 2])
1208 name = "one empty, one non-empty"
1209 cases = "!=", "<", "<="
1210
1211#------------------------------------------------------------------------------
1212
1213class TestSubsetPartial(TestSubsets):
1214 left = set([1])
1215 right = set([1, 2])
1216 name = "one a non-empty proper subset of other"
1217 cases = "!=", "<", "<="
1218
1219#------------------------------------------------------------------------------
1220
1221class TestSubsetNonOverlap(TestSubsets):
1222 left = set([1])
1223 right = set([2])
1224 name = "neither empty, neither contains"
1225 cases = "!="
1226
1227#==============================================================================
1228
1229class TestOnlySetsInBinaryOps(unittest.TestCase):
1230
1231 def test_eq_ne(self):
1232 # Unlike the others, this is testing that == and != *are* allowed.
1233 self.assertEqual(self.other == self.set, False)
1234 self.assertEqual(self.set == self.other, False)
1235 self.assertEqual(self.other != self.set, True)
1236 self.assertEqual(self.set != self.other, True)
1237
1238 def test_ge_gt_le_lt(self):
1239 self.assertRaises(TypeError, lambda: self.set < self.other)
1240 self.assertRaises(TypeError, lambda: self.set <= self.other)
1241 self.assertRaises(TypeError, lambda: self.set > self.other)
1242 self.assertRaises(TypeError, lambda: self.set >= self.other)
1243
1244 self.assertRaises(TypeError, lambda: self.other < self.set)
1245 self.assertRaises(TypeError, lambda: self.other <= self.set)
1246 self.assertRaises(TypeError, lambda: self.other > self.set)
1247 self.assertRaises(TypeError, lambda: self.other >= self.set)
1248
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001249 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001250 try:
1251 self.set |= self.other
1252 except TypeError:
1253 pass
1254 else:
1255 self.fail("expected TypeError")
1256
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001257 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001258 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001259 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001260 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001261 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001262
1263 def test_union(self):
1264 self.assertRaises(TypeError, lambda: self.set | self.other)
1265 self.assertRaises(TypeError, lambda: self.other | self.set)
1266 if self.otherIsIterable:
1267 self.set.union(self.other)
1268 else:
1269 self.assertRaises(TypeError, self.set.union, self.other)
1270
1271 def test_intersection_update_operator(self):
1272 try:
1273 self.set &= self.other
1274 except TypeError:
1275 pass
1276 else:
1277 self.fail("expected TypeError")
1278
1279 def test_intersection_update(self):
1280 if self.otherIsIterable:
1281 self.set.intersection_update(self.other)
1282 else:
1283 self.assertRaises(TypeError,
1284 self.set.intersection_update,
1285 self.other)
1286
1287 def test_intersection(self):
1288 self.assertRaises(TypeError, lambda: self.set & self.other)
1289 self.assertRaises(TypeError, lambda: self.other & self.set)
1290 if self.otherIsIterable:
1291 self.set.intersection(self.other)
1292 else:
1293 self.assertRaises(TypeError, self.set.intersection, self.other)
1294
1295 def test_sym_difference_update_operator(self):
1296 try:
1297 self.set ^= self.other
1298 except TypeError:
1299 pass
1300 else:
1301 self.fail("expected TypeError")
1302
1303 def test_sym_difference_update(self):
1304 if self.otherIsIterable:
1305 self.set.symmetric_difference_update(self.other)
1306 else:
1307 self.assertRaises(TypeError,
1308 self.set.symmetric_difference_update,
1309 self.other)
1310
1311 def test_sym_difference(self):
1312 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1313 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1314 if self.otherIsIterable:
1315 self.set.symmetric_difference(self.other)
1316 else:
1317 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1318
1319 def test_difference_update_operator(self):
1320 try:
1321 self.set -= self.other
1322 except TypeError:
1323 pass
1324 else:
1325 self.fail("expected TypeError")
1326
1327 def test_difference_update(self):
1328 if self.otherIsIterable:
1329 self.set.difference_update(self.other)
1330 else:
1331 self.assertRaises(TypeError,
1332 self.set.difference_update,
1333 self.other)
1334
1335 def test_difference(self):
1336 self.assertRaises(TypeError, lambda: self.set - self.other)
1337 self.assertRaises(TypeError, lambda: self.other - self.set)
1338 if self.otherIsIterable:
1339 self.set.difference(self.other)
1340 else:
1341 self.assertRaises(TypeError, self.set.difference, self.other)
1342
1343#------------------------------------------------------------------------------
1344
1345class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1346 def setUp(self):
1347 self.set = set((1, 2, 3))
1348 self.other = 19
1349 self.otherIsIterable = False
1350
1351#------------------------------------------------------------------------------
1352
1353class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1354 def setUp(self):
1355 self.set = set((1, 2, 3))
1356 self.other = {1:2, 3:4}
1357 self.otherIsIterable = True
1358
1359#------------------------------------------------------------------------------
1360
1361class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1362 def setUp(self):
1363 self.set = set((1, 2, 3))
1364 self.other = operator.add
1365 self.otherIsIterable = False
1366
1367#------------------------------------------------------------------------------
1368
1369class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1370 def setUp(self):
1371 self.set = set((1, 2, 3))
1372 self.other = (2, 4, 6)
1373 self.otherIsIterable = True
1374
1375#------------------------------------------------------------------------------
1376
1377class TestOnlySetsString(TestOnlySetsInBinaryOps):
1378 def setUp(self):
1379 self.set = set((1, 2, 3))
1380 self.other = 'abc'
1381 self.otherIsIterable = True
1382
1383#------------------------------------------------------------------------------
1384
1385class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1386 def setUp(self):
1387 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001388 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001389 yield i
1390 self.set = set((1, 2, 3))
1391 self.other = gen()
1392 self.otherIsIterable = True
1393
1394#==============================================================================
1395
1396class TestCopying(unittest.TestCase):
1397
1398 def test_copy(self):
1399 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001400 dup_list = sorted(dup, key=repr)
1401 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001402 self.assertEqual(len(dup_list), len(set_list))
1403 for i in range(len(dup_list)):
1404 self.failUnless(dup_list[i] is set_list[i])
1405
1406 def test_deep_copy(self):
1407 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001408 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001409 dup_list = sorted(dup, key=repr)
1410 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001411 self.assertEqual(len(dup_list), len(set_list))
1412 for i in range(len(dup_list)):
1413 self.assertEqual(dup_list[i], set_list[i])
1414
1415#------------------------------------------------------------------------------
1416
1417class TestCopyingEmpty(TestCopying):
1418 def setUp(self):
1419 self.set = set()
1420
1421#------------------------------------------------------------------------------
1422
1423class TestCopyingSingleton(TestCopying):
1424 def setUp(self):
1425 self.set = set(["hello"])
1426
1427#------------------------------------------------------------------------------
1428
1429class TestCopyingTriple(TestCopying):
1430 def setUp(self):
1431 self.set = set(["zero", 0, None])
1432
1433#------------------------------------------------------------------------------
1434
1435class TestCopyingTuple(TestCopying):
1436 def setUp(self):
1437 self.set = set([(1, 2)])
1438
1439#------------------------------------------------------------------------------
1440
1441class TestCopyingNested(TestCopying):
1442 def setUp(self):
1443 self.set = set([((1, 2), (3, 4))])
1444
1445#==============================================================================
1446
1447class TestIdentities(unittest.TestCase):
1448 def setUp(self):
1449 self.a = set('abracadabra')
1450 self.b = set('alacazam')
1451
1452 def test_binopsVsSubsets(self):
1453 a, b = self.a, self.b
1454 self.assert_(a - b < a)
1455 self.assert_(b - a < b)
1456 self.assert_(a & b < a)
1457 self.assert_(a & b < b)
1458 self.assert_(a | b > a)
1459 self.assert_(a | b > b)
1460 self.assert_(a ^ b < a | b)
1461
1462 def test_commutativity(self):
1463 a, b = self.a, self.b
1464 self.assertEqual(a&b, b&a)
1465 self.assertEqual(a|b, b|a)
1466 self.assertEqual(a^b, b^a)
1467 if a != b:
1468 self.assertNotEqual(a-b, b-a)
1469
1470 def test_summations(self):
1471 # check that sums of parts equal the whole
1472 a, b = self.a, self.b
1473 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1474 self.assertEqual((a&b)|(a^b), a|b)
1475 self.assertEqual(a|(b-a), a|b)
1476 self.assertEqual((a-b)|b, a|b)
1477 self.assertEqual((a-b)|(a&b), a)
1478 self.assertEqual((b-a)|(a&b), b)
1479 self.assertEqual((a-b)|(b-a), a^b)
1480
1481 def test_exclusion(self):
1482 # check that inverse operations show non-overlap
1483 a, b, zero = self.a, self.b, set()
1484 self.assertEqual((a-b)&b, zero)
1485 self.assertEqual((b-a)&a, zero)
1486 self.assertEqual((a&b)&(a^b), zero)
1487
1488# Tests derived from test_itertools.py =======================================
1489
1490def R(seqn):
1491 'Regular generator'
1492 for i in seqn:
1493 yield i
1494
1495class G:
1496 'Sequence using __getitem__'
1497 def __init__(self, seqn):
1498 self.seqn = seqn
1499 def __getitem__(self, i):
1500 return self.seqn[i]
1501
1502class I:
1503 'Sequence using iterator protocol'
1504 def __init__(self, seqn):
1505 self.seqn = seqn
1506 self.i = 0
1507 def __iter__(self):
1508 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001509 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001510 if self.i >= len(self.seqn): raise StopIteration
1511 v = self.seqn[self.i]
1512 self.i += 1
1513 return v
1514
1515class Ig:
1516 'Sequence using iterator protocol defined with a generator'
1517 def __init__(self, seqn):
1518 self.seqn = seqn
1519 self.i = 0
1520 def __iter__(self):
1521 for val in self.seqn:
1522 yield val
1523
1524class X:
1525 'Missing __getitem__ and __iter__'
1526 def __init__(self, seqn):
1527 self.seqn = seqn
1528 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001529 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001530 if self.i >= len(self.seqn): raise StopIteration
1531 v = self.seqn[self.i]
1532 self.i += 1
1533 return v
1534
1535class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001536 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001537 def __init__(self, seqn):
1538 self.seqn = seqn
1539 self.i = 0
1540 def __iter__(self):
1541 return self
1542
1543class E:
1544 'Test propagation of exceptions'
1545 def __init__(self, seqn):
1546 self.seqn = seqn
1547 self.i = 0
1548 def __iter__(self):
1549 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001550 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001551 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001552
1553class S:
1554 'Test immediate stop'
1555 def __init__(self, seqn):
1556 pass
1557 def __iter__(self):
1558 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001559 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001560 raise StopIteration
1561
1562from itertools import chain, imap
1563def L(seqn):
1564 'Test multiple tiers of iterators'
1565 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1566
1567class TestVariousIteratorArgs(unittest.TestCase):
1568
1569 def test_constructor(self):
1570 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001571 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001572 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001573 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001574 self.assertRaises(TypeError, cons , X(s))
1575 self.assertRaises(TypeError, cons , N(s))
1576 self.assertRaises(ZeroDivisionError, cons , E(s))
1577
1578 def test_inline_methods(self):
1579 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001580 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001581 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001582 for g in (G, I, Ig, L, R):
1583 expected = meth(data)
1584 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001585 if isinstance(expected, bool):
1586 self.assertEqual(actual, expected)
1587 else:
1588 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001589 self.assertRaises(TypeError, meth, X(s))
1590 self.assertRaises(TypeError, meth, N(s))
1591 self.assertRaises(ZeroDivisionError, meth, E(s))
1592
1593 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001594 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001595 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001596 'difference_update', 'symmetric_difference_update'):
1597 for g in (G, I, Ig, S, L, R):
1598 s = set('january')
1599 t = s.copy()
1600 getattr(s, methname)(list(g(data)))
1601 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001602 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001603
1604 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1605 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1606 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1607
1608#==============================================================================
1609
1610def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001611 test_classes = (
1612 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001613 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001614 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001615 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001616 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001617 TestSetOfSets,
1618 TestExceptionPropagation,
1619 TestBasicOpsEmpty,
1620 TestBasicOpsSingleton,
1621 TestBasicOpsTuple,
1622 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001623 TestBasicOpsString,
1624 TestBasicOpsBytes,
1625 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001626 TestBinaryOps,
1627 TestUpdateOps,
1628 TestMutate,
1629 TestSubsetEqualEmpty,
1630 TestSubsetEqualNonEmpty,
1631 TestSubsetEmptyNonEmpty,
1632 TestSubsetPartial,
1633 TestSubsetNonOverlap,
1634 TestOnlySetsNumeric,
1635 TestOnlySetsDict,
1636 TestOnlySetsOperator,
1637 TestOnlySetsTuple,
1638 TestOnlySetsString,
1639 TestOnlySetsGenerator,
1640 TestCopyingEmpty,
1641 TestCopyingSingleton,
1642 TestCopyingTriple,
1643 TestCopyingTuple,
1644 TestCopyingNested,
1645 TestIdentities,
1646 TestVariousIteratorArgs,
1647 )
1648
1649 test_support.run_unittest(*test_classes)
1650
1651 # verify reference counting
1652 if verbose and hasattr(sys, "gettotalrefcount"):
1653 import gc
1654 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001655 for i in range(len(counts)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001656 test_support.run_unittest(*test_classes)
1657 gc.collect()
1658 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001659 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001660
1661if __name__ == "__main__":
1662 test_main(verbose=True)