blob: e4766ab190be011f821faa73558abe1067d8948d [file] [log] [blame]
Éric Araujo1138eba2010-09-05 18:59: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
Christian Heimes0ded5b52007-12-10 15:50:56 +00009import warnings
Christian Heimes969fe572008-01-25 11:23:10 +000010import collections
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000011import collections.abc
Raymond Hettinger455b5092015-08-09 00:35:00 -070012import itertools
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
Ezio Melottiab5ba792013-04-19 05:58:44 +030040class TestJointOps:
Raymond Hettingera690a992003-11-16 16:17:49 +000041 # 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 Hettinger3fb156c2010-04-18 23:05:22 +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)])
Benjamin Peterson577473f2010-01-19 00:09:57 +000069 self.assertIn(self.thetype(self.letters), 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 Hettingere805ecc2009-07-27 20:16:37 +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)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +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'])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +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
Serhiy Storchakabad12572014-12-15 14:03:42 +0200234 p = pickle.dumps(self.s, i)
Raymond Hettinger15056a52004-11-09 07:25:31 +0000235 dup = pickle.loads(p)
236 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000237
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000238 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200239 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
240 itorg = iter(self.s)
241 data = self.thetype(self.s)
242 d = pickle.dumps(itorg, proto)
243 it = pickle.loads(d)
244 # Set iterators unpickle as list iterators due to the
245 # undefined order of set items.
246 # self.assertEqual(type(itorg), type(it))
247 self.assertIsInstance(it, collections.abc.Iterator)
248 self.assertEqual(self.thetype(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000249
Serhiy Storchakabad12572014-12-15 14:03:42 +0200250 it = pickle.loads(d)
251 try:
252 drop = next(it)
253 except StopIteration:
254 continue
255 d = pickle.dumps(it, proto)
256 it = pickle.loads(d)
257 self.assertEqual(self.thetype(it), data - self.thetype((drop,)))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000258
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000259 def test_deepcopy(self):
260 class Tracer:
261 def __init__(self, value):
262 self.value = value
263 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000264 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000265 def __deepcopy__(self, memo=None):
266 return Tracer(self.value + 1)
267 t = Tracer(10)
268 s = self.thetype([t])
269 dup = copy.deepcopy(s)
270 self.assertNotEqual(id(s), id(dup))
271 for elem in dup:
272 newt = elem
273 self.assertNotEqual(id(t), id(newt))
274 self.assertEqual(t.value + 1, newt.value)
275
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000276 def test_gc(self):
277 # Create a nest of cycles to exercise overall ref count check
278 class A:
279 pass
Guido van Rossum805365e2007-05-07 22:24:25 +0000280 s = set(A() for i in range(1000))
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000281 for elem in s:
282 elem.cycle = s
283 elem.sub = elem
284 elem.set = set([elem])
285
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000286 def test_subclass_with_custom_hash(self):
287 # Bug #1257731
288 class H(self.thetype):
289 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000290 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000291 s=H()
292 f=set()
293 f.add(s)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000294 self.assertIn(s, f)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000295 f.remove(s)
296 f.add(s)
297 f.discard(s)
298
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000299 def test_badcmp(self):
300 s = self.thetype([BadCmp()])
301 # Detect comparison errors during insertion and lookup
302 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
303 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
304 # Detect errors during mutating operations
305 if hasattr(s, 'add'):
306 self.assertRaises(RuntimeError, s.add, BadCmp())
307 self.assertRaises(RuntimeError, s.discard, BadCmp())
308 self.assertRaises(RuntimeError, s.remove, BadCmp())
309
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000310 def test_cyclical_repr(self):
311 w = ReprWrapper()
312 s = self.thetype([w])
313 w.value = s
314 if self.thetype == set:
315 self.assertEqual(repr(s), '{set(...)}')
316 else:
317 name = repr(s).partition('(')[0] # strip class name
Guido van Rossumbdba5cf2007-08-07 22:44:20 +0000318 self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000319
320 def test_cyclical_print(self):
321 w = ReprWrapper()
322 s = self.thetype([w])
323 w.value = s
Thomas Heller0d755b42008-07-15 17:14:09 +0000324 fo = open(support.TESTFN, "w")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000325 try:
Guido van Rossumd8c19672007-02-09 21:54:58 +0000326 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000327 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000328 fo = open(support.TESTFN, "r")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000329 self.assertEqual(fo.read(), repr(s))
330 finally:
331 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000332 support.unlink(support.TESTFN)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000333
Thomas Wouterscf297e42007-02-23 15:07:44 +0000334 def test_do_not_rehash_dict_keys(self):
335 n = 10
Guido van Rossum805365e2007-05-07 22:24:25 +0000336 d = dict.fromkeys(map(HashCountingInt, range(n)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000337 self.assertEqual(sum(elem.hash_count for elem in d), n)
338 s = self.thetype(d)
339 self.assertEqual(sum(elem.hash_count for elem in d), n)
340 s.difference(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000341 self.assertEqual(sum(elem.hash_count for elem in d), n)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000342 if hasattr(s, 'symmetric_difference_update'):
343 s.symmetric_difference_update(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000344 self.assertEqual(sum(elem.hash_count for elem in d), n)
345 d2 = dict.fromkeys(set(d))
346 self.assertEqual(sum(elem.hash_count for elem in d), n)
347 d3 = dict.fromkeys(frozenset(d))
348 self.assertEqual(sum(elem.hash_count for elem in d), n)
349 d3 = dict.fromkeys(frozenset(d), 123)
350 self.assertEqual(sum(elem.hash_count for elem in d), n)
351 self.assertEqual(d3, dict.fromkeys(d, 123))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000352
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000353 def test_container_iterator(self):
354 # Bug #3680: tp_traverse was not implemented for set iterator object
355 class C(object):
356 pass
357 obj = C()
358 ref = weakref.ref(obj)
359 container = set([obj, 1])
360 obj.x = iter(container)
361 del obj, container
362 gc.collect()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000363 self.assertTrue(ref() is None, "Cycle was not collected")
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000364
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300365 def test_free_after_iterating(self):
366 support.check_free_after_iterating(self, iter, self.thetype)
367
Ezio Melottiab5ba792013-04-19 05:58:44 +0300368class TestSet(TestJointOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000369 thetype = set
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000370 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000371
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000372 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000373 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000374 s.__init__(self.word)
375 self.assertEqual(s, set(self.word))
376 s.__init__(self.otherword)
377 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000378 self.assertRaises(TypeError, s.__init__, s, 2);
379 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000380
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000381 def test_constructor_identity(self):
382 s = self.thetype(range(3))
383 t = self.thetype(s)
384 self.assertNotEqual(id(s), id(t))
385
Guido van Rossum86e58e22006-08-28 15:27:34 +0000386 def test_set_literal(self):
387 s = set([1,2,3])
388 t = {1,2,3}
389 self.assertEqual(s, t)
390
Raymond Hettinger4c483ad2016-09-08 14:45:40 -0700391 def test_set_literal_insertion_order(self):
392 # SF Issue #26020 -- Expect left to right insertion
393 s = {1, 1.0, True}
394 self.assertEqual(len(s), 1)
395 stored_value = s.pop()
396 self.assertEqual(type(stored_value), int)
397
398 def test_set_literal_evaluation_order(self):
399 # Expect left to right expression evaluation
400 events = []
401 def record(obj):
402 events.append(obj)
403 s = {record(1), record(2), record(3)}
404 self.assertEqual(events, [1, 2, 3])
405
Raymond Hettingera690a992003-11-16 16:17:49 +0000406 def test_hash(self):
407 self.assertRaises(TypeError, hash, self.s)
408
409 def test_clear(self):
410 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000411 self.assertEqual(self.s, set())
412 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000413
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000414 def test_copy(self):
415 dup = self.s.copy()
416 self.assertEqual(self.s, dup)
417 self.assertNotEqual(id(self.s), id(dup))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000418 self.assertEqual(type(dup), self.basetype)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000419
Raymond Hettingera690a992003-11-16 16:17:49 +0000420 def test_add(self):
421 self.s.add('Q')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000422 self.assertIn('Q', self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000423 dup = self.s.copy()
424 self.s.add('Q')
425 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000426 self.assertRaises(TypeError, self.s.add, [])
427
428 def test_remove(self):
429 self.s.remove('a')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000430 self.assertNotIn('a', self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000431 self.assertRaises(KeyError, self.s.remove, 'Q')
432 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000433 s = self.thetype([frozenset(self.word)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000434 self.assertIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000435 s.remove(self.thetype(self.word))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000436 self.assertNotIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000437 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000438
Thomas Wouters89f507f2006-12-13 04:49:30 +0000439 def test_remove_keyerror_unpacking(self):
440 # bug: www.python.org/sf/1576657
441 for v1 in ['Q', (1,)]:
442 try:
443 self.s.remove(v1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000444 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000445 v2 = e.args[0]
446 self.assertEqual(v1, v2)
447 else:
448 self.fail()
449
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000450 def test_remove_keyerror_set(self):
451 key = self.thetype([3, 4])
452 try:
453 self.s.remove(key)
454 except KeyError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000455 self.assertTrue(e.args[0] is key,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000456 "KeyError should be {0}, not {1}".format(key,
457 e.args[0]))
458 else:
459 self.fail()
460
Raymond Hettingera690a992003-11-16 16:17:49 +0000461 def test_discard(self):
462 self.s.discard('a')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000463 self.assertNotIn('a', self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000464 self.s.discard('Q')
465 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000466 s = self.thetype([frozenset(self.word)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000467 self.assertIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000468 s.discard(self.thetype(self.word))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000469 self.assertNotIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000470 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000471
472 def test_pop(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000473 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000474 elem = self.s.pop()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000475 self.assertNotIn(elem, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000476 self.assertRaises(KeyError, self.s.pop)
477
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000478 def test_update(self):
479 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000480 self.assertEqual(retval, None)
481 for c in (self.word + self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000482 self.assertIn(c, self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000483 self.assertRaises(PassThru, self.s.update, check_pass_thru())
484 self.assertRaises(TypeError, self.s.update, [[]])
485 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000486 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000487 s = self.thetype('abcba')
488 self.assertEqual(s.update(C(p)), None)
489 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000490 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
491 q = 'ahi'
492 for C in set, frozenset, dict.fromkeys, str, list, tuple:
493 s = self.thetype('abcba')
494 self.assertEqual(s.update(C(p), C(q)), None)
495 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000496
497 def test_ior(self):
498 self.s |= set(self.otherword)
499 for c in (self.word + self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000500 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000501
502 def test_intersection_update(self):
503 retval = self.s.intersection_update(self.otherword)
504 self.assertEqual(retval, None)
505 for c in (self.word + self.otherword):
506 if c in self.otherword and c in self.word:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000507 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000508 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000509 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000510 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
511 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000512 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000513 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000514 s = self.thetype('abcba')
515 self.assertEqual(s.intersection_update(C(p)), None)
516 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000517 ss = 'abcba'
518 s = self.thetype(ss)
519 t = 'cbc'
520 self.assertEqual(s.intersection_update(C(p), C(t)), None)
521 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000522
523 def test_iand(self):
524 self.s &= set(self.otherword)
525 for c in (self.word + self.otherword):
526 if c in self.otherword and c in self.word:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000527 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000528 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000529 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000530
531 def test_difference_update(self):
532 retval = self.s.difference_update(self.otherword)
533 self.assertEqual(retval, None)
534 for c in (self.word + self.otherword):
535 if c in self.word and c not in self.otherword:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000536 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000537 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000538 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000539 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
540 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000541 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
542 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000543 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000544 s = self.thetype('abcba')
545 self.assertEqual(s.difference_update(C(p)), None)
546 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000547
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000548 s = self.thetype('abcdefghih')
549 s.difference_update()
550 self.assertEqual(s, self.thetype('abcdefghih'))
551
552 s = self.thetype('abcdefghih')
553 s.difference_update(C('aba'))
554 self.assertEqual(s, self.thetype('cdefghih'))
555
556 s = self.thetype('abcdefghih')
557 s.difference_update(C('cdc'), C('aba'))
558 self.assertEqual(s, self.thetype('efghih'))
559
Raymond Hettingera690a992003-11-16 16:17:49 +0000560 def test_isub(self):
561 self.s -= set(self.otherword)
562 for c in (self.word + self.otherword):
563 if c in self.word and c not in self.otherword:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000564 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000565 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000566 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000567
568 def test_symmetric_difference_update(self):
569 retval = self.s.symmetric_difference_update(self.otherword)
570 self.assertEqual(retval, None)
571 for c in (self.word + self.otherword):
572 if (c in self.word) ^ (c in self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000573 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000574 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000575 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000576 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
577 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000578 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000579 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000580 s = self.thetype('abcba')
581 self.assertEqual(s.symmetric_difference_update(C(p)), None)
582 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000583
584 def test_ixor(self):
585 self.s ^= set(self.otherword)
586 for c in (self.word + self.otherword):
587 if (c in self.word) ^ (c in self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000588 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000589 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000590 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000591
Raymond Hettingerc991db22005-08-11 07:58:45 +0000592 def test_inplace_on_self(self):
593 t = self.s.copy()
594 t |= t
595 self.assertEqual(t, self.s)
596 t &= t
597 self.assertEqual(t, self.s)
598 t -= t
599 self.assertEqual(t, self.thetype())
600 t = self.s.copy()
601 t ^= t
602 self.assertEqual(t, self.thetype())
603
Raymond Hettinger691d8052004-05-30 07:26:47 +0000604 def test_weakref(self):
605 s = self.thetype('gallahad')
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000606 p = weakref.proxy(s)
Raymond Hettinger691d8052004-05-30 07:26:47 +0000607 self.assertEqual(str(p), str(s))
608 s = None
609 self.assertRaises(ReferenceError, str, p)
610
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000611 def test_rich_compare(self):
612 class TestRichSetCompare:
613 def __gt__(self, some_set):
614 self.gt_called = True
615 return False
616 def __lt__(self, some_set):
617 self.lt_called = True
618 return False
619 def __ge__(self, some_set):
620 self.ge_called = True
621 return False
622 def __le__(self, some_set):
623 self.le_called = True
624 return False
625
Ezio Melotti42da6632011-03-15 05:18:48 +0200626 # This first tries the builtin rich set comparison, which doesn't know
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000627 # how to handle the custom object. Upon returning NotImplemented, the
628 # corresponding comparison on the right object is invoked.
629 myset = {1, 2, 3}
630
631 myobj = TestRichSetCompare()
632 myset < myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000633 self.assertTrue(myobj.gt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000634
635 myobj = TestRichSetCompare()
636 myset > myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000637 self.assertTrue(myobj.lt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000638
639 myobj = TestRichSetCompare()
640 myset <= myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000641 self.assertTrue(myobj.ge_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000642
643 myobj = TestRichSetCompare()
644 myset >= myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000645 self.assertTrue(myobj.le_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000646
Serhiy Storchaka43767632013-11-03 21:31:38 +0200647 @unittest.skipUnless(hasattr(set, "test_c_api"),
648 'C API test only available in a debug build')
649 def test_c_api(self):
650 self.assertEqual(set().test_c_api(), True)
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000651
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000652class SetSubclass(set):
653 pass
654
655class TestSetSubclass(TestSet):
656 thetype = SetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000657 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000658
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000659class SetSubclassWithKeywordArgs(set):
660 def __init__(self, iterable=[], newarg=None):
661 set.__init__(self, iterable)
662
663class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000664
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000665 def test_keywords_in_subclass(self):
666 'SF bug #1486663 -- this used to erroneously raise a TypeError'
667 SetSubclassWithKeywordArgs(newarg=1)
668
Ezio Melottiab5ba792013-04-19 05:58:44 +0300669class TestFrozenSet(TestJointOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000670 thetype = frozenset
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000671 basetype = frozenset
Raymond Hettingera690a992003-11-16 16:17:49 +0000672
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000673 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000674 s = self.thetype(self.word)
675 s.__init__(self.otherword)
676 self.assertEqual(s, set(self.word))
677
Raymond Hettingerd7946662005-08-01 21:39:29 +0000678 def test_singleton_empty_frozenset(self):
679 f = frozenset()
680 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
681 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000682 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000683 frozenset(f), f]
684 # All of the empty frozensets should have just one id()
685 self.assertEqual(len(set(map(id, efs))), 1)
686
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000687 def test_constructor_identity(self):
688 s = self.thetype(range(3))
689 t = self.thetype(s)
690 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000691
Raymond Hettingera690a992003-11-16 16:17:49 +0000692 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000693 self.assertEqual(hash(self.thetype('abcdeb')),
694 hash(self.thetype('ebecda')))
695
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000696 # make sure that all permutations give the same hash value
697 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000698 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000699 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000700 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000701 shuffle(seq)
702 results.add(hash(self.thetype(seq)))
703 self.assertEqual(len(results), 1)
704
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000705 def test_copy(self):
706 dup = self.s.copy()
707 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000708
709 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000710 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000711 key1 = self.thetype(seq)
712 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000713 self.assertEqual(key1, key2)
714 self.assertNotEqual(id(key1), id(key2))
715 d = {}
716 d[key1] = 42
717 self.assertEqual(d[key2], 42)
718
719 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000720 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000721 self.assertEqual(hash(f), hash(f))
722
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000723 def test_hash_effectiveness(self):
724 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000725 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000726 addhashvalue = hashvalues.add
727 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000728 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000729 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
730 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000731
Raymond Hettinger455b5092015-08-09 00:35:00 -0700732 def zf_range(n):
733 # https://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers
734 nums = [frozenset()]
735 for i in range(n-1):
736 num = frozenset(nums)
737 nums.append(num)
738 return nums[:n]
739
740 def powerset(s):
741 for i in range(len(s)+1):
742 yield from map(frozenset, itertools.combinations(s, i))
743
744 for n in range(18):
745 t = 2 ** n
746 mask = t - 1
Raymond Hettinger4e17e042016-11-21 16:59:04 -0800747 for nums in (range, zf_range):
Raymond Hettinger455b5092015-08-09 00:35:00 -0700748 u = len({h & mask for h in map(hash, powerset(nums(n)))})
749 self.assertGreater(4*u, t)
750
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000751class FrozenSetSubclass(frozenset):
752 pass
753
754class TestFrozenSetSubclass(TestFrozenSet):
755 thetype = FrozenSetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000756 basetype = frozenset
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000757
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000758 def test_constructor_identity(self):
759 s = self.thetype(range(3))
760 t = self.thetype(s)
761 self.assertNotEqual(id(s), id(t))
762
763 def test_copy(self):
764 dup = self.s.copy()
765 self.assertNotEqual(id(self.s), id(dup))
766
767 def test_nested_empty_constructor(self):
768 s = self.thetype()
769 t = self.thetype(s)
770 self.assertEqual(s, t)
771
Raymond Hettingerd7946662005-08-01 21:39:29 +0000772 def test_singleton_empty_frozenset(self):
773 Frozenset = self.thetype
774 f = frozenset()
775 F = Frozenset()
776 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
777 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000778 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000779 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
780 # All empty frozenset subclass instances should have different ids
781 self.assertEqual(len(set(map(id, efs))), len(efs))
782
Raymond Hettingera690a992003-11-16 16:17:49 +0000783# Tests taken from test_sets.py =============================================
784
785empty_set = set()
786
787#==============================================================================
788
Ezio Melottiab5ba792013-04-19 05:58:44 +0300789class TestBasicOps:
Raymond Hettingera690a992003-11-16 16:17:49 +0000790
791 def test_repr(self):
792 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000793 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000794
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100795 def check_repr_against_values(self):
796 text = repr(self.set)
797 self.assertTrue(text.startswith('{'))
798 self.assertTrue(text.endswith('}'))
799
800 result = text[1:-1].split(', ')
801 result.sort()
802 sorted_repr_values = [repr(value) for value in self.values]
803 sorted_repr_values.sort()
804 self.assertEqual(result, sorted_repr_values)
805
Raymond Hettingereae05de2004-07-09 04:51:24 +0000806 def test_print(self):
807 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000808 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000809 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000810 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000811 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000812 self.assertEqual(fo.read(), repr(self.set))
813 finally:
814 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000815 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000816
Raymond Hettingera690a992003-11-16 16:17:49 +0000817 def test_length(self):
818 self.assertEqual(len(self.set), self.length)
819
820 def test_self_equality(self):
821 self.assertEqual(self.set, self.set)
822
823 def test_equivalent_equality(self):
824 self.assertEqual(self.set, self.dup)
825
826 def test_copy(self):
827 self.assertEqual(self.set.copy(), self.dup)
828
829 def test_self_union(self):
830 result = self.set | self.set
831 self.assertEqual(result, self.dup)
832
833 def test_empty_union(self):
834 result = self.set | empty_set
835 self.assertEqual(result, self.dup)
836
837 def test_union_empty(self):
838 result = empty_set | self.set
839 self.assertEqual(result, self.dup)
840
841 def test_self_intersection(self):
842 result = self.set & self.set
843 self.assertEqual(result, self.dup)
844
845 def test_empty_intersection(self):
846 result = self.set & empty_set
847 self.assertEqual(result, empty_set)
848
849 def test_intersection_empty(self):
850 result = empty_set & self.set
851 self.assertEqual(result, empty_set)
852
Guido van Rossum58da9312007-11-10 23:39:45 +0000853 def test_self_isdisjoint(self):
854 result = self.set.isdisjoint(self.set)
855 self.assertEqual(result, not self.set)
856
857 def test_empty_isdisjoint(self):
858 result = self.set.isdisjoint(empty_set)
859 self.assertEqual(result, True)
860
861 def test_isdisjoint_empty(self):
862 result = empty_set.isdisjoint(self.set)
863 self.assertEqual(result, True)
864
Raymond Hettingera690a992003-11-16 16:17:49 +0000865 def test_self_symmetric_difference(self):
866 result = self.set ^ self.set
867 self.assertEqual(result, empty_set)
868
Georg Brandl33b6a312010-08-01 06:44:46 +0000869 def test_empty_symmetric_difference(self):
Raymond Hettingera690a992003-11-16 16:17:49 +0000870 result = self.set ^ empty_set
871 self.assertEqual(result, self.set)
872
873 def test_self_difference(self):
874 result = self.set - self.set
875 self.assertEqual(result, empty_set)
876
877 def test_empty_difference(self):
878 result = self.set - empty_set
879 self.assertEqual(result, self.dup)
880
881 def test_empty_difference_rev(self):
882 result = empty_set - self.set
883 self.assertEqual(result, empty_set)
884
885 def test_iteration(self):
886 for v in self.set:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000887 self.assertIn(v, self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000888 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000889 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000890
891 def test_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200892 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
893 p = pickle.dumps(self.set, proto)
894 copy = pickle.loads(p)
895 self.assertEqual(self.set, copy,
896 "%s != %s" % (self.set, copy))
Raymond Hettingera690a992003-11-16 16:17:49 +0000897
Miss Islington (bot)583ff842019-06-11 01:41:23 -0700898 def test_issue_37219(self):
899 with self.assertRaises(TypeError):
900 set().difference(123)
901 with self.assertRaises(TypeError):
902 set().difference_update(123)
903
Raymond Hettingera690a992003-11-16 16:17:49 +0000904#------------------------------------------------------------------------------
905
Ezio Melottiab5ba792013-04-19 05:58:44 +0300906class TestBasicOpsEmpty(TestBasicOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000907 def setUp(self):
908 self.case = "empty set"
909 self.values = []
910 self.set = set(self.values)
911 self.dup = set(self.values)
912 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000913 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000914
915#------------------------------------------------------------------------------
916
Ezio Melottiab5ba792013-04-19 05:58:44 +0300917class TestBasicOpsSingleton(TestBasicOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000918 def setUp(self):
919 self.case = "unit set (number)"
920 self.values = [3]
921 self.set = set(self.values)
922 self.dup = set(self.values)
923 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000924 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000925
926 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000927 self.assertIn(3, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000928
929 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000930 self.assertNotIn(2, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000931
932#------------------------------------------------------------------------------
933
Ezio Melottiab5ba792013-04-19 05:58:44 +0300934class TestBasicOpsTuple(TestBasicOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000935 def setUp(self):
936 self.case = "unit set (tuple)"
937 self.values = [(0, "zero")]
938 self.set = set(self.values)
939 self.dup = set(self.values)
940 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000941 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000942
943 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000944 self.assertIn((0, "zero"), self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000945
946 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000947 self.assertNotIn(9, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000948
949#------------------------------------------------------------------------------
950
Ezio Melottiab5ba792013-04-19 05:58:44 +0300951class TestBasicOpsTriple(TestBasicOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000952 def setUp(self):
953 self.case = "triple set"
954 self.values = [0, "zero", operator.add]
955 self.set = set(self.values)
956 self.dup = set(self.values)
957 self.length = 3
958 self.repr = None
959
Christian Heimes0ded5b52007-12-10 15:50:56 +0000960#------------------------------------------------------------------------------
961
Ezio Melottiab5ba792013-04-19 05:58:44 +0300962class TestBasicOpsString(TestBasicOps, unittest.TestCase):
Christian Heimes0ded5b52007-12-10 15:50:56 +0000963 def setUp(self):
964 self.case = "string set"
965 self.values = ["a", "b", "c"]
966 self.set = set(self.values)
967 self.dup = set(self.values)
968 self.length = 3
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100969
970 def test_repr(self):
971 self.check_repr_against_values()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000972
973#------------------------------------------------------------------------------
974
Ezio Melottiab5ba792013-04-19 05:58:44 +0300975class TestBasicOpsBytes(TestBasicOps, unittest.TestCase):
Christian Heimes0ded5b52007-12-10 15:50:56 +0000976 def setUp(self):
Philip Jenvey1226db42014-04-18 11:10:50 -0700977 self.case = "bytes set"
Christian Heimes0ded5b52007-12-10 15:50:56 +0000978 self.values = [b"a", b"b", b"c"]
979 self.set = set(self.values)
980 self.dup = set(self.values)
981 self.length = 3
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100982
983 def test_repr(self):
984 self.check_repr_against_values()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000985
986#------------------------------------------------------------------------------
987
Ezio Melottiab5ba792013-04-19 05:58:44 +0300988class TestBasicOpsMixedStringBytes(TestBasicOps, unittest.TestCase):
Christian Heimes0ded5b52007-12-10 15:50:56 +0000989 def setUp(self):
Brett Cannon241bd982010-03-20 21:55:48 +0000990 self._warning_filters = support.check_warnings()
991 self._warning_filters.__enter__()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000992 warnings.simplefilter('ignore', BytesWarning)
993 self.case = "string and bytes set"
994 self.values = ["a", "b", b"a", b"b"]
995 self.set = set(self.values)
996 self.dup = set(self.values)
997 self.length = 4
Christian Heimes0ded5b52007-12-10 15:50:56 +0000998
999 def tearDown(self):
Brett Cannon241bd982010-03-20 21:55:48 +00001000 self._warning_filters.__exit__(None, None, None)
Christian Heimes0ded5b52007-12-10 15:50:56 +00001001
Georg Brandl2daf6ae2012-02-20 19:54:16 +01001002 def test_repr(self):
1003 self.check_repr_against_values()
1004
Raymond Hettingera690a992003-11-16 16:17:49 +00001005#==============================================================================
1006
1007def baditer():
1008 raise TypeError
1009 yield True
1010
1011def gooditer():
1012 yield True
1013
1014class TestExceptionPropagation(unittest.TestCase):
1015 """SF 628246: Set constructor should not trap iterator TypeErrors"""
1016
1017 def test_instanceWithException(self):
1018 self.assertRaises(TypeError, set, baditer())
1019
1020 def test_instancesWithoutException(self):
1021 # All of these iterables should load without exception.
1022 set([1,2,3])
1023 set((1,2,3))
1024 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +00001025 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +00001026 set('abc')
1027 set(gooditer())
1028
Neal Norwitzfcf44352005-11-27 20:37:43 +00001029 def test_changingSizeWhileIterating(self):
1030 s = set([1,2,3])
1031 try:
1032 for i in s:
1033 s.update([4])
1034 except RuntimeError:
1035 pass
1036 else:
1037 self.fail("no exception when changing size during iteration")
1038
Raymond Hettingera690a992003-11-16 16:17:49 +00001039#==============================================================================
1040
1041class TestSetOfSets(unittest.TestCase):
1042 def test_constructor(self):
1043 inner = frozenset([1])
1044 outer = set([inner])
1045 element = outer.pop()
1046 self.assertEqual(type(element), frozenset)
1047 outer.add(inner) # Rebuild set of sets with .add method
1048 outer.remove(inner)
1049 self.assertEqual(outer, set()) # Verify that remove worked
1050 outer.discard(inner) # Absence of KeyError indicates working fine
1051
1052#==============================================================================
1053
1054class TestBinaryOps(unittest.TestCase):
1055 def setUp(self):
1056 self.set = set((2, 4, 6))
1057
1058 def test_eq(self): # SF bug 643115
1059 self.assertEqual(self.set, set({2:1,4:3,6:5}))
1060
1061 def test_union_subset(self):
1062 result = self.set | set([2])
1063 self.assertEqual(result, set((2, 4, 6)))
1064
1065 def test_union_superset(self):
1066 result = self.set | set([2, 4, 6, 8])
1067 self.assertEqual(result, set([2, 4, 6, 8]))
1068
1069 def test_union_overlap(self):
1070 result = self.set | set([3, 4, 5])
1071 self.assertEqual(result, set([2, 3, 4, 5, 6]))
1072
1073 def test_union_non_overlap(self):
1074 result = self.set | set([8])
1075 self.assertEqual(result, set([2, 4, 6, 8]))
1076
1077 def test_intersection_subset(self):
1078 result = self.set & set((2, 4))
1079 self.assertEqual(result, set((2, 4)))
1080
1081 def test_intersection_superset(self):
1082 result = self.set & set([2, 4, 6, 8])
1083 self.assertEqual(result, set([2, 4, 6]))
1084
1085 def test_intersection_overlap(self):
1086 result = self.set & set([3, 4, 5])
1087 self.assertEqual(result, set([4]))
1088
1089 def test_intersection_non_overlap(self):
1090 result = self.set & set([8])
1091 self.assertEqual(result, empty_set)
1092
Guido van Rossum58da9312007-11-10 23:39:45 +00001093 def test_isdisjoint_subset(self):
1094 result = self.set.isdisjoint(set((2, 4)))
1095 self.assertEqual(result, False)
1096
1097 def test_isdisjoint_superset(self):
1098 result = self.set.isdisjoint(set([2, 4, 6, 8]))
1099 self.assertEqual(result, False)
1100
1101 def test_isdisjoint_overlap(self):
1102 result = self.set.isdisjoint(set([3, 4, 5]))
1103 self.assertEqual(result, False)
1104
1105 def test_isdisjoint_non_overlap(self):
1106 result = self.set.isdisjoint(set([8]))
1107 self.assertEqual(result, True)
1108
Raymond Hettingera690a992003-11-16 16:17:49 +00001109 def test_sym_difference_subset(self):
1110 result = self.set ^ set((2, 4))
1111 self.assertEqual(result, set([6]))
1112
1113 def test_sym_difference_superset(self):
1114 result = self.set ^ set((2, 4, 6, 8))
1115 self.assertEqual(result, set([8]))
1116
1117 def test_sym_difference_overlap(self):
1118 result = self.set ^ set((3, 4, 5))
1119 self.assertEqual(result, set([2, 3, 5, 6]))
1120
1121 def test_sym_difference_non_overlap(self):
1122 result = self.set ^ set([8])
1123 self.assertEqual(result, set([2, 4, 6, 8]))
1124
Raymond Hettingera690a992003-11-16 16:17:49 +00001125#==============================================================================
1126
1127class TestUpdateOps(unittest.TestCase):
1128 def setUp(self):
1129 self.set = set((2, 4, 6))
1130
1131 def test_union_subset(self):
1132 self.set |= set([2])
1133 self.assertEqual(self.set, set((2, 4, 6)))
1134
1135 def test_union_superset(self):
1136 self.set |= set([2, 4, 6, 8])
1137 self.assertEqual(self.set, set([2, 4, 6, 8]))
1138
1139 def test_union_overlap(self):
1140 self.set |= set([3, 4, 5])
1141 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1142
1143 def test_union_non_overlap(self):
1144 self.set |= set([8])
1145 self.assertEqual(self.set, set([2, 4, 6, 8]))
1146
1147 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001148 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001149 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1150
1151 def test_intersection_subset(self):
1152 self.set &= set((2, 4))
1153 self.assertEqual(self.set, set((2, 4)))
1154
1155 def test_intersection_superset(self):
1156 self.set &= set([2, 4, 6, 8])
1157 self.assertEqual(self.set, set([2, 4, 6]))
1158
1159 def test_intersection_overlap(self):
1160 self.set &= set([3, 4, 5])
1161 self.assertEqual(self.set, set([4]))
1162
1163 def test_intersection_non_overlap(self):
1164 self.set &= set([8])
1165 self.assertEqual(self.set, empty_set)
1166
1167 def test_intersection_method_call(self):
1168 self.set.intersection_update(set([3, 4, 5]))
1169 self.assertEqual(self.set, set([4]))
1170
1171 def test_sym_difference_subset(self):
1172 self.set ^= set((2, 4))
1173 self.assertEqual(self.set, set([6]))
1174
1175 def test_sym_difference_superset(self):
1176 self.set ^= set((2, 4, 6, 8))
1177 self.assertEqual(self.set, set([8]))
1178
1179 def test_sym_difference_overlap(self):
1180 self.set ^= set((3, 4, 5))
1181 self.assertEqual(self.set, set([2, 3, 5, 6]))
1182
1183 def test_sym_difference_non_overlap(self):
1184 self.set ^= set([8])
1185 self.assertEqual(self.set, set([2, 4, 6, 8]))
1186
1187 def test_sym_difference_method_call(self):
1188 self.set.symmetric_difference_update(set([3, 4, 5]))
1189 self.assertEqual(self.set, set([2, 3, 5, 6]))
1190
1191 def test_difference_subset(self):
1192 self.set -= set((2, 4))
1193 self.assertEqual(self.set, set([6]))
1194
1195 def test_difference_superset(self):
1196 self.set -= set((2, 4, 6, 8))
1197 self.assertEqual(self.set, set([]))
1198
1199 def test_difference_overlap(self):
1200 self.set -= set((3, 4, 5))
1201 self.assertEqual(self.set, set([2, 6]))
1202
1203 def test_difference_non_overlap(self):
1204 self.set -= set([8])
1205 self.assertEqual(self.set, set([2, 4, 6]))
1206
1207 def test_difference_method_call(self):
1208 self.set.difference_update(set([3, 4, 5]))
1209 self.assertEqual(self.set, set([2, 6]))
1210
1211#==============================================================================
1212
1213class TestMutate(unittest.TestCase):
1214 def setUp(self):
1215 self.values = ["a", "b", "c"]
1216 self.set = set(self.values)
1217
1218 def test_add_present(self):
1219 self.set.add("c")
1220 self.assertEqual(self.set, set("abc"))
1221
1222 def test_add_absent(self):
1223 self.set.add("d")
1224 self.assertEqual(self.set, set("abcd"))
1225
1226 def test_add_until_full(self):
1227 tmp = set()
1228 expected_len = 0
1229 for v in self.values:
1230 tmp.add(v)
1231 expected_len += 1
1232 self.assertEqual(len(tmp), expected_len)
1233 self.assertEqual(tmp, self.set)
1234
1235 def test_remove_present(self):
1236 self.set.remove("b")
1237 self.assertEqual(self.set, set("ac"))
1238
1239 def test_remove_absent(self):
1240 try:
1241 self.set.remove("d")
1242 self.fail("Removing missing element should have raised LookupError")
1243 except LookupError:
1244 pass
1245
1246 def test_remove_until_empty(self):
1247 expected_len = len(self.set)
1248 for v in self.values:
1249 self.set.remove(v)
1250 expected_len -= 1
1251 self.assertEqual(len(self.set), expected_len)
1252
1253 def test_discard_present(self):
1254 self.set.discard("c")
1255 self.assertEqual(self.set, set("ab"))
1256
1257 def test_discard_absent(self):
1258 self.set.discard("d")
1259 self.assertEqual(self.set, set("abc"))
1260
1261 def test_clear(self):
1262 self.set.clear()
1263 self.assertEqual(len(self.set), 0)
1264
1265 def test_pop(self):
1266 popped = {}
1267 while self.set:
1268 popped[self.set.pop()] = None
1269 self.assertEqual(len(popped), len(self.values))
1270 for v in self.values:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001271 self.assertIn(v, popped)
Raymond Hettingera690a992003-11-16 16:17:49 +00001272
1273 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001274 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001275 self.assertEqual(self.set, set(self.values))
1276
1277 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001278 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001279 self.assertEqual(self.set, set(self.values))
1280
1281 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001282 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001283 self.assertEqual(self.set, set(self.values + ["z"]))
1284
1285#==============================================================================
1286
Ezio Melottiab5ba792013-04-19 05:58:44 +03001287class TestSubsets:
Raymond Hettingera690a992003-11-16 16:17:49 +00001288
1289 case2method = {"<=": "issubset",
1290 ">=": "issuperset",
1291 }
1292
1293 reverse = {"==": "==",
1294 "!=": "!=",
1295 "<": ">",
1296 ">": "<",
1297 "<=": ">=",
1298 ">=": "<=",
1299 }
1300
1301 def test_issubset(self):
1302 x = self.left
1303 y = self.right
1304 for case in "!=", "==", "<", "<=", ">", ">=":
1305 expected = case in self.cases
1306 # Test the binary infix spelling.
1307 result = eval("x" + case + "y", locals())
1308 self.assertEqual(result, expected)
1309 # Test the "friendly" method-name spelling, if one exists.
1310 if case in TestSubsets.case2method:
1311 method = getattr(x, TestSubsets.case2method[case])
1312 result = method(y)
1313 self.assertEqual(result, expected)
1314
1315 # Now do the same for the operands reversed.
1316 rcase = TestSubsets.reverse[case]
1317 result = eval("y" + rcase + "x", locals())
1318 self.assertEqual(result, expected)
1319 if rcase in TestSubsets.case2method:
1320 method = getattr(y, TestSubsets.case2method[rcase])
1321 result = method(x)
1322 self.assertEqual(result, expected)
1323#------------------------------------------------------------------------------
1324
Ezio Melottiab5ba792013-04-19 05:58:44 +03001325class TestSubsetEqualEmpty(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001326 left = set()
1327 right = set()
1328 name = "both empty"
1329 cases = "==", "<=", ">="
1330
1331#------------------------------------------------------------------------------
1332
Ezio Melottiab5ba792013-04-19 05:58:44 +03001333class TestSubsetEqualNonEmpty(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001334 left = set([1, 2])
1335 right = set([1, 2])
1336 name = "equal pair"
1337 cases = "==", "<=", ">="
1338
1339#------------------------------------------------------------------------------
1340
Ezio Melottiab5ba792013-04-19 05:58:44 +03001341class TestSubsetEmptyNonEmpty(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001342 left = set()
1343 right = set([1, 2])
1344 name = "one empty, one non-empty"
1345 cases = "!=", "<", "<="
1346
1347#------------------------------------------------------------------------------
1348
Ezio Melottiab5ba792013-04-19 05:58:44 +03001349class TestSubsetPartial(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001350 left = set([1])
1351 right = set([1, 2])
1352 name = "one a non-empty proper subset of other"
1353 cases = "!=", "<", "<="
1354
1355#------------------------------------------------------------------------------
1356
Ezio Melottiab5ba792013-04-19 05:58:44 +03001357class TestSubsetNonOverlap(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001358 left = set([1])
1359 right = set([2])
1360 name = "neither empty, neither contains"
1361 cases = "!="
1362
1363#==============================================================================
1364
Ezio Melottiab5ba792013-04-19 05:58:44 +03001365class TestOnlySetsInBinaryOps:
Raymond Hettingera690a992003-11-16 16:17:49 +00001366
1367 def test_eq_ne(self):
1368 # Unlike the others, this is testing that == and != *are* allowed.
1369 self.assertEqual(self.other == self.set, False)
1370 self.assertEqual(self.set == self.other, False)
1371 self.assertEqual(self.other != self.set, True)
1372 self.assertEqual(self.set != self.other, True)
1373
1374 def test_ge_gt_le_lt(self):
1375 self.assertRaises(TypeError, lambda: self.set < self.other)
1376 self.assertRaises(TypeError, lambda: self.set <= self.other)
1377 self.assertRaises(TypeError, lambda: self.set > self.other)
1378 self.assertRaises(TypeError, lambda: self.set >= self.other)
1379
1380 self.assertRaises(TypeError, lambda: self.other < self.set)
1381 self.assertRaises(TypeError, lambda: self.other <= self.set)
1382 self.assertRaises(TypeError, lambda: self.other > self.set)
1383 self.assertRaises(TypeError, lambda: self.other >= self.set)
1384
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001385 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001386 try:
1387 self.set |= self.other
1388 except TypeError:
1389 pass
1390 else:
1391 self.fail("expected TypeError")
1392
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001393 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001394 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001395 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001396 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001397 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001398
1399 def test_union(self):
1400 self.assertRaises(TypeError, lambda: self.set | self.other)
1401 self.assertRaises(TypeError, lambda: self.other | self.set)
1402 if self.otherIsIterable:
1403 self.set.union(self.other)
1404 else:
1405 self.assertRaises(TypeError, self.set.union, self.other)
1406
1407 def test_intersection_update_operator(self):
1408 try:
1409 self.set &= self.other
1410 except TypeError:
1411 pass
1412 else:
1413 self.fail("expected TypeError")
1414
1415 def test_intersection_update(self):
1416 if self.otherIsIterable:
1417 self.set.intersection_update(self.other)
1418 else:
1419 self.assertRaises(TypeError,
1420 self.set.intersection_update,
1421 self.other)
1422
1423 def test_intersection(self):
1424 self.assertRaises(TypeError, lambda: self.set & self.other)
1425 self.assertRaises(TypeError, lambda: self.other & self.set)
1426 if self.otherIsIterable:
1427 self.set.intersection(self.other)
1428 else:
1429 self.assertRaises(TypeError, self.set.intersection, self.other)
1430
1431 def test_sym_difference_update_operator(self):
1432 try:
1433 self.set ^= self.other
1434 except TypeError:
1435 pass
1436 else:
1437 self.fail("expected TypeError")
1438
1439 def test_sym_difference_update(self):
1440 if self.otherIsIterable:
1441 self.set.symmetric_difference_update(self.other)
1442 else:
1443 self.assertRaises(TypeError,
1444 self.set.symmetric_difference_update,
1445 self.other)
1446
1447 def test_sym_difference(self):
1448 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1449 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1450 if self.otherIsIterable:
1451 self.set.symmetric_difference(self.other)
1452 else:
1453 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1454
1455 def test_difference_update_operator(self):
1456 try:
1457 self.set -= self.other
1458 except TypeError:
1459 pass
1460 else:
1461 self.fail("expected TypeError")
1462
1463 def test_difference_update(self):
1464 if self.otherIsIterable:
1465 self.set.difference_update(self.other)
1466 else:
1467 self.assertRaises(TypeError,
1468 self.set.difference_update,
1469 self.other)
1470
1471 def test_difference(self):
1472 self.assertRaises(TypeError, lambda: self.set - self.other)
1473 self.assertRaises(TypeError, lambda: self.other - self.set)
1474 if self.otherIsIterable:
1475 self.set.difference(self.other)
1476 else:
1477 self.assertRaises(TypeError, self.set.difference, self.other)
1478
1479#------------------------------------------------------------------------------
1480
Ezio Melottiab5ba792013-04-19 05:58:44 +03001481class TestOnlySetsNumeric(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001482 def setUp(self):
1483 self.set = set((1, 2, 3))
1484 self.other = 19
1485 self.otherIsIterable = False
1486
1487#------------------------------------------------------------------------------
1488
Ezio Melottiab5ba792013-04-19 05:58:44 +03001489class TestOnlySetsDict(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001490 def setUp(self):
1491 self.set = set((1, 2, 3))
1492 self.other = {1:2, 3:4}
1493 self.otherIsIterable = True
1494
1495#------------------------------------------------------------------------------
1496
Ezio Melottiab5ba792013-04-19 05:58:44 +03001497class TestOnlySetsOperator(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001498 def setUp(self):
1499 self.set = set((1, 2, 3))
1500 self.other = operator.add
1501 self.otherIsIterable = False
1502
1503#------------------------------------------------------------------------------
1504
Ezio Melottiab5ba792013-04-19 05:58:44 +03001505class TestOnlySetsTuple(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001506 def setUp(self):
1507 self.set = set((1, 2, 3))
1508 self.other = (2, 4, 6)
1509 self.otherIsIterable = True
1510
1511#------------------------------------------------------------------------------
1512
Ezio Melottiab5ba792013-04-19 05:58:44 +03001513class TestOnlySetsString(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001514 def setUp(self):
1515 self.set = set((1, 2, 3))
1516 self.other = 'abc'
1517 self.otherIsIterable = True
1518
1519#------------------------------------------------------------------------------
1520
Ezio Melottiab5ba792013-04-19 05:58:44 +03001521class TestOnlySetsGenerator(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001522 def setUp(self):
1523 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001524 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001525 yield i
1526 self.set = set((1, 2, 3))
1527 self.other = gen()
1528 self.otherIsIterable = True
1529
1530#==============================================================================
1531
Ezio Melottiab5ba792013-04-19 05:58:44 +03001532class TestCopying:
Raymond Hettingera690a992003-11-16 16:17:49 +00001533
1534 def test_copy(self):
1535 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001536 dup_list = sorted(dup, key=repr)
1537 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001538 self.assertEqual(len(dup_list), len(set_list))
1539 for i in range(len(dup_list)):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001540 self.assertTrue(dup_list[i] is set_list[i])
Raymond Hettingera690a992003-11-16 16:17:49 +00001541
1542 def test_deep_copy(self):
1543 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001544 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001545 dup_list = sorted(dup, key=repr)
1546 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001547 self.assertEqual(len(dup_list), len(set_list))
1548 for i in range(len(dup_list)):
1549 self.assertEqual(dup_list[i], set_list[i])
1550
1551#------------------------------------------------------------------------------
1552
Ezio Melottiab5ba792013-04-19 05:58:44 +03001553class TestCopyingEmpty(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001554 def setUp(self):
1555 self.set = set()
1556
1557#------------------------------------------------------------------------------
1558
Ezio Melottiab5ba792013-04-19 05:58:44 +03001559class TestCopyingSingleton(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001560 def setUp(self):
1561 self.set = set(["hello"])
1562
1563#------------------------------------------------------------------------------
1564
Ezio Melottiab5ba792013-04-19 05:58:44 +03001565class TestCopyingTriple(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001566 def setUp(self):
1567 self.set = set(["zero", 0, None])
1568
1569#------------------------------------------------------------------------------
1570
Ezio Melottiab5ba792013-04-19 05:58:44 +03001571class TestCopyingTuple(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001572 def setUp(self):
1573 self.set = set([(1, 2)])
1574
1575#------------------------------------------------------------------------------
1576
Ezio Melottiab5ba792013-04-19 05:58:44 +03001577class TestCopyingNested(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001578 def setUp(self):
1579 self.set = set([((1, 2), (3, 4))])
1580
1581#==============================================================================
1582
1583class TestIdentities(unittest.TestCase):
1584 def setUp(self):
1585 self.a = set('abracadabra')
1586 self.b = set('alacazam')
1587
1588 def test_binopsVsSubsets(self):
1589 a, b = self.a, self.b
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001590 self.assertTrue(a - b < a)
1591 self.assertTrue(b - a < b)
1592 self.assertTrue(a & b < a)
1593 self.assertTrue(a & b < b)
1594 self.assertTrue(a | b > a)
1595 self.assertTrue(a | b > b)
1596 self.assertTrue(a ^ b < a | b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001597
1598 def test_commutativity(self):
1599 a, b = self.a, self.b
1600 self.assertEqual(a&b, b&a)
1601 self.assertEqual(a|b, b|a)
1602 self.assertEqual(a^b, b^a)
1603 if a != b:
1604 self.assertNotEqual(a-b, b-a)
1605
1606 def test_summations(self):
1607 # check that sums of parts equal the whole
1608 a, b = self.a, self.b
1609 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1610 self.assertEqual((a&b)|(a^b), a|b)
1611 self.assertEqual(a|(b-a), a|b)
1612 self.assertEqual((a-b)|b, a|b)
1613 self.assertEqual((a-b)|(a&b), a)
1614 self.assertEqual((b-a)|(a&b), b)
1615 self.assertEqual((a-b)|(b-a), a^b)
1616
1617 def test_exclusion(self):
1618 # check that inverse operations show non-overlap
1619 a, b, zero = self.a, self.b, set()
1620 self.assertEqual((a-b)&b, zero)
1621 self.assertEqual((b-a)&a, zero)
1622 self.assertEqual((a&b)&(a^b), zero)
1623
1624# Tests derived from test_itertools.py =======================================
1625
1626def R(seqn):
1627 'Regular generator'
1628 for i in seqn:
1629 yield i
1630
1631class G:
1632 'Sequence using __getitem__'
1633 def __init__(self, seqn):
1634 self.seqn = seqn
1635 def __getitem__(self, i):
1636 return self.seqn[i]
1637
1638class I:
1639 'Sequence using iterator protocol'
1640 def __init__(self, seqn):
1641 self.seqn = seqn
1642 self.i = 0
1643 def __iter__(self):
1644 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001645 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001646 if self.i >= len(self.seqn): raise StopIteration
1647 v = self.seqn[self.i]
1648 self.i += 1
1649 return v
1650
1651class Ig:
1652 'Sequence using iterator protocol defined with a generator'
1653 def __init__(self, seqn):
1654 self.seqn = seqn
1655 self.i = 0
1656 def __iter__(self):
1657 for val in self.seqn:
1658 yield val
1659
1660class X:
1661 'Missing __getitem__ and __iter__'
1662 def __init__(self, seqn):
1663 self.seqn = seqn
1664 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001665 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001666 if self.i >= len(self.seqn): raise StopIteration
1667 v = self.seqn[self.i]
1668 self.i += 1
1669 return v
1670
1671class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001672 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001673 def __init__(self, seqn):
1674 self.seqn = seqn
1675 self.i = 0
1676 def __iter__(self):
1677 return self
1678
1679class E:
1680 'Test propagation of exceptions'
1681 def __init__(self, seqn):
1682 self.seqn = seqn
1683 self.i = 0
1684 def __iter__(self):
1685 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001686 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001687 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001688
1689class S:
1690 'Test immediate stop'
1691 def __init__(self, seqn):
1692 pass
1693 def __iter__(self):
1694 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001695 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001696 raise StopIteration
1697
Raymond Hettingera6c60372008-03-13 01:26:19 +00001698from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001699def L(seqn):
1700 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001701 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001702
1703class TestVariousIteratorArgs(unittest.TestCase):
1704
1705 def test_constructor(self):
1706 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001707 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001708 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001709 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001710 self.assertRaises(TypeError, cons , X(s))
1711 self.assertRaises(TypeError, cons , N(s))
1712 self.assertRaises(ZeroDivisionError, cons , E(s))
1713
1714 def test_inline_methods(self):
1715 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001716 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001717 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001718 for g in (G, I, Ig, L, R):
1719 expected = meth(data)
Tim Peters23d7d4e2013-09-06 15:41:30 -05001720 actual = meth(g(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001721 if isinstance(expected, bool):
1722 self.assertEqual(actual, expected)
1723 else:
1724 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001725 self.assertRaises(TypeError, meth, X(s))
1726 self.assertRaises(TypeError, meth, N(s))
1727 self.assertRaises(ZeroDivisionError, meth, E(s))
1728
1729 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001730 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001731 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001732 'difference_update', 'symmetric_difference_update'):
1733 for g in (G, I, Ig, S, L, R):
1734 s = set('january')
1735 t = s.copy()
1736 getattr(s, methname)(list(g(data)))
1737 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001738 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001739
1740 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1741 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1742 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1743
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001744class bad_eq:
1745 def __eq__(self, other):
1746 if be_bad:
1747 set2.clear()
1748 raise ZeroDivisionError
1749 return self is other
1750 def __hash__(self):
1751 return 0
1752
1753class bad_dict_clear:
1754 def __eq__(self, other):
1755 if be_bad:
1756 dict2.clear()
1757 return self is other
1758 def __hash__(self):
1759 return 0
1760
Éric Araujo23eae862010-09-05 18:43:07 +00001761class TestWeirdBugs(unittest.TestCase):
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001762 def test_8420_set_merge(self):
1763 # This used to segfault
1764 global be_bad, set2, dict2
1765 be_bad = False
1766 set1 = {bad_eq()}
1767 set2 = {bad_eq() for i in range(75)}
1768 be_bad = True
1769 self.assertRaises(ZeroDivisionError, set1.update, set2)
1770
1771 be_bad = False
1772 set1 = {bad_dict_clear()}
1773 dict2 = {bad_dict_clear(): None}
1774 be_bad = True
1775 set1.symmetric_difference_update(dict2)
1776
Serhiy Storchakaaf320b32015-07-08 22:58:55 +03001777 def test_iter_and_mutate(self):
1778 # Issue #24581
1779 s = set(range(100))
1780 s.clear()
1781 s.update(range(100))
1782 si = iter(s)
1783 s.clear()
1784 a = list(range(100))
1785 s.update(range(100))
1786 list(si)
1787
Raymond Hettingera3626bc2015-07-15 23:50:14 -07001788 def test_merge_and_mutate(self):
1789 class X:
1790 def __hash__(self):
1791 return hash(0)
1792 def __eq__(self, o):
1793 other.clear()
1794 return False
1795
1796 other = set()
1797 other = {X() for i in range(10)}
1798 s = {0}
1799 s.update(other)
1800
Christian Heimes969fe572008-01-25 11:23:10 +00001801# Application tests (based on David Eppstein's graph recipes ====================================
1802
1803def powerset(U):
1804 """Generates all subsets of a set or sequence U."""
1805 U = iter(U)
1806 try:
1807 x = frozenset([next(U)])
1808 for S in powerset(U):
1809 yield S
1810 yield S | x
1811 except StopIteration:
1812 yield frozenset()
1813
1814def cube(n):
1815 """Graph of n-dimensional hypercube."""
1816 singletons = [frozenset([x]) for x in range(n)]
1817 return dict([(x, frozenset([x^s for s in singletons]))
1818 for x in powerset(range(n))])
1819
1820def linegraph(G):
1821 """Graph, the vertices of which are edges of G,
1822 with two vertices being adjacent iff the corresponding
1823 edges share a vertex."""
1824 L = {}
1825 for x in G:
1826 for y in G[x]:
1827 nx = [frozenset([x,z]) for z in G[x] if z != y]
1828 ny = [frozenset([y,z]) for z in G[y] if z != x]
1829 L[frozenset([x,y])] = frozenset(nx+ny)
1830 return L
1831
1832def faces(G):
1833 'Return a set of faces in G. Where a face is a set of vertices on that face'
1834 # currently limited to triangles,squares, and pentagons
1835 f = set()
1836 for v1, edges in G.items():
1837 for v2 in edges:
1838 for v3 in G[v2]:
1839 if v1 == v3:
1840 continue
1841 if v1 in G[v3]:
1842 f.add(frozenset([v1, v2, v3]))
1843 else:
1844 for v4 in G[v3]:
1845 if v4 == v2:
1846 continue
1847 if v1 in G[v4]:
1848 f.add(frozenset([v1, v2, v3, v4]))
1849 else:
1850 for v5 in G[v4]:
1851 if v5 == v3 or v5 == v2:
1852 continue
1853 if v1 in G[v5]:
1854 f.add(frozenset([v1, v2, v3, v4, v5]))
1855 return f
1856
1857
1858class TestGraphs(unittest.TestCase):
1859
1860 def test_cube(self):
1861
1862 g = cube(3) # vert --> {v1, v2, v3}
1863 vertices1 = set(g)
1864 self.assertEqual(len(vertices1), 8) # eight vertices
1865 for edge in g.values():
1866 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1867 vertices2 = set(v for edges in g.values() for v in edges)
1868 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1869
1870 cubefaces = faces(g)
1871 self.assertEqual(len(cubefaces), 6) # six faces
1872 for face in cubefaces:
1873 self.assertEqual(len(face), 4) # each face is a square
1874
1875 def test_cuboctahedron(self):
1876
1877 # http://en.wikipedia.org/wiki/Cuboctahedron
1878 # 8 triangular faces and 6 square faces
Martin Panter46f50722016-05-26 05:35:26 +00001879 # 12 identical vertices each connecting a triangle and square
Christian Heimes969fe572008-01-25 11:23:10 +00001880
1881 g = cube(3)
1882 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1883 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1884
1885 vertices = set(cuboctahedron)
1886 for edges in cuboctahedron.values():
1887 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1888 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1889 self.assertEqual(vertices, othervertices) # edge vertices in original set
1890
1891 cubofaces = faces(cuboctahedron)
1892 facesizes = collections.defaultdict(int)
1893 for face in cubofaces:
1894 facesizes[len(face)] += 1
1895 self.assertEqual(facesizes[3], 8) # eight triangular faces
1896 self.assertEqual(facesizes[4], 6) # six square faces
1897
1898 for vertex in cuboctahedron:
1899 edge = vertex # Cuboctahedron vertices are edges in Cube
1900 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1901 for cubevert in edge:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001902 self.assertIn(cubevert, g)
Christian Heimes969fe572008-01-25 11:23:10 +00001903
1904
Raymond Hettingera690a992003-11-16 16:17:49 +00001905#==============================================================================
1906
Raymond Hettingera690a992003-11-16 16:17:49 +00001907if __name__ == "__main__":
Ezio Melottiab5ba792013-04-19 05:58:44 +03001908 unittest.main()