blob: 0a899081f2a5c59eff7f36bd57970070705f8e21 [file] [log] [blame]
Raymond Hettinger175a6ac2003-09-21 08:14:11 +00001import unittest, operator, copy, pickle, random
Guido van Rossumd6cf3af2002-08-19 16:19:15 +00002from test import test_support
3
Florent Xicluna07627882010-03-21 01:14:24 +00004test_support.import_module("sets", deprecated=True)
5from sets import Set, ImmutableSet
6
Guido van Rossumd6cf3af2002-08-19 16:19:15 +00007empty_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:
Ezio Melottiaa980582010-01-23 23:04:36 +000075 self.assertIn(v, self.values)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000076
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000077 def test_pickling(self):
Serhiy Storchaka655720e2014-12-15 14:02:43 +020078 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
79 p = pickle.dumps(self.set, proto)
80 copy = pickle.loads(p)
81 self.assertEqual(self.set, copy,
82 "%s != %s" % (self.set, copy))
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000083
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000084#------------------------------------------------------------------------------
85
86class TestBasicOpsEmpty(TestBasicOps):
87 def setUp(self):
88 self.case = "empty set"
89 self.values = []
90 self.set = Set(self.values)
91 self.dup = Set(self.values)
92 self.length = 0
93 self.repr = "Set([])"
94
95#------------------------------------------------------------------------------
96
97class TestBasicOpsSingleton(TestBasicOps):
98 def setUp(self):
99 self.case = "unit set (number)"
100 self.values = [3]
101 self.set = Set(self.values)
102 self.dup = Set(self.values)
103 self.length = 1
104 self.repr = "Set([3])"
105
106 def test_in(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000107 self.assertTrue(3 in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000108
109 def test_not_in(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000110 self.assertTrue(2 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000111
112#------------------------------------------------------------------------------
113
114class TestBasicOpsTuple(TestBasicOps):
115 def setUp(self):
116 self.case = "unit set (tuple)"
117 self.values = [(0, "zero")]
118 self.set = Set(self.values)
119 self.dup = Set(self.values)
120 self.length = 1
121 self.repr = "Set([(0, 'zero')])"
122
123 def test_in(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000124 self.assertTrue((0, "zero") in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000125
126 def test_not_in(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000127 self.assertTrue(9 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000128
129#------------------------------------------------------------------------------
130
131class TestBasicOpsTriple(TestBasicOps):
132 def setUp(self):
133 self.case = "triple set"
134 self.values = [0, "zero", operator.add]
135 self.set = Set(self.values)
136 self.dup = Set(self.values)
137 self.length = 3
138 self.repr = None
139
140#==============================================================================
141
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000142def baditer():
143 raise TypeError
144 yield True
145
146def gooditer():
147 yield True
148
149class TestExceptionPropagation(unittest.TestCase):
150 """SF 628246: Set constructor should not trap iterator TypeErrors"""
151
152 def test_instanceWithException(self):
153 self.assertRaises(TypeError, Set, baditer())
154
155 def test_instancesWithoutException(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000156 # All of these iterables should load without exception.
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000157 Set([1,2,3])
158 Set((1,2,3))
159 Set({'one':1, 'two':2, 'three':3})
160 Set(xrange(3))
161 Set('abc')
162 Set(gooditer())
163
164#==============================================================================
165
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000166class TestSetOfSets(unittest.TestCase):
167 def test_constructor(self):
168 inner = Set([1])
169 outer = Set([inner])
170 element = outer.pop()
Tim Peters4127e912002-08-25 18:02:29 +0000171 self.assertEqual(type(element), ImmutableSet)
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000172 outer.add(inner) # Rebuild set of sets with .add method
173 outer.remove(inner)
Tim Peters4127e912002-08-25 18:02:29 +0000174 self.assertEqual(outer, Set()) # Verify that remove worked
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000175 outer.discard(inner) # Absence of KeyError indicates working fine
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000176
177#==============================================================================
178
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000179class TestBinaryOps(unittest.TestCase):
180 def setUp(self):
181 self.set = Set((2, 4, 6))
182
Raymond Hettinger35e48d22002-11-25 20:43:55 +0000183 def test_eq(self): # SF bug 643115
184 self.assertEqual(self.set, Set({2:1,4:3,6:5}))
185
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000186 def test_union_subset(self):
187 result = self.set | Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000188 self.assertEqual(result, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000189
190 def test_union_superset(self):
191 result = self.set | Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000192 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000193
194 def test_union_overlap(self):
195 result = self.set | Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000196 self.assertEqual(result, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000197
198 def test_union_non_overlap(self):
199 result = self.set | Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000200 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000201
202 def test_intersection_subset(self):
203 result = self.set & Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000204 self.assertEqual(result, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000205
206 def test_intersection_superset(self):
207 result = self.set & Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000208 self.assertEqual(result, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000209
210 def test_intersection_overlap(self):
211 result = self.set & Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000212 self.assertEqual(result, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000213
214 def test_intersection_non_overlap(self):
215 result = self.set & Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000216 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000217
218 def test_sym_difference_subset(self):
219 result = self.set ^ Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000220 self.assertEqual(result, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000221
222 def test_sym_difference_superset(self):
223 result = self.set ^ Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000224 self.assertEqual(result, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000225
226 def test_sym_difference_overlap(self):
227 result = self.set ^ Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000228 self.assertEqual(result, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000229
230 def test_sym_difference_non_overlap(self):
231 result = self.set ^ Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000232 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000233
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000234 def test_cmp(self):
235 a, b = Set('a'), Set('b')
Tim Peters44f14b02003-03-02 00:19:49 +0000236 self.assertRaises(TypeError, cmp, a, b)
237
238 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000239 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
Tim Peters44f14b02003-03-02 00:19:49 +0000240 # which Python thinks is good enough to synthesize a cmp() result
241 # without calling __cmp__.
242 self.assertEqual(cmp(a, a), 0)
243
244 self.assertRaises(TypeError, cmp, a, 12)
245 self.assertRaises(TypeError, cmp, "abc", a)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000246
Raymond Hettinger038ca2a2005-08-13 02:29:58 +0000247 def test_inplace_on_self(self):
248 t = self.set.copy()
249 t |= t
250 self.assertEqual(t, self.set)
251 t &= t
252 self.assertEqual(t, self.set)
253 t -= t
254 self.assertEqual(len(t), 0)
255 t = self.set.copy()
256 t ^= t
257 self.assertEqual(len(t), 0)
258
259
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000260#==============================================================================
261
262class TestUpdateOps(unittest.TestCase):
263 def setUp(self):
264 self.set = Set((2, 4, 6))
265
266 def test_union_subset(self):
267 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000268 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000269
270 def test_union_superset(self):
271 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000272 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000273
274 def test_union_overlap(self):
275 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000276 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000277
278 def test_union_non_overlap(self):
279 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000280 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000281
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000282 def test_union_method_call(self):
283 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000284 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000285
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000286 def test_intersection_subset(self):
287 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000288 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000289
290 def test_intersection_superset(self):
291 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000292 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000293
294 def test_intersection_overlap(self):
295 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000296 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000297
298 def test_intersection_non_overlap(self):
299 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000300 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000301
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000302 def test_intersection_method_call(self):
303 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000304 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000305
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000306 def test_sym_difference_subset(self):
307 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000308 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000309
310 def test_sym_difference_superset(self):
311 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000312 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000313
314 def test_sym_difference_overlap(self):
315 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000316 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000317
318 def test_sym_difference_non_overlap(self):
319 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000320 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000321
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000322 def test_sym_difference_method_call(self):
323 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000324 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000325
326 def test_difference_subset(self):
327 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000328 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000329
330 def test_difference_superset(self):
331 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000332 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000333
334 def test_difference_overlap(self):
335 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000336 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000337
338 def test_difference_non_overlap(self):
339 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000340 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000341
342 def test_difference_method_call(self):
343 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000344 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000345
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000346#==============================================================================
347
348class TestMutate(unittest.TestCase):
349 def setUp(self):
350 self.values = ["a", "b", "c"]
351 self.set = Set(self.values)
352
353 def test_add_present(self):
354 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000355 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000356
357 def test_add_absent(self):
358 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000359 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000360
361 def test_add_until_full(self):
362 tmp = Set()
363 expected_len = 0
364 for v in self.values:
365 tmp.add(v)
366 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000367 self.assertEqual(len(tmp), expected_len)
368 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000369
370 def test_remove_present(self):
371 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000372 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000373
374 def test_remove_absent(self):
375 try:
376 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000377 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000378 except LookupError:
379 pass
380
381 def test_remove_until_empty(self):
382 expected_len = len(self.set)
383 for v in self.values:
384 self.set.remove(v)
385 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000386 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000387
388 def test_discard_present(self):
389 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000390 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000391
392 def test_discard_absent(self):
393 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000394 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000395
396 def test_clear(self):
397 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000398 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000399
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000400 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000401 popped = {}
402 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000403 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000404 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000405 for v in self.values:
Ezio Melottiaa980582010-01-23 23:04:36 +0000406 self.assertIn(v, popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000407
408 def test_update_empty_tuple(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000409 self.set.union_update(())
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_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000413 self.set.union_update(("a",))
Tim Petersa7777992002-08-25 17:38:49 +0000414 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000415
416 def test_update_unit_tuple_non_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000417 self.set.union_update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000418 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000419
420#==============================================================================
421
422class TestSubsets(unittest.TestCase):
423
Tim Peters93d8d482002-08-25 18:21:47 +0000424 case2method = {"<=": "issubset",
425 ">=": "issuperset",
426 }
Tim Petersea76c982002-08-25 18:43:10 +0000427
428 reverse = {"==": "==",
429 "!=": "!=",
430 "<": ">",
431 ">": "<",
432 "<=": ">=",
433 ">=": "<=",
434 }
Tim Peters93d8d482002-08-25 18:21:47 +0000435
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000436 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000437 x = self.left
438 y = self.right
439 for case in "!=", "==", "<", "<=", ">", ">=":
440 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000441 # Test the binary infix spelling.
442 result = eval("x" + case + "y", locals())
443 self.assertEqual(result, expected)
444 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000445 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000446 method = getattr(x, TestSubsets.case2method[case])
447 result = method(y)
448 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000449
Tim Petersea76c982002-08-25 18:43:10 +0000450 # Now do the same for the operands reversed.
451 rcase = TestSubsets.reverse[case]
452 result = eval("y" + rcase + "x", locals())
453 self.assertEqual(result, expected)
454 if rcase in TestSubsets.case2method:
455 method = getattr(y, TestSubsets.case2method[rcase])
456 result = method(x)
457 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000458#------------------------------------------------------------------------------
459
460class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000461 left = Set()
462 right = Set()
463 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000464 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000465
466#------------------------------------------------------------------------------
467
468class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000469 left = Set([1, 2])
470 right = Set([1, 2])
471 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000472 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000473
474#------------------------------------------------------------------------------
475
476class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000477 left = Set()
478 right = Set([1, 2])
479 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000480 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000481
482#------------------------------------------------------------------------------
483
484class TestSubsetPartial(TestSubsets):
Tim Peters3de75262002-11-09 05:26:15 +0000485 left = Set([1])
486 right = Set([1, 2])
487 name = "one a non-empty proper subset of other"
488 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000489
490#------------------------------------------------------------------------------
491
492class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000493 left = Set([1])
494 right = Set([2])
495 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000496 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000497
498#==============================================================================
499
500class TestOnlySetsInBinaryOps(unittest.TestCase):
501
Tim Peters44f14b02003-03-02 00:19:49 +0000502 def test_eq_ne(self):
503 # Unlike the others, this is testing that == and != *are* allowed.
504 self.assertEqual(self.other == self.set, False)
505 self.assertEqual(self.set == self.other, False)
506 self.assertEqual(self.other != self.set, True)
507 self.assertEqual(self.set != self.other, True)
508
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000509 def test_ge_gt_le_lt(self):
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000510 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)
513 self.assertRaises(TypeError, lambda: self.set >= self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000514
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000515 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 self.assertRaises(TypeError, lambda: self.other >= self.set)
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000519
Raymond Hettinger6a180122003-08-17 08:34:09 +0000520 def test_union_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000521 try:
522 self.set |= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000523 except TypeError:
524 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000525 else:
526 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000527
Raymond Hettinger6a180122003-08-17 08:34:09 +0000528 def test_union_update(self):
529 if self.otherIsIterable:
530 self.set.union_update(self.other)
531 else:
532 self.assertRaises(TypeError, self.set.union_update, self.other)
533
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000534 def test_union(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000535 self.assertRaises(TypeError, lambda: self.set | self.other)
536 self.assertRaises(TypeError, lambda: self.other | self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000537 if self.otherIsIterable:
538 self.set.union(self.other)
539 else:
540 self.assertRaises(TypeError, self.set.union, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000541
Raymond Hettinger6a180122003-08-17 08:34:09 +0000542 def test_intersection_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000543 try:
544 self.set &= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000545 except TypeError:
546 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000547 else:
548 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000549
Raymond Hettinger6a180122003-08-17 08:34:09 +0000550 def test_intersection_update(self):
551 if self.otherIsIterable:
552 self.set.intersection_update(self.other)
553 else:
554 self.assertRaises(TypeError,
555 self.set.intersection_update,
556 self.other)
557
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000558 def test_intersection(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000559 self.assertRaises(TypeError, lambda: self.set & self.other)
560 self.assertRaises(TypeError, lambda: self.other & self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000561 if self.otherIsIterable:
562 self.set.intersection(self.other)
563 else:
564 self.assertRaises(TypeError, self.set.intersection, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000565
Raymond Hettinger6a180122003-08-17 08:34:09 +0000566 def test_sym_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000567 try:
568 self.set ^= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000569 except TypeError:
570 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000571 else:
572 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000573
Raymond Hettinger6a180122003-08-17 08:34:09 +0000574 def test_sym_difference_update(self):
575 if self.otherIsIterable:
576 self.set.symmetric_difference_update(self.other)
577 else:
578 self.assertRaises(TypeError,
579 self.set.symmetric_difference_update,
580 self.other)
581
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000582 def test_sym_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000583 self.assertRaises(TypeError, lambda: self.set ^ self.other)
584 self.assertRaises(TypeError, lambda: self.other ^ self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000585 if self.otherIsIterable:
586 self.set.symmetric_difference(self.other)
587 else:
588 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000589
Raymond Hettinger6a180122003-08-17 08:34:09 +0000590 def test_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000591 try:
592 self.set -= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000593 except TypeError:
594 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000595 else:
596 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000597
Raymond Hettinger6a180122003-08-17 08:34:09 +0000598 def test_difference_update(self):
599 if self.otherIsIterable:
600 self.set.difference_update(self.other)
601 else:
602 self.assertRaises(TypeError,
603 self.set.difference_update,
604 self.other)
605
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000606 def test_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000607 self.assertRaises(TypeError, lambda: self.set - self.other)
608 self.assertRaises(TypeError, lambda: self.other - self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000609 if self.otherIsIterable:
610 self.set.difference(self.other)
611 else:
612 self.assertRaises(TypeError, self.set.difference, self.other)
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000613
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000614#------------------------------------------------------------------------------
615
616class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
617 def setUp(self):
618 self.set = Set((1, 2, 3))
619 self.other = 19
Raymond Hettinger6a180122003-08-17 08:34:09 +0000620 self.otherIsIterable = False
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000621
622#------------------------------------------------------------------------------
623
624class TestOnlySetsDict(TestOnlySetsInBinaryOps):
625 def setUp(self):
626 self.set = Set((1, 2, 3))
627 self.other = {1:2, 3:4}
Raymond Hettinger6a180122003-08-17 08:34:09 +0000628 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000629
630#------------------------------------------------------------------------------
631
632class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
633 def setUp(self):
634 self.set = Set((1, 2, 3))
635 self.other = operator.add
Raymond Hettinger6a180122003-08-17 08:34:09 +0000636 self.otherIsIterable = False
637
Florent Xicluna07627882010-03-21 01:14:24 +0000638 def test_ge_gt_le_lt(self):
639 with test_support.check_py3k_warnings():
640 super(TestOnlySetsOperator, self).test_ge_gt_le_lt()
641
Raymond Hettinger6a180122003-08-17 08:34:09 +0000642#------------------------------------------------------------------------------
643
644class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
645 def setUp(self):
646 self.set = Set((1, 2, 3))
647 self.other = (2, 4, 6)
648 self.otherIsIterable = True
649
650#------------------------------------------------------------------------------
651
652class TestOnlySetsString(TestOnlySetsInBinaryOps):
653 def setUp(self):
654 self.set = Set((1, 2, 3))
655 self.other = 'abc'
656 self.otherIsIterable = True
657
658#------------------------------------------------------------------------------
659
660class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
661 def setUp(self):
662 def gen():
663 for i in xrange(0, 10, 2):
664 yield i
665 self.set = Set((1, 2, 3))
666 self.other = gen()
667 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000668
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000669#------------------------------------------------------------------------------
670
671class TestOnlySetsofSets(TestOnlySetsInBinaryOps):
672 def setUp(self):
673 self.set = Set((1, 2, 3))
674 self.other = [Set('ab'), ImmutableSet('cd')]
675 self.otherIsIterable = True
676
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000677#==============================================================================
678
679class TestCopying(unittest.TestCase):
680
681 def test_copy(self):
682 dup = self.set.copy()
Florent Xicluna07627882010-03-21 01:14:24 +0000683 self.assertEqual(len(dup), len(self.set))
684 dup_list = sorted(dup)
685 set_list = sorted(self.set)
Tim Peters4127e912002-08-25 18:02:29 +0000686 self.assertEqual(len(dup_list), len(set_list))
Florent Xicluna07627882010-03-21 01:14:24 +0000687 for i, el in enumerate(dup_list):
688 self.assertIs(el, set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000689
690 def test_deep_copy(self):
691 dup = copy.deepcopy(self.set)
Florent Xicluna07627882010-03-21 01:14:24 +0000692 self.assertSetEqual(dup, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000693
694#------------------------------------------------------------------------------
695
696class TestCopyingEmpty(TestCopying):
697 def setUp(self):
698 self.set = Set()
699
700#------------------------------------------------------------------------------
701
702class TestCopyingSingleton(TestCopying):
703 def setUp(self):
704 self.set = Set(["hello"])
705
706#------------------------------------------------------------------------------
707
708class TestCopyingTriple(TestCopying):
709 def setUp(self):
710 self.set = Set(["zero", 0, None])
711
Florent Xicluna07627882010-03-21 01:14:24 +0000712 def test_copy(self):
713 with test_support.check_py3k_warnings():
714 super(TestCopyingTriple, self).test_copy()
715
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000716#------------------------------------------------------------------------------
717
718class TestCopyingTuple(TestCopying):
719 def setUp(self):
720 self.set = Set([(1, 2)])
721
722#------------------------------------------------------------------------------
723
724class TestCopyingNested(TestCopying):
725 def setUp(self):
726 self.set = Set([((1, 2), (3, 4))])
727
728#==============================================================================
729
Raymond Hettinger6a180122003-08-17 08:34:09 +0000730class TestIdentities(unittest.TestCase):
731 def setUp(self):
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000732 self.a = Set([random.randrange(100) for i in xrange(50)])
733 self.b = Set([random.randrange(100) for i in xrange(50)])
Raymond Hettinger6a180122003-08-17 08:34:09 +0000734
735 def test_binopsVsSubsets(self):
736 a, b = self.a, self.b
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000737 self.assertTrue(a - b <= a)
738 self.assertTrue(b - a <= b)
739 self.assertTrue(a & b <= a)
740 self.assertTrue(a & b <= b)
741 self.assertTrue(a | b >= a)
742 self.assertTrue(a | b >= b)
743 self.assertTrue(a ^ b <= a | b)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000744
745 def test_commutativity(self):
746 a, b = self.a, self.b
747 self.assertEqual(a&b, b&a)
748 self.assertEqual(a|b, b|a)
749 self.assertEqual(a^b, b^a)
750 if a != b:
751 self.assertNotEqual(a-b, b-a)
752
Raymond Hettinger3778f402003-09-24 03:56:07 +0000753 def test_reflexsive_relations(self):
754 a, zero = self.a, Set()
755 self.assertEqual(a ^ a, zero)
756 self.assertEqual(a - a, zero)
757 self.assertEqual(a | a, a)
758 self.assertEqual(a & a, a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000759 self.assertTrue(a <= a)
760 self.assertTrue(a >= a)
761 self.assertTrue(a == a)
Raymond Hettinger3778f402003-09-24 03:56:07 +0000762
Raymond Hettinger6a180122003-08-17 08:34:09 +0000763 def test_summations(self):
764 # check that sums of parts equal the whole
765 a, b = self.a, self.b
766 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
767 self.assertEqual((a&b)|(a^b), a|b)
768 self.assertEqual(a|(b-a), a|b)
769 self.assertEqual((a-b)|b, a|b)
770 self.assertEqual((a-b)|(a&b), a)
771 self.assertEqual((b-a)|(a&b), b)
772 self.assertEqual((a-b)|(b-a), a^b)
773
774 def test_exclusion(self):
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000775 # check that inverse operations do not overlap
Raymond Hettinger6a180122003-08-17 08:34:09 +0000776 a, b, zero = self.a, self.b, Set()
777 self.assertEqual((a-b)&b, zero)
778 self.assertEqual((b-a)&a, zero)
779 self.assertEqual((a&b)&(a^b), zero)
780
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000781 def test_cardinality_relations(self):
782 a, b = self.a, self.b
783 self.assertEqual(len(a), len(a-b) + len(a&b))
784 self.assertEqual(len(b), len(b-a) + len(a&b))
785 self.assertEqual(len(a^b), len(a-b) + len(b-a))
786 self.assertEqual(len(a|b), len(a-b) + len(a&b) + len(b-a))
Raymond Hettinger3778f402003-09-24 03:56:07 +0000787 self.assertEqual(len(a^b) + len(a&b), len(a|b))
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000788
Raymond Hettinger6a180122003-08-17 08:34:09 +0000789#==============================================================================
790
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000791libreftest = """
792Example from the Library Reference: Doc/lib/libsets.tex
793
Tim Peters3ba491e2003-03-01 23:33:34 +0000794>>> from sets import Set as Base # override _repr to get sorted output
795>>> class Set(Base):
796... def _repr(self):
797... return Base._repr(self, sorted=True)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000798>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
799>>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
Raymond Hettinger19540352003-08-16 00:59:59 +0000800>>> managers = Set(['Jane', 'Jack', 'Susan', 'Zack'])
801>>> employees = engineers | programmers | managers # union
802>>> engineering_management = engineers & managers # intersection
803>>> fulltime_management = managers - engineers - programmers # difference
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000804>>> engineers.add('Marvin')
805>>> print engineers
Tim Peters3ba491e2003-03-01 23:33:34 +0000806Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000807>>> employees.issuperset(engineers) # superset test
808False
Raymond Hettinger6a180122003-08-17 08:34:09 +0000809>>> employees.union_update(engineers) # update from another set
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000810>>> employees.issuperset(engineers)
811True
Raymond Hettinger19540352003-08-16 00:59:59 +0000812>>> for group in [engineers, programmers, managers, employees]:
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000813... group.discard('Susan') # unconditionally remove element
814... print group
815...
Tim Peters3ba491e2003-03-01 23:33:34 +0000816Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
817Set(['Jack', 'Janice', 'Sam'])
818Set(['Jack', 'Jane', 'Zack'])
819Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin', 'Sam', 'Zack'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000820"""
821
822#==============================================================================
823
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000824__test__ = {'libreftest' : libreftest}
825
826def test_main(verbose=None):
Neal Norwitzb902f4e2006-04-03 04:45:34 +0000827 import doctest
828 from test import test_sets
Walter Dörwald21d3a322003-05-01 17:45:56 +0000829 test_support.run_unittest(
830 TestSetOfSets,
831 TestExceptionPropagation,
832 TestBasicOpsEmpty,
833 TestBasicOpsSingleton,
834 TestBasicOpsTuple,
835 TestBasicOpsTriple,
836 TestBinaryOps,
837 TestUpdateOps,
838 TestMutate,
839 TestSubsetEqualEmpty,
840 TestSubsetEqualNonEmpty,
841 TestSubsetEmptyNonEmpty,
842 TestSubsetPartial,
843 TestSubsetNonOverlap,
844 TestOnlySetsNumeric,
845 TestOnlySetsDict,
846 TestOnlySetsOperator,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000847 TestOnlySetsTuple,
848 TestOnlySetsString,
849 TestOnlySetsGenerator,
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000850 TestOnlySetsofSets,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000851 TestCopyingEmpty,
852 TestCopyingSingleton,
853 TestCopyingTriple,
854 TestCopyingTuple,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000855 TestCopyingNested,
856 TestIdentities,
Raymond Hettinger654fcd52004-08-07 06:15:12 +0000857 doctest.DocTestSuite(test_sets),
Walter Dörwald21d3a322003-05-01 17:45:56 +0000858 )
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000859
860if __name__ == "__main__":
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000861 test_main(verbose=True)