blob: ff834e0aa0d7ab64e98c1f7b883c2e30713a32b3 [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
Raymond Hettinger038ca2a2005-08-13 02:29:58 +0000246 def test_inplace_on_self(self):
247 t = self.set.copy()
248 t |= t
249 self.assertEqual(t, self.set)
250 t &= t
251 self.assertEqual(t, self.set)
252 t -= t
253 self.assertEqual(len(t), 0)
254 t = self.set.copy()
255 t ^= t
256 self.assertEqual(len(t), 0)
257
258
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000259#==============================================================================
260
261class TestUpdateOps(unittest.TestCase):
262 def setUp(self):
263 self.set = Set((2, 4, 6))
264
265 def test_union_subset(self):
266 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000267 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000268
269 def test_union_superset(self):
270 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000271 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000272
273 def test_union_overlap(self):
274 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000275 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000276
277 def test_union_non_overlap(self):
278 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000279 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000280
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000281 def test_union_method_call(self):
282 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000283 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000284
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000285 def test_intersection_subset(self):
286 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000287 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000288
289 def test_intersection_superset(self):
290 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000291 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000292
293 def test_intersection_overlap(self):
294 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000295 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000296
297 def test_intersection_non_overlap(self):
298 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000299 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000300
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000301 def test_intersection_method_call(self):
302 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000303 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000304
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000305 def test_sym_difference_subset(self):
306 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000307 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000308
309 def test_sym_difference_superset(self):
310 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000311 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000312
313 def test_sym_difference_overlap(self):
314 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000315 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000316
317 def test_sym_difference_non_overlap(self):
318 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000319 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000320
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000321 def test_sym_difference_method_call(self):
322 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000323 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000324
325 def test_difference_subset(self):
326 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000327 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000328
329 def test_difference_superset(self):
330 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000331 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000332
333 def test_difference_overlap(self):
334 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000335 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000336
337 def test_difference_non_overlap(self):
338 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000339 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000340
341 def test_difference_method_call(self):
342 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000343 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000344
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000345#==============================================================================
346
347class TestMutate(unittest.TestCase):
348 def setUp(self):
349 self.values = ["a", "b", "c"]
350 self.set = Set(self.values)
351
352 def test_add_present(self):
353 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000354 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000355
356 def test_add_absent(self):
357 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000358 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000359
360 def test_add_until_full(self):
361 tmp = Set()
362 expected_len = 0
363 for v in self.values:
364 tmp.add(v)
365 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000366 self.assertEqual(len(tmp), expected_len)
367 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000368
369 def test_remove_present(self):
370 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000371 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000372
373 def test_remove_absent(self):
374 try:
375 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000376 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000377 except LookupError:
378 pass
379
380 def test_remove_until_empty(self):
381 expected_len = len(self.set)
382 for v in self.values:
383 self.set.remove(v)
384 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000385 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000386
387 def test_discard_present(self):
388 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000389 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000390
391 def test_discard_absent(self):
392 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000393 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000394
395 def test_clear(self):
396 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000397 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000398
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000399 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000400 popped = {}
401 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000402 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000403 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000404 for v in self.values:
Tim Peters4127e912002-08-25 18:02:29 +0000405 self.failUnless(v in popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000406
407 def test_update_empty_tuple(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000408 self.set.union_update(())
Tim Petersa7777992002-08-25 17:38:49 +0000409 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000410
411 def test_update_unit_tuple_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000412 self.set.union_update(("a",))
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_non_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000416 self.set.union_update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000417 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000418
419#==============================================================================
420
421class TestSubsets(unittest.TestCase):
422
Tim Peters93d8d482002-08-25 18:21:47 +0000423 case2method = {"<=": "issubset",
424 ">=": "issuperset",
425 }
Tim Petersea76c982002-08-25 18:43:10 +0000426
427 reverse = {"==": "==",
428 "!=": "!=",
429 "<": ">",
430 ">": "<",
431 "<=": ">=",
432 ">=": "<=",
433 }
Tim Peters93d8d482002-08-25 18:21:47 +0000434
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000435 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000436 x = self.left
437 y = self.right
438 for case in "!=", "==", "<", "<=", ">", ">=":
439 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000440 # Test the binary infix spelling.
441 result = eval("x" + case + "y", locals())
442 self.assertEqual(result, expected)
443 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000444 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000445 method = getattr(x, TestSubsets.case2method[case])
446 result = method(y)
447 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000448
Tim Petersea76c982002-08-25 18:43:10 +0000449 # Now do the same for the operands reversed.
450 rcase = TestSubsets.reverse[case]
451 result = eval("y" + rcase + "x", locals())
452 self.assertEqual(result, expected)
453 if rcase in TestSubsets.case2method:
454 method = getattr(y, TestSubsets.case2method[rcase])
455 result = method(x)
456 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000457#------------------------------------------------------------------------------
458
459class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000460 left = Set()
461 right = Set()
462 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000463 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000464
465#------------------------------------------------------------------------------
466
467class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000468 left = Set([1, 2])
469 right = Set([1, 2])
470 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000471 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000472
473#------------------------------------------------------------------------------
474
475class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000476 left = Set()
477 right = Set([1, 2])
478 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000479 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000480
481#------------------------------------------------------------------------------
482
483class TestSubsetPartial(TestSubsets):
Tim Peters3de75262002-11-09 05:26:15 +0000484 left = Set([1])
485 right = Set([1, 2])
486 name = "one a non-empty proper subset of other"
487 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000488
489#------------------------------------------------------------------------------
490
491class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000492 left = Set([1])
493 right = Set([2])
494 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000495 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000496
497#==============================================================================
498
499class TestOnlySetsInBinaryOps(unittest.TestCase):
500
Tim Peters44f14b02003-03-02 00:19:49 +0000501 def test_eq_ne(self):
502 # Unlike the others, this is testing that == and != *are* allowed.
503 self.assertEqual(self.other == self.set, False)
504 self.assertEqual(self.set == self.other, False)
505 self.assertEqual(self.other != self.set, True)
506 self.assertEqual(self.set != self.other, True)
507
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000508 def test_ge_gt_le_lt(self):
Tim Peters44f14b02003-03-02 00:19:49 +0000509 self.assertRaises(TypeError, lambda: self.set < self.other)
510 self.assertRaises(TypeError, lambda: self.set <= self.other)
511 self.assertRaises(TypeError, lambda: self.set > self.other)
512 self.assertRaises(TypeError, lambda: self.set >= self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000513
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000514 self.assertRaises(TypeError, lambda: self.other < self.set)
515 self.assertRaises(TypeError, lambda: self.other <= self.set)
516 self.assertRaises(TypeError, lambda: self.other > self.set)
517 self.assertRaises(TypeError, lambda: self.other >= self.set)
518
Raymond Hettinger6a180122003-08-17 08:34:09 +0000519 def test_union_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000520 try:
521 self.set |= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000522 except TypeError:
523 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000524 else:
525 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000526
Raymond Hettinger6a180122003-08-17 08:34:09 +0000527 def test_union_update(self):
528 if self.otherIsIterable:
529 self.set.union_update(self.other)
530 else:
531 self.assertRaises(TypeError, self.set.union_update, self.other)
532
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000533 def test_union(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000534 self.assertRaises(TypeError, lambda: self.set | self.other)
535 self.assertRaises(TypeError, lambda: self.other | self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000536 if self.otherIsIterable:
537 self.set.union(self.other)
538 else:
539 self.assertRaises(TypeError, self.set.union, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000540
Raymond Hettinger6a180122003-08-17 08:34:09 +0000541 def test_intersection_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000542 try:
543 self.set &= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000544 except TypeError:
545 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000546 else:
547 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000548
Raymond Hettinger6a180122003-08-17 08:34:09 +0000549 def test_intersection_update(self):
550 if self.otherIsIterable:
551 self.set.intersection_update(self.other)
552 else:
553 self.assertRaises(TypeError,
554 self.set.intersection_update,
555 self.other)
556
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000557 def test_intersection(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000558 self.assertRaises(TypeError, lambda: self.set & self.other)
559 self.assertRaises(TypeError, lambda: self.other & self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000560 if self.otherIsIterable:
561 self.set.intersection(self.other)
562 else:
563 self.assertRaises(TypeError, self.set.intersection, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000564
Raymond Hettinger6a180122003-08-17 08:34:09 +0000565 def test_sym_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000566 try:
567 self.set ^= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000568 except TypeError:
569 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000570 else:
571 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000572
Raymond Hettinger6a180122003-08-17 08:34:09 +0000573 def test_sym_difference_update(self):
574 if self.otherIsIterable:
575 self.set.symmetric_difference_update(self.other)
576 else:
577 self.assertRaises(TypeError,
578 self.set.symmetric_difference_update,
579 self.other)
580
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000581 def test_sym_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000582 self.assertRaises(TypeError, lambda: self.set ^ self.other)
583 self.assertRaises(TypeError, lambda: self.other ^ self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000584 if self.otherIsIterable:
585 self.set.symmetric_difference(self.other)
586 else:
587 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000588
Raymond Hettinger6a180122003-08-17 08:34:09 +0000589 def test_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000590 try:
591 self.set -= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000592 except TypeError:
593 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000594 else:
595 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000596
Raymond Hettinger6a180122003-08-17 08:34:09 +0000597 def test_difference_update(self):
598 if self.otherIsIterable:
599 self.set.difference_update(self.other)
600 else:
601 self.assertRaises(TypeError,
602 self.set.difference_update,
603 self.other)
604
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000605 def test_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000606 self.assertRaises(TypeError, lambda: self.set - self.other)
607 self.assertRaises(TypeError, lambda: self.other - self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000608 if self.otherIsIterable:
609 self.set.difference(self.other)
610 else:
611 self.assertRaises(TypeError, self.set.difference, self.other)
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000612
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000613#------------------------------------------------------------------------------
614
615class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
616 def setUp(self):
617 self.set = Set((1, 2, 3))
618 self.other = 19
Raymond Hettinger6a180122003-08-17 08:34:09 +0000619 self.otherIsIterable = False
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000620
621#------------------------------------------------------------------------------
622
623class TestOnlySetsDict(TestOnlySetsInBinaryOps):
624 def setUp(self):
625 self.set = Set((1, 2, 3))
626 self.other = {1:2, 3:4}
Raymond Hettinger6a180122003-08-17 08:34:09 +0000627 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000628
629#------------------------------------------------------------------------------
630
631class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
632 def setUp(self):
633 self.set = Set((1, 2, 3))
634 self.other = operator.add
Raymond Hettinger6a180122003-08-17 08:34:09 +0000635 self.otherIsIterable = False
636
637#------------------------------------------------------------------------------
638
639class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
640 def setUp(self):
641 self.set = Set((1, 2, 3))
642 self.other = (2, 4, 6)
643 self.otherIsIterable = True
644
645#------------------------------------------------------------------------------
646
647class TestOnlySetsString(TestOnlySetsInBinaryOps):
648 def setUp(self):
649 self.set = Set((1, 2, 3))
650 self.other = 'abc'
651 self.otherIsIterable = True
652
653#------------------------------------------------------------------------------
654
655class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
656 def setUp(self):
657 def gen():
658 for i in xrange(0, 10, 2):
659 yield i
660 self.set = Set((1, 2, 3))
661 self.other = gen()
662 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000663
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000664#------------------------------------------------------------------------------
665
666class TestOnlySetsofSets(TestOnlySetsInBinaryOps):
667 def setUp(self):
668 self.set = Set((1, 2, 3))
669 self.other = [Set('ab'), ImmutableSet('cd')]
670 self.otherIsIterable = True
671
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000672#==============================================================================
673
674class TestCopying(unittest.TestCase):
675
676 def test_copy(self):
677 dup = self.set.copy()
678 dup_list = list(dup); dup_list.sort()
679 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000680 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000681 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000682 self.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000683
684 def test_deep_copy(self):
685 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000686 ##print type(dup), repr(dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000687 dup_list = list(dup); dup_list.sort()
688 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000689 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000690 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000691 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000692
693#------------------------------------------------------------------------------
694
695class TestCopyingEmpty(TestCopying):
696 def setUp(self):
697 self.set = Set()
698
699#------------------------------------------------------------------------------
700
701class TestCopyingSingleton(TestCopying):
702 def setUp(self):
703 self.set = Set(["hello"])
704
705#------------------------------------------------------------------------------
706
707class TestCopyingTriple(TestCopying):
708 def setUp(self):
709 self.set = Set(["zero", 0, None])
710
711#------------------------------------------------------------------------------
712
713class TestCopyingTuple(TestCopying):
714 def setUp(self):
715 self.set = Set([(1, 2)])
716
717#------------------------------------------------------------------------------
718
719class TestCopyingNested(TestCopying):
720 def setUp(self):
721 self.set = Set([((1, 2), (3, 4))])
722
723#==============================================================================
724
Raymond Hettinger6a180122003-08-17 08:34:09 +0000725class TestIdentities(unittest.TestCase):
726 def setUp(self):
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000727 self.a = Set([random.randrange(100) for i in xrange(50)])
728 self.b = Set([random.randrange(100) for i in xrange(50)])
Raymond Hettinger6a180122003-08-17 08:34:09 +0000729
730 def test_binopsVsSubsets(self):
731 a, b = self.a, self.b
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000732 self.assert_(a - b <= a)
733 self.assert_(b - a <= b)
734 self.assert_(a & b <= a)
735 self.assert_(a & b <= b)
736 self.assert_(a | b >= a)
737 self.assert_(a | b >= b)
738 self.assert_(a ^ b <= a | b)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000739
740 def test_commutativity(self):
741 a, b = self.a, self.b
742 self.assertEqual(a&b, b&a)
743 self.assertEqual(a|b, b|a)
744 self.assertEqual(a^b, b^a)
745 if a != b:
746 self.assertNotEqual(a-b, b-a)
747
Raymond Hettinger3778f402003-09-24 03:56:07 +0000748 def test_reflexsive_relations(self):
749 a, zero = self.a, Set()
750 self.assertEqual(a ^ a, zero)
751 self.assertEqual(a - a, zero)
752 self.assertEqual(a | a, a)
753 self.assertEqual(a & a, a)
754 self.assert_(a <= a)
755 self.assert_(a >= a)
756 self.assert_(a == a)
757
Raymond Hettinger6a180122003-08-17 08:34:09 +0000758 def test_summations(self):
759 # check that sums of parts equal the whole
760 a, b = self.a, self.b
761 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
762 self.assertEqual((a&b)|(a^b), a|b)
763 self.assertEqual(a|(b-a), a|b)
764 self.assertEqual((a-b)|b, a|b)
765 self.assertEqual((a-b)|(a&b), a)
766 self.assertEqual((b-a)|(a&b), b)
767 self.assertEqual((a-b)|(b-a), a^b)
768
769 def test_exclusion(self):
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000770 # check that inverse operations do not overlap
Raymond Hettinger6a180122003-08-17 08:34:09 +0000771 a, b, zero = self.a, self.b, Set()
772 self.assertEqual((a-b)&b, zero)
773 self.assertEqual((b-a)&a, zero)
774 self.assertEqual((a&b)&(a^b), zero)
775
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000776 def test_cardinality_relations(self):
777 a, b = self.a, self.b
778 self.assertEqual(len(a), len(a-b) + len(a&b))
779 self.assertEqual(len(b), len(b-a) + len(a&b))
780 self.assertEqual(len(a^b), len(a-b) + len(b-a))
781 self.assertEqual(len(a|b), len(a-b) + len(a&b) + len(b-a))
Raymond Hettinger3778f402003-09-24 03:56:07 +0000782 self.assertEqual(len(a^b) + len(a&b), len(a|b))
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000783
Raymond Hettinger6a180122003-08-17 08:34:09 +0000784#==============================================================================
785
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000786libreftest = """
787Example from the Library Reference: Doc/lib/libsets.tex
788
Tim Peters3ba491e2003-03-01 23:33:34 +0000789>>> from sets import Set as Base # override _repr to get sorted output
790>>> class Set(Base):
791... def _repr(self):
792... return Base._repr(self, sorted=True)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000793>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
794>>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
Raymond Hettinger19540352003-08-16 00:59:59 +0000795>>> managers = Set(['Jane', 'Jack', 'Susan', 'Zack'])
796>>> employees = engineers | programmers | managers # union
797>>> engineering_management = engineers & managers # intersection
798>>> fulltime_management = managers - engineers - programmers # difference
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000799>>> engineers.add('Marvin')
800>>> print engineers
Tim Peters3ba491e2003-03-01 23:33:34 +0000801Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000802>>> employees.issuperset(engineers) # superset test
803False
Raymond Hettinger6a180122003-08-17 08:34:09 +0000804>>> employees.union_update(engineers) # update from another set
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000805>>> employees.issuperset(engineers)
806True
Raymond Hettinger19540352003-08-16 00:59:59 +0000807>>> for group in [engineers, programmers, managers, employees]:
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000808... group.discard('Susan') # unconditionally remove element
809... print group
810...
Tim Peters3ba491e2003-03-01 23:33:34 +0000811Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
812Set(['Jack', 'Janice', 'Sam'])
813Set(['Jack', 'Jane', 'Zack'])
814Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin', 'Sam', 'Zack'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000815"""
816
817#==============================================================================
818
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000819__test__ = {'libreftest' : libreftest}
820
821def test_main(verbose=None):
Raymond Hettinger654fcd52004-08-07 06:15:12 +0000822 import test_sets, doctest
Walter Dörwald21d3a322003-05-01 17:45:56 +0000823 test_support.run_unittest(
824 TestSetOfSets,
825 TestExceptionPropagation,
826 TestBasicOpsEmpty,
827 TestBasicOpsSingleton,
828 TestBasicOpsTuple,
829 TestBasicOpsTriple,
830 TestBinaryOps,
831 TestUpdateOps,
832 TestMutate,
833 TestSubsetEqualEmpty,
834 TestSubsetEqualNonEmpty,
835 TestSubsetEmptyNonEmpty,
836 TestSubsetPartial,
837 TestSubsetNonOverlap,
838 TestOnlySetsNumeric,
839 TestOnlySetsDict,
840 TestOnlySetsOperator,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000841 TestOnlySetsTuple,
842 TestOnlySetsString,
843 TestOnlySetsGenerator,
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000844 TestOnlySetsofSets,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000845 TestCopyingEmpty,
846 TestCopyingSingleton,
847 TestCopyingTriple,
848 TestCopyingTuple,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000849 TestCopyingNested,
850 TestIdentities,
Raymond Hettinger654fcd52004-08-07 06:15:12 +0000851 doctest.DocTestSuite(test_sets),
Walter Dörwald21d3a322003-05-01 17:45:56 +0000852 )
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000853
854if __name__ == "__main__":
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000855 test_main(verbose=True)