blob: efa388f3df31104299f731dc759395d9c4611902 [file] [log] [blame]
Guido van Rossumd6cf3af2002-08-19 16:19:15 +00001#!/usr/bin/env python
2
Brett Cannon093b6702007-01-13 00:29:49 +00003import warnings
4warnings.filterwarnings("ignore", "the sets module is deprecated",
5 DeprecationWarning, "test\.test_sets")
6
Raymond Hettinger175a6ac2003-09-21 08:14:11 +00007import unittest, operator, copy, pickle, random
Guido van Rossumd6cf3af2002-08-19 16:19:15 +00008from sets import Set, ImmutableSet
9from test import test_support
10
11empty_set = Set()
12
13#==============================================================================
14
15class TestBasicOps(unittest.TestCase):
16
17 def test_repr(self):
18 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +000019 self.assertEqual(repr(self.set), self.repr)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000020
21 def test_length(self):
Tim Petersa7777992002-08-25 17:38:49 +000022 self.assertEqual(len(self.set), self.length)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000023
24 def test_self_equality(self):
Tim Petersa7777992002-08-25 17:38:49 +000025 self.assertEqual(self.set, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000026
27 def test_equivalent_equality(self):
Tim Petersa7777992002-08-25 17:38:49 +000028 self.assertEqual(self.set, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000029
30 def test_copy(self):
Tim Petersa7777992002-08-25 17:38:49 +000031 self.assertEqual(self.set.copy(), self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000032
33 def test_self_union(self):
34 result = self.set | self.set
Tim Petersa7777992002-08-25 17:38:49 +000035 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000036
37 def test_empty_union(self):
38 result = self.set | empty_set
Tim Petersa7777992002-08-25 17:38:49 +000039 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000040
41 def test_union_empty(self):
42 result = empty_set | self.set
Tim Petersa7777992002-08-25 17:38:49 +000043 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000044
45 def test_self_intersection(self):
46 result = self.set & self.set
Tim Petersa7777992002-08-25 17:38:49 +000047 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000048
49 def test_empty_intersection(self):
50 result = self.set & empty_set
Tim Petersa7777992002-08-25 17:38:49 +000051 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000052
53 def test_intersection_empty(self):
54 result = empty_set & self.set
Tim Petersa7777992002-08-25 17:38:49 +000055 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000056
57 def test_self_symmetric_difference(self):
58 result = self.set ^ self.set
Tim Petersa7777992002-08-25 17:38:49 +000059 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000060
61 def checkempty_symmetric_difference(self):
62 result = self.set ^ empty_set
Tim Petersa7777992002-08-25 17:38:49 +000063 self.assertEqual(result, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000064
65 def test_self_difference(self):
66 result = self.set - self.set
Tim Petersa7777992002-08-25 17:38:49 +000067 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000068
69 def test_empty_difference(self):
70 result = self.set - empty_set
Tim Petersa7777992002-08-25 17:38:49 +000071 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000072
73 def test_empty_difference_rev(self):
74 result = empty_set - self.set
Tim Petersa7777992002-08-25 17:38:49 +000075 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000076
77 def test_iteration(self):
78 for v in self.set:
Tim Peters4127e912002-08-25 18:02:29 +000079 self.assert_(v in self.values)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000080
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000081 def test_pickling(self):
82 p = pickle.dumps(self.set)
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000083 copy = pickle.loads(p)
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000084 self.assertEqual(self.set, copy,
85 "%s != %s" % (self.set, copy))
86
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000087#------------------------------------------------------------------------------
88
89class TestBasicOpsEmpty(TestBasicOps):
90 def setUp(self):
91 self.case = "empty set"
92 self.values = []
93 self.set = Set(self.values)
94 self.dup = Set(self.values)
95 self.length = 0
96 self.repr = "Set([])"
97
98#------------------------------------------------------------------------------
99
100class TestBasicOpsSingleton(TestBasicOps):
101 def setUp(self):
102 self.case = "unit set (number)"
103 self.values = [3]
104 self.set = Set(self.values)
105 self.dup = Set(self.values)
106 self.length = 1
107 self.repr = "Set([3])"
108
109 def test_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000110 self.failUnless(3 in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000111
112 def test_not_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000113 self.failUnless(2 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000114
115#------------------------------------------------------------------------------
116
117class TestBasicOpsTuple(TestBasicOps):
118 def setUp(self):
119 self.case = "unit set (tuple)"
120 self.values = [(0, "zero")]
121 self.set = Set(self.values)
122 self.dup = Set(self.values)
123 self.length = 1
124 self.repr = "Set([(0, 'zero')])"
125
126 def test_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000127 self.failUnless((0, "zero") in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000128
129 def test_not_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000130 self.failUnless(9 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000131
132#------------------------------------------------------------------------------
133
134class TestBasicOpsTriple(TestBasicOps):
135 def setUp(self):
136 self.case = "triple set"
137 self.values = [0, "zero", operator.add]
138 self.set = Set(self.values)
139 self.dup = Set(self.values)
140 self.length = 3
141 self.repr = None
142
143#==============================================================================
144
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000145def baditer():
146 raise TypeError
147 yield True
148
149def gooditer():
150 yield True
151
152class TestExceptionPropagation(unittest.TestCase):
153 """SF 628246: Set constructor should not trap iterator TypeErrors"""
154
155 def test_instanceWithException(self):
156 self.assertRaises(TypeError, Set, baditer())
157
158 def test_instancesWithoutException(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000159 # All of these iterables should load without exception.
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000160 Set([1,2,3])
161 Set((1,2,3))
162 Set({'one':1, 'two':2, 'three':3})
163 Set(xrange(3))
164 Set('abc')
165 Set(gooditer())
166
167#==============================================================================
168
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000169class TestSetOfSets(unittest.TestCase):
170 def test_constructor(self):
171 inner = Set([1])
172 outer = Set([inner])
173 element = outer.pop()
Tim Peters4127e912002-08-25 18:02:29 +0000174 self.assertEqual(type(element), ImmutableSet)
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000175 outer.add(inner) # Rebuild set of sets with .add method
176 outer.remove(inner)
Tim Peters4127e912002-08-25 18:02:29 +0000177 self.assertEqual(outer, Set()) # Verify that remove worked
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000178 outer.discard(inner) # Absence of KeyError indicates working fine
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000179
180#==============================================================================
181
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000182class TestBinaryOps(unittest.TestCase):
183 def setUp(self):
184 self.set = Set((2, 4, 6))
185
Raymond Hettinger35e48d22002-11-25 20:43:55 +0000186 def test_eq(self): # SF bug 643115
187 self.assertEqual(self.set, Set({2:1,4:3,6:5}))
188
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000189 def test_union_subset(self):
190 result = self.set | Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000191 self.assertEqual(result, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000192
193 def test_union_superset(self):
194 result = self.set | Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000195 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000196
197 def test_union_overlap(self):
198 result = self.set | Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000199 self.assertEqual(result, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000200
201 def test_union_non_overlap(self):
202 result = self.set | Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000203 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000204
205 def test_intersection_subset(self):
206 result = self.set & Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000207 self.assertEqual(result, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000208
209 def test_intersection_superset(self):
210 result = self.set & Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000211 self.assertEqual(result, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000212
213 def test_intersection_overlap(self):
214 result = self.set & Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000215 self.assertEqual(result, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000216
217 def test_intersection_non_overlap(self):
218 result = self.set & Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000219 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000220
221 def test_sym_difference_subset(self):
222 result = self.set ^ Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000223 self.assertEqual(result, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000224
225 def test_sym_difference_superset(self):
226 result = self.set ^ Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000227 self.assertEqual(result, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000228
229 def test_sym_difference_overlap(self):
230 result = self.set ^ Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000231 self.assertEqual(result, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000232
233 def test_sym_difference_non_overlap(self):
234 result = self.set ^ Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000235 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000236
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000237 def test_cmp(self):
238 a, b = Set('a'), Set('b')
Tim Peters44f14b02003-03-02 00:19:49 +0000239 self.assertRaises(TypeError, cmp, a, b)
240
241 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000242 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
Tim Peters44f14b02003-03-02 00:19:49 +0000243 # which Python thinks is good enough to synthesize a cmp() result
244 # without calling __cmp__.
245 self.assertEqual(cmp(a, a), 0)
246
247 self.assertRaises(TypeError, cmp, a, 12)
248 self.assertRaises(TypeError, cmp, "abc", a)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000249
Raymond Hettinger038ca2a2005-08-13 02:29:58 +0000250 def test_inplace_on_self(self):
251 t = self.set.copy()
252 t |= t
253 self.assertEqual(t, self.set)
254 t &= t
255 self.assertEqual(t, self.set)
256 t -= t
257 self.assertEqual(len(t), 0)
258 t = self.set.copy()
259 t ^= t
260 self.assertEqual(len(t), 0)
261
262
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000263#==============================================================================
264
265class TestUpdateOps(unittest.TestCase):
266 def setUp(self):
267 self.set = Set((2, 4, 6))
268
269 def test_union_subset(self):
270 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000271 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000272
273 def test_union_superset(self):
274 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000275 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000276
277 def test_union_overlap(self):
278 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000279 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000280
281 def test_union_non_overlap(self):
282 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000283 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000284
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000285 def test_union_method_call(self):
286 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000287 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000288
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000289 def test_intersection_subset(self):
290 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000291 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000292
293 def test_intersection_superset(self):
294 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000295 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000296
297 def test_intersection_overlap(self):
298 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000299 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000300
301 def test_intersection_non_overlap(self):
302 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000303 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000304
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000305 def test_intersection_method_call(self):
306 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000307 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000308
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000309 def test_sym_difference_subset(self):
310 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000311 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000312
313 def test_sym_difference_superset(self):
314 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000315 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000316
317 def test_sym_difference_overlap(self):
318 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000319 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000320
321 def test_sym_difference_non_overlap(self):
322 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000323 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000324
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000325 def test_sym_difference_method_call(self):
326 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000327 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000328
329 def test_difference_subset(self):
330 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000331 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000332
333 def test_difference_superset(self):
334 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000335 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000336
337 def test_difference_overlap(self):
338 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000339 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000340
341 def test_difference_non_overlap(self):
342 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000343 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000344
345 def test_difference_method_call(self):
346 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000347 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000348
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000349#==============================================================================
350
351class TestMutate(unittest.TestCase):
352 def setUp(self):
353 self.values = ["a", "b", "c"]
354 self.set = Set(self.values)
355
356 def test_add_present(self):
357 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000358 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000359
360 def test_add_absent(self):
361 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000362 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000363
364 def test_add_until_full(self):
365 tmp = Set()
366 expected_len = 0
367 for v in self.values:
368 tmp.add(v)
369 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000370 self.assertEqual(len(tmp), expected_len)
371 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000372
373 def test_remove_present(self):
374 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000375 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000376
377 def test_remove_absent(self):
378 try:
379 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000380 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000381 except LookupError:
382 pass
383
384 def test_remove_until_empty(self):
385 expected_len = len(self.set)
386 for v in self.values:
387 self.set.remove(v)
388 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000389 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000390
391 def test_discard_present(self):
392 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000393 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000394
395 def test_discard_absent(self):
396 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000397 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000398
399 def test_clear(self):
400 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000401 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000402
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000403 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000404 popped = {}
405 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000406 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000407 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000408 for v in self.values:
Tim Peters4127e912002-08-25 18:02:29 +0000409 self.failUnless(v in popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000410
411 def test_update_empty_tuple(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000412 self.set.union_update(())
Tim Petersa7777992002-08-25 17:38:49 +0000413 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000414
415 def test_update_unit_tuple_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000416 self.set.union_update(("a",))
Tim Petersa7777992002-08-25 17:38:49 +0000417 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000418
419 def test_update_unit_tuple_non_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000420 self.set.union_update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000421 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000422
423#==============================================================================
424
425class TestSubsets(unittest.TestCase):
426
Tim Peters93d8d482002-08-25 18:21:47 +0000427 case2method = {"<=": "issubset",
428 ">=": "issuperset",
429 }
Tim Petersea76c982002-08-25 18:43:10 +0000430
431 reverse = {"==": "==",
432 "!=": "!=",
433 "<": ">",
434 ">": "<",
435 "<=": ">=",
436 ">=": "<=",
437 }
Tim Peters93d8d482002-08-25 18:21:47 +0000438
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000439 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000440 x = self.left
441 y = self.right
442 for case in "!=", "==", "<", "<=", ">", ">=":
443 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000444 # Test the binary infix spelling.
445 result = eval("x" + case + "y", locals())
446 self.assertEqual(result, expected)
447 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000448 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000449 method = getattr(x, TestSubsets.case2method[case])
450 result = method(y)
451 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000452
Tim Petersea76c982002-08-25 18:43:10 +0000453 # Now do the same for the operands reversed.
454 rcase = TestSubsets.reverse[case]
455 result = eval("y" + rcase + "x", locals())
456 self.assertEqual(result, expected)
457 if rcase in TestSubsets.case2method:
458 method = getattr(y, TestSubsets.case2method[rcase])
459 result = method(x)
460 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000461#------------------------------------------------------------------------------
462
463class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000464 left = Set()
465 right = Set()
466 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000467 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000468
469#------------------------------------------------------------------------------
470
471class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000472 left = Set([1, 2])
473 right = Set([1, 2])
474 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000475 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000476
477#------------------------------------------------------------------------------
478
479class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000480 left = Set()
481 right = Set([1, 2])
482 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000483 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000484
485#------------------------------------------------------------------------------
486
487class TestSubsetPartial(TestSubsets):
Tim Peters3de75262002-11-09 05:26:15 +0000488 left = Set([1])
489 right = Set([1, 2])
490 name = "one a non-empty proper subset of other"
491 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000492
493#------------------------------------------------------------------------------
494
495class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000496 left = Set([1])
497 right = Set([2])
498 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000499 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000500
501#==============================================================================
502
503class TestOnlySetsInBinaryOps(unittest.TestCase):
504
Tim Peters44f14b02003-03-02 00:19:49 +0000505 def test_eq_ne(self):
506 # Unlike the others, this is testing that == and != *are* allowed.
507 self.assertEqual(self.other == self.set, False)
508 self.assertEqual(self.set == self.other, False)
509 self.assertEqual(self.other != self.set, True)
510 self.assertEqual(self.set != self.other, True)
511
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000512 def test_ge_gt_le_lt(self):
Tim Peters44f14b02003-03-02 00:19:49 +0000513 self.assertRaises(TypeError, lambda: self.set < self.other)
514 self.assertRaises(TypeError, lambda: self.set <= self.other)
515 self.assertRaises(TypeError, lambda: self.set > self.other)
516 self.assertRaises(TypeError, lambda: self.set >= self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000517
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000518 self.assertRaises(TypeError, lambda: self.other < self.set)
519 self.assertRaises(TypeError, lambda: self.other <= self.set)
520 self.assertRaises(TypeError, lambda: self.other > self.set)
521 self.assertRaises(TypeError, lambda: self.other >= self.set)
522
Raymond Hettinger6a180122003-08-17 08:34:09 +0000523 def test_union_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000524 try:
525 self.set |= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000526 except TypeError:
527 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000528 else:
529 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000530
Raymond Hettinger6a180122003-08-17 08:34:09 +0000531 def test_union_update(self):
532 if self.otherIsIterable:
533 self.set.union_update(self.other)
534 else:
535 self.assertRaises(TypeError, self.set.union_update, self.other)
536
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000537 def test_union(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000538 self.assertRaises(TypeError, lambda: self.set | self.other)
539 self.assertRaises(TypeError, lambda: self.other | self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000540 if self.otherIsIterable:
541 self.set.union(self.other)
542 else:
543 self.assertRaises(TypeError, self.set.union, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000544
Raymond Hettinger6a180122003-08-17 08:34:09 +0000545 def test_intersection_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000546 try:
547 self.set &= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000548 except TypeError:
549 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000550 else:
551 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000552
Raymond Hettinger6a180122003-08-17 08:34:09 +0000553 def test_intersection_update(self):
554 if self.otherIsIterable:
555 self.set.intersection_update(self.other)
556 else:
557 self.assertRaises(TypeError,
558 self.set.intersection_update,
559 self.other)
560
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000561 def test_intersection(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000562 self.assertRaises(TypeError, lambda: self.set & self.other)
563 self.assertRaises(TypeError, lambda: self.other & self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000564 if self.otherIsIterable:
565 self.set.intersection(self.other)
566 else:
567 self.assertRaises(TypeError, self.set.intersection, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000568
Raymond Hettinger6a180122003-08-17 08:34:09 +0000569 def test_sym_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000570 try:
571 self.set ^= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000572 except TypeError:
573 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000574 else:
575 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000576
Raymond Hettinger6a180122003-08-17 08:34:09 +0000577 def test_sym_difference_update(self):
578 if self.otherIsIterable:
579 self.set.symmetric_difference_update(self.other)
580 else:
581 self.assertRaises(TypeError,
582 self.set.symmetric_difference_update,
583 self.other)
584
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000585 def test_sym_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000586 self.assertRaises(TypeError, lambda: self.set ^ self.other)
587 self.assertRaises(TypeError, lambda: self.other ^ self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000588 if self.otherIsIterable:
589 self.set.symmetric_difference(self.other)
590 else:
591 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000592
Raymond Hettinger6a180122003-08-17 08:34:09 +0000593 def test_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000594 try:
595 self.set -= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000596 except TypeError:
597 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000598 else:
599 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000600
Raymond Hettinger6a180122003-08-17 08:34:09 +0000601 def test_difference_update(self):
602 if self.otherIsIterable:
603 self.set.difference_update(self.other)
604 else:
605 self.assertRaises(TypeError,
606 self.set.difference_update,
607 self.other)
608
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000609 def test_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000610 self.assertRaises(TypeError, lambda: self.set - self.other)
611 self.assertRaises(TypeError, lambda: self.other - self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000612 if self.otherIsIterable:
613 self.set.difference(self.other)
614 else:
615 self.assertRaises(TypeError, self.set.difference, self.other)
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000616
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000617#------------------------------------------------------------------------------
618
619class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
620 def setUp(self):
621 self.set = Set((1, 2, 3))
622 self.other = 19
Raymond Hettinger6a180122003-08-17 08:34:09 +0000623 self.otherIsIterable = False
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000624
625#------------------------------------------------------------------------------
626
627class TestOnlySetsDict(TestOnlySetsInBinaryOps):
628 def setUp(self):
629 self.set = Set((1, 2, 3))
630 self.other = {1:2, 3:4}
Raymond Hettinger6a180122003-08-17 08:34:09 +0000631 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000632
633#------------------------------------------------------------------------------
634
635class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
636 def setUp(self):
637 self.set = Set((1, 2, 3))
638 self.other = operator.add
Raymond Hettinger6a180122003-08-17 08:34:09 +0000639 self.otherIsIterable = False
640
641#------------------------------------------------------------------------------
642
643class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
644 def setUp(self):
645 self.set = Set((1, 2, 3))
646 self.other = (2, 4, 6)
647 self.otherIsIterable = True
648
649#------------------------------------------------------------------------------
650
651class TestOnlySetsString(TestOnlySetsInBinaryOps):
652 def setUp(self):
653 self.set = Set((1, 2, 3))
654 self.other = 'abc'
655 self.otherIsIterable = True
656
657#------------------------------------------------------------------------------
658
659class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
660 def setUp(self):
661 def gen():
662 for i in xrange(0, 10, 2):
663 yield i
664 self.set = Set((1, 2, 3))
665 self.other = gen()
666 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000667
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000668#------------------------------------------------------------------------------
669
670class TestOnlySetsofSets(TestOnlySetsInBinaryOps):
671 def setUp(self):
672 self.set = Set((1, 2, 3))
673 self.other = [Set('ab'), ImmutableSet('cd')]
674 self.otherIsIterable = True
675
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000676#==============================================================================
677
678class TestCopying(unittest.TestCase):
679
680 def test_copy(self):
681 dup = self.set.copy()
682 dup_list = list(dup); dup_list.sort()
683 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000684 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000685 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000686 self.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000687
688 def test_deep_copy(self):
689 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000690 ##print type(dup), repr(dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000691 dup_list = list(dup); dup_list.sort()
692 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000693 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000694 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000695 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000696
697#------------------------------------------------------------------------------
698
699class TestCopyingEmpty(TestCopying):
700 def setUp(self):
701 self.set = Set()
702
703#------------------------------------------------------------------------------
704
705class TestCopyingSingleton(TestCopying):
706 def setUp(self):
707 self.set = Set(["hello"])
708
709#------------------------------------------------------------------------------
710
711class TestCopyingTriple(TestCopying):
712 def setUp(self):
713 self.set = Set(["zero", 0, None])
714
715#------------------------------------------------------------------------------
716
717class TestCopyingTuple(TestCopying):
718 def setUp(self):
719 self.set = Set([(1, 2)])
720
721#------------------------------------------------------------------------------
722
723class TestCopyingNested(TestCopying):
724 def setUp(self):
725 self.set = Set([((1, 2), (3, 4))])
726
727#==============================================================================
728
Raymond Hettinger6a180122003-08-17 08:34:09 +0000729class TestIdentities(unittest.TestCase):
730 def setUp(self):
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000731 self.a = Set([random.randrange(100) for i in xrange(50)])
732 self.b = Set([random.randrange(100) for i in xrange(50)])
Raymond Hettinger6a180122003-08-17 08:34:09 +0000733
734 def test_binopsVsSubsets(self):
735 a, b = self.a, self.b
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000736 self.assert_(a - b <= a)
737 self.assert_(b - a <= b)
738 self.assert_(a & b <= a)
739 self.assert_(a & b <= b)
740 self.assert_(a | b >= a)
741 self.assert_(a | b >= b)
742 self.assert_(a ^ b <= a | b)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000743
744 def test_commutativity(self):
745 a, b = self.a, self.b
746 self.assertEqual(a&b, b&a)
747 self.assertEqual(a|b, b|a)
748 self.assertEqual(a^b, b^a)
749 if a != b:
750 self.assertNotEqual(a-b, b-a)
751
Raymond Hettinger3778f402003-09-24 03:56:07 +0000752 def test_reflexsive_relations(self):
753 a, zero = self.a, Set()
754 self.assertEqual(a ^ a, zero)
755 self.assertEqual(a - a, zero)
756 self.assertEqual(a | a, a)
757 self.assertEqual(a & a, a)
758 self.assert_(a <= a)
759 self.assert_(a >= a)
760 self.assert_(a == a)
761
Raymond Hettinger6a180122003-08-17 08:34:09 +0000762 def test_summations(self):
763 # check that sums of parts equal the whole
764 a, b = self.a, self.b
765 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
766 self.assertEqual((a&b)|(a^b), a|b)
767 self.assertEqual(a|(b-a), a|b)
768 self.assertEqual((a-b)|b, a|b)
769 self.assertEqual((a-b)|(a&b), a)
770 self.assertEqual((b-a)|(a&b), b)
771 self.assertEqual((a-b)|(b-a), a^b)
772
773 def test_exclusion(self):
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000774 # check that inverse operations do not overlap
Raymond Hettinger6a180122003-08-17 08:34:09 +0000775 a, b, zero = self.a, self.b, Set()
776 self.assertEqual((a-b)&b, zero)
777 self.assertEqual((b-a)&a, zero)
778 self.assertEqual((a&b)&(a^b), zero)
779
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000780 def test_cardinality_relations(self):
781 a, b = self.a, self.b
782 self.assertEqual(len(a), len(a-b) + len(a&b))
783 self.assertEqual(len(b), len(b-a) + len(a&b))
784 self.assertEqual(len(a^b), len(a-b) + len(b-a))
785 self.assertEqual(len(a|b), len(a-b) + len(a&b) + len(b-a))
Raymond Hettinger3778f402003-09-24 03:56:07 +0000786 self.assertEqual(len(a^b) + len(a&b), len(a|b))
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000787
Raymond Hettinger6a180122003-08-17 08:34:09 +0000788#==============================================================================
789
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000790libreftest = """
791Example from the Library Reference: Doc/lib/libsets.tex
792
Tim Peters3ba491e2003-03-01 23:33:34 +0000793>>> from sets import Set as Base # override _repr to get sorted output
794>>> class Set(Base):
795... def _repr(self):
796... return Base._repr(self, sorted=True)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000797>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
798>>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
Raymond Hettinger19540352003-08-16 00:59:59 +0000799>>> managers = Set(['Jane', 'Jack', 'Susan', 'Zack'])
800>>> employees = engineers | programmers | managers # union
801>>> engineering_management = engineers & managers # intersection
802>>> fulltime_management = managers - engineers - programmers # difference
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000803>>> engineers.add('Marvin')
804>>> print engineers
Tim Peters3ba491e2003-03-01 23:33:34 +0000805Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000806>>> employees.issuperset(engineers) # superset test
807False
Raymond Hettinger6a180122003-08-17 08:34:09 +0000808>>> employees.union_update(engineers) # update from another set
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000809>>> employees.issuperset(engineers)
810True
Raymond Hettinger19540352003-08-16 00:59:59 +0000811>>> for group in [engineers, programmers, managers, employees]:
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000812... group.discard('Susan') # unconditionally remove element
813... print group
814...
Tim Peters3ba491e2003-03-01 23:33:34 +0000815Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
816Set(['Jack', 'Janice', 'Sam'])
817Set(['Jack', 'Jane', 'Zack'])
818Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin', 'Sam', 'Zack'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000819"""
820
821#==============================================================================
822
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000823__test__ = {'libreftest' : libreftest}
824
825def test_main(verbose=None):
Neal Norwitzb902f4e2006-04-03 04:45:34 +0000826 import doctest
827 from test import test_sets
Walter Dörwald21d3a322003-05-01 17:45:56 +0000828 test_support.run_unittest(
829 TestSetOfSets,
830 TestExceptionPropagation,
831 TestBasicOpsEmpty,
832 TestBasicOpsSingleton,
833 TestBasicOpsTuple,
834 TestBasicOpsTriple,
835 TestBinaryOps,
836 TestUpdateOps,
837 TestMutate,
838 TestSubsetEqualEmpty,
839 TestSubsetEqualNonEmpty,
840 TestSubsetEmptyNonEmpty,
841 TestSubsetPartial,
842 TestSubsetNonOverlap,
843 TestOnlySetsNumeric,
844 TestOnlySetsDict,
845 TestOnlySetsOperator,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000846 TestOnlySetsTuple,
847 TestOnlySetsString,
848 TestOnlySetsGenerator,
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000849 TestOnlySetsofSets,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000850 TestCopyingEmpty,
851 TestCopyingSingleton,
852 TestCopyingTriple,
853 TestCopyingTuple,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000854 TestCopyingNested,
855 TestIdentities,
Raymond Hettinger654fcd52004-08-07 06:15:12 +0000856 doctest.DocTestSuite(test_sets),
Walter Dörwald21d3a322003-05-01 17:45:56 +0000857 )
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000858
859if __name__ == "__main__":
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000860 test_main(verbose=True)