blob: f4d1f6aa0489f28a9afd12a327689399981caf2a [file] [log] [blame]
Raymond Hettingera690a992003-11-16 16:17:49 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003import gc
4import weakref
Raymond Hettingera690a992003-11-16 16:17:49 +00005import operator
6import copy
7import pickle
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
Christian Heimes969fe572008-01-25 11:23:10 +000011import collections
Raymond Hettingera690a992003-11-16 16:17:49 +000012
13class PassThru(Exception):
14 pass
15
16def check_pass_thru():
17 raise PassThru
18 yield 1
19
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000020class BadCmp:
21 def __hash__(self):
22 return 1
Guido van Rossum47b9ff62006-08-24 00:41:19 +000023 def __eq__(self, other):
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000024 raise RuntimeError
25
Thomas Wouters902d6eb2007-01-09 23:18:33 +000026class ReprWrapper:
27 'Used to test self-referential repr() calls'
28 def __repr__(self):
29 return repr(self.value)
30
Thomas Wouterscf297e42007-02-23 15:07:44 +000031class HashCountingInt(int):
32 'int-like object that counts the number of times __hash__ is called'
33 def __init__(self, *args):
34 self.hash_count = 0
35 def __hash__(self):
36 self.hash_count += 1
37 return int.__hash__(self)
38
Raymond Hettingera690a992003-11-16 16:17:49 +000039class TestJointOps(unittest.TestCase):
40 # Tests common to both set and frozenset
41
42 def setUp(self):
43 self.word = word = 'simsalabim'
44 self.otherword = 'madagascar'
45 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
46 self.s = self.thetype(word)
47 self.d = dict.fromkeys(word)
48
Raymond Hettinger6429a472004-09-28 01:51:35 +000049 def test_new_or_init(self):
50 self.assertRaises(TypeError, self.thetype, [], 2)
51
Raymond Hettingera690a992003-11-16 16:17:49 +000052 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000053 actual = sorted(self.s)
54 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000055 self.assertEqual(actual, expected)
56 self.assertRaises(PassThru, self.thetype, check_pass_thru())
57 self.assertRaises(TypeError, self.thetype, [[]])
58
59 def test_len(self):
60 self.assertEqual(len(self.s), len(self.d))
61
62 def test_contains(self):
63 for c in self.letters:
64 self.assertEqual(c in self.s, c in self.d)
65 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000066 s = self.thetype([frozenset(self.letters)])
Benjamin Peterson577473f2010-01-19 00:09:57 +000067 self.assertIn(self.thetype(self.letters), s)
Raymond Hettingera690a992003-11-16 16:17:49 +000068
Raymond Hettingera690a992003-11-16 16:17:49 +000069 def test_union(self):
70 u = self.s.union(self.otherword)
71 for c in self.letters:
72 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000073 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +000074 self.assertEqual(type(u), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +000075 self.assertRaises(PassThru, self.s.union, check_pass_thru())
76 self.assertRaises(TypeError, self.s.union, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +000077 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000078 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
79 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
80 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
81 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Georg Brandlc28e1fa2008-06-10 19:20:26 +000082 self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
Raymond Hettingera690a992003-11-16 16:17:49 +000083
Raymond Hettingere805ecc2009-07-27 20:16:37 +000084 # Issue #6573
85 x = self.thetype()
86 self.assertEqual(x.union(set([1]), x, set([2])), self.thetype([1, 2]))
87
Raymond Hettingera690a992003-11-16 16:17:49 +000088 def test_or(self):
89 i = self.s.union(self.otherword)
90 self.assertEqual(self.s | set(self.otherword), i)
91 self.assertEqual(self.s | frozenset(self.otherword), i)
92 try:
93 self.s | self.otherword
94 except TypeError:
95 pass
96 else:
97 self.fail("s|t did not screen-out general iterables")
98
99 def test_intersection(self):
100 i = self.s.intersection(self.otherword)
101 for c in self.letters:
102 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000103 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000104 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000105 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Guido van Rossum75a902d2007-10-19 22:06:24 +0000106 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000107 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
108 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
109 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
110 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000111 self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000112 s = self.thetype('abcba')
113 z = s.intersection()
114 if self.thetype == frozenset():
115 self.assertEqual(id(s), id(z))
116 else:
117 self.assertNotEqual(id(s), id(z))
Raymond Hettingera690a992003-11-16 16:17:49 +0000118
Guido van Rossum58da9312007-11-10 23:39:45 +0000119 def test_isdisjoint(self):
120 def f(s1, s2):
121 'Pure python equivalent of isdisjoint()'
122 return not set(s1).intersection(s2)
123 for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
124 s1 = self.thetype(larg)
125 for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
126 for C in set, frozenset, dict.fromkeys, str, list, tuple:
127 s2 = C(rarg)
128 actual = s1.isdisjoint(s2)
129 expected = f(s1, s2)
130 self.assertEqual(actual, expected)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000131 self.assertTrue(actual is True or actual is False)
Guido van Rossum58da9312007-11-10 23:39:45 +0000132
Raymond Hettingera690a992003-11-16 16:17:49 +0000133 def test_and(self):
134 i = self.s.intersection(self.otherword)
135 self.assertEqual(self.s & set(self.otherword), i)
136 self.assertEqual(self.s & frozenset(self.otherword), i)
137 try:
138 self.s & self.otherword
139 except TypeError:
140 pass
141 else:
142 self.fail("s&t did not screen-out general iterables")
143
144 def test_difference(self):
145 i = self.s.difference(self.otherword)
146 for c in self.letters:
147 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000148 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000149 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000150 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
151 self.assertRaises(TypeError, self.s.difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000152 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000153 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
154 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
155 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
156 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000157 self.assertEqual(self.thetype('abcba').difference(), set('abc'))
158 self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000159
160 def test_sub(self):
161 i = self.s.difference(self.otherword)
162 self.assertEqual(self.s - set(self.otherword), i)
163 self.assertEqual(self.s - frozenset(self.otherword), i)
164 try:
165 self.s - self.otherword
166 except TypeError:
167 pass
168 else:
169 self.fail("s-t did not screen-out general iterables")
170
171 def test_symmetric_difference(self):
172 i = self.s.symmetric_difference(self.otherword)
173 for c in self.letters:
174 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000175 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000176 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000177 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
178 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000179 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000180 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
181 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
182 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
183 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000184
185 def test_xor(self):
186 i = self.s.symmetric_difference(self.otherword)
187 self.assertEqual(self.s ^ set(self.otherword), i)
188 self.assertEqual(self.s ^ frozenset(self.otherword), i)
189 try:
190 self.s ^ self.otherword
191 except TypeError:
192 pass
193 else:
194 self.fail("s^t did not screen-out general iterables")
195
196 def test_equality(self):
197 self.assertEqual(self.s, set(self.word))
198 self.assertEqual(self.s, frozenset(self.word))
199 self.assertEqual(self.s == self.word, False)
200 self.assertNotEqual(self.s, set(self.otherword))
201 self.assertNotEqual(self.s, frozenset(self.otherword))
202 self.assertEqual(self.s != self.word, True)
203
204 def test_setOfFrozensets(self):
205 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
206 s = self.thetype(t)
207 self.assertEqual(len(s), 3)
208
Raymond Hettingera690a992003-11-16 16:17:49 +0000209 def test_sub_and_super(self):
210 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000211 self.assertTrue(p < q)
212 self.assertTrue(p <= q)
213 self.assertTrue(q <= q)
214 self.assertTrue(q > p)
215 self.assertTrue(q >= p)
216 self.assertFalse(q < r)
217 self.assertFalse(q <= r)
218 self.assertFalse(q > r)
219 self.assertFalse(q >= r)
220 self.assertTrue(set('a').issubset('abc'))
221 self.assertTrue(set('abc').issuperset('a'))
222 self.assertFalse(set('a').issubset('cbs'))
223 self.assertFalse(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000224
225 def test_pickling(self):
Hirokazu Yamamoto801f9d32008-12-27 04:21:44 +0000226 for i in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000227 p = pickle.dumps(self.s, i)
228 dup = pickle.loads(p)
229 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
230 if type(self.s) not in (set, frozenset):
231 self.s.x = 10
232 p = pickle.dumps(self.s)
233 dup = pickle.loads(p)
234 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000235
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000236 def test_deepcopy(self):
237 class Tracer:
238 def __init__(self, value):
239 self.value = value
240 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000241 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000242 def __deepcopy__(self, memo=None):
243 return Tracer(self.value + 1)
244 t = Tracer(10)
245 s = self.thetype([t])
246 dup = copy.deepcopy(s)
247 self.assertNotEqual(id(s), id(dup))
248 for elem in dup:
249 newt = elem
250 self.assertNotEqual(id(t), id(newt))
251 self.assertEqual(t.value + 1, newt.value)
252
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000253 def test_gc(self):
254 # Create a nest of cycles to exercise overall ref count check
255 class A:
256 pass
Guido van Rossum805365e2007-05-07 22:24:25 +0000257 s = set(A() for i in range(1000))
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000258 for elem in s:
259 elem.cycle = s
260 elem.sub = elem
261 elem.set = set([elem])
262
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000263 def test_subclass_with_custom_hash(self):
264 # Bug #1257731
265 class H(self.thetype):
266 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000267 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000268 s=H()
269 f=set()
270 f.add(s)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000271 self.assertIn(s, f)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000272 f.remove(s)
273 f.add(s)
274 f.discard(s)
275
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000276 def test_badcmp(self):
277 s = self.thetype([BadCmp()])
278 # Detect comparison errors during insertion and lookup
279 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
280 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
281 # Detect errors during mutating operations
282 if hasattr(s, 'add'):
283 self.assertRaises(RuntimeError, s.add, BadCmp())
284 self.assertRaises(RuntimeError, s.discard, BadCmp())
285 self.assertRaises(RuntimeError, s.remove, BadCmp())
286
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000287 def test_cyclical_repr(self):
288 w = ReprWrapper()
289 s = self.thetype([w])
290 w.value = s
291 if self.thetype == set:
292 self.assertEqual(repr(s), '{set(...)}')
293 else:
294 name = repr(s).partition('(')[0] # strip class name
Guido van Rossumbdba5cf2007-08-07 22:44:20 +0000295 self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000296
297 def test_cyclical_print(self):
298 w = ReprWrapper()
299 s = self.thetype([w])
300 w.value = s
Thomas Heller0d755b42008-07-15 17:14:09 +0000301 fo = open(support.TESTFN, "w")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000302 try:
Guido van Rossumd8c19672007-02-09 21:54:58 +0000303 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000304 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000305 fo = open(support.TESTFN, "r")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000306 self.assertEqual(fo.read(), repr(s))
307 finally:
308 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000309 support.unlink(support.TESTFN)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000310
Thomas Wouterscf297e42007-02-23 15:07:44 +0000311 def test_do_not_rehash_dict_keys(self):
312 n = 10
Guido van Rossum805365e2007-05-07 22:24:25 +0000313 d = dict.fromkeys(map(HashCountingInt, range(n)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000314 self.assertEqual(sum(elem.hash_count for elem in d), n)
315 s = self.thetype(d)
316 self.assertEqual(sum(elem.hash_count for elem in d), n)
317 s.difference(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000318 self.assertEqual(sum(elem.hash_count for elem in d), n)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000319 if hasattr(s, 'symmetric_difference_update'):
320 s.symmetric_difference_update(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000321 self.assertEqual(sum(elem.hash_count for elem in d), n)
322 d2 = dict.fromkeys(set(d))
323 self.assertEqual(sum(elem.hash_count for elem in d), n)
324 d3 = dict.fromkeys(frozenset(d))
325 self.assertEqual(sum(elem.hash_count for elem in d), n)
326 d3 = dict.fromkeys(frozenset(d), 123)
327 self.assertEqual(sum(elem.hash_count for elem in d), n)
328 self.assertEqual(d3, dict.fromkeys(d, 123))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000329
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000330 def test_container_iterator(self):
331 # Bug #3680: tp_traverse was not implemented for set iterator object
332 class C(object):
333 pass
334 obj = C()
335 ref = weakref.ref(obj)
336 container = set([obj, 1])
337 obj.x = iter(container)
338 del obj, container
339 gc.collect()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000340 self.assertTrue(ref() is None, "Cycle was not collected")
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000341
Raymond Hettingera690a992003-11-16 16:17:49 +0000342class TestSet(TestJointOps):
343 thetype = set
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000344 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000345
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000346 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000347 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000348 s.__init__(self.word)
349 self.assertEqual(s, set(self.word))
350 s.__init__(self.otherword)
351 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000352 self.assertRaises(TypeError, s.__init__, s, 2);
353 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000354
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000355 def test_constructor_identity(self):
356 s = self.thetype(range(3))
357 t = self.thetype(s)
358 self.assertNotEqual(id(s), id(t))
359
Guido van Rossum86e58e22006-08-28 15:27:34 +0000360 def test_set_literal(self):
361 s = set([1,2,3])
362 t = {1,2,3}
363 self.assertEqual(s, t)
364
Raymond Hettingera690a992003-11-16 16:17:49 +0000365 def test_hash(self):
366 self.assertRaises(TypeError, hash, self.s)
367
368 def test_clear(self):
369 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000370 self.assertEqual(self.s, set())
371 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000372
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000373 def test_copy(self):
374 dup = self.s.copy()
375 self.assertEqual(self.s, dup)
376 self.assertNotEqual(id(self.s), id(dup))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000377 self.assertEqual(type(dup), self.basetype)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000378
Raymond Hettingera690a992003-11-16 16:17:49 +0000379 def test_add(self):
380 self.s.add('Q')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000381 self.assertIn('Q', self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000382 dup = self.s.copy()
383 self.s.add('Q')
384 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000385 self.assertRaises(TypeError, self.s.add, [])
386
387 def test_remove(self):
388 self.s.remove('a')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000389 self.assertNotIn('a', self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000390 self.assertRaises(KeyError, self.s.remove, 'Q')
391 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000392 s = self.thetype([frozenset(self.word)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000393 self.assertIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000394 s.remove(self.thetype(self.word))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000395 self.assertNotIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000396 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000397
Thomas Wouters89f507f2006-12-13 04:49:30 +0000398 def test_remove_keyerror_unpacking(self):
399 # bug: www.python.org/sf/1576657
400 for v1 in ['Q', (1,)]:
401 try:
402 self.s.remove(v1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000403 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000404 v2 = e.args[0]
405 self.assertEqual(v1, v2)
406 else:
407 self.fail()
408
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000409 def test_remove_keyerror_set(self):
410 key = self.thetype([3, 4])
411 try:
412 self.s.remove(key)
413 except KeyError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000414 self.assertTrue(e.args[0] is key,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000415 "KeyError should be {0}, not {1}".format(key,
416 e.args[0]))
417 else:
418 self.fail()
419
Raymond Hettingera690a992003-11-16 16:17:49 +0000420 def test_discard(self):
421 self.s.discard('a')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000422 self.assertNotIn('a', self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000423 self.s.discard('Q')
424 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000425 s = self.thetype([frozenset(self.word)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000426 self.assertIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000427 s.discard(self.thetype(self.word))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000428 self.assertNotIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000429 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000430
431 def test_pop(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000432 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000433 elem = self.s.pop()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000434 self.assertNotIn(elem, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000435 self.assertRaises(KeyError, self.s.pop)
436
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000437 def test_update(self):
438 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000439 self.assertEqual(retval, None)
440 for c in (self.word + self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000441 self.assertIn(c, self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000442 self.assertRaises(PassThru, self.s.update, check_pass_thru())
443 self.assertRaises(TypeError, self.s.update, [[]])
444 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000445 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000446 s = self.thetype('abcba')
447 self.assertEqual(s.update(C(p)), None)
448 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000449 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
450 q = 'ahi'
451 for C in set, frozenset, dict.fromkeys, str, list, tuple:
452 s = self.thetype('abcba')
453 self.assertEqual(s.update(C(p), C(q)), None)
454 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000455
456 def test_ior(self):
457 self.s |= set(self.otherword)
458 for c in (self.word + self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000459 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000460
461 def test_intersection_update(self):
462 retval = self.s.intersection_update(self.otherword)
463 self.assertEqual(retval, None)
464 for c in (self.word + self.otherword):
465 if c in self.otherword and c in self.word:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000466 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000467 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000468 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000469 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
470 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000471 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000472 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000473 s = self.thetype('abcba')
474 self.assertEqual(s.intersection_update(C(p)), None)
475 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000476 ss = 'abcba'
477 s = self.thetype(ss)
478 t = 'cbc'
479 self.assertEqual(s.intersection_update(C(p), C(t)), None)
480 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000481
482 def test_iand(self):
483 self.s &= set(self.otherword)
484 for c in (self.word + self.otherword):
485 if c in self.otherword and c in self.word:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000486 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000487 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000488 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000489
490 def test_difference_update(self):
491 retval = self.s.difference_update(self.otherword)
492 self.assertEqual(retval, None)
493 for c in (self.word + self.otherword):
494 if c in self.word and c not in self.otherword:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000495 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000496 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000497 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000498 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
499 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000500 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
501 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000502 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000503 s = self.thetype('abcba')
504 self.assertEqual(s.difference_update(C(p)), None)
505 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000506
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000507 s = self.thetype('abcdefghih')
508 s.difference_update()
509 self.assertEqual(s, self.thetype('abcdefghih'))
510
511 s = self.thetype('abcdefghih')
512 s.difference_update(C('aba'))
513 self.assertEqual(s, self.thetype('cdefghih'))
514
515 s = self.thetype('abcdefghih')
516 s.difference_update(C('cdc'), C('aba'))
517 self.assertEqual(s, self.thetype('efghih'))
518
Raymond Hettingera690a992003-11-16 16:17:49 +0000519 def test_isub(self):
520 self.s -= set(self.otherword)
521 for c in (self.word + self.otherword):
522 if c in self.word and c not in self.otherword:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000523 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000524 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000525 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000526
527 def test_symmetric_difference_update(self):
528 retval = self.s.symmetric_difference_update(self.otherword)
529 self.assertEqual(retval, None)
530 for c in (self.word + self.otherword):
531 if (c in self.word) ^ (c in self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000532 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000533 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000534 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000535 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
536 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000537 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000538 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000539 s = self.thetype('abcba')
540 self.assertEqual(s.symmetric_difference_update(C(p)), None)
541 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000542
543 def test_ixor(self):
544 self.s ^= set(self.otherword)
545 for c in (self.word + self.otherword):
546 if (c in self.word) ^ (c in self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000547 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000548 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000549 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000550
Raymond Hettingerc991db22005-08-11 07:58:45 +0000551 def test_inplace_on_self(self):
552 t = self.s.copy()
553 t |= t
554 self.assertEqual(t, self.s)
555 t &= t
556 self.assertEqual(t, self.s)
557 t -= t
558 self.assertEqual(t, self.thetype())
559 t = self.s.copy()
560 t ^= t
561 self.assertEqual(t, self.thetype())
562
Raymond Hettinger691d8052004-05-30 07:26:47 +0000563 def test_weakref(self):
564 s = self.thetype('gallahad')
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000565 p = weakref.proxy(s)
Raymond Hettinger691d8052004-05-30 07:26:47 +0000566 self.assertEqual(str(p), str(s))
567 s = None
568 self.assertRaises(ReferenceError, str, p)
569
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000570 def test_rich_compare(self):
571 class TestRichSetCompare:
572 def __gt__(self, some_set):
573 self.gt_called = True
574 return False
575 def __lt__(self, some_set):
576 self.lt_called = True
577 return False
578 def __ge__(self, some_set):
579 self.ge_called = True
580 return False
581 def __le__(self, some_set):
582 self.le_called = True
583 return False
584
585 # This first tries the bulitin rich set comparison, which doesn't know
586 # how to handle the custom object. Upon returning NotImplemented, the
587 # corresponding comparison on the right object is invoked.
588 myset = {1, 2, 3}
589
590 myobj = TestRichSetCompare()
591 myset < myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000592 self.assertTrue(myobj.gt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000593
594 myobj = TestRichSetCompare()
595 myset > myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000596 self.assertTrue(myobj.lt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000597
598 myobj = TestRichSetCompare()
599 myset <= myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000600 self.assertTrue(myobj.ge_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000601
602 myobj = TestRichSetCompare()
603 myset >= myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000604 self.assertTrue(myobj.le_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000605
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000606 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000607 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000608 def test_c_api(self):
Victor Stinner08b36bd2010-03-13 00:19:17 +0000609 self.assertEqual(set().test_c_api(), True)
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000610
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000611class SetSubclass(set):
612 pass
613
614class TestSetSubclass(TestSet):
615 thetype = SetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000616 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000617
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000618class SetSubclassWithKeywordArgs(set):
619 def __init__(self, iterable=[], newarg=None):
620 set.__init__(self, iterable)
621
622class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000623
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000624 def test_keywords_in_subclass(self):
625 'SF bug #1486663 -- this used to erroneously raise a TypeError'
626 SetSubclassWithKeywordArgs(newarg=1)
627
Raymond Hettingera690a992003-11-16 16:17:49 +0000628class TestFrozenSet(TestJointOps):
629 thetype = frozenset
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000630 basetype = frozenset
Raymond Hettingera690a992003-11-16 16:17:49 +0000631
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000632 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000633 s = self.thetype(self.word)
634 s.__init__(self.otherword)
635 self.assertEqual(s, set(self.word))
636
Raymond Hettingerd7946662005-08-01 21:39:29 +0000637 def test_singleton_empty_frozenset(self):
638 f = frozenset()
639 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
640 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000641 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000642 frozenset(f), f]
643 # All of the empty frozensets should have just one id()
644 self.assertEqual(len(set(map(id, efs))), 1)
645
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000646 def test_constructor_identity(self):
647 s = self.thetype(range(3))
648 t = self.thetype(s)
649 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000650
Raymond Hettingera690a992003-11-16 16:17:49 +0000651 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000652 self.assertEqual(hash(self.thetype('abcdeb')),
653 hash(self.thetype('ebecda')))
654
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000655 # make sure that all permutations give the same hash value
656 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000657 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000658 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000659 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000660 shuffle(seq)
661 results.add(hash(self.thetype(seq)))
662 self.assertEqual(len(results), 1)
663
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000664 def test_copy(self):
665 dup = self.s.copy()
666 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000667
668 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000669 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000670 key1 = self.thetype(seq)
671 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000672 self.assertEqual(key1, key2)
673 self.assertNotEqual(id(key1), id(key2))
674 d = {}
675 d[key1] = 42
676 self.assertEqual(d[key2], 42)
677
678 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000679 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000680 self.assertEqual(hash(f), hash(f))
681
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000682 def test_hash_effectiveness(self):
683 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000684 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000685 addhashvalue = hashvalues.add
686 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000687 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000688 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
689 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000690
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000691class FrozenSetSubclass(frozenset):
692 pass
693
694class TestFrozenSetSubclass(TestFrozenSet):
695 thetype = FrozenSetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000696 basetype = frozenset
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000697
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000698 def test_constructor_identity(self):
699 s = self.thetype(range(3))
700 t = self.thetype(s)
701 self.assertNotEqual(id(s), id(t))
702
703 def test_copy(self):
704 dup = self.s.copy()
705 self.assertNotEqual(id(self.s), id(dup))
706
707 def test_nested_empty_constructor(self):
708 s = self.thetype()
709 t = self.thetype(s)
710 self.assertEqual(s, t)
711
Raymond Hettingerd7946662005-08-01 21:39:29 +0000712 def test_singleton_empty_frozenset(self):
713 Frozenset = self.thetype
714 f = frozenset()
715 F = Frozenset()
716 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
717 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000718 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000719 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
720 # All empty frozenset subclass instances should have different ids
721 self.assertEqual(len(set(map(id, efs))), len(efs))
722
Raymond Hettingera690a992003-11-16 16:17:49 +0000723# Tests taken from test_sets.py =============================================
724
725empty_set = set()
726
727#==============================================================================
728
729class TestBasicOps(unittest.TestCase):
730
731 def test_repr(self):
732 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000733 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000734
Raymond Hettingereae05de2004-07-09 04:51:24 +0000735 def test_print(self):
736 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000737 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000738 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000739 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000740 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000741 self.assertEqual(fo.read(), repr(self.set))
742 finally:
743 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000744 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000745
Raymond Hettingera690a992003-11-16 16:17:49 +0000746 def test_length(self):
747 self.assertEqual(len(self.set), self.length)
748
749 def test_self_equality(self):
750 self.assertEqual(self.set, self.set)
751
752 def test_equivalent_equality(self):
753 self.assertEqual(self.set, self.dup)
754
755 def test_copy(self):
756 self.assertEqual(self.set.copy(), self.dup)
757
758 def test_self_union(self):
759 result = self.set | self.set
760 self.assertEqual(result, self.dup)
761
762 def test_empty_union(self):
763 result = self.set | empty_set
764 self.assertEqual(result, self.dup)
765
766 def test_union_empty(self):
767 result = empty_set | self.set
768 self.assertEqual(result, self.dup)
769
770 def test_self_intersection(self):
771 result = self.set & self.set
772 self.assertEqual(result, self.dup)
773
774 def test_empty_intersection(self):
775 result = self.set & empty_set
776 self.assertEqual(result, empty_set)
777
778 def test_intersection_empty(self):
779 result = empty_set & self.set
780 self.assertEqual(result, empty_set)
781
Guido van Rossum58da9312007-11-10 23:39:45 +0000782 def test_self_isdisjoint(self):
783 result = self.set.isdisjoint(self.set)
784 self.assertEqual(result, not self.set)
785
786 def test_empty_isdisjoint(self):
787 result = self.set.isdisjoint(empty_set)
788 self.assertEqual(result, True)
789
790 def test_isdisjoint_empty(self):
791 result = empty_set.isdisjoint(self.set)
792 self.assertEqual(result, True)
793
Raymond Hettingera690a992003-11-16 16:17:49 +0000794 def test_self_symmetric_difference(self):
795 result = self.set ^ self.set
796 self.assertEqual(result, empty_set)
797
798 def checkempty_symmetric_difference(self):
799 result = self.set ^ empty_set
800 self.assertEqual(result, self.set)
801
802 def test_self_difference(self):
803 result = self.set - self.set
804 self.assertEqual(result, empty_set)
805
806 def test_empty_difference(self):
807 result = self.set - empty_set
808 self.assertEqual(result, self.dup)
809
810 def test_empty_difference_rev(self):
811 result = empty_set - self.set
812 self.assertEqual(result, empty_set)
813
814 def test_iteration(self):
815 for v in self.set:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000816 self.assertIn(v, self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000817 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000818 # note: __length_hint__ is an internal undocumented API,
819 # don't rely on it in your own programs
820 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000821
822 def test_pickling(self):
823 p = pickle.dumps(self.set)
824 copy = pickle.loads(p)
825 self.assertEqual(self.set, copy,
826 "%s != %s" % (self.set, copy))
827
828#------------------------------------------------------------------------------
829
830class TestBasicOpsEmpty(TestBasicOps):
831 def setUp(self):
832 self.case = "empty set"
833 self.values = []
834 self.set = set(self.values)
835 self.dup = set(self.values)
836 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000837 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000838
839#------------------------------------------------------------------------------
840
841class TestBasicOpsSingleton(TestBasicOps):
842 def setUp(self):
843 self.case = "unit set (number)"
844 self.values = [3]
845 self.set = set(self.values)
846 self.dup = set(self.values)
847 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000848 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000849
850 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000851 self.assertIn(3, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000852
853 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000854 self.assertNotIn(2, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000855
856#------------------------------------------------------------------------------
857
858class TestBasicOpsTuple(TestBasicOps):
859 def setUp(self):
860 self.case = "unit set (tuple)"
861 self.values = [(0, "zero")]
862 self.set = set(self.values)
863 self.dup = set(self.values)
864 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000865 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000866
867 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000868 self.assertIn((0, "zero"), self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000869
870 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000871 self.assertNotIn(9, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000872
873#------------------------------------------------------------------------------
874
875class TestBasicOpsTriple(TestBasicOps):
876 def setUp(self):
877 self.case = "triple set"
878 self.values = [0, "zero", operator.add]
879 self.set = set(self.values)
880 self.dup = set(self.values)
881 self.length = 3
882 self.repr = None
883
Christian Heimes0ded5b52007-12-10 15:50:56 +0000884#------------------------------------------------------------------------------
885
886class TestBasicOpsString(TestBasicOps):
887 def setUp(self):
888 self.case = "string set"
889 self.values = ["a", "b", "c"]
890 self.set = set(self.values)
891 self.dup = set(self.values)
892 self.length = 3
893 self.repr = "{'a', 'c', 'b'}"
894
895#------------------------------------------------------------------------------
896
897class TestBasicOpsBytes(TestBasicOps):
898 def setUp(self):
899 self.case = "string set"
900 self.values = [b"a", b"b", b"c"]
901 self.set = set(self.values)
902 self.dup = set(self.values)
903 self.length = 3
904 self.repr = "{b'a', b'c', b'b'}"
905
906#------------------------------------------------------------------------------
907
908class TestBasicOpsMixedStringBytes(TestBasicOps):
909 def setUp(self):
910 self.warning_filters = warnings.filters[:]
911 warnings.simplefilter('ignore', BytesWarning)
912 self.case = "string and bytes set"
913 self.values = ["a", "b", b"a", b"b"]
914 self.set = set(self.values)
915 self.dup = set(self.values)
916 self.length = 4
917 self.repr = "{'a', b'a', 'b', b'b'}"
918
919 def tearDown(self):
920 warnings.filters = self.warning_filters
921
Raymond Hettingera690a992003-11-16 16:17:49 +0000922#==============================================================================
923
924def baditer():
925 raise TypeError
926 yield True
927
928def gooditer():
929 yield True
930
931class TestExceptionPropagation(unittest.TestCase):
932 """SF 628246: Set constructor should not trap iterator TypeErrors"""
933
934 def test_instanceWithException(self):
935 self.assertRaises(TypeError, set, baditer())
936
937 def test_instancesWithoutException(self):
938 # All of these iterables should load without exception.
939 set([1,2,3])
940 set((1,2,3))
941 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000942 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000943 set('abc')
944 set(gooditer())
945
Neal Norwitzfcf44352005-11-27 20:37:43 +0000946 def test_changingSizeWhileIterating(self):
947 s = set([1,2,3])
948 try:
949 for i in s:
950 s.update([4])
951 except RuntimeError:
952 pass
953 else:
954 self.fail("no exception when changing size during iteration")
955
Raymond Hettingera690a992003-11-16 16:17:49 +0000956#==============================================================================
957
958class TestSetOfSets(unittest.TestCase):
959 def test_constructor(self):
960 inner = frozenset([1])
961 outer = set([inner])
962 element = outer.pop()
963 self.assertEqual(type(element), frozenset)
964 outer.add(inner) # Rebuild set of sets with .add method
965 outer.remove(inner)
966 self.assertEqual(outer, set()) # Verify that remove worked
967 outer.discard(inner) # Absence of KeyError indicates working fine
968
969#==============================================================================
970
971class TestBinaryOps(unittest.TestCase):
972 def setUp(self):
973 self.set = set((2, 4, 6))
974
975 def test_eq(self): # SF bug 643115
976 self.assertEqual(self.set, set({2:1,4:3,6:5}))
977
978 def test_union_subset(self):
979 result = self.set | set([2])
980 self.assertEqual(result, set((2, 4, 6)))
981
982 def test_union_superset(self):
983 result = self.set | set([2, 4, 6, 8])
984 self.assertEqual(result, set([2, 4, 6, 8]))
985
986 def test_union_overlap(self):
987 result = self.set | set([3, 4, 5])
988 self.assertEqual(result, set([2, 3, 4, 5, 6]))
989
990 def test_union_non_overlap(self):
991 result = self.set | set([8])
992 self.assertEqual(result, set([2, 4, 6, 8]))
993
994 def test_intersection_subset(self):
995 result = self.set & set((2, 4))
996 self.assertEqual(result, set((2, 4)))
997
998 def test_intersection_superset(self):
999 result = self.set & set([2, 4, 6, 8])
1000 self.assertEqual(result, set([2, 4, 6]))
1001
1002 def test_intersection_overlap(self):
1003 result = self.set & set([3, 4, 5])
1004 self.assertEqual(result, set([4]))
1005
1006 def test_intersection_non_overlap(self):
1007 result = self.set & set([8])
1008 self.assertEqual(result, empty_set)
1009
Guido van Rossum58da9312007-11-10 23:39:45 +00001010 def test_isdisjoint_subset(self):
1011 result = self.set.isdisjoint(set((2, 4)))
1012 self.assertEqual(result, False)
1013
1014 def test_isdisjoint_superset(self):
1015 result = self.set.isdisjoint(set([2, 4, 6, 8]))
1016 self.assertEqual(result, False)
1017
1018 def test_isdisjoint_overlap(self):
1019 result = self.set.isdisjoint(set([3, 4, 5]))
1020 self.assertEqual(result, False)
1021
1022 def test_isdisjoint_non_overlap(self):
1023 result = self.set.isdisjoint(set([8]))
1024 self.assertEqual(result, True)
1025
Raymond Hettingera690a992003-11-16 16:17:49 +00001026 def test_sym_difference_subset(self):
1027 result = self.set ^ set((2, 4))
1028 self.assertEqual(result, set([6]))
1029
1030 def test_sym_difference_superset(self):
1031 result = self.set ^ set((2, 4, 6, 8))
1032 self.assertEqual(result, set([8]))
1033
1034 def test_sym_difference_overlap(self):
1035 result = self.set ^ set((3, 4, 5))
1036 self.assertEqual(result, set([2, 3, 5, 6]))
1037
1038 def test_sym_difference_non_overlap(self):
1039 result = self.set ^ set([8])
1040 self.assertEqual(result, set([2, 4, 6, 8]))
1041
Raymond Hettingera690a992003-11-16 16:17:49 +00001042#==============================================================================
1043
1044class TestUpdateOps(unittest.TestCase):
1045 def setUp(self):
1046 self.set = set((2, 4, 6))
1047
1048 def test_union_subset(self):
1049 self.set |= set([2])
1050 self.assertEqual(self.set, set((2, 4, 6)))
1051
1052 def test_union_superset(self):
1053 self.set |= set([2, 4, 6, 8])
1054 self.assertEqual(self.set, set([2, 4, 6, 8]))
1055
1056 def test_union_overlap(self):
1057 self.set |= set([3, 4, 5])
1058 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1059
1060 def test_union_non_overlap(self):
1061 self.set |= set([8])
1062 self.assertEqual(self.set, set([2, 4, 6, 8]))
1063
1064 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001065 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001066 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1067
1068 def test_intersection_subset(self):
1069 self.set &= set((2, 4))
1070 self.assertEqual(self.set, set((2, 4)))
1071
1072 def test_intersection_superset(self):
1073 self.set &= set([2, 4, 6, 8])
1074 self.assertEqual(self.set, set([2, 4, 6]))
1075
1076 def test_intersection_overlap(self):
1077 self.set &= set([3, 4, 5])
1078 self.assertEqual(self.set, set([4]))
1079
1080 def test_intersection_non_overlap(self):
1081 self.set &= set([8])
1082 self.assertEqual(self.set, empty_set)
1083
1084 def test_intersection_method_call(self):
1085 self.set.intersection_update(set([3, 4, 5]))
1086 self.assertEqual(self.set, set([4]))
1087
1088 def test_sym_difference_subset(self):
1089 self.set ^= set((2, 4))
1090 self.assertEqual(self.set, set([6]))
1091
1092 def test_sym_difference_superset(self):
1093 self.set ^= set((2, 4, 6, 8))
1094 self.assertEqual(self.set, set([8]))
1095
1096 def test_sym_difference_overlap(self):
1097 self.set ^= set((3, 4, 5))
1098 self.assertEqual(self.set, set([2, 3, 5, 6]))
1099
1100 def test_sym_difference_non_overlap(self):
1101 self.set ^= set([8])
1102 self.assertEqual(self.set, set([2, 4, 6, 8]))
1103
1104 def test_sym_difference_method_call(self):
1105 self.set.symmetric_difference_update(set([3, 4, 5]))
1106 self.assertEqual(self.set, set([2, 3, 5, 6]))
1107
1108 def test_difference_subset(self):
1109 self.set -= set((2, 4))
1110 self.assertEqual(self.set, set([6]))
1111
1112 def test_difference_superset(self):
1113 self.set -= set((2, 4, 6, 8))
1114 self.assertEqual(self.set, set([]))
1115
1116 def test_difference_overlap(self):
1117 self.set -= set((3, 4, 5))
1118 self.assertEqual(self.set, set([2, 6]))
1119
1120 def test_difference_non_overlap(self):
1121 self.set -= set([8])
1122 self.assertEqual(self.set, set([2, 4, 6]))
1123
1124 def test_difference_method_call(self):
1125 self.set.difference_update(set([3, 4, 5]))
1126 self.assertEqual(self.set, set([2, 6]))
1127
1128#==============================================================================
1129
1130class TestMutate(unittest.TestCase):
1131 def setUp(self):
1132 self.values = ["a", "b", "c"]
1133 self.set = set(self.values)
1134
1135 def test_add_present(self):
1136 self.set.add("c")
1137 self.assertEqual(self.set, set("abc"))
1138
1139 def test_add_absent(self):
1140 self.set.add("d")
1141 self.assertEqual(self.set, set("abcd"))
1142
1143 def test_add_until_full(self):
1144 tmp = set()
1145 expected_len = 0
1146 for v in self.values:
1147 tmp.add(v)
1148 expected_len += 1
1149 self.assertEqual(len(tmp), expected_len)
1150 self.assertEqual(tmp, self.set)
1151
1152 def test_remove_present(self):
1153 self.set.remove("b")
1154 self.assertEqual(self.set, set("ac"))
1155
1156 def test_remove_absent(self):
1157 try:
1158 self.set.remove("d")
1159 self.fail("Removing missing element should have raised LookupError")
1160 except LookupError:
1161 pass
1162
1163 def test_remove_until_empty(self):
1164 expected_len = len(self.set)
1165 for v in self.values:
1166 self.set.remove(v)
1167 expected_len -= 1
1168 self.assertEqual(len(self.set), expected_len)
1169
1170 def test_discard_present(self):
1171 self.set.discard("c")
1172 self.assertEqual(self.set, set("ab"))
1173
1174 def test_discard_absent(self):
1175 self.set.discard("d")
1176 self.assertEqual(self.set, set("abc"))
1177
1178 def test_clear(self):
1179 self.set.clear()
1180 self.assertEqual(len(self.set), 0)
1181
1182 def test_pop(self):
1183 popped = {}
1184 while self.set:
1185 popped[self.set.pop()] = None
1186 self.assertEqual(len(popped), len(self.values))
1187 for v in self.values:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001188 self.assertIn(v, popped)
Raymond Hettingera690a992003-11-16 16:17:49 +00001189
1190 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001191 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001192 self.assertEqual(self.set, set(self.values))
1193
1194 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001195 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001196 self.assertEqual(self.set, set(self.values))
1197
1198 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001199 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001200 self.assertEqual(self.set, set(self.values + ["z"]))
1201
1202#==============================================================================
1203
1204class TestSubsets(unittest.TestCase):
1205
1206 case2method = {"<=": "issubset",
1207 ">=": "issuperset",
1208 }
1209
1210 reverse = {"==": "==",
1211 "!=": "!=",
1212 "<": ">",
1213 ">": "<",
1214 "<=": ">=",
1215 ">=": "<=",
1216 }
1217
1218 def test_issubset(self):
1219 x = self.left
1220 y = self.right
1221 for case in "!=", "==", "<", "<=", ">", ">=":
1222 expected = case in self.cases
1223 # Test the binary infix spelling.
1224 result = eval("x" + case + "y", locals())
1225 self.assertEqual(result, expected)
1226 # Test the "friendly" method-name spelling, if one exists.
1227 if case in TestSubsets.case2method:
1228 method = getattr(x, TestSubsets.case2method[case])
1229 result = method(y)
1230 self.assertEqual(result, expected)
1231
1232 # Now do the same for the operands reversed.
1233 rcase = TestSubsets.reverse[case]
1234 result = eval("y" + rcase + "x", locals())
1235 self.assertEqual(result, expected)
1236 if rcase in TestSubsets.case2method:
1237 method = getattr(y, TestSubsets.case2method[rcase])
1238 result = method(x)
1239 self.assertEqual(result, expected)
1240#------------------------------------------------------------------------------
1241
1242class TestSubsetEqualEmpty(TestSubsets):
1243 left = set()
1244 right = set()
1245 name = "both empty"
1246 cases = "==", "<=", ">="
1247
1248#------------------------------------------------------------------------------
1249
1250class TestSubsetEqualNonEmpty(TestSubsets):
1251 left = set([1, 2])
1252 right = set([1, 2])
1253 name = "equal pair"
1254 cases = "==", "<=", ">="
1255
1256#------------------------------------------------------------------------------
1257
1258class TestSubsetEmptyNonEmpty(TestSubsets):
1259 left = set()
1260 right = set([1, 2])
1261 name = "one empty, one non-empty"
1262 cases = "!=", "<", "<="
1263
1264#------------------------------------------------------------------------------
1265
1266class TestSubsetPartial(TestSubsets):
1267 left = set([1])
1268 right = set([1, 2])
1269 name = "one a non-empty proper subset of other"
1270 cases = "!=", "<", "<="
1271
1272#------------------------------------------------------------------------------
1273
1274class TestSubsetNonOverlap(TestSubsets):
1275 left = set([1])
1276 right = set([2])
1277 name = "neither empty, neither contains"
1278 cases = "!="
1279
1280#==============================================================================
1281
1282class TestOnlySetsInBinaryOps(unittest.TestCase):
1283
1284 def test_eq_ne(self):
1285 # Unlike the others, this is testing that == and != *are* allowed.
1286 self.assertEqual(self.other == self.set, False)
1287 self.assertEqual(self.set == self.other, False)
1288 self.assertEqual(self.other != self.set, True)
1289 self.assertEqual(self.set != self.other, True)
1290
1291 def test_ge_gt_le_lt(self):
1292 self.assertRaises(TypeError, lambda: self.set < self.other)
1293 self.assertRaises(TypeError, lambda: self.set <= self.other)
1294 self.assertRaises(TypeError, lambda: self.set > self.other)
1295 self.assertRaises(TypeError, lambda: self.set >= self.other)
1296
1297 self.assertRaises(TypeError, lambda: self.other < self.set)
1298 self.assertRaises(TypeError, lambda: self.other <= self.set)
1299 self.assertRaises(TypeError, lambda: self.other > self.set)
1300 self.assertRaises(TypeError, lambda: self.other >= self.set)
1301
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001302 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001303 try:
1304 self.set |= self.other
1305 except TypeError:
1306 pass
1307 else:
1308 self.fail("expected TypeError")
1309
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001310 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001311 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001312 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001313 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001314 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001315
1316 def test_union(self):
1317 self.assertRaises(TypeError, lambda: self.set | self.other)
1318 self.assertRaises(TypeError, lambda: self.other | self.set)
1319 if self.otherIsIterable:
1320 self.set.union(self.other)
1321 else:
1322 self.assertRaises(TypeError, self.set.union, self.other)
1323
1324 def test_intersection_update_operator(self):
1325 try:
1326 self.set &= self.other
1327 except TypeError:
1328 pass
1329 else:
1330 self.fail("expected TypeError")
1331
1332 def test_intersection_update(self):
1333 if self.otherIsIterable:
1334 self.set.intersection_update(self.other)
1335 else:
1336 self.assertRaises(TypeError,
1337 self.set.intersection_update,
1338 self.other)
1339
1340 def test_intersection(self):
1341 self.assertRaises(TypeError, lambda: self.set & self.other)
1342 self.assertRaises(TypeError, lambda: self.other & self.set)
1343 if self.otherIsIterable:
1344 self.set.intersection(self.other)
1345 else:
1346 self.assertRaises(TypeError, self.set.intersection, self.other)
1347
1348 def test_sym_difference_update_operator(self):
1349 try:
1350 self.set ^= self.other
1351 except TypeError:
1352 pass
1353 else:
1354 self.fail("expected TypeError")
1355
1356 def test_sym_difference_update(self):
1357 if self.otherIsIterable:
1358 self.set.symmetric_difference_update(self.other)
1359 else:
1360 self.assertRaises(TypeError,
1361 self.set.symmetric_difference_update,
1362 self.other)
1363
1364 def test_sym_difference(self):
1365 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1366 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1367 if self.otherIsIterable:
1368 self.set.symmetric_difference(self.other)
1369 else:
1370 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1371
1372 def test_difference_update_operator(self):
1373 try:
1374 self.set -= self.other
1375 except TypeError:
1376 pass
1377 else:
1378 self.fail("expected TypeError")
1379
1380 def test_difference_update(self):
1381 if self.otherIsIterable:
1382 self.set.difference_update(self.other)
1383 else:
1384 self.assertRaises(TypeError,
1385 self.set.difference_update,
1386 self.other)
1387
1388 def test_difference(self):
1389 self.assertRaises(TypeError, lambda: self.set - self.other)
1390 self.assertRaises(TypeError, lambda: self.other - self.set)
1391 if self.otherIsIterable:
1392 self.set.difference(self.other)
1393 else:
1394 self.assertRaises(TypeError, self.set.difference, self.other)
1395
1396#------------------------------------------------------------------------------
1397
1398class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1399 def setUp(self):
1400 self.set = set((1, 2, 3))
1401 self.other = 19
1402 self.otherIsIterable = False
1403
1404#------------------------------------------------------------------------------
1405
1406class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1407 def setUp(self):
1408 self.set = set((1, 2, 3))
1409 self.other = {1:2, 3:4}
1410 self.otherIsIterable = True
1411
1412#------------------------------------------------------------------------------
1413
1414class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1415 def setUp(self):
1416 self.set = set((1, 2, 3))
1417 self.other = operator.add
1418 self.otherIsIterable = False
1419
1420#------------------------------------------------------------------------------
1421
1422class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1423 def setUp(self):
1424 self.set = set((1, 2, 3))
1425 self.other = (2, 4, 6)
1426 self.otherIsIterable = True
1427
1428#------------------------------------------------------------------------------
1429
1430class TestOnlySetsString(TestOnlySetsInBinaryOps):
1431 def setUp(self):
1432 self.set = set((1, 2, 3))
1433 self.other = 'abc'
1434 self.otherIsIterable = True
1435
1436#------------------------------------------------------------------------------
1437
1438class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1439 def setUp(self):
1440 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001441 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001442 yield i
1443 self.set = set((1, 2, 3))
1444 self.other = gen()
1445 self.otherIsIterable = True
1446
1447#==============================================================================
1448
1449class TestCopying(unittest.TestCase):
1450
1451 def test_copy(self):
1452 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001453 dup_list = sorted(dup, key=repr)
1454 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001455 self.assertEqual(len(dup_list), len(set_list))
1456 for i in range(len(dup_list)):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001457 self.assertTrue(dup_list[i] is set_list[i])
Raymond Hettingera690a992003-11-16 16:17:49 +00001458
1459 def test_deep_copy(self):
1460 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001461 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001462 dup_list = sorted(dup, key=repr)
1463 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001464 self.assertEqual(len(dup_list), len(set_list))
1465 for i in range(len(dup_list)):
1466 self.assertEqual(dup_list[i], set_list[i])
1467
1468#------------------------------------------------------------------------------
1469
1470class TestCopyingEmpty(TestCopying):
1471 def setUp(self):
1472 self.set = set()
1473
1474#------------------------------------------------------------------------------
1475
1476class TestCopyingSingleton(TestCopying):
1477 def setUp(self):
1478 self.set = set(["hello"])
1479
1480#------------------------------------------------------------------------------
1481
1482class TestCopyingTriple(TestCopying):
1483 def setUp(self):
1484 self.set = set(["zero", 0, None])
1485
1486#------------------------------------------------------------------------------
1487
1488class TestCopyingTuple(TestCopying):
1489 def setUp(self):
1490 self.set = set([(1, 2)])
1491
1492#------------------------------------------------------------------------------
1493
1494class TestCopyingNested(TestCopying):
1495 def setUp(self):
1496 self.set = set([((1, 2), (3, 4))])
1497
1498#==============================================================================
1499
1500class TestIdentities(unittest.TestCase):
1501 def setUp(self):
1502 self.a = set('abracadabra')
1503 self.b = set('alacazam')
1504
1505 def test_binopsVsSubsets(self):
1506 a, b = self.a, self.b
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001507 self.assertTrue(a - b < a)
1508 self.assertTrue(b - a < b)
1509 self.assertTrue(a & b < a)
1510 self.assertTrue(a & b < b)
1511 self.assertTrue(a | b > a)
1512 self.assertTrue(a | b > b)
1513 self.assertTrue(a ^ b < a | b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001514
1515 def test_commutativity(self):
1516 a, b = self.a, self.b
1517 self.assertEqual(a&b, b&a)
1518 self.assertEqual(a|b, b|a)
1519 self.assertEqual(a^b, b^a)
1520 if a != b:
1521 self.assertNotEqual(a-b, b-a)
1522
1523 def test_summations(self):
1524 # check that sums of parts equal the whole
1525 a, b = self.a, self.b
1526 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1527 self.assertEqual((a&b)|(a^b), a|b)
1528 self.assertEqual(a|(b-a), a|b)
1529 self.assertEqual((a-b)|b, a|b)
1530 self.assertEqual((a-b)|(a&b), a)
1531 self.assertEqual((b-a)|(a&b), b)
1532 self.assertEqual((a-b)|(b-a), a^b)
1533
1534 def test_exclusion(self):
1535 # check that inverse operations show non-overlap
1536 a, b, zero = self.a, self.b, set()
1537 self.assertEqual((a-b)&b, zero)
1538 self.assertEqual((b-a)&a, zero)
1539 self.assertEqual((a&b)&(a^b), zero)
1540
1541# Tests derived from test_itertools.py =======================================
1542
1543def R(seqn):
1544 'Regular generator'
1545 for i in seqn:
1546 yield i
1547
1548class G:
1549 'Sequence using __getitem__'
1550 def __init__(self, seqn):
1551 self.seqn = seqn
1552 def __getitem__(self, i):
1553 return self.seqn[i]
1554
1555class I:
1556 'Sequence using iterator protocol'
1557 def __init__(self, seqn):
1558 self.seqn = seqn
1559 self.i = 0
1560 def __iter__(self):
1561 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001562 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001563 if self.i >= len(self.seqn): raise StopIteration
1564 v = self.seqn[self.i]
1565 self.i += 1
1566 return v
1567
1568class Ig:
1569 'Sequence using iterator protocol defined with a generator'
1570 def __init__(self, seqn):
1571 self.seqn = seqn
1572 self.i = 0
1573 def __iter__(self):
1574 for val in self.seqn:
1575 yield val
1576
1577class X:
1578 'Missing __getitem__ and __iter__'
1579 def __init__(self, seqn):
1580 self.seqn = seqn
1581 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001582 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001583 if self.i >= len(self.seqn): raise StopIteration
1584 v = self.seqn[self.i]
1585 self.i += 1
1586 return v
1587
1588class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001589 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001590 def __init__(self, seqn):
1591 self.seqn = seqn
1592 self.i = 0
1593 def __iter__(self):
1594 return self
1595
1596class E:
1597 'Test propagation of exceptions'
1598 def __init__(self, seqn):
1599 self.seqn = seqn
1600 self.i = 0
1601 def __iter__(self):
1602 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001603 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001604 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001605
1606class S:
1607 'Test immediate stop'
1608 def __init__(self, seqn):
1609 pass
1610 def __iter__(self):
1611 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001612 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001613 raise StopIteration
1614
Raymond Hettingera6c60372008-03-13 01:26:19 +00001615from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001616def L(seqn):
1617 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001618 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001619
1620class TestVariousIteratorArgs(unittest.TestCase):
1621
1622 def test_constructor(self):
1623 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001624 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001625 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001626 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001627 self.assertRaises(TypeError, cons , X(s))
1628 self.assertRaises(TypeError, cons , N(s))
1629 self.assertRaises(ZeroDivisionError, cons , E(s))
1630
1631 def test_inline_methods(self):
1632 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001633 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001634 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001635 for g in (G, I, Ig, L, R):
1636 expected = meth(data)
1637 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001638 if isinstance(expected, bool):
1639 self.assertEqual(actual, expected)
1640 else:
1641 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001642 self.assertRaises(TypeError, meth, X(s))
1643 self.assertRaises(TypeError, meth, N(s))
1644 self.assertRaises(ZeroDivisionError, meth, E(s))
1645
1646 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001647 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001648 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001649 'difference_update', 'symmetric_difference_update'):
1650 for g in (G, I, Ig, S, L, R):
1651 s = set('january')
1652 t = s.copy()
1653 getattr(s, methname)(list(g(data)))
1654 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001655 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001656
1657 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1658 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1659 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1660
Christian Heimes969fe572008-01-25 11:23:10 +00001661# Application tests (based on David Eppstein's graph recipes ====================================
1662
1663def powerset(U):
1664 """Generates all subsets of a set or sequence U."""
1665 U = iter(U)
1666 try:
1667 x = frozenset([next(U)])
1668 for S in powerset(U):
1669 yield S
1670 yield S | x
1671 except StopIteration:
1672 yield frozenset()
1673
1674def cube(n):
1675 """Graph of n-dimensional hypercube."""
1676 singletons = [frozenset([x]) for x in range(n)]
1677 return dict([(x, frozenset([x^s for s in singletons]))
1678 for x in powerset(range(n))])
1679
1680def linegraph(G):
1681 """Graph, the vertices of which are edges of G,
1682 with two vertices being adjacent iff the corresponding
1683 edges share a vertex."""
1684 L = {}
1685 for x in G:
1686 for y in G[x]:
1687 nx = [frozenset([x,z]) for z in G[x] if z != y]
1688 ny = [frozenset([y,z]) for z in G[y] if z != x]
1689 L[frozenset([x,y])] = frozenset(nx+ny)
1690 return L
1691
1692def faces(G):
1693 'Return a set of faces in G. Where a face is a set of vertices on that face'
1694 # currently limited to triangles,squares, and pentagons
1695 f = set()
1696 for v1, edges in G.items():
1697 for v2 in edges:
1698 for v3 in G[v2]:
1699 if v1 == v3:
1700 continue
1701 if v1 in G[v3]:
1702 f.add(frozenset([v1, v2, v3]))
1703 else:
1704 for v4 in G[v3]:
1705 if v4 == v2:
1706 continue
1707 if v1 in G[v4]:
1708 f.add(frozenset([v1, v2, v3, v4]))
1709 else:
1710 for v5 in G[v4]:
1711 if v5 == v3 or v5 == v2:
1712 continue
1713 if v1 in G[v5]:
1714 f.add(frozenset([v1, v2, v3, v4, v5]))
1715 return f
1716
1717
1718class TestGraphs(unittest.TestCase):
1719
1720 def test_cube(self):
1721
1722 g = cube(3) # vert --> {v1, v2, v3}
1723 vertices1 = set(g)
1724 self.assertEqual(len(vertices1), 8) # eight vertices
1725 for edge in g.values():
1726 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1727 vertices2 = set(v for edges in g.values() for v in edges)
1728 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1729
1730 cubefaces = faces(g)
1731 self.assertEqual(len(cubefaces), 6) # six faces
1732 for face in cubefaces:
1733 self.assertEqual(len(face), 4) # each face is a square
1734
1735 def test_cuboctahedron(self):
1736
1737 # http://en.wikipedia.org/wiki/Cuboctahedron
1738 # 8 triangular faces and 6 square faces
1739 # 12 indentical vertices each connecting a triangle and square
1740
1741 g = cube(3)
1742 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1743 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1744
1745 vertices = set(cuboctahedron)
1746 for edges in cuboctahedron.values():
1747 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1748 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1749 self.assertEqual(vertices, othervertices) # edge vertices in original set
1750
1751 cubofaces = faces(cuboctahedron)
1752 facesizes = collections.defaultdict(int)
1753 for face in cubofaces:
1754 facesizes[len(face)] += 1
1755 self.assertEqual(facesizes[3], 8) # eight triangular faces
1756 self.assertEqual(facesizes[4], 6) # six square faces
1757
1758 for vertex in cuboctahedron:
1759 edge = vertex # Cuboctahedron vertices are edges in Cube
1760 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1761 for cubevert in edge:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001762 self.assertIn(cubevert, g)
Christian Heimes969fe572008-01-25 11:23:10 +00001763
1764
Raymond Hettingera690a992003-11-16 16:17:49 +00001765#==============================================================================
1766
1767def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001768 test_classes = (
1769 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001770 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001771 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001772 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001773 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001774 TestSetOfSets,
1775 TestExceptionPropagation,
1776 TestBasicOpsEmpty,
1777 TestBasicOpsSingleton,
1778 TestBasicOpsTuple,
1779 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001780 TestBasicOpsString,
1781 TestBasicOpsBytes,
1782 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001783 TestBinaryOps,
1784 TestUpdateOps,
1785 TestMutate,
1786 TestSubsetEqualEmpty,
1787 TestSubsetEqualNonEmpty,
1788 TestSubsetEmptyNonEmpty,
1789 TestSubsetPartial,
1790 TestSubsetNonOverlap,
1791 TestOnlySetsNumeric,
1792 TestOnlySetsDict,
1793 TestOnlySetsOperator,
1794 TestOnlySetsTuple,
1795 TestOnlySetsString,
1796 TestOnlySetsGenerator,
1797 TestCopyingEmpty,
1798 TestCopyingSingleton,
1799 TestCopyingTriple,
1800 TestCopyingTuple,
1801 TestCopyingNested,
1802 TestIdentities,
1803 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001804 TestGraphs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001805 )
1806
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001807 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001808
1809 # verify reference counting
1810 if verbose and hasattr(sys, "gettotalrefcount"):
1811 import gc
1812 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001813 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001814 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001815 gc.collect()
1816 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001817 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001818
1819if __name__ == "__main__":
1820 test_main(verbose=True)