blob: 88cfcacdf9e6c4d5891f019992ee16d69dd94a29 [file] [log] [blame]
Guido van Rossumd6cf3af2002-08-19 16:19:15 +00001#!/usr/bin/env python
2
Raymond Hettinger175a6ac2003-09-21 08:14:11 +00003import unittest, operator, copy, pickle, random
Guido van Rossumd6cf3af2002-08-19 16:19:15 +00004from sets import Set, ImmutableSet
5from test import test_support
6
7empty_set = Set()
8
9#==============================================================================
10
11class TestBasicOps(unittest.TestCase):
12
13 def test_repr(self):
14 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +000015 self.assertEqual(repr(self.set), self.repr)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000016
17 def test_length(self):
Tim Petersa7777992002-08-25 17:38:49 +000018 self.assertEqual(len(self.set), self.length)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000019
20 def test_self_equality(self):
Tim Petersa7777992002-08-25 17:38:49 +000021 self.assertEqual(self.set, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000022
23 def test_equivalent_equality(self):
Tim Petersa7777992002-08-25 17:38:49 +000024 self.assertEqual(self.set, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000025
26 def test_copy(self):
Tim Petersa7777992002-08-25 17:38:49 +000027 self.assertEqual(self.set.copy(), self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000028
29 def test_self_union(self):
30 result = self.set | self.set
Tim Petersa7777992002-08-25 17:38:49 +000031 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000032
33 def test_empty_union(self):
34 result = self.set | empty_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_union_empty(self):
38 result = empty_set | self.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_self_intersection(self):
42 result = self.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_empty_intersection(self):
46 result = self.set & empty_set
Tim Petersa7777992002-08-25 17:38:49 +000047 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000048
49 def test_intersection_empty(self):
50 result = empty_set & self.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_self_symmetric_difference(self):
54 result = self.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 checkempty_symmetric_difference(self):
58 result = self.set ^ empty_set
Tim Petersa7777992002-08-25 17:38:49 +000059 self.assertEqual(result, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000060
61 def test_self_difference(self):
62 result = self.set - self.set
Tim Petersa7777992002-08-25 17:38:49 +000063 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000064
65 def test_empty_difference(self):
66 result = self.set - empty_set
Tim Petersa7777992002-08-25 17:38:49 +000067 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000068
69 def test_empty_difference_rev(self):
70 result = empty_set - self.set
Tim Petersa7777992002-08-25 17:38:49 +000071 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000072
73 def test_iteration(self):
74 for v in self.set:
Tim Peters4127e912002-08-25 18:02:29 +000075 self.assert_(v in self.values)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000076
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000077 def test_pickling(self):
78 p = pickle.dumps(self.set)
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000079 copy = pickle.loads(p)
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000080 self.assertEqual(self.set, copy,
81 "%s != %s" % (self.set, copy))
82
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000083#------------------------------------------------------------------------------
84
85class TestBasicOpsEmpty(TestBasicOps):
86 def setUp(self):
87 self.case = "empty set"
88 self.values = []
89 self.set = Set(self.values)
90 self.dup = Set(self.values)
91 self.length = 0
92 self.repr = "Set([])"
93
94#------------------------------------------------------------------------------
95
96class TestBasicOpsSingleton(TestBasicOps):
97 def setUp(self):
98 self.case = "unit set (number)"
99 self.values = [3]
100 self.set = Set(self.values)
101 self.dup = Set(self.values)
102 self.length = 1
103 self.repr = "Set([3])"
104
105 def test_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000106 self.failUnless(3 in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000107
108 def test_not_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000109 self.failUnless(2 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000110
111#------------------------------------------------------------------------------
112
113class TestBasicOpsTuple(TestBasicOps):
114 def setUp(self):
115 self.case = "unit set (tuple)"
116 self.values = [(0, "zero")]
117 self.set = Set(self.values)
118 self.dup = Set(self.values)
119 self.length = 1
120 self.repr = "Set([(0, 'zero')])"
121
122 def test_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000123 self.failUnless((0, "zero") in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000124
125 def test_not_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000126 self.failUnless(9 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000127
128#------------------------------------------------------------------------------
129
130class TestBasicOpsTriple(TestBasicOps):
131 def setUp(self):
132 self.case = "triple set"
133 self.values = [0, "zero", operator.add]
134 self.set = Set(self.values)
135 self.dup = Set(self.values)
136 self.length = 3
137 self.repr = None
138
139#==============================================================================
140
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000141def baditer():
142 raise TypeError
143 yield True
144
145def gooditer():
146 yield True
147
148class TestExceptionPropagation(unittest.TestCase):
149 """SF 628246: Set constructor should not trap iterator TypeErrors"""
150
151 def test_instanceWithException(self):
152 self.assertRaises(TypeError, Set, baditer())
153
154 def test_instancesWithoutException(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000155 # All of these iterables should load without exception.
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000156 Set([1,2,3])
157 Set((1,2,3))
158 Set({'one':1, 'two':2, 'three':3})
159 Set(xrange(3))
160 Set('abc')
161 Set(gooditer())
162
163#==============================================================================
164
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000165class TestSetOfSets(unittest.TestCase):
166 def test_constructor(self):
167 inner = Set([1])
168 outer = Set([inner])
169 element = outer.pop()
Tim Peters4127e912002-08-25 18:02:29 +0000170 self.assertEqual(type(element), ImmutableSet)
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000171 outer.add(inner) # Rebuild set of sets with .add method
172 outer.remove(inner)
Tim Peters4127e912002-08-25 18:02:29 +0000173 self.assertEqual(outer, Set()) # Verify that remove worked
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000174 outer.discard(inner) # Absence of KeyError indicates working fine
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000175
176#==============================================================================
177
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000178class TestBinaryOps(unittest.TestCase):
179 def setUp(self):
180 self.set = Set((2, 4, 6))
181
Raymond Hettinger35e48d22002-11-25 20:43:55 +0000182 def test_eq(self): # SF bug 643115
183 self.assertEqual(self.set, Set({2:1,4:3,6:5}))
184
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000185 def test_union_subset(self):
186 result = self.set | Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000187 self.assertEqual(result, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000188
189 def test_union_superset(self):
190 result = self.set | Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000191 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000192
193 def test_union_overlap(self):
194 result = self.set | Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000195 self.assertEqual(result, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000196
197 def test_union_non_overlap(self):
198 result = self.set | Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000199 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000200
201 def test_intersection_subset(self):
202 result = self.set & Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000203 self.assertEqual(result, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000204
205 def test_intersection_superset(self):
206 result = self.set & Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000207 self.assertEqual(result, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000208
209 def test_intersection_overlap(self):
210 result = self.set & Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000211 self.assertEqual(result, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000212
213 def test_intersection_non_overlap(self):
214 result = self.set & Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000215 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000216
217 def test_sym_difference_subset(self):
218 result = self.set ^ Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000219 self.assertEqual(result, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000220
221 def test_sym_difference_superset(self):
222 result = self.set ^ Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000223 self.assertEqual(result, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000224
225 def test_sym_difference_overlap(self):
226 result = self.set ^ Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000227 self.assertEqual(result, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000228
229 def test_sym_difference_non_overlap(self):
230 result = self.set ^ Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000231 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000232
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000233 def test_cmp(self):
234 a, b = Set('a'), Set('b')
Tim Peters44f14b02003-03-02 00:19:49 +0000235 self.assertRaises(TypeError, cmp, a, b)
236
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000237 # In py3k, this works!
238 self.assertRaises(TypeError, cmp, a, a)
Tim Peters44f14b02003-03-02 00:19:49 +0000239
240 self.assertRaises(TypeError, cmp, a, 12)
241 self.assertRaises(TypeError, cmp, "abc", a)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000242
Raymond Hettinger038ca2a2005-08-13 02:29:58 +0000243 def test_inplace_on_self(self):
244 t = self.set.copy()
245 t |= t
246 self.assertEqual(t, self.set)
247 t &= t
248 self.assertEqual(t, self.set)
249 t -= t
250 self.assertEqual(len(t), 0)
251 t = self.set.copy()
252 t ^= t
253 self.assertEqual(len(t), 0)
254
255
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000256#==============================================================================
257
258class TestUpdateOps(unittest.TestCase):
259 def setUp(self):
260 self.set = Set((2, 4, 6))
261
262 def test_union_subset(self):
263 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000264 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000265
266 def test_union_superset(self):
267 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000268 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000269
270 def test_union_overlap(self):
271 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000272 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000273
274 def test_union_non_overlap(self):
275 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000276 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000277
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000278 def test_union_method_call(self):
279 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000280 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000281
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000282 def test_intersection_subset(self):
283 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000284 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000285
286 def test_intersection_superset(self):
287 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000288 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000289
290 def test_intersection_overlap(self):
291 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000292 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000293
294 def test_intersection_non_overlap(self):
295 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000296 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000297
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000298 def test_intersection_method_call(self):
299 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000300 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000301
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000302 def test_sym_difference_subset(self):
303 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000304 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000305
306 def test_sym_difference_superset(self):
307 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000308 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000309
310 def test_sym_difference_overlap(self):
311 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000312 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000313
314 def test_sym_difference_non_overlap(self):
315 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000316 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000317
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000318 def test_sym_difference_method_call(self):
319 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000320 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000321
322 def test_difference_subset(self):
323 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000324 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000325
326 def test_difference_superset(self):
327 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000328 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000329
330 def test_difference_overlap(self):
331 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000332 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000333
334 def test_difference_non_overlap(self):
335 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000336 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000337
338 def test_difference_method_call(self):
339 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000340 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000341
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000342#==============================================================================
343
344class TestMutate(unittest.TestCase):
345 def setUp(self):
346 self.values = ["a", "b", "c"]
347 self.set = Set(self.values)
348
349 def test_add_present(self):
350 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000351 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000352
353 def test_add_absent(self):
354 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000355 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000356
357 def test_add_until_full(self):
358 tmp = Set()
359 expected_len = 0
360 for v in self.values:
361 tmp.add(v)
362 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000363 self.assertEqual(len(tmp), expected_len)
364 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000365
366 def test_remove_present(self):
367 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000368 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000369
370 def test_remove_absent(self):
371 try:
372 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000373 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000374 except LookupError:
375 pass
376
377 def test_remove_until_empty(self):
378 expected_len = len(self.set)
379 for v in self.values:
380 self.set.remove(v)
381 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000382 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000383
384 def test_discard_present(self):
385 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000386 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000387
388 def test_discard_absent(self):
389 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000390 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000391
392 def test_clear(self):
393 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000394 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000395
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000396 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000397 popped = {}
398 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000399 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000400 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000401 for v in self.values:
Tim Peters4127e912002-08-25 18:02:29 +0000402 self.failUnless(v in popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000403
404 def test_update_empty_tuple(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000405 self.set.union_update(())
Tim Petersa7777992002-08-25 17:38:49 +0000406 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000407
408 def test_update_unit_tuple_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000409 self.set.union_update(("a",))
Tim Petersa7777992002-08-25 17:38:49 +0000410 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000411
412 def test_update_unit_tuple_non_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000413 self.set.union_update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000414 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000415
416#==============================================================================
417
418class TestSubsets(unittest.TestCase):
419
Tim Peters93d8d482002-08-25 18:21:47 +0000420 case2method = {"<=": "issubset",
421 ">=": "issuperset",
422 }
Tim Petersea76c982002-08-25 18:43:10 +0000423
424 reverse = {"==": "==",
425 "!=": "!=",
426 "<": ">",
427 ">": "<",
428 "<=": ">=",
429 ">=": "<=",
430 }
Tim Peters93d8d482002-08-25 18:21:47 +0000431
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000432 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000433 x = self.left
434 y = self.right
435 for case in "!=", "==", "<", "<=", ">", ">=":
436 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000437 # Test the binary infix spelling.
438 result = eval("x" + case + "y", locals())
439 self.assertEqual(result, expected)
440 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000441 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000442 method = getattr(x, TestSubsets.case2method[case])
443 result = method(y)
444 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000445
Tim Petersea76c982002-08-25 18:43:10 +0000446 # Now do the same for the operands reversed.
447 rcase = TestSubsets.reverse[case]
448 result = eval("y" + rcase + "x", locals())
449 self.assertEqual(result, expected)
450 if rcase in TestSubsets.case2method:
451 method = getattr(y, TestSubsets.case2method[rcase])
452 result = method(x)
453 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000454#------------------------------------------------------------------------------
455
456class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000457 left = Set()
458 right = Set()
459 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000460 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000461
462#------------------------------------------------------------------------------
463
464class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000465 left = Set([1, 2])
466 right = Set([1, 2])
467 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000468 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000469
470#------------------------------------------------------------------------------
471
472class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000473 left = Set()
474 right = Set([1, 2])
475 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000476 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000477
478#------------------------------------------------------------------------------
479
480class TestSubsetPartial(TestSubsets):
Tim Peters3de75262002-11-09 05:26:15 +0000481 left = Set([1])
482 right = Set([1, 2])
483 name = "one a non-empty proper subset of other"
484 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000485
486#------------------------------------------------------------------------------
487
488class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000489 left = Set([1])
490 right = Set([2])
491 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000492 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000493
494#==============================================================================
495
496class TestOnlySetsInBinaryOps(unittest.TestCase):
497
Tim Peters44f14b02003-03-02 00:19:49 +0000498 def test_eq_ne(self):
499 # Unlike the others, this is testing that == and != *are* allowed.
500 self.assertEqual(self.other == self.set, False)
501 self.assertEqual(self.set == self.other, False)
502 self.assertEqual(self.other != self.set, True)
503 self.assertEqual(self.set != self.other, True)
504
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000505 def test_ge_gt_le_lt(self):
Tim Peters44f14b02003-03-02 00:19:49 +0000506 self.assertRaises(TypeError, lambda: self.set < self.other)
507 self.assertRaises(TypeError, lambda: self.set <= self.other)
508 self.assertRaises(TypeError, lambda: self.set > self.other)
509 self.assertRaises(TypeError, lambda: self.set >= self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000510
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000511 self.assertRaises(TypeError, lambda: self.other < self.set)
512 self.assertRaises(TypeError, lambda: self.other <= self.set)
513 self.assertRaises(TypeError, lambda: self.other > self.set)
514 self.assertRaises(TypeError, lambda: self.other >= self.set)
515
Raymond Hettinger6a180122003-08-17 08:34:09 +0000516 def test_union_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000517 try:
518 self.set |= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000519 except TypeError:
520 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000521 else:
522 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000523
Raymond Hettinger6a180122003-08-17 08:34:09 +0000524 def test_union_update(self):
525 if self.otherIsIterable:
526 self.set.union_update(self.other)
527 else:
528 self.assertRaises(TypeError, self.set.union_update, self.other)
529
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000530 def test_union(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000531 self.assertRaises(TypeError, lambda: self.set | self.other)
532 self.assertRaises(TypeError, lambda: self.other | self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000533 if self.otherIsIterable:
534 self.set.union(self.other)
535 else:
536 self.assertRaises(TypeError, self.set.union, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000537
Raymond Hettinger6a180122003-08-17 08:34:09 +0000538 def test_intersection_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000539 try:
540 self.set &= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000541 except TypeError:
542 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000543 else:
544 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000545
Raymond Hettinger6a180122003-08-17 08:34:09 +0000546 def test_intersection_update(self):
547 if self.otherIsIterable:
548 self.set.intersection_update(self.other)
549 else:
550 self.assertRaises(TypeError,
551 self.set.intersection_update,
552 self.other)
553
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000554 def test_intersection(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000555 self.assertRaises(TypeError, lambda: self.set & self.other)
556 self.assertRaises(TypeError, lambda: self.other & self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000557 if self.otherIsIterable:
558 self.set.intersection(self.other)
559 else:
560 self.assertRaises(TypeError, self.set.intersection, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000561
Raymond Hettinger6a180122003-08-17 08:34:09 +0000562 def test_sym_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000563 try:
564 self.set ^= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000565 except TypeError:
566 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000567 else:
568 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000569
Raymond Hettinger6a180122003-08-17 08:34:09 +0000570 def test_sym_difference_update(self):
571 if self.otherIsIterable:
572 self.set.symmetric_difference_update(self.other)
573 else:
574 self.assertRaises(TypeError,
575 self.set.symmetric_difference_update,
576 self.other)
577
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000578 def test_sym_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000579 self.assertRaises(TypeError, lambda: self.set ^ self.other)
580 self.assertRaises(TypeError, lambda: self.other ^ self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000581 if self.otherIsIterable:
582 self.set.symmetric_difference(self.other)
583 else:
584 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000585
Raymond Hettinger6a180122003-08-17 08:34:09 +0000586 def test_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000587 try:
588 self.set -= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000589 except TypeError:
590 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000591 else:
592 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000593
Raymond Hettinger6a180122003-08-17 08:34:09 +0000594 def test_difference_update(self):
595 if self.otherIsIterable:
596 self.set.difference_update(self.other)
597 else:
598 self.assertRaises(TypeError,
599 self.set.difference_update,
600 self.other)
601
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000602 def test_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000603 self.assertRaises(TypeError, lambda: self.set - self.other)
604 self.assertRaises(TypeError, lambda: self.other - self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000605 if self.otherIsIterable:
606 self.set.difference(self.other)
607 else:
608 self.assertRaises(TypeError, self.set.difference, self.other)
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000609
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000610#------------------------------------------------------------------------------
611
612class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
613 def setUp(self):
614 self.set = Set((1, 2, 3))
615 self.other = 19
Raymond Hettinger6a180122003-08-17 08:34:09 +0000616 self.otherIsIterable = False
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000617
618#------------------------------------------------------------------------------
619
620class TestOnlySetsDict(TestOnlySetsInBinaryOps):
621 def setUp(self):
622 self.set = Set((1, 2, 3))
623 self.other = {1:2, 3:4}
Raymond Hettinger6a180122003-08-17 08:34:09 +0000624 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000625
626#------------------------------------------------------------------------------
627
628class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
629 def setUp(self):
630 self.set = Set((1, 2, 3))
631 self.other = operator.add
Raymond Hettinger6a180122003-08-17 08:34:09 +0000632 self.otherIsIterable = False
633
634#------------------------------------------------------------------------------
635
636class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
637 def setUp(self):
638 self.set = Set((1, 2, 3))
639 self.other = (2, 4, 6)
640 self.otherIsIterable = True
641
642#------------------------------------------------------------------------------
643
644class TestOnlySetsString(TestOnlySetsInBinaryOps):
645 def setUp(self):
646 self.set = Set((1, 2, 3))
647 self.other = 'abc'
648 self.otherIsIterable = True
649
650#------------------------------------------------------------------------------
651
652class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
653 def setUp(self):
654 def gen():
655 for i in xrange(0, 10, 2):
656 yield i
657 self.set = Set((1, 2, 3))
658 self.other = gen()
659 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000660
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000661#------------------------------------------------------------------------------
662
663class TestOnlySetsofSets(TestOnlySetsInBinaryOps):
664 def setUp(self):
665 self.set = Set((1, 2, 3))
666 self.other = [Set('ab'), ImmutableSet('cd')]
667 self.otherIsIterable = True
668
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000669#==============================================================================
670
671class TestCopying(unittest.TestCase):
672
673 def test_copy(self):
674 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000675 dup_list = sorted(dup, key=repr)
676 set_list = sorted(self.set, key=repr)
Tim Peters4127e912002-08-25 18:02:29 +0000677 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000678 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000679 self.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000680
681 def test_deep_copy(self):
682 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000683 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000684 dup_list = sorted(dup, key=repr)
685 set_list = sorted(self.set, key=repr)
Tim Peters4127e912002-08-25 18:02:29 +0000686 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000687 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000688 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000689
690#------------------------------------------------------------------------------
691
692class TestCopyingEmpty(TestCopying):
693 def setUp(self):
694 self.set = Set()
695
696#------------------------------------------------------------------------------
697
698class TestCopyingSingleton(TestCopying):
699 def setUp(self):
700 self.set = Set(["hello"])
701
702#------------------------------------------------------------------------------
703
704class TestCopyingTriple(TestCopying):
705 def setUp(self):
706 self.set = Set(["zero", 0, None])
707
708#------------------------------------------------------------------------------
709
710class TestCopyingTuple(TestCopying):
711 def setUp(self):
712 self.set = Set([(1, 2)])
713
714#------------------------------------------------------------------------------
715
716class TestCopyingNested(TestCopying):
717 def setUp(self):
718 self.set = Set([((1, 2), (3, 4))])
719
720#==============================================================================
721
Raymond Hettinger6a180122003-08-17 08:34:09 +0000722class TestIdentities(unittest.TestCase):
723 def setUp(self):
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000724 self.a = Set([random.randrange(100) for i in xrange(50)])
725 self.b = Set([random.randrange(100) for i in xrange(50)])
Raymond Hettinger6a180122003-08-17 08:34:09 +0000726
727 def test_binopsVsSubsets(self):
728 a, b = self.a, self.b
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000729 self.assert_(a - b <= a)
730 self.assert_(b - a <= b)
731 self.assert_(a & b <= a)
732 self.assert_(a & b <= b)
733 self.assert_(a | b >= a)
734 self.assert_(a | b >= b)
735 self.assert_(a ^ b <= a | b)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000736
737 def test_commutativity(self):
738 a, b = self.a, self.b
739 self.assertEqual(a&b, b&a)
740 self.assertEqual(a|b, b|a)
741 self.assertEqual(a^b, b^a)
742 if a != b:
743 self.assertNotEqual(a-b, b-a)
744
Raymond Hettinger3778f402003-09-24 03:56:07 +0000745 def test_reflexsive_relations(self):
746 a, zero = self.a, Set()
747 self.assertEqual(a ^ a, zero)
748 self.assertEqual(a - a, zero)
749 self.assertEqual(a | a, a)
750 self.assertEqual(a & a, a)
751 self.assert_(a <= a)
752 self.assert_(a >= a)
753 self.assert_(a == a)
754
Raymond Hettinger6a180122003-08-17 08:34:09 +0000755 def test_summations(self):
756 # check that sums of parts equal the whole
757 a, b = self.a, self.b
758 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
759 self.assertEqual((a&b)|(a^b), a|b)
760 self.assertEqual(a|(b-a), a|b)
761 self.assertEqual((a-b)|b, a|b)
762 self.assertEqual((a-b)|(a&b), a)
763 self.assertEqual((b-a)|(a&b), b)
764 self.assertEqual((a-b)|(b-a), a^b)
765
766 def test_exclusion(self):
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000767 # check that inverse operations do not overlap
Raymond Hettinger6a180122003-08-17 08:34:09 +0000768 a, b, zero = self.a, self.b, Set()
769 self.assertEqual((a-b)&b, zero)
770 self.assertEqual((b-a)&a, zero)
771 self.assertEqual((a&b)&(a^b), zero)
772
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000773 def test_cardinality_relations(self):
774 a, b = self.a, self.b
775 self.assertEqual(len(a), len(a-b) + len(a&b))
776 self.assertEqual(len(b), len(b-a) + len(a&b))
777 self.assertEqual(len(a^b), len(a-b) + len(b-a))
778 self.assertEqual(len(a|b), len(a-b) + len(a&b) + len(b-a))
Raymond Hettinger3778f402003-09-24 03:56:07 +0000779 self.assertEqual(len(a^b) + len(a&b), len(a|b))
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000780
Raymond Hettinger6a180122003-08-17 08:34:09 +0000781#==============================================================================
782
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000783libreftest = """
784Example from the Library Reference: Doc/lib/libsets.tex
785
Tim Peters3ba491e2003-03-01 23:33:34 +0000786>>> from sets import Set as Base # override _repr to get sorted output
787>>> class Set(Base):
788... def _repr(self):
789... return Base._repr(self, sorted=True)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000790>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
791>>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
Raymond Hettinger19540352003-08-16 00:59:59 +0000792>>> managers = Set(['Jane', 'Jack', 'Susan', 'Zack'])
793>>> employees = engineers | programmers | managers # union
794>>> engineering_management = engineers & managers # intersection
795>>> fulltime_management = managers - engineers - programmers # difference
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000796>>> engineers.add('Marvin')
797>>> print engineers
Tim Peters3ba491e2003-03-01 23:33:34 +0000798Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000799>>> employees.issuperset(engineers) # superset test
800False
Raymond Hettinger6a180122003-08-17 08:34:09 +0000801>>> employees.union_update(engineers) # update from another set
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000802>>> employees.issuperset(engineers)
803True
Raymond Hettinger19540352003-08-16 00:59:59 +0000804>>> for group in [engineers, programmers, managers, employees]:
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000805... group.discard('Susan') # unconditionally remove element
806... print group
807...
Tim Peters3ba491e2003-03-01 23:33:34 +0000808Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
809Set(['Jack', 'Janice', 'Sam'])
810Set(['Jack', 'Jane', 'Zack'])
811Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin', 'Sam', 'Zack'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000812"""
813
814#==============================================================================
815
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000816__test__ = {'libreftest' : libreftest}
817
818def test_main(verbose=None):
Neal Norwitzef4f7f02006-03-24 06:59:24 +0000819 import doctest
820 from test import test_sets
Walter Dörwald21d3a322003-05-01 17:45:56 +0000821 test_support.run_unittest(
822 TestSetOfSets,
823 TestExceptionPropagation,
824 TestBasicOpsEmpty,
825 TestBasicOpsSingleton,
826 TestBasicOpsTuple,
827 TestBasicOpsTriple,
828 TestBinaryOps,
829 TestUpdateOps,
830 TestMutate,
831 TestSubsetEqualEmpty,
832 TestSubsetEqualNonEmpty,
833 TestSubsetEmptyNonEmpty,
834 TestSubsetPartial,
835 TestSubsetNonOverlap,
836 TestOnlySetsNumeric,
837 TestOnlySetsDict,
838 TestOnlySetsOperator,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000839 TestOnlySetsTuple,
840 TestOnlySetsString,
841 TestOnlySetsGenerator,
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000842 TestOnlySetsofSets,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000843 TestCopyingEmpty,
844 TestCopyingSingleton,
845 TestCopyingTriple,
846 TestCopyingTuple,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000847 TestCopyingNested,
848 TestIdentities,
Raymond Hettinger654fcd52004-08-07 06:15:12 +0000849 doctest.DocTestSuite(test_sets),
Walter Dörwald21d3a322003-05-01 17:45:56 +0000850 )
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000851
852if __name__ == "__main__":
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000853 test_main(verbose=True)