blob: 1e0a909c0a05f4173b3326687e278e9dec7827e1 [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):
Brett Cannon241bd982010-03-20 21:55:48 +0000910 self._warning_filters = support.check_warnings()
911 self._warning_filters.__enter__()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000912 warnings.simplefilter('ignore', BytesWarning)
913 self.case = "string and bytes set"
914 self.values = ["a", "b", b"a", b"b"]
915 self.set = set(self.values)
916 self.dup = set(self.values)
917 self.length = 4
918 self.repr = "{'a', b'a', 'b', b'b'}"
919
920 def tearDown(self):
Brett Cannon241bd982010-03-20 21:55:48 +0000921 self._warning_filters.__exit__(None, None, None)
Christian Heimes0ded5b52007-12-10 15:50:56 +0000922
Raymond Hettingera690a992003-11-16 16:17:49 +0000923#==============================================================================
924
925def baditer():
926 raise TypeError
927 yield True
928
929def gooditer():
930 yield True
931
932class TestExceptionPropagation(unittest.TestCase):
933 """SF 628246: Set constructor should not trap iterator TypeErrors"""
934
935 def test_instanceWithException(self):
936 self.assertRaises(TypeError, set, baditer())
937
938 def test_instancesWithoutException(self):
939 # All of these iterables should load without exception.
940 set([1,2,3])
941 set((1,2,3))
942 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000943 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000944 set('abc')
945 set(gooditer())
946
Neal Norwitzfcf44352005-11-27 20:37:43 +0000947 def test_changingSizeWhileIterating(self):
948 s = set([1,2,3])
949 try:
950 for i in s:
951 s.update([4])
952 except RuntimeError:
953 pass
954 else:
955 self.fail("no exception when changing size during iteration")
956
Raymond Hettingera690a992003-11-16 16:17:49 +0000957#==============================================================================
958
959class TestSetOfSets(unittest.TestCase):
960 def test_constructor(self):
961 inner = frozenset([1])
962 outer = set([inner])
963 element = outer.pop()
964 self.assertEqual(type(element), frozenset)
965 outer.add(inner) # Rebuild set of sets with .add method
966 outer.remove(inner)
967 self.assertEqual(outer, set()) # Verify that remove worked
968 outer.discard(inner) # Absence of KeyError indicates working fine
969
970#==============================================================================
971
972class TestBinaryOps(unittest.TestCase):
973 def setUp(self):
974 self.set = set((2, 4, 6))
975
976 def test_eq(self): # SF bug 643115
977 self.assertEqual(self.set, set({2:1,4:3,6:5}))
978
979 def test_union_subset(self):
980 result = self.set | set([2])
981 self.assertEqual(result, set((2, 4, 6)))
982
983 def test_union_superset(self):
984 result = self.set | set([2, 4, 6, 8])
985 self.assertEqual(result, set([2, 4, 6, 8]))
986
987 def test_union_overlap(self):
988 result = self.set | set([3, 4, 5])
989 self.assertEqual(result, set([2, 3, 4, 5, 6]))
990
991 def test_union_non_overlap(self):
992 result = self.set | set([8])
993 self.assertEqual(result, set([2, 4, 6, 8]))
994
995 def test_intersection_subset(self):
996 result = self.set & set((2, 4))
997 self.assertEqual(result, set((2, 4)))
998
999 def test_intersection_superset(self):
1000 result = self.set & set([2, 4, 6, 8])
1001 self.assertEqual(result, set([2, 4, 6]))
1002
1003 def test_intersection_overlap(self):
1004 result = self.set & set([3, 4, 5])
1005 self.assertEqual(result, set([4]))
1006
1007 def test_intersection_non_overlap(self):
1008 result = self.set & set([8])
1009 self.assertEqual(result, empty_set)
1010
Guido van Rossum58da9312007-11-10 23:39:45 +00001011 def test_isdisjoint_subset(self):
1012 result = self.set.isdisjoint(set((2, 4)))
1013 self.assertEqual(result, False)
1014
1015 def test_isdisjoint_superset(self):
1016 result = self.set.isdisjoint(set([2, 4, 6, 8]))
1017 self.assertEqual(result, False)
1018
1019 def test_isdisjoint_overlap(self):
1020 result = self.set.isdisjoint(set([3, 4, 5]))
1021 self.assertEqual(result, False)
1022
1023 def test_isdisjoint_non_overlap(self):
1024 result = self.set.isdisjoint(set([8]))
1025 self.assertEqual(result, True)
1026
Raymond Hettingera690a992003-11-16 16:17:49 +00001027 def test_sym_difference_subset(self):
1028 result = self.set ^ set((2, 4))
1029 self.assertEqual(result, set([6]))
1030
1031 def test_sym_difference_superset(self):
1032 result = self.set ^ set((2, 4, 6, 8))
1033 self.assertEqual(result, set([8]))
1034
1035 def test_sym_difference_overlap(self):
1036 result = self.set ^ set((3, 4, 5))
1037 self.assertEqual(result, set([2, 3, 5, 6]))
1038
1039 def test_sym_difference_non_overlap(self):
1040 result = self.set ^ set([8])
1041 self.assertEqual(result, set([2, 4, 6, 8]))
1042
Raymond Hettingera690a992003-11-16 16:17:49 +00001043#==============================================================================
1044
1045class TestUpdateOps(unittest.TestCase):
1046 def setUp(self):
1047 self.set = set((2, 4, 6))
1048
1049 def test_union_subset(self):
1050 self.set |= set([2])
1051 self.assertEqual(self.set, set((2, 4, 6)))
1052
1053 def test_union_superset(self):
1054 self.set |= set([2, 4, 6, 8])
1055 self.assertEqual(self.set, set([2, 4, 6, 8]))
1056
1057 def test_union_overlap(self):
1058 self.set |= set([3, 4, 5])
1059 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1060
1061 def test_union_non_overlap(self):
1062 self.set |= set([8])
1063 self.assertEqual(self.set, set([2, 4, 6, 8]))
1064
1065 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001066 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001067 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1068
1069 def test_intersection_subset(self):
1070 self.set &= set((2, 4))
1071 self.assertEqual(self.set, set((2, 4)))
1072
1073 def test_intersection_superset(self):
1074 self.set &= set([2, 4, 6, 8])
1075 self.assertEqual(self.set, set([2, 4, 6]))
1076
1077 def test_intersection_overlap(self):
1078 self.set &= set([3, 4, 5])
1079 self.assertEqual(self.set, set([4]))
1080
1081 def test_intersection_non_overlap(self):
1082 self.set &= set([8])
1083 self.assertEqual(self.set, empty_set)
1084
1085 def test_intersection_method_call(self):
1086 self.set.intersection_update(set([3, 4, 5]))
1087 self.assertEqual(self.set, set([4]))
1088
1089 def test_sym_difference_subset(self):
1090 self.set ^= set((2, 4))
1091 self.assertEqual(self.set, set([6]))
1092
1093 def test_sym_difference_superset(self):
1094 self.set ^= set((2, 4, 6, 8))
1095 self.assertEqual(self.set, set([8]))
1096
1097 def test_sym_difference_overlap(self):
1098 self.set ^= set((3, 4, 5))
1099 self.assertEqual(self.set, set([2, 3, 5, 6]))
1100
1101 def test_sym_difference_non_overlap(self):
1102 self.set ^= set([8])
1103 self.assertEqual(self.set, set([2, 4, 6, 8]))
1104
1105 def test_sym_difference_method_call(self):
1106 self.set.symmetric_difference_update(set([3, 4, 5]))
1107 self.assertEqual(self.set, set([2, 3, 5, 6]))
1108
1109 def test_difference_subset(self):
1110 self.set -= set((2, 4))
1111 self.assertEqual(self.set, set([6]))
1112
1113 def test_difference_superset(self):
1114 self.set -= set((2, 4, 6, 8))
1115 self.assertEqual(self.set, set([]))
1116
1117 def test_difference_overlap(self):
1118 self.set -= set((3, 4, 5))
1119 self.assertEqual(self.set, set([2, 6]))
1120
1121 def test_difference_non_overlap(self):
1122 self.set -= set([8])
1123 self.assertEqual(self.set, set([2, 4, 6]))
1124
1125 def test_difference_method_call(self):
1126 self.set.difference_update(set([3, 4, 5]))
1127 self.assertEqual(self.set, set([2, 6]))
1128
1129#==============================================================================
1130
1131class TestMutate(unittest.TestCase):
1132 def setUp(self):
1133 self.values = ["a", "b", "c"]
1134 self.set = set(self.values)
1135
1136 def test_add_present(self):
1137 self.set.add("c")
1138 self.assertEqual(self.set, set("abc"))
1139
1140 def test_add_absent(self):
1141 self.set.add("d")
1142 self.assertEqual(self.set, set("abcd"))
1143
1144 def test_add_until_full(self):
1145 tmp = set()
1146 expected_len = 0
1147 for v in self.values:
1148 tmp.add(v)
1149 expected_len += 1
1150 self.assertEqual(len(tmp), expected_len)
1151 self.assertEqual(tmp, self.set)
1152
1153 def test_remove_present(self):
1154 self.set.remove("b")
1155 self.assertEqual(self.set, set("ac"))
1156
1157 def test_remove_absent(self):
1158 try:
1159 self.set.remove("d")
1160 self.fail("Removing missing element should have raised LookupError")
1161 except LookupError:
1162 pass
1163
1164 def test_remove_until_empty(self):
1165 expected_len = len(self.set)
1166 for v in self.values:
1167 self.set.remove(v)
1168 expected_len -= 1
1169 self.assertEqual(len(self.set), expected_len)
1170
1171 def test_discard_present(self):
1172 self.set.discard("c")
1173 self.assertEqual(self.set, set("ab"))
1174
1175 def test_discard_absent(self):
1176 self.set.discard("d")
1177 self.assertEqual(self.set, set("abc"))
1178
1179 def test_clear(self):
1180 self.set.clear()
1181 self.assertEqual(len(self.set), 0)
1182
1183 def test_pop(self):
1184 popped = {}
1185 while self.set:
1186 popped[self.set.pop()] = None
1187 self.assertEqual(len(popped), len(self.values))
1188 for v in self.values:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001189 self.assertIn(v, popped)
Raymond Hettingera690a992003-11-16 16:17:49 +00001190
1191 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001192 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001193 self.assertEqual(self.set, set(self.values))
1194
1195 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001196 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001197 self.assertEqual(self.set, set(self.values))
1198
1199 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001200 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001201 self.assertEqual(self.set, set(self.values + ["z"]))
1202
1203#==============================================================================
1204
1205class TestSubsets(unittest.TestCase):
1206
1207 case2method = {"<=": "issubset",
1208 ">=": "issuperset",
1209 }
1210
1211 reverse = {"==": "==",
1212 "!=": "!=",
1213 "<": ">",
1214 ">": "<",
1215 "<=": ">=",
1216 ">=": "<=",
1217 }
1218
1219 def test_issubset(self):
1220 x = self.left
1221 y = self.right
1222 for case in "!=", "==", "<", "<=", ">", ">=":
1223 expected = case in self.cases
1224 # Test the binary infix spelling.
1225 result = eval("x" + case + "y", locals())
1226 self.assertEqual(result, expected)
1227 # Test the "friendly" method-name spelling, if one exists.
1228 if case in TestSubsets.case2method:
1229 method = getattr(x, TestSubsets.case2method[case])
1230 result = method(y)
1231 self.assertEqual(result, expected)
1232
1233 # Now do the same for the operands reversed.
1234 rcase = TestSubsets.reverse[case]
1235 result = eval("y" + rcase + "x", locals())
1236 self.assertEqual(result, expected)
1237 if rcase in TestSubsets.case2method:
1238 method = getattr(y, TestSubsets.case2method[rcase])
1239 result = method(x)
1240 self.assertEqual(result, expected)
1241#------------------------------------------------------------------------------
1242
1243class TestSubsetEqualEmpty(TestSubsets):
1244 left = set()
1245 right = set()
1246 name = "both empty"
1247 cases = "==", "<=", ">="
1248
1249#------------------------------------------------------------------------------
1250
1251class TestSubsetEqualNonEmpty(TestSubsets):
1252 left = set([1, 2])
1253 right = set([1, 2])
1254 name = "equal pair"
1255 cases = "==", "<=", ">="
1256
1257#------------------------------------------------------------------------------
1258
1259class TestSubsetEmptyNonEmpty(TestSubsets):
1260 left = set()
1261 right = set([1, 2])
1262 name = "one empty, one non-empty"
1263 cases = "!=", "<", "<="
1264
1265#------------------------------------------------------------------------------
1266
1267class TestSubsetPartial(TestSubsets):
1268 left = set([1])
1269 right = set([1, 2])
1270 name = "one a non-empty proper subset of other"
1271 cases = "!=", "<", "<="
1272
1273#------------------------------------------------------------------------------
1274
1275class TestSubsetNonOverlap(TestSubsets):
1276 left = set([1])
1277 right = set([2])
1278 name = "neither empty, neither contains"
1279 cases = "!="
1280
1281#==============================================================================
1282
1283class TestOnlySetsInBinaryOps(unittest.TestCase):
1284
1285 def test_eq_ne(self):
1286 # Unlike the others, this is testing that == and != *are* allowed.
1287 self.assertEqual(self.other == self.set, False)
1288 self.assertEqual(self.set == self.other, False)
1289 self.assertEqual(self.other != self.set, True)
1290 self.assertEqual(self.set != self.other, True)
1291
1292 def test_ge_gt_le_lt(self):
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 self.assertRaises(TypeError, lambda: self.set >= self.other)
1297
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 self.assertRaises(TypeError, lambda: self.other >= self.set)
1302
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001303 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001304 try:
1305 self.set |= self.other
1306 except TypeError:
1307 pass
1308 else:
1309 self.fail("expected TypeError")
1310
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001311 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001312 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001313 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001314 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001315 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001316
1317 def test_union(self):
1318 self.assertRaises(TypeError, lambda: self.set | self.other)
1319 self.assertRaises(TypeError, lambda: self.other | self.set)
1320 if self.otherIsIterable:
1321 self.set.union(self.other)
1322 else:
1323 self.assertRaises(TypeError, self.set.union, self.other)
1324
1325 def test_intersection_update_operator(self):
1326 try:
1327 self.set &= self.other
1328 except TypeError:
1329 pass
1330 else:
1331 self.fail("expected TypeError")
1332
1333 def test_intersection_update(self):
1334 if self.otherIsIterable:
1335 self.set.intersection_update(self.other)
1336 else:
1337 self.assertRaises(TypeError,
1338 self.set.intersection_update,
1339 self.other)
1340
1341 def test_intersection(self):
1342 self.assertRaises(TypeError, lambda: self.set & self.other)
1343 self.assertRaises(TypeError, lambda: self.other & self.set)
1344 if self.otherIsIterable:
1345 self.set.intersection(self.other)
1346 else:
1347 self.assertRaises(TypeError, self.set.intersection, self.other)
1348
1349 def test_sym_difference_update_operator(self):
1350 try:
1351 self.set ^= self.other
1352 except TypeError:
1353 pass
1354 else:
1355 self.fail("expected TypeError")
1356
1357 def test_sym_difference_update(self):
1358 if self.otherIsIterable:
1359 self.set.symmetric_difference_update(self.other)
1360 else:
1361 self.assertRaises(TypeError,
1362 self.set.symmetric_difference_update,
1363 self.other)
1364
1365 def test_sym_difference(self):
1366 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1367 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1368 if self.otherIsIterable:
1369 self.set.symmetric_difference(self.other)
1370 else:
1371 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1372
1373 def test_difference_update_operator(self):
1374 try:
1375 self.set -= self.other
1376 except TypeError:
1377 pass
1378 else:
1379 self.fail("expected TypeError")
1380
1381 def test_difference_update(self):
1382 if self.otherIsIterable:
1383 self.set.difference_update(self.other)
1384 else:
1385 self.assertRaises(TypeError,
1386 self.set.difference_update,
1387 self.other)
1388
1389 def test_difference(self):
1390 self.assertRaises(TypeError, lambda: self.set - self.other)
1391 self.assertRaises(TypeError, lambda: self.other - self.set)
1392 if self.otherIsIterable:
1393 self.set.difference(self.other)
1394 else:
1395 self.assertRaises(TypeError, self.set.difference, self.other)
1396
1397#------------------------------------------------------------------------------
1398
1399class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1400 def setUp(self):
1401 self.set = set((1, 2, 3))
1402 self.other = 19
1403 self.otherIsIterable = False
1404
1405#------------------------------------------------------------------------------
1406
1407class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1408 def setUp(self):
1409 self.set = set((1, 2, 3))
1410 self.other = {1:2, 3:4}
1411 self.otherIsIterable = True
1412
1413#------------------------------------------------------------------------------
1414
1415class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1416 def setUp(self):
1417 self.set = set((1, 2, 3))
1418 self.other = operator.add
1419 self.otherIsIterable = False
1420
1421#------------------------------------------------------------------------------
1422
1423class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1424 def setUp(self):
1425 self.set = set((1, 2, 3))
1426 self.other = (2, 4, 6)
1427 self.otherIsIterable = True
1428
1429#------------------------------------------------------------------------------
1430
1431class TestOnlySetsString(TestOnlySetsInBinaryOps):
1432 def setUp(self):
1433 self.set = set((1, 2, 3))
1434 self.other = 'abc'
1435 self.otherIsIterable = True
1436
1437#------------------------------------------------------------------------------
1438
1439class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1440 def setUp(self):
1441 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001442 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001443 yield i
1444 self.set = set((1, 2, 3))
1445 self.other = gen()
1446 self.otherIsIterable = True
1447
1448#==============================================================================
1449
1450class TestCopying(unittest.TestCase):
1451
1452 def test_copy(self):
1453 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001454 dup_list = sorted(dup, key=repr)
1455 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001456 self.assertEqual(len(dup_list), len(set_list))
1457 for i in range(len(dup_list)):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001458 self.assertTrue(dup_list[i] is set_list[i])
Raymond Hettingera690a992003-11-16 16:17:49 +00001459
1460 def test_deep_copy(self):
1461 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001462 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001463 dup_list = sorted(dup, key=repr)
1464 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001465 self.assertEqual(len(dup_list), len(set_list))
1466 for i in range(len(dup_list)):
1467 self.assertEqual(dup_list[i], set_list[i])
1468
1469#------------------------------------------------------------------------------
1470
1471class TestCopyingEmpty(TestCopying):
1472 def setUp(self):
1473 self.set = set()
1474
1475#------------------------------------------------------------------------------
1476
1477class TestCopyingSingleton(TestCopying):
1478 def setUp(self):
1479 self.set = set(["hello"])
1480
1481#------------------------------------------------------------------------------
1482
1483class TestCopyingTriple(TestCopying):
1484 def setUp(self):
1485 self.set = set(["zero", 0, None])
1486
1487#------------------------------------------------------------------------------
1488
1489class TestCopyingTuple(TestCopying):
1490 def setUp(self):
1491 self.set = set([(1, 2)])
1492
1493#------------------------------------------------------------------------------
1494
1495class TestCopyingNested(TestCopying):
1496 def setUp(self):
1497 self.set = set([((1, 2), (3, 4))])
1498
1499#==============================================================================
1500
1501class TestIdentities(unittest.TestCase):
1502 def setUp(self):
1503 self.a = set('abracadabra')
1504 self.b = set('alacazam')
1505
1506 def test_binopsVsSubsets(self):
1507 a, b = self.a, self.b
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001508 self.assertTrue(a - b < a)
1509 self.assertTrue(b - a < b)
1510 self.assertTrue(a & b < a)
1511 self.assertTrue(a & b < b)
1512 self.assertTrue(a | b > a)
1513 self.assertTrue(a | b > b)
1514 self.assertTrue(a ^ b < a | b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001515
1516 def test_commutativity(self):
1517 a, b = self.a, self.b
1518 self.assertEqual(a&b, b&a)
1519 self.assertEqual(a|b, b|a)
1520 self.assertEqual(a^b, b^a)
1521 if a != b:
1522 self.assertNotEqual(a-b, b-a)
1523
1524 def test_summations(self):
1525 # check that sums of parts equal the whole
1526 a, b = self.a, self.b
1527 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1528 self.assertEqual((a&b)|(a^b), a|b)
1529 self.assertEqual(a|(b-a), a|b)
1530 self.assertEqual((a-b)|b, a|b)
1531 self.assertEqual((a-b)|(a&b), a)
1532 self.assertEqual((b-a)|(a&b), b)
1533 self.assertEqual((a-b)|(b-a), a^b)
1534
1535 def test_exclusion(self):
1536 # check that inverse operations show non-overlap
1537 a, b, zero = self.a, self.b, set()
1538 self.assertEqual((a-b)&b, zero)
1539 self.assertEqual((b-a)&a, zero)
1540 self.assertEqual((a&b)&(a^b), zero)
1541
1542# Tests derived from test_itertools.py =======================================
1543
1544def R(seqn):
1545 'Regular generator'
1546 for i in seqn:
1547 yield i
1548
1549class G:
1550 'Sequence using __getitem__'
1551 def __init__(self, seqn):
1552 self.seqn = seqn
1553 def __getitem__(self, i):
1554 return self.seqn[i]
1555
1556class I:
1557 'Sequence using iterator protocol'
1558 def __init__(self, seqn):
1559 self.seqn = seqn
1560 self.i = 0
1561 def __iter__(self):
1562 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001563 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001564 if self.i >= len(self.seqn): raise StopIteration
1565 v = self.seqn[self.i]
1566 self.i += 1
1567 return v
1568
1569class Ig:
1570 'Sequence using iterator protocol defined with a generator'
1571 def __init__(self, seqn):
1572 self.seqn = seqn
1573 self.i = 0
1574 def __iter__(self):
1575 for val in self.seqn:
1576 yield val
1577
1578class X:
1579 'Missing __getitem__ and __iter__'
1580 def __init__(self, seqn):
1581 self.seqn = seqn
1582 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001583 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001584 if self.i >= len(self.seqn): raise StopIteration
1585 v = self.seqn[self.i]
1586 self.i += 1
1587 return v
1588
1589class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001590 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001591 def __init__(self, seqn):
1592 self.seqn = seqn
1593 self.i = 0
1594 def __iter__(self):
1595 return self
1596
1597class E:
1598 'Test propagation of exceptions'
1599 def __init__(self, seqn):
1600 self.seqn = seqn
1601 self.i = 0
1602 def __iter__(self):
1603 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001604 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001605 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001606
1607class S:
1608 'Test immediate stop'
1609 def __init__(self, seqn):
1610 pass
1611 def __iter__(self):
1612 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001613 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001614 raise StopIteration
1615
Raymond Hettingera6c60372008-03-13 01:26:19 +00001616from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001617def L(seqn):
1618 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001619 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001620
1621class TestVariousIteratorArgs(unittest.TestCase):
1622
1623 def test_constructor(self):
1624 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001625 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001626 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001627 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001628 self.assertRaises(TypeError, cons , X(s))
1629 self.assertRaises(TypeError, cons , N(s))
1630 self.assertRaises(ZeroDivisionError, cons , E(s))
1631
1632 def test_inline_methods(self):
1633 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001634 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001635 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001636 for g in (G, I, Ig, L, R):
1637 expected = meth(data)
1638 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001639 if isinstance(expected, bool):
1640 self.assertEqual(actual, expected)
1641 else:
1642 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001643 self.assertRaises(TypeError, meth, X(s))
1644 self.assertRaises(TypeError, meth, N(s))
1645 self.assertRaises(ZeroDivisionError, meth, E(s))
1646
1647 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001648 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001649 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001650 'difference_update', 'symmetric_difference_update'):
1651 for g in (G, I, Ig, S, L, R):
1652 s = set('january')
1653 t = s.copy()
1654 getattr(s, methname)(list(g(data)))
1655 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001656 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001657
1658 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1659 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1660 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1661
Christian Heimes969fe572008-01-25 11:23:10 +00001662# Application tests (based on David Eppstein's graph recipes ====================================
1663
1664def powerset(U):
1665 """Generates all subsets of a set or sequence U."""
1666 U = iter(U)
1667 try:
1668 x = frozenset([next(U)])
1669 for S in powerset(U):
1670 yield S
1671 yield S | x
1672 except StopIteration:
1673 yield frozenset()
1674
1675def cube(n):
1676 """Graph of n-dimensional hypercube."""
1677 singletons = [frozenset([x]) for x in range(n)]
1678 return dict([(x, frozenset([x^s for s in singletons]))
1679 for x in powerset(range(n))])
1680
1681def linegraph(G):
1682 """Graph, the vertices of which are edges of G,
1683 with two vertices being adjacent iff the corresponding
1684 edges share a vertex."""
1685 L = {}
1686 for x in G:
1687 for y in G[x]:
1688 nx = [frozenset([x,z]) for z in G[x] if z != y]
1689 ny = [frozenset([y,z]) for z in G[y] if z != x]
1690 L[frozenset([x,y])] = frozenset(nx+ny)
1691 return L
1692
1693def faces(G):
1694 'Return a set of faces in G. Where a face is a set of vertices on that face'
1695 # currently limited to triangles,squares, and pentagons
1696 f = set()
1697 for v1, edges in G.items():
1698 for v2 in edges:
1699 for v3 in G[v2]:
1700 if v1 == v3:
1701 continue
1702 if v1 in G[v3]:
1703 f.add(frozenset([v1, v2, v3]))
1704 else:
1705 for v4 in G[v3]:
1706 if v4 == v2:
1707 continue
1708 if v1 in G[v4]:
1709 f.add(frozenset([v1, v2, v3, v4]))
1710 else:
1711 for v5 in G[v4]:
1712 if v5 == v3 or v5 == v2:
1713 continue
1714 if v1 in G[v5]:
1715 f.add(frozenset([v1, v2, v3, v4, v5]))
1716 return f
1717
1718
1719class TestGraphs(unittest.TestCase):
1720
1721 def test_cube(self):
1722
1723 g = cube(3) # vert --> {v1, v2, v3}
1724 vertices1 = set(g)
1725 self.assertEqual(len(vertices1), 8) # eight vertices
1726 for edge in g.values():
1727 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1728 vertices2 = set(v for edges in g.values() for v in edges)
1729 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1730
1731 cubefaces = faces(g)
1732 self.assertEqual(len(cubefaces), 6) # six faces
1733 for face in cubefaces:
1734 self.assertEqual(len(face), 4) # each face is a square
1735
1736 def test_cuboctahedron(self):
1737
1738 # http://en.wikipedia.org/wiki/Cuboctahedron
1739 # 8 triangular faces and 6 square faces
1740 # 12 indentical vertices each connecting a triangle and square
1741
1742 g = cube(3)
1743 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1744 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1745
1746 vertices = set(cuboctahedron)
1747 for edges in cuboctahedron.values():
1748 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1749 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1750 self.assertEqual(vertices, othervertices) # edge vertices in original set
1751
1752 cubofaces = faces(cuboctahedron)
1753 facesizes = collections.defaultdict(int)
1754 for face in cubofaces:
1755 facesizes[len(face)] += 1
1756 self.assertEqual(facesizes[3], 8) # eight triangular faces
1757 self.assertEqual(facesizes[4], 6) # six square faces
1758
1759 for vertex in cuboctahedron:
1760 edge = vertex # Cuboctahedron vertices are edges in Cube
1761 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1762 for cubevert in edge:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001763 self.assertIn(cubevert, g)
Christian Heimes969fe572008-01-25 11:23:10 +00001764
1765
Raymond Hettingera690a992003-11-16 16:17:49 +00001766#==============================================================================
1767
1768def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001769 test_classes = (
1770 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001771 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001772 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001773 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001774 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001775 TestSetOfSets,
1776 TestExceptionPropagation,
1777 TestBasicOpsEmpty,
1778 TestBasicOpsSingleton,
1779 TestBasicOpsTuple,
1780 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001781 TestBasicOpsString,
1782 TestBasicOpsBytes,
1783 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001784 TestBinaryOps,
1785 TestUpdateOps,
1786 TestMutate,
1787 TestSubsetEqualEmpty,
1788 TestSubsetEqualNonEmpty,
1789 TestSubsetEmptyNonEmpty,
1790 TestSubsetPartial,
1791 TestSubsetNonOverlap,
1792 TestOnlySetsNumeric,
1793 TestOnlySetsDict,
1794 TestOnlySetsOperator,
1795 TestOnlySetsTuple,
1796 TestOnlySetsString,
1797 TestOnlySetsGenerator,
1798 TestCopyingEmpty,
1799 TestCopyingSingleton,
1800 TestCopyingTriple,
1801 TestCopyingTuple,
1802 TestCopyingNested,
1803 TestIdentities,
1804 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001805 TestGraphs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001806 )
1807
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001808 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001809
1810 # verify reference counting
1811 if verbose and hasattr(sys, "gettotalrefcount"):
1812 import gc
1813 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001814 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001815 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001816 gc.collect()
1817 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001818 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001819
1820if __name__ == "__main__":
1821 test_main(verbose=True)