blob: c5a48b1c1ec80d6221cbb0f4ac083d40ff342ebc [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
237 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000238 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
Tim Peters44f14b02003-03-02 00:19:49 +0000239 # which Python thinks is good enough to synthesize a cmp() result
240 # without calling __cmp__.
241 self.assertEqual(cmp(a, a), 0)
242
243 self.assertRaises(TypeError, cmp, a, 12)
244 self.assertRaises(TypeError, cmp, "abc", a)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000245
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000246#==============================================================================
247
248class TestUpdateOps(unittest.TestCase):
249 def setUp(self):
250 self.set = Set((2, 4, 6))
251
252 def test_union_subset(self):
253 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000254 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000255
256 def test_union_superset(self):
257 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000258 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000259
260 def test_union_overlap(self):
261 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000262 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000263
264 def test_union_non_overlap(self):
265 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000266 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000267
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000268 def test_union_method_call(self):
269 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000270 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000271
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000272 def test_intersection_subset(self):
273 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000274 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000275
276 def test_intersection_superset(self):
277 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000278 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000279
280 def test_intersection_overlap(self):
281 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000282 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000283
284 def test_intersection_non_overlap(self):
285 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000286 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000287
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000288 def test_intersection_method_call(self):
289 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000290 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000291
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000292 def test_sym_difference_subset(self):
293 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000294 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000295
296 def test_sym_difference_superset(self):
297 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000298 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000299
300 def test_sym_difference_overlap(self):
301 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000302 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000303
304 def test_sym_difference_non_overlap(self):
305 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000306 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000307
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000308 def test_sym_difference_method_call(self):
309 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000310 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000311
312 def test_difference_subset(self):
313 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000314 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000315
316 def test_difference_superset(self):
317 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000318 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000319
320 def test_difference_overlap(self):
321 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000322 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000323
324 def test_difference_non_overlap(self):
325 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000326 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000327
328 def test_difference_method_call(self):
329 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000330 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000331
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000332#==============================================================================
333
334class TestMutate(unittest.TestCase):
335 def setUp(self):
336 self.values = ["a", "b", "c"]
337 self.set = Set(self.values)
338
339 def test_add_present(self):
340 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000341 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000342
343 def test_add_absent(self):
344 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000345 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000346
347 def test_add_until_full(self):
348 tmp = Set()
349 expected_len = 0
350 for v in self.values:
351 tmp.add(v)
352 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000353 self.assertEqual(len(tmp), expected_len)
354 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000355
356 def test_remove_present(self):
357 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000358 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000359
360 def test_remove_absent(self):
361 try:
362 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000363 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000364 except LookupError:
365 pass
366
367 def test_remove_until_empty(self):
368 expected_len = len(self.set)
369 for v in self.values:
370 self.set.remove(v)
371 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000372 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000373
374 def test_discard_present(self):
375 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000376 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000377
378 def test_discard_absent(self):
379 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000380 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000381
382 def test_clear(self):
383 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000384 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000385
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000386 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000387 popped = {}
388 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000389 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000390 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000391 for v in self.values:
Tim Peters4127e912002-08-25 18:02:29 +0000392 self.failUnless(v in popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000393
394 def test_update_empty_tuple(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000395 self.set.union_update(())
Tim Petersa7777992002-08-25 17:38:49 +0000396 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000397
398 def test_update_unit_tuple_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000399 self.set.union_update(("a",))
Tim Petersa7777992002-08-25 17:38:49 +0000400 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000401
402 def test_update_unit_tuple_non_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000403 self.set.union_update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000404 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000405
406#==============================================================================
407
408class TestSubsets(unittest.TestCase):
409
Tim Peters93d8d482002-08-25 18:21:47 +0000410 case2method = {"<=": "issubset",
411 ">=": "issuperset",
412 }
Tim Petersea76c982002-08-25 18:43:10 +0000413
414 reverse = {"==": "==",
415 "!=": "!=",
416 "<": ">",
417 ">": "<",
418 "<=": ">=",
419 ">=": "<=",
420 }
Tim Peters93d8d482002-08-25 18:21:47 +0000421
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000422 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000423 x = self.left
424 y = self.right
425 for case in "!=", "==", "<", "<=", ">", ">=":
426 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000427 # Test the binary infix spelling.
428 result = eval("x" + case + "y", locals())
429 self.assertEqual(result, expected)
430 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000431 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000432 method = getattr(x, TestSubsets.case2method[case])
433 result = method(y)
434 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000435
Tim Petersea76c982002-08-25 18:43:10 +0000436 # Now do the same for the operands reversed.
437 rcase = TestSubsets.reverse[case]
438 result = eval("y" + rcase + "x", locals())
439 self.assertEqual(result, expected)
440 if rcase in TestSubsets.case2method:
441 method = getattr(y, TestSubsets.case2method[rcase])
442 result = method(x)
443 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000444#------------------------------------------------------------------------------
445
446class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000447 left = Set()
448 right = Set()
449 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000450 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000451
452#------------------------------------------------------------------------------
453
454class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000455 left = Set([1, 2])
456 right = Set([1, 2])
457 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000458 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000459
460#------------------------------------------------------------------------------
461
462class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000463 left = Set()
464 right = Set([1, 2])
465 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000466 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000467
468#------------------------------------------------------------------------------
469
470class TestSubsetPartial(TestSubsets):
Tim Peters3de75262002-11-09 05:26:15 +0000471 left = Set([1])
472 right = Set([1, 2])
473 name = "one a non-empty proper subset of other"
474 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000475
476#------------------------------------------------------------------------------
477
478class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000479 left = Set([1])
480 right = Set([2])
481 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000482 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000483
484#==============================================================================
485
486class TestOnlySetsInBinaryOps(unittest.TestCase):
487
Tim Peters44f14b02003-03-02 00:19:49 +0000488 def test_eq_ne(self):
489 # Unlike the others, this is testing that == and != *are* allowed.
490 self.assertEqual(self.other == self.set, False)
491 self.assertEqual(self.set == self.other, False)
492 self.assertEqual(self.other != self.set, True)
493 self.assertEqual(self.set != self.other, True)
494
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000495 def test_ge_gt_le_lt(self):
Tim Peters44f14b02003-03-02 00:19:49 +0000496 self.assertRaises(TypeError, lambda: self.set < self.other)
497 self.assertRaises(TypeError, lambda: self.set <= self.other)
498 self.assertRaises(TypeError, lambda: self.set > self.other)
499 self.assertRaises(TypeError, lambda: self.set >= self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000500
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000501 self.assertRaises(TypeError, lambda: self.other < self.set)
502 self.assertRaises(TypeError, lambda: self.other <= self.set)
503 self.assertRaises(TypeError, lambda: self.other > self.set)
504 self.assertRaises(TypeError, lambda: self.other >= self.set)
505
Raymond Hettinger6a180122003-08-17 08:34:09 +0000506 def test_union_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000507 try:
508 self.set |= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000509 except TypeError:
510 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000511 else:
512 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000513
Raymond Hettinger6a180122003-08-17 08:34:09 +0000514 def test_union_update(self):
515 if self.otherIsIterable:
516 self.set.union_update(self.other)
517 else:
518 self.assertRaises(TypeError, self.set.union_update, self.other)
519
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000520 def test_union(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000521 self.assertRaises(TypeError, lambda: self.set | self.other)
522 self.assertRaises(TypeError, lambda: self.other | self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000523 if self.otherIsIterable:
524 self.set.union(self.other)
525 else:
526 self.assertRaises(TypeError, self.set.union, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000527
Raymond Hettinger6a180122003-08-17 08:34:09 +0000528 def test_intersection_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000529 try:
530 self.set &= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000531 except TypeError:
532 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000533 else:
534 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000535
Raymond Hettinger6a180122003-08-17 08:34:09 +0000536 def test_intersection_update(self):
537 if self.otherIsIterable:
538 self.set.intersection_update(self.other)
539 else:
540 self.assertRaises(TypeError,
541 self.set.intersection_update,
542 self.other)
543
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000544 def test_intersection(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000545 self.assertRaises(TypeError, lambda: self.set & self.other)
546 self.assertRaises(TypeError, lambda: self.other & self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000547 if self.otherIsIterable:
548 self.set.intersection(self.other)
549 else:
550 self.assertRaises(TypeError, self.set.intersection, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000551
Raymond Hettinger6a180122003-08-17 08:34:09 +0000552 def test_sym_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000553 try:
554 self.set ^= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000555 except TypeError:
556 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000557 else:
558 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000559
Raymond Hettinger6a180122003-08-17 08:34:09 +0000560 def test_sym_difference_update(self):
561 if self.otherIsIterable:
562 self.set.symmetric_difference_update(self.other)
563 else:
564 self.assertRaises(TypeError,
565 self.set.symmetric_difference_update,
566 self.other)
567
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000568 def test_sym_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000569 self.assertRaises(TypeError, lambda: self.set ^ self.other)
570 self.assertRaises(TypeError, lambda: self.other ^ self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000571 if self.otherIsIterable:
572 self.set.symmetric_difference(self.other)
573 else:
574 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000575
Raymond Hettinger6a180122003-08-17 08:34:09 +0000576 def test_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000577 try:
578 self.set -= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000579 except TypeError:
580 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000581 else:
582 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000583
Raymond Hettinger6a180122003-08-17 08:34:09 +0000584 def test_difference_update(self):
585 if self.otherIsIterable:
586 self.set.difference_update(self.other)
587 else:
588 self.assertRaises(TypeError,
589 self.set.difference_update,
590 self.other)
591
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000592 def test_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000593 self.assertRaises(TypeError, lambda: self.set - self.other)
594 self.assertRaises(TypeError, lambda: self.other - self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000595 if self.otherIsIterable:
596 self.set.difference(self.other)
597 else:
598 self.assertRaises(TypeError, self.set.difference, self.other)
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000599
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000600#------------------------------------------------------------------------------
601
602class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
603 def setUp(self):
604 self.set = Set((1, 2, 3))
605 self.other = 19
Raymond Hettinger6a180122003-08-17 08:34:09 +0000606 self.otherIsIterable = False
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000607
608#------------------------------------------------------------------------------
609
610class TestOnlySetsDict(TestOnlySetsInBinaryOps):
611 def setUp(self):
612 self.set = Set((1, 2, 3))
613 self.other = {1:2, 3:4}
Raymond Hettinger6a180122003-08-17 08:34:09 +0000614 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000615
616#------------------------------------------------------------------------------
617
618class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
619 def setUp(self):
620 self.set = Set((1, 2, 3))
621 self.other = operator.add
Raymond Hettinger6a180122003-08-17 08:34:09 +0000622 self.otherIsIterable = False
623
624#------------------------------------------------------------------------------
625
626class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
627 def setUp(self):
628 self.set = Set((1, 2, 3))
629 self.other = (2, 4, 6)
630 self.otherIsIterable = True
631
632#------------------------------------------------------------------------------
633
634class TestOnlySetsString(TestOnlySetsInBinaryOps):
635 def setUp(self):
636 self.set = Set((1, 2, 3))
637 self.other = 'abc'
638 self.otherIsIterable = True
639
640#------------------------------------------------------------------------------
641
642class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
643 def setUp(self):
644 def gen():
645 for i in xrange(0, 10, 2):
646 yield i
647 self.set = Set((1, 2, 3))
648 self.other = gen()
649 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000650
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000651#------------------------------------------------------------------------------
652
653class TestOnlySetsofSets(TestOnlySetsInBinaryOps):
654 def setUp(self):
655 self.set = Set((1, 2, 3))
656 self.other = [Set('ab'), ImmutableSet('cd')]
657 self.otherIsIterable = True
658
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000659#==============================================================================
660
661class TestCopying(unittest.TestCase):
662
663 def test_copy(self):
664 dup = self.set.copy()
665 dup_list = list(dup); dup_list.sort()
666 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000667 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000668 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000669 self.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000670
671 def test_deep_copy(self):
672 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000673 ##print type(dup), repr(dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000674 dup_list = list(dup); dup_list.sort()
675 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000676 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000677 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000678 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000679
680#------------------------------------------------------------------------------
681
682class TestCopyingEmpty(TestCopying):
683 def setUp(self):
684 self.set = Set()
685
686#------------------------------------------------------------------------------
687
688class TestCopyingSingleton(TestCopying):
689 def setUp(self):
690 self.set = Set(["hello"])
691
692#------------------------------------------------------------------------------
693
694class TestCopyingTriple(TestCopying):
695 def setUp(self):
696 self.set = Set(["zero", 0, None])
697
698#------------------------------------------------------------------------------
699
700class TestCopyingTuple(TestCopying):
701 def setUp(self):
702 self.set = Set([(1, 2)])
703
704#------------------------------------------------------------------------------
705
706class TestCopyingNested(TestCopying):
707 def setUp(self):
708 self.set = Set([((1, 2), (3, 4))])
709
710#==============================================================================
711
Raymond Hettinger6a180122003-08-17 08:34:09 +0000712class TestIdentities(unittest.TestCase):
713 def setUp(self):
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000714 self.a = Set([random.randrange(100) for i in xrange(50)])
715 self.b = Set([random.randrange(100) for i in xrange(50)])
Raymond Hettinger6a180122003-08-17 08:34:09 +0000716
717 def test_binopsVsSubsets(self):
718 a, b = self.a, self.b
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000719 self.assert_(a - b <= a)
720 self.assert_(b - a <= b)
721 self.assert_(a & b <= a)
722 self.assert_(a & b <= b)
723 self.assert_(a | b >= a)
724 self.assert_(a | b >= b)
725 self.assert_(a ^ b <= a | b)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000726
727 def test_commutativity(self):
728 a, b = self.a, self.b
729 self.assertEqual(a&b, b&a)
730 self.assertEqual(a|b, b|a)
731 self.assertEqual(a^b, b^a)
732 if a != b:
733 self.assertNotEqual(a-b, b-a)
734
Raymond Hettinger3778f402003-09-24 03:56:07 +0000735 def test_reflexsive_relations(self):
736 a, zero = self.a, Set()
737 self.assertEqual(a ^ a, zero)
738 self.assertEqual(a - a, zero)
739 self.assertEqual(a | a, a)
740 self.assertEqual(a & a, a)
741 self.assert_(a <= a)
742 self.assert_(a >= a)
743 self.assert_(a == a)
744
Raymond Hettinger6a180122003-08-17 08:34:09 +0000745 def test_summations(self):
746 # check that sums of parts equal the whole
747 a, b = self.a, self.b
748 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
749 self.assertEqual((a&b)|(a^b), a|b)
750 self.assertEqual(a|(b-a), a|b)
751 self.assertEqual((a-b)|b, a|b)
752 self.assertEqual((a-b)|(a&b), a)
753 self.assertEqual((b-a)|(a&b), b)
754 self.assertEqual((a-b)|(b-a), a^b)
755
756 def test_exclusion(self):
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000757 # check that inverse operations do not overlap
Raymond Hettinger6a180122003-08-17 08:34:09 +0000758 a, b, zero = self.a, self.b, Set()
759 self.assertEqual((a-b)&b, zero)
760 self.assertEqual((b-a)&a, zero)
761 self.assertEqual((a&b)&(a^b), zero)
762
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000763 def test_cardinality_relations(self):
764 a, b = self.a, self.b
765 self.assertEqual(len(a), len(a-b) + len(a&b))
766 self.assertEqual(len(b), len(b-a) + len(a&b))
767 self.assertEqual(len(a^b), len(a-b) + len(b-a))
768 self.assertEqual(len(a|b), len(a-b) + len(a&b) + len(b-a))
Raymond Hettinger3778f402003-09-24 03:56:07 +0000769 self.assertEqual(len(a^b) + len(a&b), len(a|b))
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000770
Raymond Hettinger6a180122003-08-17 08:34:09 +0000771#==============================================================================
772
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000773libreftest = """
774Example from the Library Reference: Doc/lib/libsets.tex
775
Tim Peters3ba491e2003-03-01 23:33:34 +0000776>>> from sets import Set as Base # override _repr to get sorted output
777>>> class Set(Base):
778... def _repr(self):
779... return Base._repr(self, sorted=True)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000780>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
781>>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
Raymond Hettinger19540352003-08-16 00:59:59 +0000782>>> managers = Set(['Jane', 'Jack', 'Susan', 'Zack'])
783>>> employees = engineers | programmers | managers # union
784>>> engineering_management = engineers & managers # intersection
785>>> fulltime_management = managers - engineers - programmers # difference
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000786>>> engineers.add('Marvin')
787>>> print engineers
Tim Peters3ba491e2003-03-01 23:33:34 +0000788Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000789>>> employees.issuperset(engineers) # superset test
790False
Raymond Hettinger6a180122003-08-17 08:34:09 +0000791>>> employees.union_update(engineers) # update from another set
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000792>>> employees.issuperset(engineers)
793True
Raymond Hettinger19540352003-08-16 00:59:59 +0000794>>> for group in [engineers, programmers, managers, employees]:
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000795... group.discard('Susan') # unconditionally remove element
796... print group
797...
Tim Peters3ba491e2003-03-01 23:33:34 +0000798Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
799Set(['Jack', 'Janice', 'Sam'])
800Set(['Jack', 'Jane', 'Zack'])
801Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin', 'Sam', 'Zack'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000802"""
803
804#==============================================================================
805
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000806__test__ = {'libreftest' : libreftest}
807
808def test_main(verbose=None):
Raymond Hettinger654fcd52004-08-07 06:15:12 +0000809 import test_sets, doctest
Walter Dörwald21d3a322003-05-01 17:45:56 +0000810 test_support.run_unittest(
811 TestSetOfSets,
812 TestExceptionPropagation,
813 TestBasicOpsEmpty,
814 TestBasicOpsSingleton,
815 TestBasicOpsTuple,
816 TestBasicOpsTriple,
817 TestBinaryOps,
818 TestUpdateOps,
819 TestMutate,
820 TestSubsetEqualEmpty,
821 TestSubsetEqualNonEmpty,
822 TestSubsetEmptyNonEmpty,
823 TestSubsetPartial,
824 TestSubsetNonOverlap,
825 TestOnlySetsNumeric,
826 TestOnlySetsDict,
827 TestOnlySetsOperator,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000828 TestOnlySetsTuple,
829 TestOnlySetsString,
830 TestOnlySetsGenerator,
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000831 TestOnlySetsofSets,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000832 TestCopyingEmpty,
833 TestCopyingSingleton,
834 TestCopyingTriple,
835 TestCopyingTuple,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000836 TestCopyingNested,
837 TestIdentities,
Raymond Hettinger654fcd52004-08-07 06:15:12 +0000838 doctest.DocTestSuite(test_sets),
Walter Dörwald21d3a322003-05-01 17:45:56 +0000839 )
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000840
841if __name__ == "__main__":
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000842 test_main(verbose=True)