blob: 5d5e2324e9df465c30c4959c42c1424c3b6e59c8 [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 Hettingereae05de2004-07-09 04:51:24 +00008import os
Raymond Hettinger82cb9a22005-07-05 05:34:43 +00009from random import randrange, shuffle
Raymond Hettingerc47e01d2005-08-16 10:44:15 +000010import sys
Christian Heimes0ded5b52007-12-10 15:50:56 +000011import warnings
Christian Heimes969fe572008-01-25 11:23:10 +000012import collections
Raymond Hettingera690a992003-11-16 16:17:49 +000013
14class PassThru(Exception):
15 pass
16
17def check_pass_thru():
18 raise PassThru
19 yield 1
20
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000021class BadCmp:
22 def __hash__(self):
23 return 1
Guido van Rossum47b9ff62006-08-24 00:41:19 +000024 def __eq__(self, other):
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000025 raise RuntimeError
26
Thomas Wouters902d6eb2007-01-09 23:18:33 +000027class ReprWrapper:
28 'Used to test self-referential repr() calls'
29 def __repr__(self):
30 return repr(self.value)
31
Thomas Wouterscf297e42007-02-23 15:07:44 +000032class HashCountingInt(int):
33 'int-like object that counts the number of times __hash__ is called'
34 def __init__(self, *args):
35 self.hash_count = 0
36 def __hash__(self):
37 self.hash_count += 1
38 return int.__hash__(self)
39
Raymond Hettingera690a992003-11-16 16:17:49 +000040class TestJointOps(unittest.TestCase):
41 # Tests common to both set and frozenset
42
43 def setUp(self):
44 self.word = word = 'simsalabim'
45 self.otherword = 'madagascar'
46 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
47 self.s = self.thetype(word)
48 self.d = dict.fromkeys(word)
49
Raymond Hettinger6429a472004-09-28 01:51:35 +000050 def test_new_or_init(self):
51 self.assertRaises(TypeError, self.thetype, [], 2)
Raymond Hettingerdbe96122010-04-18 23:03:16 +000052 self.assertRaises(TypeError, set().__init__, a=1)
Raymond Hettinger6429a472004-09-28 01:51:35 +000053
Raymond Hettingera690a992003-11-16 16:17:49 +000054 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000055 actual = sorted(self.s)
56 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000057 self.assertEqual(actual, expected)
58 self.assertRaises(PassThru, self.thetype, check_pass_thru())
59 self.assertRaises(TypeError, self.thetype, [[]])
60
61 def test_len(self):
62 self.assertEqual(len(self.s), len(self.d))
63
64 def test_contains(self):
65 for c in self.letters:
66 self.assertEqual(c in self.s, c in self.d)
67 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000068 s = self.thetype([frozenset(self.letters)])
Georg Brandlab91fde2009-08-13 08:51:18 +000069 self.assertTrue(self.thetype(self.letters) in s)
Raymond Hettingera690a992003-11-16 16:17:49 +000070
Raymond Hettingera690a992003-11-16 16:17:49 +000071 def test_union(self):
72 u = self.s.union(self.otherword)
73 for c in self.letters:
74 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000075 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +000076 self.assertEqual(type(u), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +000077 self.assertRaises(PassThru, self.s.union, check_pass_thru())
78 self.assertRaises(TypeError, self.s.union, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +000079 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000080 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
81 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
82 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
83 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Georg Brandlc28e1fa2008-06-10 19:20:26 +000084 self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
Raymond Hettingera690a992003-11-16 16:17:49 +000085
Raymond Hettinger63853bb2009-07-27 20:29:18 +000086 # Issue #6573
87 x = self.thetype()
88 self.assertEqual(x.union(set([1]), x, set([2])), self.thetype([1, 2]))
89
Raymond Hettingera690a992003-11-16 16:17:49 +000090 def test_or(self):
91 i = self.s.union(self.otherword)
92 self.assertEqual(self.s | set(self.otherword), i)
93 self.assertEqual(self.s | frozenset(self.otherword), i)
94 try:
95 self.s | self.otherword
96 except TypeError:
97 pass
98 else:
99 self.fail("s|t did not screen-out general iterables")
100
101 def test_intersection(self):
102 i = self.s.intersection(self.otherword)
103 for c in self.letters:
104 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000105 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000106 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000107 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Guido van Rossum75a902d2007-10-19 22:06:24 +0000108 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000109 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
110 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
111 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
112 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000113 self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000114 s = self.thetype('abcba')
115 z = s.intersection()
116 if self.thetype == frozenset():
117 self.assertEqual(id(s), id(z))
118 else:
119 self.assertNotEqual(id(s), id(z))
Raymond Hettingera690a992003-11-16 16:17:49 +0000120
Guido van Rossum58da9312007-11-10 23:39:45 +0000121 def test_isdisjoint(self):
122 def f(s1, s2):
123 'Pure python equivalent of isdisjoint()'
124 return not set(s1).intersection(s2)
125 for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
126 s1 = self.thetype(larg)
127 for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
128 for C in set, frozenset, dict.fromkeys, str, list, tuple:
129 s2 = C(rarg)
130 actual = s1.isdisjoint(s2)
131 expected = f(s1, s2)
132 self.assertEqual(actual, expected)
Georg Brandlab91fde2009-08-13 08:51:18 +0000133 self.assertTrue(actual is True or actual is False)
Guido van Rossum58da9312007-11-10 23:39:45 +0000134
Raymond Hettingera690a992003-11-16 16:17:49 +0000135 def test_and(self):
136 i = self.s.intersection(self.otherword)
137 self.assertEqual(self.s & set(self.otherword), i)
138 self.assertEqual(self.s & frozenset(self.otherword), i)
139 try:
140 self.s & self.otherword
141 except TypeError:
142 pass
143 else:
144 self.fail("s&t did not screen-out general iterables")
145
146 def test_difference(self):
147 i = self.s.difference(self.otherword)
148 for c in self.letters:
149 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000150 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000151 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000152 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
153 self.assertRaises(TypeError, self.s.difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000154 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000155 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
156 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
157 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
158 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000159 self.assertEqual(self.thetype('abcba').difference(), set('abc'))
160 self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000161
162 def test_sub(self):
163 i = self.s.difference(self.otherword)
164 self.assertEqual(self.s - set(self.otherword), i)
165 self.assertEqual(self.s - frozenset(self.otherword), i)
166 try:
167 self.s - self.otherword
168 except TypeError:
169 pass
170 else:
171 self.fail("s-t did not screen-out general iterables")
172
173 def test_symmetric_difference(self):
174 i = self.s.symmetric_difference(self.otherword)
175 for c in self.letters:
176 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000177 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000178 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000179 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
180 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000181 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000182 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
183 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
184 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
185 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000186
187 def test_xor(self):
188 i = self.s.symmetric_difference(self.otherword)
189 self.assertEqual(self.s ^ set(self.otherword), i)
190 self.assertEqual(self.s ^ frozenset(self.otherword), i)
191 try:
192 self.s ^ self.otherword
193 except TypeError:
194 pass
195 else:
196 self.fail("s^t did not screen-out general iterables")
197
198 def test_equality(self):
199 self.assertEqual(self.s, set(self.word))
200 self.assertEqual(self.s, frozenset(self.word))
201 self.assertEqual(self.s == self.word, False)
202 self.assertNotEqual(self.s, set(self.otherword))
203 self.assertNotEqual(self.s, frozenset(self.otherword))
204 self.assertEqual(self.s != self.word, True)
205
206 def test_setOfFrozensets(self):
207 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
208 s = self.thetype(t)
209 self.assertEqual(len(s), 3)
210
Raymond Hettingera690a992003-11-16 16:17:49 +0000211 def test_sub_and_super(self):
212 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
Georg Brandlab91fde2009-08-13 08:51:18 +0000213 self.assertTrue(p < q)
214 self.assertTrue(p <= q)
215 self.assertTrue(q <= q)
216 self.assertTrue(q > p)
217 self.assertTrue(q >= p)
218 self.assertFalse(q < r)
219 self.assertFalse(q <= r)
220 self.assertFalse(q > r)
221 self.assertFalse(q >= r)
222 self.assertTrue(set('a').issubset('abc'))
223 self.assertTrue(set('abc').issuperset('a'))
224 self.assertFalse(set('a').issubset('cbs'))
225 self.assertFalse(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000226
227 def test_pickling(self):
Hirokazu Yamamoto801f9d32008-12-27 04:21:44 +0000228 for i in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000229 p = pickle.dumps(self.s, i)
230 dup = pickle.loads(p)
231 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
232 if type(self.s) not in (set, frozenset):
233 self.s.x = 10
234 p = pickle.dumps(self.s)
235 dup = pickle.loads(p)
236 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000237
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000238 def test_deepcopy(self):
239 class Tracer:
240 def __init__(self, value):
241 self.value = value
242 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000243 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000244 def __deepcopy__(self, memo=None):
245 return Tracer(self.value + 1)
246 t = Tracer(10)
247 s = self.thetype([t])
248 dup = copy.deepcopy(s)
249 self.assertNotEqual(id(s), id(dup))
250 for elem in dup:
251 newt = elem
252 self.assertNotEqual(id(t), id(newt))
253 self.assertEqual(t.value + 1, newt.value)
254
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000255 def test_gc(self):
256 # Create a nest of cycles to exercise overall ref count check
257 class A:
258 pass
Guido van Rossum805365e2007-05-07 22:24:25 +0000259 s = set(A() for i in range(1000))
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000260 for elem in s:
261 elem.cycle = s
262 elem.sub = elem
263 elem.set = set([elem])
264
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000265 def test_subclass_with_custom_hash(self):
266 # Bug #1257731
267 class H(self.thetype):
268 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000269 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000270 s=H()
271 f=set()
272 f.add(s)
Georg Brandlab91fde2009-08-13 08:51:18 +0000273 self.assertTrue(s in f)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000274 f.remove(s)
275 f.add(s)
276 f.discard(s)
277
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000278 def test_badcmp(self):
279 s = self.thetype([BadCmp()])
280 # Detect comparison errors during insertion and lookup
281 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
282 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
283 # Detect errors during mutating operations
284 if hasattr(s, 'add'):
285 self.assertRaises(RuntimeError, s.add, BadCmp())
286 self.assertRaises(RuntimeError, s.discard, BadCmp())
287 self.assertRaises(RuntimeError, s.remove, BadCmp())
288
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000289 def test_cyclical_repr(self):
290 w = ReprWrapper()
291 s = self.thetype([w])
292 w.value = s
293 if self.thetype == set:
294 self.assertEqual(repr(s), '{set(...)}')
295 else:
296 name = repr(s).partition('(')[0] # strip class name
Guido van Rossumbdba5cf2007-08-07 22:44:20 +0000297 self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000298
299 def test_cyclical_print(self):
300 w = ReprWrapper()
301 s = self.thetype([w])
302 w.value = s
Thomas Heller0d755b42008-07-15 17:14:09 +0000303 fo = open(support.TESTFN, "w")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000304 try:
Guido van Rossumd8c19672007-02-09 21:54:58 +0000305 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000306 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000307 fo = open(support.TESTFN, "r")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000308 self.assertEqual(fo.read(), repr(s))
309 finally:
310 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000311 support.unlink(support.TESTFN)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000312
Thomas Wouterscf297e42007-02-23 15:07:44 +0000313 def test_do_not_rehash_dict_keys(self):
314 n = 10
Guido van Rossum805365e2007-05-07 22:24:25 +0000315 d = dict.fromkeys(map(HashCountingInt, range(n)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000316 self.assertEqual(sum(elem.hash_count for elem in d), n)
317 s = self.thetype(d)
318 self.assertEqual(sum(elem.hash_count for elem in d), n)
319 s.difference(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000320 self.assertEqual(sum(elem.hash_count for elem in d), n)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000321 if hasattr(s, 'symmetric_difference_update'):
322 s.symmetric_difference_update(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000323 self.assertEqual(sum(elem.hash_count for elem in d), n)
324 d2 = dict.fromkeys(set(d))
325 self.assertEqual(sum(elem.hash_count for elem in d), n)
326 d3 = dict.fromkeys(frozenset(d))
327 self.assertEqual(sum(elem.hash_count for elem in d), n)
328 d3 = dict.fromkeys(frozenset(d), 123)
329 self.assertEqual(sum(elem.hash_count for elem in d), n)
330 self.assertEqual(d3, dict.fromkeys(d, 123))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000331
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000332 def test_container_iterator(self):
333 # Bug #3680: tp_traverse was not implemented for set iterator object
334 class C(object):
335 pass
336 obj = C()
337 ref = weakref.ref(obj)
338 container = set([obj, 1])
339 obj.x = iter(container)
340 del obj, container
341 gc.collect()
Georg Brandlab91fde2009-08-13 08:51:18 +0000342 self.assertTrue(ref() is None, "Cycle was not collected")
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000343
Raymond Hettingera690a992003-11-16 16:17:49 +0000344class TestSet(TestJointOps):
345 thetype = set
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000346 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000347
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000348 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000349 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000350 s.__init__(self.word)
351 self.assertEqual(s, set(self.word))
352 s.__init__(self.otherword)
353 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000354 self.assertRaises(TypeError, s.__init__, s, 2);
355 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000356
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000357 def test_constructor_identity(self):
358 s = self.thetype(range(3))
359 t = self.thetype(s)
360 self.assertNotEqual(id(s), id(t))
361
Guido van Rossum86e58e22006-08-28 15:27:34 +0000362 def test_set_literal(self):
363 s = set([1,2,3])
364 t = {1,2,3}
365 self.assertEqual(s, t)
366
Raymond Hettingera690a992003-11-16 16:17:49 +0000367 def test_hash(self):
368 self.assertRaises(TypeError, hash, self.s)
369
370 def test_clear(self):
371 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000372 self.assertEqual(self.s, set())
373 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000374
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000375 def test_copy(self):
376 dup = self.s.copy()
377 self.assertEqual(self.s, dup)
378 self.assertNotEqual(id(self.s), id(dup))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000379 self.assertEqual(type(dup), self.basetype)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000380
Raymond Hettingera690a992003-11-16 16:17:49 +0000381 def test_add(self):
382 self.s.add('Q')
Georg Brandlab91fde2009-08-13 08:51:18 +0000383 self.assertTrue('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000384 dup = self.s.copy()
385 self.s.add('Q')
386 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000387 self.assertRaises(TypeError, self.s.add, [])
388
389 def test_remove(self):
390 self.s.remove('a')
Georg Brandlab91fde2009-08-13 08:51:18 +0000391 self.assertTrue('a' not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000392 self.assertRaises(KeyError, self.s.remove, 'Q')
393 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000394 s = self.thetype([frozenset(self.word)])
Georg Brandlab91fde2009-08-13 08:51:18 +0000395 self.assertTrue(self.thetype(self.word) in s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000396 s.remove(self.thetype(self.word))
Georg Brandlab91fde2009-08-13 08:51:18 +0000397 self.assertTrue(self.thetype(self.word) not in s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000398 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000399
Thomas Wouters89f507f2006-12-13 04:49:30 +0000400 def test_remove_keyerror_unpacking(self):
401 # bug: www.python.org/sf/1576657
402 for v1 in ['Q', (1,)]:
403 try:
404 self.s.remove(v1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000405 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000406 v2 = e.args[0]
407 self.assertEqual(v1, v2)
408 else:
409 self.fail()
410
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000411 def test_remove_keyerror_set(self):
412 key = self.thetype([3, 4])
413 try:
414 self.s.remove(key)
415 except KeyError as e:
Georg Brandlab91fde2009-08-13 08:51:18 +0000416 self.assertTrue(e.args[0] is key,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000417 "KeyError should be {0}, not {1}".format(key,
418 e.args[0]))
419 else:
420 self.fail()
421
Raymond Hettingera690a992003-11-16 16:17:49 +0000422 def test_discard(self):
423 self.s.discard('a')
Georg Brandlab91fde2009-08-13 08:51:18 +0000424 self.assertTrue('a' not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000425 self.s.discard('Q')
426 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000427 s = self.thetype([frozenset(self.word)])
Georg Brandlab91fde2009-08-13 08:51:18 +0000428 self.assertTrue(self.thetype(self.word) in s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000429 s.discard(self.thetype(self.word))
Georg Brandlab91fde2009-08-13 08:51:18 +0000430 self.assertTrue(self.thetype(self.word) not in s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000431 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000432
433 def test_pop(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000434 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000435 elem = self.s.pop()
Georg Brandlab91fde2009-08-13 08:51:18 +0000436 self.assertTrue(elem not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000437 self.assertRaises(KeyError, self.s.pop)
438
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000439 def test_update(self):
440 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000441 self.assertEqual(retval, None)
442 for c in (self.word + self.otherword):
Georg Brandlab91fde2009-08-13 08:51:18 +0000443 self.assertTrue(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000444 self.assertRaises(PassThru, self.s.update, check_pass_thru())
445 self.assertRaises(TypeError, self.s.update, [[]])
446 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000447 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000448 s = self.thetype('abcba')
449 self.assertEqual(s.update(C(p)), None)
450 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000451 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
452 q = 'ahi'
453 for C in set, frozenset, dict.fromkeys, str, list, tuple:
454 s = self.thetype('abcba')
455 self.assertEqual(s.update(C(p), C(q)), None)
456 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000457
458 def test_ior(self):
459 self.s |= set(self.otherword)
460 for c in (self.word + self.otherword):
Georg Brandlab91fde2009-08-13 08:51:18 +0000461 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000462
463 def test_intersection_update(self):
464 retval = self.s.intersection_update(self.otherword)
465 self.assertEqual(retval, None)
466 for c in (self.word + self.otherword):
467 if c in self.otherword and c in self.word:
Georg Brandlab91fde2009-08-13 08:51:18 +0000468 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000469 else:
Georg Brandlab91fde2009-08-13 08:51:18 +0000470 self.assertTrue(c not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000471 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
472 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000473 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000474 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000475 s = self.thetype('abcba')
476 self.assertEqual(s.intersection_update(C(p)), None)
477 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000478 ss = 'abcba'
479 s = self.thetype(ss)
480 t = 'cbc'
481 self.assertEqual(s.intersection_update(C(p), C(t)), None)
482 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000483
484 def test_iand(self):
485 self.s &= set(self.otherword)
486 for c in (self.word + self.otherword):
487 if c in self.otherword and c in self.word:
Georg Brandlab91fde2009-08-13 08:51:18 +0000488 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000489 else:
Georg Brandlab91fde2009-08-13 08:51:18 +0000490 self.assertTrue(c not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000491
492 def test_difference_update(self):
493 retval = self.s.difference_update(self.otherword)
494 self.assertEqual(retval, None)
495 for c in (self.word + self.otherword):
496 if c in self.word and c not in self.otherword:
Georg Brandlab91fde2009-08-13 08:51:18 +0000497 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000498 else:
Georg Brandlab91fde2009-08-13 08:51:18 +0000499 self.assertTrue(c not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000500 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
501 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000502 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
503 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000504 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000505 s = self.thetype('abcba')
506 self.assertEqual(s.difference_update(C(p)), None)
507 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000508
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000509 s = self.thetype('abcdefghih')
510 s.difference_update()
511 self.assertEqual(s, self.thetype('abcdefghih'))
512
513 s = self.thetype('abcdefghih')
514 s.difference_update(C('aba'))
515 self.assertEqual(s, self.thetype('cdefghih'))
516
517 s = self.thetype('abcdefghih')
518 s.difference_update(C('cdc'), C('aba'))
519 self.assertEqual(s, self.thetype('efghih'))
520
Raymond Hettingera690a992003-11-16 16:17:49 +0000521 def test_isub(self):
522 self.s -= set(self.otherword)
523 for c in (self.word + self.otherword):
524 if c in self.word and c not in self.otherword:
Georg Brandlab91fde2009-08-13 08:51:18 +0000525 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000526 else:
Georg Brandlab91fde2009-08-13 08:51:18 +0000527 self.assertTrue(c not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000528
529 def test_symmetric_difference_update(self):
530 retval = self.s.symmetric_difference_update(self.otherword)
531 self.assertEqual(retval, None)
532 for c in (self.word + self.otherword):
533 if (c in self.word) ^ (c in self.otherword):
Georg Brandlab91fde2009-08-13 08:51:18 +0000534 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000535 else:
Georg Brandlab91fde2009-08-13 08:51:18 +0000536 self.assertTrue(c not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000537 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
538 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000539 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000540 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000541 s = self.thetype('abcba')
542 self.assertEqual(s.symmetric_difference_update(C(p)), None)
543 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000544
545 def test_ixor(self):
546 self.s ^= set(self.otherword)
547 for c in (self.word + self.otherword):
548 if (c in self.word) ^ (c in self.otherword):
Georg Brandlab91fde2009-08-13 08:51:18 +0000549 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000550 else:
Georg Brandlab91fde2009-08-13 08:51:18 +0000551 self.assertTrue(c not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000552
Raymond Hettingerc991db22005-08-11 07:58:45 +0000553 def test_inplace_on_self(self):
554 t = self.s.copy()
555 t |= t
556 self.assertEqual(t, self.s)
557 t &= t
558 self.assertEqual(t, self.s)
559 t -= t
560 self.assertEqual(t, self.thetype())
561 t = self.s.copy()
562 t ^= t
563 self.assertEqual(t, self.thetype())
564
Raymond Hettinger691d8052004-05-30 07:26:47 +0000565 def test_weakref(self):
566 s = self.thetype('gallahad')
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000567 p = weakref.proxy(s)
Raymond Hettinger691d8052004-05-30 07:26:47 +0000568 self.assertEqual(str(p), str(s))
569 s = None
570 self.assertRaises(ReferenceError, str, p)
571
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000572 def test_rich_compare(self):
573 class TestRichSetCompare:
574 def __gt__(self, some_set):
575 self.gt_called = True
576 return False
577 def __lt__(self, some_set):
578 self.lt_called = True
579 return False
580 def __ge__(self, some_set):
581 self.ge_called = True
582 return False
583 def __le__(self, some_set):
584 self.le_called = True
585 return False
586
Ezio Melotti42da6632011-03-15 05:18:48 +0200587 # This first tries the builtin rich set comparison, which doesn't know
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000588 # how to handle the custom object. Upon returning NotImplemented, the
589 # corresponding comparison on the right object is invoked.
590 myset = {1, 2, 3}
591
592 myobj = TestRichSetCompare()
593 myset < myobj
Georg Brandlab91fde2009-08-13 08:51:18 +0000594 self.assertTrue(myobj.gt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000595
596 myobj = TestRichSetCompare()
597 myset > myobj
Georg Brandlab91fde2009-08-13 08:51:18 +0000598 self.assertTrue(myobj.lt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000599
600 myobj = TestRichSetCompare()
601 myset <= myobj
Georg Brandlab91fde2009-08-13 08:51:18 +0000602 self.assertTrue(myobj.ge_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000603
604 myobj = TestRichSetCompare()
605 myset >= myobj
Georg Brandlab91fde2009-08-13 08:51:18 +0000606 self.assertTrue(myobj.le_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000607
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000608 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000609 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000610 def test_c_api(self):
611 self.assertEqual(set('abc').test_c_api(), True)
612
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000613class SetSubclass(set):
614 pass
615
616class TestSetSubclass(TestSet):
617 thetype = SetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000618 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000619
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000620class SetSubclassWithKeywordArgs(set):
621 def __init__(self, iterable=[], newarg=None):
622 set.__init__(self, iterable)
623
624class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000625
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000626 def test_keywords_in_subclass(self):
627 'SF bug #1486663 -- this used to erroneously raise a TypeError'
628 SetSubclassWithKeywordArgs(newarg=1)
629
Raymond Hettingera690a992003-11-16 16:17:49 +0000630class TestFrozenSet(TestJointOps):
631 thetype = frozenset
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000632 basetype = frozenset
Raymond Hettingera690a992003-11-16 16:17:49 +0000633
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000634 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000635 s = self.thetype(self.word)
636 s.__init__(self.otherword)
637 self.assertEqual(s, set(self.word))
638
Raymond Hettingerd7946662005-08-01 21:39:29 +0000639 def test_singleton_empty_frozenset(self):
640 f = frozenset()
641 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
642 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000643 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000644 frozenset(f), f]
645 # All of the empty frozensets should have just one id()
646 self.assertEqual(len(set(map(id, efs))), 1)
647
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000648 def test_constructor_identity(self):
649 s = self.thetype(range(3))
650 t = self.thetype(s)
651 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000652
Raymond Hettingera690a992003-11-16 16:17:49 +0000653 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000654 self.assertEqual(hash(self.thetype('abcdeb')),
655 hash(self.thetype('ebecda')))
656
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000657 # make sure that all permutations give the same hash value
658 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000659 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000660 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000661 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000662 shuffle(seq)
663 results.add(hash(self.thetype(seq)))
664 self.assertEqual(len(results), 1)
665
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000666 def test_copy(self):
667 dup = self.s.copy()
668 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000669
670 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000671 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000672 key1 = self.thetype(seq)
673 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000674 self.assertEqual(key1, key2)
675 self.assertNotEqual(id(key1), id(key2))
676 d = {}
677 d[key1] = 42
678 self.assertEqual(d[key2], 42)
679
680 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000681 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000682 self.assertEqual(hash(f), hash(f))
683
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000684 def test_hash_effectiveness(self):
685 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000686 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000687 addhashvalue = hashvalues.add
688 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000689 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000690 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
691 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000692
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000693class FrozenSetSubclass(frozenset):
694 pass
695
696class TestFrozenSetSubclass(TestFrozenSet):
697 thetype = FrozenSetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000698 basetype = frozenset
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000699
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000700 def test_constructor_identity(self):
701 s = self.thetype(range(3))
702 t = self.thetype(s)
703 self.assertNotEqual(id(s), id(t))
704
705 def test_copy(self):
706 dup = self.s.copy()
707 self.assertNotEqual(id(self.s), id(dup))
708
709 def test_nested_empty_constructor(self):
710 s = self.thetype()
711 t = self.thetype(s)
712 self.assertEqual(s, t)
713
Raymond Hettingerd7946662005-08-01 21:39:29 +0000714 def test_singleton_empty_frozenset(self):
715 Frozenset = self.thetype
716 f = frozenset()
717 F = Frozenset()
718 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
719 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000720 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000721 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
722 # All empty frozenset subclass instances should have different ids
723 self.assertEqual(len(set(map(id, efs))), len(efs))
724
Raymond Hettingera690a992003-11-16 16:17:49 +0000725# Tests taken from test_sets.py =============================================
726
727empty_set = set()
728
729#==============================================================================
730
731class TestBasicOps(unittest.TestCase):
732
733 def test_repr(self):
734 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000735 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000736
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100737 def check_repr_against_values(self):
738 text = repr(self.set)
739 self.assertTrue(text.startswith('{'))
740 self.assertTrue(text.endswith('}'))
741
742 result = text[1:-1].split(', ')
743 result.sort()
744 sorted_repr_values = [repr(value) for value in self.values]
745 sorted_repr_values.sort()
746 self.assertEqual(result, sorted_repr_values)
747
Raymond Hettingereae05de2004-07-09 04:51:24 +0000748 def test_print(self):
749 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000750 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000751 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000752 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000753 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000754 self.assertEqual(fo.read(), repr(self.set))
755 finally:
756 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000757 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000758
Raymond Hettingera690a992003-11-16 16:17:49 +0000759 def test_length(self):
760 self.assertEqual(len(self.set), self.length)
761
762 def test_self_equality(self):
763 self.assertEqual(self.set, self.set)
764
765 def test_equivalent_equality(self):
766 self.assertEqual(self.set, self.dup)
767
768 def test_copy(self):
769 self.assertEqual(self.set.copy(), self.dup)
770
771 def test_self_union(self):
772 result = self.set | self.set
773 self.assertEqual(result, self.dup)
774
775 def test_empty_union(self):
776 result = self.set | empty_set
777 self.assertEqual(result, self.dup)
778
779 def test_union_empty(self):
780 result = empty_set | self.set
781 self.assertEqual(result, self.dup)
782
783 def test_self_intersection(self):
784 result = self.set & self.set
785 self.assertEqual(result, self.dup)
786
787 def test_empty_intersection(self):
788 result = self.set & empty_set
789 self.assertEqual(result, empty_set)
790
791 def test_intersection_empty(self):
792 result = empty_set & self.set
793 self.assertEqual(result, empty_set)
794
Guido van Rossum58da9312007-11-10 23:39:45 +0000795 def test_self_isdisjoint(self):
796 result = self.set.isdisjoint(self.set)
797 self.assertEqual(result, not self.set)
798
799 def test_empty_isdisjoint(self):
800 result = self.set.isdisjoint(empty_set)
801 self.assertEqual(result, True)
802
803 def test_isdisjoint_empty(self):
804 result = empty_set.isdisjoint(self.set)
805 self.assertEqual(result, True)
806
Raymond Hettingera690a992003-11-16 16:17:49 +0000807 def test_self_symmetric_difference(self):
808 result = self.set ^ self.set
809 self.assertEqual(result, empty_set)
810
Georg Brandl44c58232010-08-01 19:04:55 +0000811 def test_empty_symmetric_difference(self):
Raymond Hettingera690a992003-11-16 16:17:49 +0000812 result = self.set ^ empty_set
813 self.assertEqual(result, self.set)
814
815 def test_self_difference(self):
816 result = self.set - self.set
817 self.assertEqual(result, empty_set)
818
819 def test_empty_difference(self):
820 result = self.set - empty_set
821 self.assertEqual(result, self.dup)
822
823 def test_empty_difference_rev(self):
824 result = empty_set - self.set
825 self.assertEqual(result, empty_set)
826
827 def test_iteration(self):
828 for v in self.set:
Georg Brandlab91fde2009-08-13 08:51:18 +0000829 self.assertTrue(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000830 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000831 # note: __length_hint__ is an internal undocumented API,
832 # don't rely on it in your own programs
833 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000834
835 def test_pickling(self):
836 p = pickle.dumps(self.set)
837 copy = pickle.loads(p)
838 self.assertEqual(self.set, copy,
839 "%s != %s" % (self.set, copy))
840
841#------------------------------------------------------------------------------
842
843class TestBasicOpsEmpty(TestBasicOps):
844 def setUp(self):
845 self.case = "empty set"
846 self.values = []
847 self.set = set(self.values)
848 self.dup = set(self.values)
849 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000850 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000851
852#------------------------------------------------------------------------------
853
854class TestBasicOpsSingleton(TestBasicOps):
855 def setUp(self):
856 self.case = "unit set (number)"
857 self.values = [3]
858 self.set = set(self.values)
859 self.dup = set(self.values)
860 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000861 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000862
863 def test_in(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000864 self.assertTrue(3 in self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000865
866 def test_not_in(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000867 self.assertTrue(2 not in self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000868
869#------------------------------------------------------------------------------
870
871class TestBasicOpsTuple(TestBasicOps):
872 def setUp(self):
873 self.case = "unit set (tuple)"
874 self.values = [(0, "zero")]
875 self.set = set(self.values)
876 self.dup = set(self.values)
877 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000878 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000879
880 def test_in(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000881 self.assertTrue((0, "zero") in self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000882
883 def test_not_in(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000884 self.assertTrue(9 not in self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000885
886#------------------------------------------------------------------------------
887
888class TestBasicOpsTriple(TestBasicOps):
889 def setUp(self):
890 self.case = "triple set"
891 self.values = [0, "zero", operator.add]
892 self.set = set(self.values)
893 self.dup = set(self.values)
894 self.length = 3
895 self.repr = None
896
Christian Heimes0ded5b52007-12-10 15:50:56 +0000897#------------------------------------------------------------------------------
898
899class TestBasicOpsString(TestBasicOps):
900 def setUp(self):
901 self.case = "string set"
902 self.values = ["a", "b", "c"]
903 self.set = set(self.values)
904 self.dup = set(self.values)
905 self.length = 3
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100906
907 def test_repr(self):
908 self.check_repr_against_values()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000909
910#------------------------------------------------------------------------------
911
912class TestBasicOpsBytes(TestBasicOps):
913 def setUp(self):
914 self.case = "string set"
915 self.values = [b"a", b"b", b"c"]
916 self.set = set(self.values)
917 self.dup = set(self.values)
918 self.length = 3
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100919
920 def test_repr(self):
921 self.check_repr_against_values()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000922
923#------------------------------------------------------------------------------
924
925class TestBasicOpsMixedStringBytes(TestBasicOps):
926 def setUp(self):
927 self.warning_filters = warnings.filters[:]
928 warnings.simplefilter('ignore', BytesWarning)
929 self.case = "string and bytes set"
930 self.values = ["a", "b", b"a", b"b"]
931 self.set = set(self.values)
932 self.dup = set(self.values)
933 self.length = 4
Christian Heimes0ded5b52007-12-10 15:50:56 +0000934
935 def tearDown(self):
936 warnings.filters = self.warning_filters
937
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100938 def test_repr(self):
939 self.check_repr_against_values()
940
Raymond Hettingera690a992003-11-16 16:17:49 +0000941#==============================================================================
942
943def baditer():
944 raise TypeError
945 yield True
946
947def gooditer():
948 yield True
949
950class TestExceptionPropagation(unittest.TestCase):
951 """SF 628246: Set constructor should not trap iterator TypeErrors"""
952
953 def test_instanceWithException(self):
954 self.assertRaises(TypeError, set, baditer())
955
956 def test_instancesWithoutException(self):
957 # All of these iterables should load without exception.
958 set([1,2,3])
959 set((1,2,3))
960 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000961 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000962 set('abc')
963 set(gooditer())
964
Neal Norwitzfcf44352005-11-27 20:37:43 +0000965 def test_changingSizeWhileIterating(self):
966 s = set([1,2,3])
967 try:
968 for i in s:
969 s.update([4])
970 except RuntimeError:
971 pass
972 else:
973 self.fail("no exception when changing size during iteration")
974
Raymond Hettingera690a992003-11-16 16:17:49 +0000975#==============================================================================
976
977class TestSetOfSets(unittest.TestCase):
978 def test_constructor(self):
979 inner = frozenset([1])
980 outer = set([inner])
981 element = outer.pop()
982 self.assertEqual(type(element), frozenset)
983 outer.add(inner) # Rebuild set of sets with .add method
984 outer.remove(inner)
985 self.assertEqual(outer, set()) # Verify that remove worked
986 outer.discard(inner) # Absence of KeyError indicates working fine
987
988#==============================================================================
989
990class TestBinaryOps(unittest.TestCase):
991 def setUp(self):
992 self.set = set((2, 4, 6))
993
994 def test_eq(self): # SF bug 643115
995 self.assertEqual(self.set, set({2:1,4:3,6:5}))
996
997 def test_union_subset(self):
998 result = self.set | set([2])
999 self.assertEqual(result, set((2, 4, 6)))
1000
1001 def test_union_superset(self):
1002 result = self.set | set([2, 4, 6, 8])
1003 self.assertEqual(result, set([2, 4, 6, 8]))
1004
1005 def test_union_overlap(self):
1006 result = self.set | set([3, 4, 5])
1007 self.assertEqual(result, set([2, 3, 4, 5, 6]))
1008
1009 def test_union_non_overlap(self):
1010 result = self.set | set([8])
1011 self.assertEqual(result, set([2, 4, 6, 8]))
1012
1013 def test_intersection_subset(self):
1014 result = self.set & set((2, 4))
1015 self.assertEqual(result, set((2, 4)))
1016
1017 def test_intersection_superset(self):
1018 result = self.set & set([2, 4, 6, 8])
1019 self.assertEqual(result, set([2, 4, 6]))
1020
1021 def test_intersection_overlap(self):
1022 result = self.set & set([3, 4, 5])
1023 self.assertEqual(result, set([4]))
1024
1025 def test_intersection_non_overlap(self):
1026 result = self.set & set([8])
1027 self.assertEqual(result, empty_set)
1028
Guido van Rossum58da9312007-11-10 23:39:45 +00001029 def test_isdisjoint_subset(self):
1030 result = self.set.isdisjoint(set((2, 4)))
1031 self.assertEqual(result, False)
1032
1033 def test_isdisjoint_superset(self):
1034 result = self.set.isdisjoint(set([2, 4, 6, 8]))
1035 self.assertEqual(result, False)
1036
1037 def test_isdisjoint_overlap(self):
1038 result = self.set.isdisjoint(set([3, 4, 5]))
1039 self.assertEqual(result, False)
1040
1041 def test_isdisjoint_non_overlap(self):
1042 result = self.set.isdisjoint(set([8]))
1043 self.assertEqual(result, True)
1044
Raymond Hettingera690a992003-11-16 16:17:49 +00001045 def test_sym_difference_subset(self):
1046 result = self.set ^ set((2, 4))
1047 self.assertEqual(result, set([6]))
1048
1049 def test_sym_difference_superset(self):
1050 result = self.set ^ set((2, 4, 6, 8))
1051 self.assertEqual(result, set([8]))
1052
1053 def test_sym_difference_overlap(self):
1054 result = self.set ^ set((3, 4, 5))
1055 self.assertEqual(result, set([2, 3, 5, 6]))
1056
1057 def test_sym_difference_non_overlap(self):
1058 result = self.set ^ set([8])
1059 self.assertEqual(result, set([2, 4, 6, 8]))
1060
Raymond Hettingera690a992003-11-16 16:17:49 +00001061#==============================================================================
1062
1063class TestUpdateOps(unittest.TestCase):
1064 def setUp(self):
1065 self.set = set((2, 4, 6))
1066
1067 def test_union_subset(self):
1068 self.set |= set([2])
1069 self.assertEqual(self.set, set((2, 4, 6)))
1070
1071 def test_union_superset(self):
1072 self.set |= set([2, 4, 6, 8])
1073 self.assertEqual(self.set, set([2, 4, 6, 8]))
1074
1075 def test_union_overlap(self):
1076 self.set |= set([3, 4, 5])
1077 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1078
1079 def test_union_non_overlap(self):
1080 self.set |= set([8])
1081 self.assertEqual(self.set, set([2, 4, 6, 8]))
1082
1083 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001084 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001085 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1086
1087 def test_intersection_subset(self):
1088 self.set &= set((2, 4))
1089 self.assertEqual(self.set, set((2, 4)))
1090
1091 def test_intersection_superset(self):
1092 self.set &= set([2, 4, 6, 8])
1093 self.assertEqual(self.set, set([2, 4, 6]))
1094
1095 def test_intersection_overlap(self):
1096 self.set &= set([3, 4, 5])
1097 self.assertEqual(self.set, set([4]))
1098
1099 def test_intersection_non_overlap(self):
1100 self.set &= set([8])
1101 self.assertEqual(self.set, empty_set)
1102
1103 def test_intersection_method_call(self):
1104 self.set.intersection_update(set([3, 4, 5]))
1105 self.assertEqual(self.set, set([4]))
1106
1107 def test_sym_difference_subset(self):
1108 self.set ^= set((2, 4))
1109 self.assertEqual(self.set, set([6]))
1110
1111 def test_sym_difference_superset(self):
1112 self.set ^= set((2, 4, 6, 8))
1113 self.assertEqual(self.set, set([8]))
1114
1115 def test_sym_difference_overlap(self):
1116 self.set ^= set((3, 4, 5))
1117 self.assertEqual(self.set, set([2, 3, 5, 6]))
1118
1119 def test_sym_difference_non_overlap(self):
1120 self.set ^= set([8])
1121 self.assertEqual(self.set, set([2, 4, 6, 8]))
1122
1123 def test_sym_difference_method_call(self):
1124 self.set.symmetric_difference_update(set([3, 4, 5]))
1125 self.assertEqual(self.set, set([2, 3, 5, 6]))
1126
1127 def test_difference_subset(self):
1128 self.set -= set((2, 4))
1129 self.assertEqual(self.set, set([6]))
1130
1131 def test_difference_superset(self):
1132 self.set -= set((2, 4, 6, 8))
1133 self.assertEqual(self.set, set([]))
1134
1135 def test_difference_overlap(self):
1136 self.set -= set((3, 4, 5))
1137 self.assertEqual(self.set, set([2, 6]))
1138
1139 def test_difference_non_overlap(self):
1140 self.set -= set([8])
1141 self.assertEqual(self.set, set([2, 4, 6]))
1142
1143 def test_difference_method_call(self):
1144 self.set.difference_update(set([3, 4, 5]))
1145 self.assertEqual(self.set, set([2, 6]))
1146
1147#==============================================================================
1148
1149class TestMutate(unittest.TestCase):
1150 def setUp(self):
1151 self.values = ["a", "b", "c"]
1152 self.set = set(self.values)
1153
1154 def test_add_present(self):
1155 self.set.add("c")
1156 self.assertEqual(self.set, set("abc"))
1157
1158 def test_add_absent(self):
1159 self.set.add("d")
1160 self.assertEqual(self.set, set("abcd"))
1161
1162 def test_add_until_full(self):
1163 tmp = set()
1164 expected_len = 0
1165 for v in self.values:
1166 tmp.add(v)
1167 expected_len += 1
1168 self.assertEqual(len(tmp), expected_len)
1169 self.assertEqual(tmp, self.set)
1170
1171 def test_remove_present(self):
1172 self.set.remove("b")
1173 self.assertEqual(self.set, set("ac"))
1174
1175 def test_remove_absent(self):
1176 try:
1177 self.set.remove("d")
1178 self.fail("Removing missing element should have raised LookupError")
1179 except LookupError:
1180 pass
1181
1182 def test_remove_until_empty(self):
1183 expected_len = len(self.set)
1184 for v in self.values:
1185 self.set.remove(v)
1186 expected_len -= 1
1187 self.assertEqual(len(self.set), expected_len)
1188
1189 def test_discard_present(self):
1190 self.set.discard("c")
1191 self.assertEqual(self.set, set("ab"))
1192
1193 def test_discard_absent(self):
1194 self.set.discard("d")
1195 self.assertEqual(self.set, set("abc"))
1196
1197 def test_clear(self):
1198 self.set.clear()
1199 self.assertEqual(len(self.set), 0)
1200
1201 def test_pop(self):
1202 popped = {}
1203 while self.set:
1204 popped[self.set.pop()] = None
1205 self.assertEqual(len(popped), len(self.values))
1206 for v in self.values:
Georg Brandlab91fde2009-08-13 08:51:18 +00001207 self.assertTrue(v in popped)
Raymond Hettingera690a992003-11-16 16:17:49 +00001208
1209 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001210 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001211 self.assertEqual(self.set, set(self.values))
1212
1213 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001214 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001215 self.assertEqual(self.set, set(self.values))
1216
1217 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001218 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001219 self.assertEqual(self.set, set(self.values + ["z"]))
1220
1221#==============================================================================
1222
1223class TestSubsets(unittest.TestCase):
1224
1225 case2method = {"<=": "issubset",
1226 ">=": "issuperset",
1227 }
1228
1229 reverse = {"==": "==",
1230 "!=": "!=",
1231 "<": ">",
1232 ">": "<",
1233 "<=": ">=",
1234 ">=": "<=",
1235 }
1236
1237 def test_issubset(self):
1238 x = self.left
1239 y = self.right
1240 for case in "!=", "==", "<", "<=", ">", ">=":
1241 expected = case in self.cases
1242 # Test the binary infix spelling.
1243 result = eval("x" + case + "y", locals())
1244 self.assertEqual(result, expected)
1245 # Test the "friendly" method-name spelling, if one exists.
1246 if case in TestSubsets.case2method:
1247 method = getattr(x, TestSubsets.case2method[case])
1248 result = method(y)
1249 self.assertEqual(result, expected)
1250
1251 # Now do the same for the operands reversed.
1252 rcase = TestSubsets.reverse[case]
1253 result = eval("y" + rcase + "x", locals())
1254 self.assertEqual(result, expected)
1255 if rcase in TestSubsets.case2method:
1256 method = getattr(y, TestSubsets.case2method[rcase])
1257 result = method(x)
1258 self.assertEqual(result, expected)
1259#------------------------------------------------------------------------------
1260
1261class TestSubsetEqualEmpty(TestSubsets):
1262 left = set()
1263 right = set()
1264 name = "both empty"
1265 cases = "==", "<=", ">="
1266
1267#------------------------------------------------------------------------------
1268
1269class TestSubsetEqualNonEmpty(TestSubsets):
1270 left = set([1, 2])
1271 right = set([1, 2])
1272 name = "equal pair"
1273 cases = "==", "<=", ">="
1274
1275#------------------------------------------------------------------------------
1276
1277class TestSubsetEmptyNonEmpty(TestSubsets):
1278 left = set()
1279 right = set([1, 2])
1280 name = "one empty, one non-empty"
1281 cases = "!=", "<", "<="
1282
1283#------------------------------------------------------------------------------
1284
1285class TestSubsetPartial(TestSubsets):
1286 left = set([1])
1287 right = set([1, 2])
1288 name = "one a non-empty proper subset of other"
1289 cases = "!=", "<", "<="
1290
1291#------------------------------------------------------------------------------
1292
1293class TestSubsetNonOverlap(TestSubsets):
1294 left = set([1])
1295 right = set([2])
1296 name = "neither empty, neither contains"
1297 cases = "!="
1298
1299#==============================================================================
1300
1301class TestOnlySetsInBinaryOps(unittest.TestCase):
1302
1303 def test_eq_ne(self):
1304 # Unlike the others, this is testing that == and != *are* allowed.
1305 self.assertEqual(self.other == self.set, False)
1306 self.assertEqual(self.set == self.other, False)
1307 self.assertEqual(self.other != self.set, True)
1308 self.assertEqual(self.set != self.other, True)
1309
1310 def test_ge_gt_le_lt(self):
1311 self.assertRaises(TypeError, lambda: self.set < self.other)
1312 self.assertRaises(TypeError, lambda: self.set <= self.other)
1313 self.assertRaises(TypeError, lambda: self.set > self.other)
1314 self.assertRaises(TypeError, lambda: self.set >= self.other)
1315
1316 self.assertRaises(TypeError, lambda: self.other < self.set)
1317 self.assertRaises(TypeError, lambda: self.other <= self.set)
1318 self.assertRaises(TypeError, lambda: self.other > self.set)
1319 self.assertRaises(TypeError, lambda: self.other >= self.set)
1320
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001321 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001322 try:
1323 self.set |= self.other
1324 except TypeError:
1325 pass
1326 else:
1327 self.fail("expected TypeError")
1328
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001329 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001330 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001331 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001332 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001333 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001334
1335 def test_union(self):
1336 self.assertRaises(TypeError, lambda: self.set | self.other)
1337 self.assertRaises(TypeError, lambda: self.other | self.set)
1338 if self.otherIsIterable:
1339 self.set.union(self.other)
1340 else:
1341 self.assertRaises(TypeError, self.set.union, self.other)
1342
1343 def test_intersection_update_operator(self):
1344 try:
1345 self.set &= self.other
1346 except TypeError:
1347 pass
1348 else:
1349 self.fail("expected TypeError")
1350
1351 def test_intersection_update(self):
1352 if self.otherIsIterable:
1353 self.set.intersection_update(self.other)
1354 else:
1355 self.assertRaises(TypeError,
1356 self.set.intersection_update,
1357 self.other)
1358
1359 def test_intersection(self):
1360 self.assertRaises(TypeError, lambda: self.set & self.other)
1361 self.assertRaises(TypeError, lambda: self.other & self.set)
1362 if self.otherIsIterable:
1363 self.set.intersection(self.other)
1364 else:
1365 self.assertRaises(TypeError, self.set.intersection, self.other)
1366
1367 def test_sym_difference_update_operator(self):
1368 try:
1369 self.set ^= self.other
1370 except TypeError:
1371 pass
1372 else:
1373 self.fail("expected TypeError")
1374
1375 def test_sym_difference_update(self):
1376 if self.otherIsIterable:
1377 self.set.symmetric_difference_update(self.other)
1378 else:
1379 self.assertRaises(TypeError,
1380 self.set.symmetric_difference_update,
1381 self.other)
1382
1383 def test_sym_difference(self):
1384 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1385 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1386 if self.otherIsIterable:
1387 self.set.symmetric_difference(self.other)
1388 else:
1389 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1390
1391 def test_difference_update_operator(self):
1392 try:
1393 self.set -= self.other
1394 except TypeError:
1395 pass
1396 else:
1397 self.fail("expected TypeError")
1398
1399 def test_difference_update(self):
1400 if self.otherIsIterable:
1401 self.set.difference_update(self.other)
1402 else:
1403 self.assertRaises(TypeError,
1404 self.set.difference_update,
1405 self.other)
1406
1407 def test_difference(self):
1408 self.assertRaises(TypeError, lambda: self.set - self.other)
1409 self.assertRaises(TypeError, lambda: self.other - self.set)
1410 if self.otherIsIterable:
1411 self.set.difference(self.other)
1412 else:
1413 self.assertRaises(TypeError, self.set.difference, self.other)
1414
1415#------------------------------------------------------------------------------
1416
1417class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1418 def setUp(self):
1419 self.set = set((1, 2, 3))
1420 self.other = 19
1421 self.otherIsIterable = False
1422
1423#------------------------------------------------------------------------------
1424
1425class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1426 def setUp(self):
1427 self.set = set((1, 2, 3))
1428 self.other = {1:2, 3:4}
1429 self.otherIsIterable = True
1430
1431#------------------------------------------------------------------------------
1432
1433class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1434 def setUp(self):
1435 self.set = set((1, 2, 3))
1436 self.other = operator.add
1437 self.otherIsIterable = False
1438
1439#------------------------------------------------------------------------------
1440
1441class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1442 def setUp(self):
1443 self.set = set((1, 2, 3))
1444 self.other = (2, 4, 6)
1445 self.otherIsIterable = True
1446
1447#------------------------------------------------------------------------------
1448
1449class TestOnlySetsString(TestOnlySetsInBinaryOps):
1450 def setUp(self):
1451 self.set = set((1, 2, 3))
1452 self.other = 'abc'
1453 self.otherIsIterable = True
1454
1455#------------------------------------------------------------------------------
1456
1457class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1458 def setUp(self):
1459 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001460 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001461 yield i
1462 self.set = set((1, 2, 3))
1463 self.other = gen()
1464 self.otherIsIterable = True
1465
1466#==============================================================================
1467
1468class TestCopying(unittest.TestCase):
1469
1470 def test_copy(self):
1471 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001472 dup_list = sorted(dup, key=repr)
1473 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001474 self.assertEqual(len(dup_list), len(set_list))
1475 for i in range(len(dup_list)):
Georg Brandlab91fde2009-08-13 08:51:18 +00001476 self.assertTrue(dup_list[i] is set_list[i])
Raymond Hettingera690a992003-11-16 16:17:49 +00001477
1478 def test_deep_copy(self):
1479 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001480 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001481 dup_list = sorted(dup, key=repr)
1482 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001483 self.assertEqual(len(dup_list), len(set_list))
1484 for i in range(len(dup_list)):
1485 self.assertEqual(dup_list[i], set_list[i])
1486
1487#------------------------------------------------------------------------------
1488
1489class TestCopyingEmpty(TestCopying):
1490 def setUp(self):
1491 self.set = set()
1492
1493#------------------------------------------------------------------------------
1494
1495class TestCopyingSingleton(TestCopying):
1496 def setUp(self):
1497 self.set = set(["hello"])
1498
1499#------------------------------------------------------------------------------
1500
1501class TestCopyingTriple(TestCopying):
1502 def setUp(self):
1503 self.set = set(["zero", 0, None])
1504
1505#------------------------------------------------------------------------------
1506
1507class TestCopyingTuple(TestCopying):
1508 def setUp(self):
1509 self.set = set([(1, 2)])
1510
1511#------------------------------------------------------------------------------
1512
1513class TestCopyingNested(TestCopying):
1514 def setUp(self):
1515 self.set = set([((1, 2), (3, 4))])
1516
1517#==============================================================================
1518
1519class TestIdentities(unittest.TestCase):
1520 def setUp(self):
1521 self.a = set('abracadabra')
1522 self.b = set('alacazam')
1523
1524 def test_binopsVsSubsets(self):
1525 a, b = self.a, self.b
Georg Brandlab91fde2009-08-13 08:51:18 +00001526 self.assertTrue(a - b < a)
1527 self.assertTrue(b - a < b)
1528 self.assertTrue(a & b < a)
1529 self.assertTrue(a & b < b)
1530 self.assertTrue(a | b > a)
1531 self.assertTrue(a | b > b)
1532 self.assertTrue(a ^ b < a | b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001533
1534 def test_commutativity(self):
1535 a, b = self.a, self.b
1536 self.assertEqual(a&b, b&a)
1537 self.assertEqual(a|b, b|a)
1538 self.assertEqual(a^b, b^a)
1539 if a != b:
1540 self.assertNotEqual(a-b, b-a)
1541
1542 def test_summations(self):
1543 # check that sums of parts equal the whole
1544 a, b = self.a, self.b
1545 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1546 self.assertEqual((a&b)|(a^b), a|b)
1547 self.assertEqual(a|(b-a), a|b)
1548 self.assertEqual((a-b)|b, a|b)
1549 self.assertEqual((a-b)|(a&b), a)
1550 self.assertEqual((b-a)|(a&b), b)
1551 self.assertEqual((a-b)|(b-a), a^b)
1552
1553 def test_exclusion(self):
1554 # check that inverse operations show non-overlap
1555 a, b, zero = self.a, self.b, set()
1556 self.assertEqual((a-b)&b, zero)
1557 self.assertEqual((b-a)&a, zero)
1558 self.assertEqual((a&b)&(a^b), zero)
1559
1560# Tests derived from test_itertools.py =======================================
1561
1562def R(seqn):
1563 'Regular generator'
1564 for i in seqn:
1565 yield i
1566
1567class G:
1568 'Sequence using __getitem__'
1569 def __init__(self, seqn):
1570 self.seqn = seqn
1571 def __getitem__(self, i):
1572 return self.seqn[i]
1573
1574class I:
1575 'Sequence using iterator protocol'
1576 def __init__(self, seqn):
1577 self.seqn = seqn
1578 self.i = 0
1579 def __iter__(self):
1580 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001581 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001582 if self.i >= len(self.seqn): raise StopIteration
1583 v = self.seqn[self.i]
1584 self.i += 1
1585 return v
1586
1587class Ig:
1588 'Sequence using iterator protocol defined with a generator'
1589 def __init__(self, seqn):
1590 self.seqn = seqn
1591 self.i = 0
1592 def __iter__(self):
1593 for val in self.seqn:
1594 yield val
1595
1596class X:
1597 'Missing __getitem__ and __iter__'
1598 def __init__(self, seqn):
1599 self.seqn = seqn
1600 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001601 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001602 if self.i >= len(self.seqn): raise StopIteration
1603 v = self.seqn[self.i]
1604 self.i += 1
1605 return v
1606
1607class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001608 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001609 def __init__(self, seqn):
1610 self.seqn = seqn
1611 self.i = 0
1612 def __iter__(self):
1613 return self
1614
1615class E:
1616 'Test propagation of exceptions'
1617 def __init__(self, seqn):
1618 self.seqn = seqn
1619 self.i = 0
1620 def __iter__(self):
1621 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001622 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001623 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001624
1625class S:
1626 'Test immediate stop'
1627 def __init__(self, seqn):
1628 pass
1629 def __iter__(self):
1630 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001631 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001632 raise StopIteration
1633
Raymond Hettingera6c60372008-03-13 01:26:19 +00001634from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001635def L(seqn):
1636 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001637 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001638
1639class TestVariousIteratorArgs(unittest.TestCase):
1640
1641 def test_constructor(self):
1642 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001643 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001644 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001645 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001646 self.assertRaises(TypeError, cons , X(s))
1647 self.assertRaises(TypeError, cons , N(s))
1648 self.assertRaises(ZeroDivisionError, cons , E(s))
1649
1650 def test_inline_methods(self):
1651 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001652 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001653 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001654 for g in (G, I, Ig, L, R):
1655 expected = meth(data)
1656 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001657 if isinstance(expected, bool):
1658 self.assertEqual(actual, expected)
1659 else:
1660 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001661 self.assertRaises(TypeError, meth, X(s))
1662 self.assertRaises(TypeError, meth, N(s))
1663 self.assertRaises(ZeroDivisionError, meth, E(s))
1664
1665 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001666 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001667 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001668 'difference_update', 'symmetric_difference_update'):
1669 for g in (G, I, Ig, S, L, R):
1670 s = set('january')
1671 t = s.copy()
1672 getattr(s, methname)(list(g(data)))
1673 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001674 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001675
1676 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1677 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1678 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1679
Éric Araujo48049912011-03-23 02:08:07 +01001680class bad_eq:
1681 def __eq__(self, other):
1682 if be_bad:
1683 set2.clear()
1684 raise ZeroDivisionError
1685 return self is other
1686 def __hash__(self):
1687 return 0
1688
1689class bad_dict_clear:
1690 def __eq__(self, other):
1691 if be_bad:
1692 dict2.clear()
1693 return self is other
1694 def __hash__(self):
1695 return 0
1696
1697class TestWeirdBugs(unittest.TestCase):
1698 def test_8420_set_merge(self):
1699 # This used to segfault
1700 global be_bad, set2, dict2
1701 be_bad = False
1702 set1 = {bad_eq()}
1703 set2 = {bad_eq() for i in range(75)}
1704 be_bad = True
1705 self.assertRaises(ZeroDivisionError, set1.update, set2)
1706
1707 be_bad = False
1708 set1 = {bad_dict_clear()}
1709 dict2 = {bad_dict_clear(): None}
1710 be_bad = True
1711 set1.symmetric_difference_update(dict2)
1712
Christian Heimes969fe572008-01-25 11:23:10 +00001713# Application tests (based on David Eppstein's graph recipes ====================================
1714
1715def powerset(U):
1716 """Generates all subsets of a set or sequence U."""
1717 U = iter(U)
1718 try:
1719 x = frozenset([next(U)])
1720 for S in powerset(U):
1721 yield S
1722 yield S | x
1723 except StopIteration:
1724 yield frozenset()
1725
1726def cube(n):
1727 """Graph of n-dimensional hypercube."""
1728 singletons = [frozenset([x]) for x in range(n)]
1729 return dict([(x, frozenset([x^s for s in singletons]))
1730 for x in powerset(range(n))])
1731
1732def linegraph(G):
1733 """Graph, the vertices of which are edges of G,
1734 with two vertices being adjacent iff the corresponding
1735 edges share a vertex."""
1736 L = {}
1737 for x in G:
1738 for y in G[x]:
1739 nx = [frozenset([x,z]) for z in G[x] if z != y]
1740 ny = [frozenset([y,z]) for z in G[y] if z != x]
1741 L[frozenset([x,y])] = frozenset(nx+ny)
1742 return L
1743
1744def faces(G):
1745 'Return a set of faces in G. Where a face is a set of vertices on that face'
1746 # currently limited to triangles,squares, and pentagons
1747 f = set()
1748 for v1, edges in G.items():
1749 for v2 in edges:
1750 for v3 in G[v2]:
1751 if v1 == v3:
1752 continue
1753 if v1 in G[v3]:
1754 f.add(frozenset([v1, v2, v3]))
1755 else:
1756 for v4 in G[v3]:
1757 if v4 == v2:
1758 continue
1759 if v1 in G[v4]:
1760 f.add(frozenset([v1, v2, v3, v4]))
1761 else:
1762 for v5 in G[v4]:
1763 if v5 == v3 or v5 == v2:
1764 continue
1765 if v1 in G[v5]:
1766 f.add(frozenset([v1, v2, v3, v4, v5]))
1767 return f
1768
1769
1770class TestGraphs(unittest.TestCase):
1771
1772 def test_cube(self):
1773
1774 g = cube(3) # vert --> {v1, v2, v3}
1775 vertices1 = set(g)
1776 self.assertEqual(len(vertices1), 8) # eight vertices
1777 for edge in g.values():
1778 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1779 vertices2 = set(v for edges in g.values() for v in edges)
1780 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1781
1782 cubefaces = faces(g)
1783 self.assertEqual(len(cubefaces), 6) # six faces
1784 for face in cubefaces:
1785 self.assertEqual(len(face), 4) # each face is a square
1786
1787 def test_cuboctahedron(self):
1788
1789 # http://en.wikipedia.org/wiki/Cuboctahedron
1790 # 8 triangular faces and 6 square faces
1791 # 12 indentical vertices each connecting a triangle and square
1792
1793 g = cube(3)
1794 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1795 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1796
1797 vertices = set(cuboctahedron)
1798 for edges in cuboctahedron.values():
1799 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1800 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1801 self.assertEqual(vertices, othervertices) # edge vertices in original set
1802
1803 cubofaces = faces(cuboctahedron)
1804 facesizes = collections.defaultdict(int)
1805 for face in cubofaces:
1806 facesizes[len(face)] += 1
1807 self.assertEqual(facesizes[3], 8) # eight triangular faces
1808 self.assertEqual(facesizes[4], 6) # six square faces
1809
1810 for vertex in cuboctahedron:
1811 edge = vertex # Cuboctahedron vertices are edges in Cube
1812 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1813 for cubevert in edge:
Georg Brandlab91fde2009-08-13 08:51:18 +00001814 self.assertTrue(cubevert in g)
Christian Heimes969fe572008-01-25 11:23:10 +00001815
1816
Raymond Hettingera690a992003-11-16 16:17:49 +00001817#==============================================================================
1818
1819def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001820 test_classes = (
1821 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001822 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001823 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001824 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001825 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001826 TestSetOfSets,
1827 TestExceptionPropagation,
1828 TestBasicOpsEmpty,
1829 TestBasicOpsSingleton,
1830 TestBasicOpsTuple,
1831 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001832 TestBasicOpsString,
1833 TestBasicOpsBytes,
1834 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001835 TestBinaryOps,
1836 TestUpdateOps,
1837 TestMutate,
1838 TestSubsetEqualEmpty,
1839 TestSubsetEqualNonEmpty,
1840 TestSubsetEmptyNonEmpty,
1841 TestSubsetPartial,
1842 TestSubsetNonOverlap,
1843 TestOnlySetsNumeric,
1844 TestOnlySetsDict,
1845 TestOnlySetsOperator,
1846 TestOnlySetsTuple,
1847 TestOnlySetsString,
1848 TestOnlySetsGenerator,
1849 TestCopyingEmpty,
1850 TestCopyingSingleton,
1851 TestCopyingTriple,
1852 TestCopyingTuple,
1853 TestCopyingNested,
1854 TestIdentities,
1855 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001856 TestGraphs,
Éric Araujo48049912011-03-23 02:08:07 +01001857 TestWeirdBugs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001858 )
1859
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001860 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001861
1862 # verify reference counting
1863 if verbose and hasattr(sys, "gettotalrefcount"):
1864 import gc
1865 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001866 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001867 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001868 gc.collect()
1869 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001870 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001871
1872if __name__ == "__main__":
1873 test_main(verbose=True)