blob: 0754ed74fc7b86671d27dd4fd8f61ea539ba0cb8 [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 test import test_support
5
Florent Xicluna07627882010-03-21 01:14:24 +00006test_support.import_module("sets", deprecated=True)
7from sets import Set, ImmutableSet
8
Guido van Rossumd6cf3af2002-08-19 16:19:15 +00009empty_set = Set()
10
11#==============================================================================
12
13class TestBasicOps(unittest.TestCase):
14
15 def test_repr(self):
16 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +000017 self.assertEqual(repr(self.set), self.repr)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000018
19 def test_length(self):
Tim Petersa7777992002-08-25 17:38:49 +000020 self.assertEqual(len(self.set), self.length)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000021
22 def test_self_equality(self):
Tim Petersa7777992002-08-25 17:38:49 +000023 self.assertEqual(self.set, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000024
25 def test_equivalent_equality(self):
Tim Petersa7777992002-08-25 17:38:49 +000026 self.assertEqual(self.set, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000027
28 def test_copy(self):
Tim Petersa7777992002-08-25 17:38:49 +000029 self.assertEqual(self.set.copy(), self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000030
31 def test_self_union(self):
32 result = self.set | self.set
Tim Petersa7777992002-08-25 17:38:49 +000033 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000034
35 def test_empty_union(self):
36 result = self.set | empty_set
Tim Petersa7777992002-08-25 17:38:49 +000037 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000038
39 def test_union_empty(self):
40 result = empty_set | self.set
Tim Petersa7777992002-08-25 17:38:49 +000041 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000042
43 def test_self_intersection(self):
44 result = self.set & self.set
Tim Petersa7777992002-08-25 17:38:49 +000045 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000046
47 def test_empty_intersection(self):
48 result = self.set & empty_set
Tim Petersa7777992002-08-25 17:38:49 +000049 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000050
51 def test_intersection_empty(self):
52 result = empty_set & self.set
Tim Petersa7777992002-08-25 17:38:49 +000053 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000054
55 def test_self_symmetric_difference(self):
56 result = self.set ^ self.set
Tim Petersa7777992002-08-25 17:38:49 +000057 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000058
59 def checkempty_symmetric_difference(self):
60 result = self.set ^ empty_set
Tim Petersa7777992002-08-25 17:38:49 +000061 self.assertEqual(result, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000062
63 def test_self_difference(self):
64 result = self.set - self.set
Tim Petersa7777992002-08-25 17:38:49 +000065 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000066
67 def test_empty_difference(self):
68 result = self.set - empty_set
Tim Petersa7777992002-08-25 17:38:49 +000069 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000070
71 def test_empty_difference_rev(self):
72 result = empty_set - self.set
Tim Petersa7777992002-08-25 17:38:49 +000073 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000074
75 def test_iteration(self):
76 for v in self.set:
Ezio Melottiaa980582010-01-23 23:04:36 +000077 self.assertIn(v, self.values)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000078
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000079 def test_pickling(self):
80 p = pickle.dumps(self.set)
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000081 copy = pickle.loads(p)
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000082 self.assertEqual(self.set, copy,
83 "%s != %s" % (self.set, copy))
84
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000085#------------------------------------------------------------------------------
86
87class TestBasicOpsEmpty(TestBasicOps):
88 def setUp(self):
89 self.case = "empty set"
90 self.values = []
91 self.set = Set(self.values)
92 self.dup = Set(self.values)
93 self.length = 0
94 self.repr = "Set([])"
95
96#------------------------------------------------------------------------------
97
98class TestBasicOpsSingleton(TestBasicOps):
99 def setUp(self):
100 self.case = "unit set (number)"
101 self.values = [3]
102 self.set = Set(self.values)
103 self.dup = Set(self.values)
104 self.length = 1
105 self.repr = "Set([3])"
106
107 def test_in(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000108 self.assertTrue(3 in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000109
110 def test_not_in(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000111 self.assertTrue(2 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000112
113#------------------------------------------------------------------------------
114
115class TestBasicOpsTuple(TestBasicOps):
116 def setUp(self):
117 self.case = "unit set (tuple)"
118 self.values = [(0, "zero")]
119 self.set = Set(self.values)
120 self.dup = Set(self.values)
121 self.length = 1
122 self.repr = "Set([(0, 'zero')])"
123
124 def test_in(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000125 self.assertTrue((0, "zero") in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000126
127 def test_not_in(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000128 self.assertTrue(9 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000129
130#------------------------------------------------------------------------------
131
132class TestBasicOpsTriple(TestBasicOps):
133 def setUp(self):
134 self.case = "triple set"
135 self.values = [0, "zero", operator.add]
136 self.set = Set(self.values)
137 self.dup = Set(self.values)
138 self.length = 3
139 self.repr = None
140
141#==============================================================================
142
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000143def baditer():
144 raise TypeError
145 yield True
146
147def gooditer():
148 yield True
149
150class TestExceptionPropagation(unittest.TestCase):
151 """SF 628246: Set constructor should not trap iterator TypeErrors"""
152
153 def test_instanceWithException(self):
154 self.assertRaises(TypeError, Set, baditer())
155
156 def test_instancesWithoutException(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000157 # All of these iterables should load without exception.
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000158 Set([1,2,3])
159 Set((1,2,3))
160 Set({'one':1, 'two':2, 'three':3})
161 Set(xrange(3))
162 Set('abc')
163 Set(gooditer())
164
165#==============================================================================
166
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000167class TestSetOfSets(unittest.TestCase):
168 def test_constructor(self):
169 inner = Set([1])
170 outer = Set([inner])
171 element = outer.pop()
Tim Peters4127e912002-08-25 18:02:29 +0000172 self.assertEqual(type(element), ImmutableSet)
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000173 outer.add(inner) # Rebuild set of sets with .add method
174 outer.remove(inner)
Tim Peters4127e912002-08-25 18:02:29 +0000175 self.assertEqual(outer, Set()) # Verify that remove worked
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000176 outer.discard(inner) # Absence of KeyError indicates working fine
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000177
178#==============================================================================
179
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000180class TestBinaryOps(unittest.TestCase):
181 def setUp(self):
182 self.set = Set((2, 4, 6))
183
Raymond Hettinger35e48d22002-11-25 20:43:55 +0000184 def test_eq(self): # SF bug 643115
185 self.assertEqual(self.set, Set({2:1,4:3,6:5}))
186
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000187 def test_union_subset(self):
188 result = self.set | Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000189 self.assertEqual(result, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000190
191 def test_union_superset(self):
192 result = self.set | Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000193 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000194
195 def test_union_overlap(self):
196 result = self.set | Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000197 self.assertEqual(result, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000198
199 def test_union_non_overlap(self):
200 result = self.set | Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000201 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000202
203 def test_intersection_subset(self):
204 result = self.set & Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000205 self.assertEqual(result, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000206
207 def test_intersection_superset(self):
208 result = self.set & Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000209 self.assertEqual(result, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000210
211 def test_intersection_overlap(self):
212 result = self.set & Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000213 self.assertEqual(result, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000214
215 def test_intersection_non_overlap(self):
216 result = self.set & Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000217 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000218
219 def test_sym_difference_subset(self):
220 result = self.set ^ Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000221 self.assertEqual(result, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000222
223 def test_sym_difference_superset(self):
224 result = self.set ^ Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000225 self.assertEqual(result, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000226
227 def test_sym_difference_overlap(self):
228 result = self.set ^ Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000229 self.assertEqual(result, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000230
231 def test_sym_difference_non_overlap(self):
232 result = self.set ^ Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000233 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000234
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000235 def test_cmp(self):
236 a, b = Set('a'), Set('b')
Tim Peters44f14b02003-03-02 00:19:49 +0000237 self.assertRaises(TypeError, cmp, a, b)
238
239 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000240 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
Tim Peters44f14b02003-03-02 00:19:49 +0000241 # which Python thinks is good enough to synthesize a cmp() result
242 # without calling __cmp__.
243 self.assertEqual(cmp(a, a), 0)
244
245 self.assertRaises(TypeError, cmp, a, 12)
246 self.assertRaises(TypeError, cmp, "abc", a)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000247
Raymond Hettinger038ca2a2005-08-13 02:29:58 +0000248 def test_inplace_on_self(self):
249 t = self.set.copy()
250 t |= t
251 self.assertEqual(t, self.set)
252 t &= t
253 self.assertEqual(t, self.set)
254 t -= t
255 self.assertEqual(len(t), 0)
256 t = self.set.copy()
257 t ^= t
258 self.assertEqual(len(t), 0)
259
260
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000261#==============================================================================
262
263class TestUpdateOps(unittest.TestCase):
264 def setUp(self):
265 self.set = Set((2, 4, 6))
266
267 def test_union_subset(self):
268 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000269 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000270
271 def test_union_superset(self):
272 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000273 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000274
275 def test_union_overlap(self):
276 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000277 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000278
279 def test_union_non_overlap(self):
280 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000281 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000282
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000283 def test_union_method_call(self):
284 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000285 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000286
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000287 def test_intersection_subset(self):
288 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000289 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000290
291 def test_intersection_superset(self):
292 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000293 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000294
295 def test_intersection_overlap(self):
296 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000297 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000298
299 def test_intersection_non_overlap(self):
300 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000301 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000302
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000303 def test_intersection_method_call(self):
304 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000305 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000306
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000307 def test_sym_difference_subset(self):
308 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000309 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000310
311 def test_sym_difference_superset(self):
312 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000313 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000314
315 def test_sym_difference_overlap(self):
316 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000317 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000318
319 def test_sym_difference_non_overlap(self):
320 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000321 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000322
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000323 def test_sym_difference_method_call(self):
324 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000325 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000326
327 def test_difference_subset(self):
328 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000329 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000330
331 def test_difference_superset(self):
332 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000333 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000334
335 def test_difference_overlap(self):
336 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000337 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000338
339 def test_difference_non_overlap(self):
340 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000341 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000342
343 def test_difference_method_call(self):
344 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000345 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000346
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000347#==============================================================================
348
349class TestMutate(unittest.TestCase):
350 def setUp(self):
351 self.values = ["a", "b", "c"]
352 self.set = Set(self.values)
353
354 def test_add_present(self):
355 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000356 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000357
358 def test_add_absent(self):
359 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000360 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000361
362 def test_add_until_full(self):
363 tmp = Set()
364 expected_len = 0
365 for v in self.values:
366 tmp.add(v)
367 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000368 self.assertEqual(len(tmp), expected_len)
369 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000370
371 def test_remove_present(self):
372 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000373 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000374
375 def test_remove_absent(self):
376 try:
377 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000378 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000379 except LookupError:
380 pass
381
382 def test_remove_until_empty(self):
383 expected_len = len(self.set)
384 for v in self.values:
385 self.set.remove(v)
386 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000387 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000388
389 def test_discard_present(self):
390 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000391 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000392
393 def test_discard_absent(self):
394 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000395 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000396
397 def test_clear(self):
398 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000399 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000400
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000401 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000402 popped = {}
403 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000404 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000405 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000406 for v in self.values:
Ezio Melottiaa980582010-01-23 23:04:36 +0000407 self.assertIn(v, popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000408
409 def test_update_empty_tuple(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000410 self.set.union_update(())
Tim Petersa7777992002-08-25 17:38:49 +0000411 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000412
413 def test_update_unit_tuple_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000414 self.set.union_update(("a",))
Tim Petersa7777992002-08-25 17:38:49 +0000415 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000416
417 def test_update_unit_tuple_non_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000418 self.set.union_update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000419 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000420
421#==============================================================================
422
423class TestSubsets(unittest.TestCase):
424
Tim Peters93d8d482002-08-25 18:21:47 +0000425 case2method = {"<=": "issubset",
426 ">=": "issuperset",
427 }
Tim Petersea76c982002-08-25 18:43:10 +0000428
429 reverse = {"==": "==",
430 "!=": "!=",
431 "<": ">",
432 ">": "<",
433 "<=": ">=",
434 ">=": "<=",
435 }
Tim Peters93d8d482002-08-25 18:21:47 +0000436
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000437 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000438 x = self.left
439 y = self.right
440 for case in "!=", "==", "<", "<=", ">", ">=":
441 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000442 # Test the binary infix spelling.
443 result = eval("x" + case + "y", locals())
444 self.assertEqual(result, expected)
445 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000446 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000447 method = getattr(x, TestSubsets.case2method[case])
448 result = method(y)
449 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000450
Tim Petersea76c982002-08-25 18:43:10 +0000451 # Now do the same for the operands reversed.
452 rcase = TestSubsets.reverse[case]
453 result = eval("y" + rcase + "x", locals())
454 self.assertEqual(result, expected)
455 if rcase in TestSubsets.case2method:
456 method = getattr(y, TestSubsets.case2method[rcase])
457 result = method(x)
458 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000459#------------------------------------------------------------------------------
460
461class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000462 left = Set()
463 right = Set()
464 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000465 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000466
467#------------------------------------------------------------------------------
468
469class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000470 left = Set([1, 2])
471 right = Set([1, 2])
472 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000473 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000474
475#------------------------------------------------------------------------------
476
477class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000478 left = Set()
479 right = Set([1, 2])
480 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000481 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000482
483#------------------------------------------------------------------------------
484
485class TestSubsetPartial(TestSubsets):
Tim Peters3de75262002-11-09 05:26:15 +0000486 left = Set([1])
487 right = Set([1, 2])
488 name = "one a non-empty proper subset of other"
489 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000490
491#------------------------------------------------------------------------------
492
493class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000494 left = Set([1])
495 right = Set([2])
496 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000497 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000498
499#==============================================================================
500
501class TestOnlySetsInBinaryOps(unittest.TestCase):
502
Tim Peters44f14b02003-03-02 00:19:49 +0000503 def test_eq_ne(self):
504 # Unlike the others, this is testing that == and != *are* allowed.
505 self.assertEqual(self.other == self.set, False)
506 self.assertEqual(self.set == self.other, False)
507 self.assertEqual(self.other != self.set, True)
508 self.assertEqual(self.set != self.other, True)
509
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000510 def test_ge_gt_le_lt(self):
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000511 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)
514 self.assertRaises(TypeError, lambda: self.set >= self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000515
Senthil Kumarance8e33a2010-01-08 19:04:16 +0000516 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)
519 self.assertRaises(TypeError, lambda: self.other >= self.set)
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000520
Raymond Hettinger6a180122003-08-17 08:34:09 +0000521 def test_union_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000522 try:
523 self.set |= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000524 except TypeError:
525 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000526 else:
527 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000528
Raymond Hettinger6a180122003-08-17 08:34:09 +0000529 def test_union_update(self):
530 if self.otherIsIterable:
531 self.set.union_update(self.other)
532 else:
533 self.assertRaises(TypeError, self.set.union_update, self.other)
534
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000535 def test_union(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000536 self.assertRaises(TypeError, lambda: self.set | self.other)
537 self.assertRaises(TypeError, lambda: self.other | self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000538 if self.otherIsIterable:
539 self.set.union(self.other)
540 else:
541 self.assertRaises(TypeError, self.set.union, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000542
Raymond Hettinger6a180122003-08-17 08:34:09 +0000543 def test_intersection_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000544 try:
545 self.set &= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000546 except TypeError:
547 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000548 else:
549 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000550
Raymond Hettinger6a180122003-08-17 08:34:09 +0000551 def test_intersection_update(self):
552 if self.otherIsIterable:
553 self.set.intersection_update(self.other)
554 else:
555 self.assertRaises(TypeError,
556 self.set.intersection_update,
557 self.other)
558
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000559 def test_intersection(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000560 self.assertRaises(TypeError, lambda: self.set & self.other)
561 self.assertRaises(TypeError, lambda: self.other & self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000562 if self.otherIsIterable:
563 self.set.intersection(self.other)
564 else:
565 self.assertRaises(TypeError, self.set.intersection, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000566
Raymond Hettinger6a180122003-08-17 08:34:09 +0000567 def test_sym_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000568 try:
569 self.set ^= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000570 except TypeError:
571 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000572 else:
573 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000574
Raymond Hettinger6a180122003-08-17 08:34:09 +0000575 def test_sym_difference_update(self):
576 if self.otherIsIterable:
577 self.set.symmetric_difference_update(self.other)
578 else:
579 self.assertRaises(TypeError,
580 self.set.symmetric_difference_update,
581 self.other)
582
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000583 def test_sym_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000584 self.assertRaises(TypeError, lambda: self.set ^ self.other)
585 self.assertRaises(TypeError, lambda: self.other ^ self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000586 if self.otherIsIterable:
587 self.set.symmetric_difference(self.other)
588 else:
589 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000590
Raymond Hettinger6a180122003-08-17 08:34:09 +0000591 def test_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000592 try:
593 self.set -= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000594 except TypeError:
595 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000596 else:
597 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000598
Raymond Hettinger6a180122003-08-17 08:34:09 +0000599 def test_difference_update(self):
600 if self.otherIsIterable:
601 self.set.difference_update(self.other)
602 else:
603 self.assertRaises(TypeError,
604 self.set.difference_update,
605 self.other)
606
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000607 def test_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000608 self.assertRaises(TypeError, lambda: self.set - self.other)
609 self.assertRaises(TypeError, lambda: self.other - self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000610 if self.otherIsIterable:
611 self.set.difference(self.other)
612 else:
613 self.assertRaises(TypeError, self.set.difference, self.other)
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000614
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000615#------------------------------------------------------------------------------
616
617class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
618 def setUp(self):
619 self.set = Set((1, 2, 3))
620 self.other = 19
Raymond Hettinger6a180122003-08-17 08:34:09 +0000621 self.otherIsIterable = False
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000622
623#------------------------------------------------------------------------------
624
625class TestOnlySetsDict(TestOnlySetsInBinaryOps):
626 def setUp(self):
627 self.set = Set((1, 2, 3))
628 self.other = {1:2, 3:4}
Raymond Hettinger6a180122003-08-17 08:34:09 +0000629 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000630
631#------------------------------------------------------------------------------
632
633class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
634 def setUp(self):
635 self.set = Set((1, 2, 3))
636 self.other = operator.add
Raymond Hettinger6a180122003-08-17 08:34:09 +0000637 self.otherIsIterable = False
638
Florent Xicluna07627882010-03-21 01:14:24 +0000639 def test_ge_gt_le_lt(self):
640 with test_support.check_py3k_warnings():
641 super(TestOnlySetsOperator, self).test_ge_gt_le_lt()
642
Raymond Hettinger6a180122003-08-17 08:34:09 +0000643#------------------------------------------------------------------------------
644
645class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
646 def setUp(self):
647 self.set = Set((1, 2, 3))
648 self.other = (2, 4, 6)
649 self.otherIsIterable = True
650
651#------------------------------------------------------------------------------
652
653class TestOnlySetsString(TestOnlySetsInBinaryOps):
654 def setUp(self):
655 self.set = Set((1, 2, 3))
656 self.other = 'abc'
657 self.otherIsIterable = True
658
659#------------------------------------------------------------------------------
660
661class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
662 def setUp(self):
663 def gen():
664 for i in xrange(0, 10, 2):
665 yield i
666 self.set = Set((1, 2, 3))
667 self.other = gen()
668 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000669
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000670#------------------------------------------------------------------------------
671
672class TestOnlySetsofSets(TestOnlySetsInBinaryOps):
673 def setUp(self):
674 self.set = Set((1, 2, 3))
675 self.other = [Set('ab'), ImmutableSet('cd')]
676 self.otherIsIterable = True
677
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000678#==============================================================================
679
680class TestCopying(unittest.TestCase):
681
682 def test_copy(self):
683 dup = self.set.copy()
Florent Xicluna07627882010-03-21 01:14:24 +0000684 self.assertEqual(len(dup), len(self.set))
685 dup_list = sorted(dup)
686 set_list = sorted(self.set)
Tim Peters4127e912002-08-25 18:02:29 +0000687 self.assertEqual(len(dup_list), len(set_list))
Florent Xicluna07627882010-03-21 01:14:24 +0000688 for i, el in enumerate(dup_list):
689 self.assertIs(el, set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000690
691 def test_deep_copy(self):
692 dup = copy.deepcopy(self.set)
Florent Xicluna07627882010-03-21 01:14:24 +0000693 self.assertSetEqual(dup, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000694
695#------------------------------------------------------------------------------
696
697class TestCopyingEmpty(TestCopying):
698 def setUp(self):
699 self.set = Set()
700
701#------------------------------------------------------------------------------
702
703class TestCopyingSingleton(TestCopying):
704 def setUp(self):
705 self.set = Set(["hello"])
706
707#------------------------------------------------------------------------------
708
709class TestCopyingTriple(TestCopying):
710 def setUp(self):
711 self.set = Set(["zero", 0, None])
712
Florent Xicluna07627882010-03-21 01:14:24 +0000713 def test_copy(self):
714 with test_support.check_py3k_warnings():
715 super(TestCopyingTriple, self).test_copy()
716
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000717#------------------------------------------------------------------------------
718
719class TestCopyingTuple(TestCopying):
720 def setUp(self):
721 self.set = Set([(1, 2)])
722
723#------------------------------------------------------------------------------
724
725class TestCopyingNested(TestCopying):
726 def setUp(self):
727 self.set = Set([((1, 2), (3, 4))])
728
729#==============================================================================
730
Raymond Hettinger6a180122003-08-17 08:34:09 +0000731class TestIdentities(unittest.TestCase):
732 def setUp(self):
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000733 self.a = Set([random.randrange(100) for i in xrange(50)])
734 self.b = Set([random.randrange(100) for i in xrange(50)])
Raymond Hettinger6a180122003-08-17 08:34:09 +0000735
736 def test_binopsVsSubsets(self):
737 a, b = self.a, self.b
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000738 self.assertTrue(a - b <= a)
739 self.assertTrue(b - a <= b)
740 self.assertTrue(a & b <= a)
741 self.assertTrue(a & b <= b)
742 self.assertTrue(a | b >= a)
743 self.assertTrue(a | b >= b)
744 self.assertTrue(a ^ b <= a | b)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000745
746 def test_commutativity(self):
747 a, b = self.a, self.b
748 self.assertEqual(a&b, b&a)
749 self.assertEqual(a|b, b|a)
750 self.assertEqual(a^b, b^a)
751 if a != b:
752 self.assertNotEqual(a-b, b-a)
753
Raymond Hettinger3778f402003-09-24 03:56:07 +0000754 def test_reflexsive_relations(self):
755 a, zero = self.a, Set()
756 self.assertEqual(a ^ a, zero)
757 self.assertEqual(a - a, zero)
758 self.assertEqual(a | a, a)
759 self.assertEqual(a & a, a)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000760 self.assertTrue(a <= a)
761 self.assertTrue(a >= a)
762 self.assertTrue(a == a)
Raymond Hettinger3778f402003-09-24 03:56:07 +0000763
Raymond Hettinger6a180122003-08-17 08:34:09 +0000764 def test_summations(self):
765 # check that sums of parts equal the whole
766 a, b = self.a, self.b
767 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
768 self.assertEqual((a&b)|(a^b), a|b)
769 self.assertEqual(a|(b-a), a|b)
770 self.assertEqual((a-b)|b, a|b)
771 self.assertEqual((a-b)|(a&b), a)
772 self.assertEqual((b-a)|(a&b), b)
773 self.assertEqual((a-b)|(b-a), a^b)
774
775 def test_exclusion(self):
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000776 # check that inverse operations do not overlap
Raymond Hettinger6a180122003-08-17 08:34:09 +0000777 a, b, zero = self.a, self.b, Set()
778 self.assertEqual((a-b)&b, zero)
779 self.assertEqual((b-a)&a, zero)
780 self.assertEqual((a&b)&(a^b), zero)
781
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000782 def test_cardinality_relations(self):
783 a, b = self.a, self.b
784 self.assertEqual(len(a), len(a-b) + len(a&b))
785 self.assertEqual(len(b), len(b-a) + len(a&b))
786 self.assertEqual(len(a^b), len(a-b) + len(b-a))
787 self.assertEqual(len(a|b), len(a-b) + len(a&b) + len(b-a))
Raymond Hettinger3778f402003-09-24 03:56:07 +0000788 self.assertEqual(len(a^b) + len(a&b), len(a|b))
Raymond Hettinger175a6ac2003-09-21 08:14:11 +0000789
Raymond Hettinger6a180122003-08-17 08:34:09 +0000790#==============================================================================
791
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000792libreftest = """
793Example from the Library Reference: Doc/lib/libsets.tex
794
Tim Peters3ba491e2003-03-01 23:33:34 +0000795>>> from sets import Set as Base # override _repr to get sorted output
796>>> class Set(Base):
797... def _repr(self):
798... return Base._repr(self, sorted=True)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000799>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
800>>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
Raymond Hettinger19540352003-08-16 00:59:59 +0000801>>> managers = Set(['Jane', 'Jack', 'Susan', 'Zack'])
802>>> employees = engineers | programmers | managers # union
803>>> engineering_management = engineers & managers # intersection
804>>> fulltime_management = managers - engineers - programmers # difference
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000805>>> engineers.add('Marvin')
806>>> print engineers
Tim Peters3ba491e2003-03-01 23:33:34 +0000807Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000808>>> employees.issuperset(engineers) # superset test
809False
Raymond Hettinger6a180122003-08-17 08:34:09 +0000810>>> employees.union_update(engineers) # update from another set
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000811>>> employees.issuperset(engineers)
812True
Raymond Hettinger19540352003-08-16 00:59:59 +0000813>>> for group in [engineers, programmers, managers, employees]:
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000814... group.discard('Susan') # unconditionally remove element
815... print group
816...
Tim Peters3ba491e2003-03-01 23:33:34 +0000817Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
818Set(['Jack', 'Janice', 'Sam'])
819Set(['Jack', 'Jane', 'Zack'])
820Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin', 'Sam', 'Zack'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000821"""
822
823#==============================================================================
824
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000825__test__ = {'libreftest' : libreftest}
826
827def test_main(verbose=None):
Neal Norwitzb902f4e2006-04-03 04:45:34 +0000828 import doctest
829 from test import test_sets
Walter Dörwald21d3a322003-05-01 17:45:56 +0000830 test_support.run_unittest(
831 TestSetOfSets,
832 TestExceptionPropagation,
833 TestBasicOpsEmpty,
834 TestBasicOpsSingleton,
835 TestBasicOpsTuple,
836 TestBasicOpsTriple,
837 TestBinaryOps,
838 TestUpdateOps,
839 TestMutate,
840 TestSubsetEqualEmpty,
841 TestSubsetEqualNonEmpty,
842 TestSubsetEmptyNonEmpty,
843 TestSubsetPartial,
844 TestSubsetNonOverlap,
845 TestOnlySetsNumeric,
846 TestOnlySetsDict,
847 TestOnlySetsOperator,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000848 TestOnlySetsTuple,
849 TestOnlySetsString,
850 TestOnlySetsGenerator,
Raymond Hettingerf9f4c692003-08-30 22:54:55 +0000851 TestOnlySetsofSets,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000852 TestCopyingEmpty,
853 TestCopyingSingleton,
854 TestCopyingTriple,
855 TestCopyingTuple,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000856 TestCopyingNested,
857 TestIdentities,
Raymond Hettinger654fcd52004-08-07 06:15:12 +0000858 doctest.DocTestSuite(test_sets),
Walter Dörwald21d3a322003-05-01 17:45:56 +0000859 )
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000860
861if __name__ == "__main__":
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000862 test_main(verbose=True)