blob: f0a1925d4e01463dfb9f7051e9e88fe97d74b291 [file] [log] [blame]
Guido van Rossumd6cf3af2002-08-19 16:19:15 +00001#!/usr/bin/env python
2
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +00003import unittest, operator, copy, pickle
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:
Tim Petersa7777992002-08-25 17:38:49 +000015 self.assertEqual(`self.set`, self.repr)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000016
17 def test_length(self):
Tim Petersa7777992002-08-25 17:38:49 +000018 self.assertEqual(len(self.set), self.length)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000019
20 def test_self_equality(self):
Tim Petersa7777992002-08-25 17:38:49 +000021 self.assertEqual(self.set, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000022
23 def test_equivalent_equality(self):
Tim Petersa7777992002-08-25 17:38:49 +000024 self.assertEqual(self.set, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000025
26 def test_copy(self):
Tim Petersa7777992002-08-25 17:38:49 +000027 self.assertEqual(self.set.copy(), self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000028
29 def test_self_union(self):
30 result = self.set | self.set
Tim Petersa7777992002-08-25 17:38:49 +000031 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000032
33 def test_empty_union(self):
34 result = self.set | empty_set
Tim Petersa7777992002-08-25 17:38:49 +000035 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000036
37 def test_union_empty(self):
38 result = empty_set | self.set
Tim Petersa7777992002-08-25 17:38:49 +000039 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000040
41 def test_self_intersection(self):
42 result = self.set & self.set
Tim Petersa7777992002-08-25 17:38:49 +000043 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000044
45 def test_empty_intersection(self):
46 result = self.set & empty_set
Tim Petersa7777992002-08-25 17:38:49 +000047 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000048
49 def test_intersection_empty(self):
50 result = empty_set & self.set
Tim Petersa7777992002-08-25 17:38:49 +000051 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000052
53 def test_self_symmetric_difference(self):
54 result = self.set ^ self.set
Tim Petersa7777992002-08-25 17:38:49 +000055 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000056
57 def checkempty_symmetric_difference(self):
58 result = self.set ^ empty_set
Tim Petersa7777992002-08-25 17:38:49 +000059 self.assertEqual(result, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000060
61 def test_self_difference(self):
62 result = self.set - self.set
Tim Petersa7777992002-08-25 17:38:49 +000063 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000064
65 def test_empty_difference(self):
66 result = self.set - empty_set
Tim Petersa7777992002-08-25 17:38:49 +000067 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000068
69 def test_empty_difference_rev(self):
70 result = empty_set - self.set
Tim Petersa7777992002-08-25 17:38:49 +000071 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000072
73 def test_iteration(self):
74 for v in self.set:
Tim Peters4127e912002-08-25 18:02:29 +000075 self.assert_(v in self.values)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000076
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000077 def test_pickling(self):
78 p = pickle.dumps(self.set)
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000079 copy = pickle.loads(p)
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000080 self.assertEqual(self.set, copy,
81 "%s != %s" % (self.set, copy))
82
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000083#------------------------------------------------------------------------------
84
85class TestBasicOpsEmpty(TestBasicOps):
86 def setUp(self):
87 self.case = "empty set"
88 self.values = []
89 self.set = Set(self.values)
90 self.dup = Set(self.values)
91 self.length = 0
92 self.repr = "Set([])"
93
94#------------------------------------------------------------------------------
95
96class TestBasicOpsSingleton(TestBasicOps):
97 def setUp(self):
98 self.case = "unit set (number)"
99 self.values = [3]
100 self.set = Set(self.values)
101 self.dup = Set(self.values)
102 self.length = 1
103 self.repr = "Set([3])"
104
105 def test_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000106 self.failUnless(3 in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000107
108 def test_not_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000109 self.failUnless(2 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000110
111#------------------------------------------------------------------------------
112
113class TestBasicOpsTuple(TestBasicOps):
114 def setUp(self):
115 self.case = "unit set (tuple)"
116 self.values = [(0, "zero")]
117 self.set = Set(self.values)
118 self.dup = Set(self.values)
119 self.length = 1
120 self.repr = "Set([(0, 'zero')])"
121
122 def test_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000123 self.failUnless((0, "zero") in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000124
125 def test_not_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000126 self.failUnless(9 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000127
128#------------------------------------------------------------------------------
129
130class TestBasicOpsTriple(TestBasicOps):
131 def setUp(self):
132 self.case = "triple set"
133 self.values = [0, "zero", operator.add]
134 self.set = Set(self.values)
135 self.dup = Set(self.values)
136 self.length = 3
137 self.repr = None
138
139#==============================================================================
140
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000141def baditer():
142 raise TypeError
143 yield True
144
145def gooditer():
146 yield True
147
148class TestExceptionPropagation(unittest.TestCase):
149 """SF 628246: Set constructor should not trap iterator TypeErrors"""
150
151 def test_instanceWithException(self):
152 self.assertRaises(TypeError, Set, baditer())
153
154 def test_instancesWithoutException(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000155 # All of these iterables should load without exception.
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000156 Set([1,2,3])
157 Set((1,2,3))
158 Set({'one':1, 'two':2, 'three':3})
159 Set(xrange(3))
160 Set('abc')
161 Set(gooditer())
162
163#==============================================================================
164
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000165class TestSetOfSets(unittest.TestCase):
166 def test_constructor(self):
167 inner = Set([1])
168 outer = Set([inner])
169 element = outer.pop()
Tim Peters4127e912002-08-25 18:02:29 +0000170 self.assertEqual(type(element), ImmutableSet)
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000171 outer.add(inner) # Rebuild set of sets with .add method
172 outer.remove(inner)
Tim Peters4127e912002-08-25 18:02:29 +0000173 self.assertEqual(outer, Set()) # Verify that remove worked
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000174 outer.discard(inner) # Absence of KeyError indicates working fine
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000175
176#==============================================================================
177
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000178class TestBinaryOps(unittest.TestCase):
179 def setUp(self):
180 self.set = Set((2, 4, 6))
181
Raymond Hettinger35e48d22002-11-25 20:43:55 +0000182 def test_eq(self): # SF bug 643115
183 self.assertEqual(self.set, Set({2:1,4:3,6:5}))
184
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000185 def test_union_subset(self):
186 result = self.set | Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000187 self.assertEqual(result, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000188
189 def test_union_superset(self):
190 result = self.set | Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000191 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000192
193 def test_union_overlap(self):
194 result = self.set | Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000195 self.assertEqual(result, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000196
197 def test_union_non_overlap(self):
198 result = self.set | Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000199 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000200
201 def test_intersection_subset(self):
202 result = self.set & Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000203 self.assertEqual(result, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000204
205 def test_intersection_superset(self):
206 result = self.set & Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000207 self.assertEqual(result, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000208
209 def test_intersection_overlap(self):
210 result = self.set & Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000211 self.assertEqual(result, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000212
213 def test_intersection_non_overlap(self):
214 result = self.set & Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000215 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000216
217 def test_sym_difference_subset(self):
218 result = self.set ^ Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000219 self.assertEqual(result, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000220
221 def test_sym_difference_superset(self):
222 result = self.set ^ Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000223 self.assertEqual(result, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000224
225 def test_sym_difference_overlap(self):
226 result = self.set ^ Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000227 self.assertEqual(result, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000228
229 def test_sym_difference_non_overlap(self):
230 result = self.set ^ Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000231 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000232
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000233 def test_cmp(self):
234 a, b = Set('a'), Set('b')
Tim Peters44f14b02003-03-02 00:19:49 +0000235 self.assertRaises(TypeError, cmp, a, b)
236
237 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000238 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
Tim Peters44f14b02003-03-02 00:19:49 +0000239 # which Python thinks is good enough to synthesize a cmp() result
240 # without calling __cmp__.
241 self.assertEqual(cmp(a, a), 0)
242
243 self.assertRaises(TypeError, cmp, a, 12)
244 self.assertRaises(TypeError, cmp, "abc", a)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000245
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000246#==============================================================================
247
248class TestUpdateOps(unittest.TestCase):
249 def setUp(self):
250 self.set = Set((2, 4, 6))
251
252 def test_union_subset(self):
253 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000254 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000255
256 def test_union_superset(self):
257 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000258 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000259
260 def test_union_overlap(self):
261 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000262 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000263
264 def test_union_non_overlap(self):
265 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000266 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000267
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000268 def test_union_method_call(self):
269 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000270 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000271
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000272 def test_intersection_subset(self):
273 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000274 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000275
276 def test_intersection_superset(self):
277 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000278 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000279
280 def test_intersection_overlap(self):
281 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000282 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000283
284 def test_intersection_non_overlap(self):
285 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000286 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000287
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000288 def test_intersection_method_call(self):
289 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000290 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000291
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000292 def test_sym_difference_subset(self):
293 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000294 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000295
296 def test_sym_difference_superset(self):
297 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000298 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000299
300 def test_sym_difference_overlap(self):
301 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000302 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000303
304 def test_sym_difference_non_overlap(self):
305 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000306 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000307
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000308 def test_sym_difference_method_call(self):
309 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000310 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000311
312 def test_difference_subset(self):
313 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000314 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000315
316 def test_difference_superset(self):
317 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000318 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000319
320 def test_difference_overlap(self):
321 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000322 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000323
324 def test_difference_non_overlap(self):
325 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000326 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000327
328 def test_difference_method_call(self):
329 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000330 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000331
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000332#==============================================================================
333
334class TestMutate(unittest.TestCase):
335 def setUp(self):
336 self.values = ["a", "b", "c"]
337 self.set = Set(self.values)
338
339 def test_add_present(self):
340 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000341 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000342
343 def test_add_absent(self):
344 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000345 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000346
347 def test_add_until_full(self):
348 tmp = Set()
349 expected_len = 0
350 for v in self.values:
351 tmp.add(v)
352 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000353 self.assertEqual(len(tmp), expected_len)
354 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000355
356 def test_remove_present(self):
357 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000358 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000359
360 def test_remove_absent(self):
361 try:
362 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000363 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000364 except LookupError:
365 pass
366
367 def test_remove_until_empty(self):
368 expected_len = len(self.set)
369 for v in self.values:
370 self.set.remove(v)
371 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000372 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000373
374 def test_discard_present(self):
375 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000376 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000377
378 def test_discard_absent(self):
379 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000380 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000381
382 def test_clear(self):
383 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000384 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000385
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000386 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000387 popped = {}
388 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000389 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000390 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000391 for v in self.values:
Tim Peters4127e912002-08-25 18:02:29 +0000392 self.failUnless(v in popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000393
394 def test_update_empty_tuple(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000395 self.set.union_update(())
Tim Petersa7777992002-08-25 17:38:49 +0000396 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000397
398 def test_update_unit_tuple_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000399 self.set.union_update(("a",))
Tim Petersa7777992002-08-25 17:38:49 +0000400 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000401
402 def test_update_unit_tuple_non_overlap(self):
Raymond Hettinger6a180122003-08-17 08:34:09 +0000403 self.set.union_update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000404 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000405
406#==============================================================================
407
408class TestSubsets(unittest.TestCase):
409
Tim Peters93d8d482002-08-25 18:21:47 +0000410 case2method = {"<=": "issubset",
411 ">=": "issuperset",
412 }
Tim Petersea76c982002-08-25 18:43:10 +0000413
414 reverse = {"==": "==",
415 "!=": "!=",
416 "<": ">",
417 ">": "<",
418 "<=": ">=",
419 ">=": "<=",
420 }
Tim Peters93d8d482002-08-25 18:21:47 +0000421
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000422 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000423 x = self.left
424 y = self.right
425 for case in "!=", "==", "<", "<=", ">", ">=":
426 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000427 # Test the binary infix spelling.
428 result = eval("x" + case + "y", locals())
429 self.assertEqual(result, expected)
430 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000431 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000432 method = getattr(x, TestSubsets.case2method[case])
433 result = method(y)
434 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000435
Tim Petersea76c982002-08-25 18:43:10 +0000436 # Now do the same for the operands reversed.
437 rcase = TestSubsets.reverse[case]
438 result = eval("y" + rcase + "x", locals())
439 self.assertEqual(result, expected)
440 if rcase in TestSubsets.case2method:
441 method = getattr(y, TestSubsets.case2method[rcase])
442 result = method(x)
443 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000444#------------------------------------------------------------------------------
445
446class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000447 left = Set()
448 right = Set()
449 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000450 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000451
452#------------------------------------------------------------------------------
453
454class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000455 left = Set([1, 2])
456 right = Set([1, 2])
457 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000458 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000459
460#------------------------------------------------------------------------------
461
462class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000463 left = Set()
464 right = Set([1, 2])
465 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000466 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000467
468#------------------------------------------------------------------------------
469
470class TestSubsetPartial(TestSubsets):
Tim Peters3de75262002-11-09 05:26:15 +0000471 left = Set([1])
472 right = Set([1, 2])
473 name = "one a non-empty proper subset of other"
474 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000475
476#------------------------------------------------------------------------------
477
478class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000479 left = Set([1])
480 right = Set([2])
481 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000482 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000483
484#==============================================================================
485
486class TestOnlySetsInBinaryOps(unittest.TestCase):
487
Tim Peters44f14b02003-03-02 00:19:49 +0000488 def test_eq_ne(self):
489 # Unlike the others, this is testing that == and != *are* allowed.
490 self.assertEqual(self.other == self.set, False)
491 self.assertEqual(self.set == self.other, False)
492 self.assertEqual(self.other != self.set, True)
493 self.assertEqual(self.set != self.other, True)
494
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000495 def test_ge_gt_le_lt(self):
Tim Peters44f14b02003-03-02 00:19:49 +0000496 self.assertRaises(TypeError, lambda: self.set < self.other)
497 self.assertRaises(TypeError, lambda: self.set <= self.other)
498 self.assertRaises(TypeError, lambda: self.set > self.other)
499 self.assertRaises(TypeError, lambda: self.set >= self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000500
Tim Petersb7bfe4b2003-03-02 00:31:23 +0000501 self.assertRaises(TypeError, lambda: self.other < self.set)
502 self.assertRaises(TypeError, lambda: self.other <= self.set)
503 self.assertRaises(TypeError, lambda: self.other > self.set)
504 self.assertRaises(TypeError, lambda: self.other >= self.set)
505
Raymond Hettinger6a180122003-08-17 08:34:09 +0000506 def test_union_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000507 try:
508 self.set |= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000509 except TypeError:
510 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000511 else:
512 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000513
Raymond Hettinger6a180122003-08-17 08:34:09 +0000514 def test_union_update(self):
515 if self.otherIsIterable:
516 self.set.union_update(self.other)
517 else:
518 self.assertRaises(TypeError, self.set.union_update, self.other)
519
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000520 def test_union(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000521 self.assertRaises(TypeError, lambda: self.set | self.other)
522 self.assertRaises(TypeError, lambda: self.other | self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000523 if self.otherIsIterable:
524 self.set.union(self.other)
525 else:
526 self.assertRaises(TypeError, self.set.union, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000527
Raymond Hettinger6a180122003-08-17 08:34:09 +0000528 def test_intersection_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000529 try:
530 self.set &= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000531 except TypeError:
532 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000533 else:
534 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000535
Raymond Hettinger6a180122003-08-17 08:34:09 +0000536 def test_intersection_update(self):
537 if self.otherIsIterable:
538 self.set.intersection_update(self.other)
539 else:
540 self.assertRaises(TypeError,
541 self.set.intersection_update,
542 self.other)
543
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000544 def test_intersection(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000545 self.assertRaises(TypeError, lambda: self.set & self.other)
546 self.assertRaises(TypeError, lambda: self.other & self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000547 if self.otherIsIterable:
548 self.set.intersection(self.other)
549 else:
550 self.assertRaises(TypeError, self.set.intersection, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000551
Raymond Hettinger6a180122003-08-17 08:34:09 +0000552 def test_sym_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000553 try:
554 self.set ^= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000555 except TypeError:
556 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000557 else:
558 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000559
Raymond Hettinger6a180122003-08-17 08:34:09 +0000560 def test_sym_difference_update(self):
561 if self.otherIsIterable:
562 self.set.symmetric_difference_update(self.other)
563 else:
564 self.assertRaises(TypeError,
565 self.set.symmetric_difference_update,
566 self.other)
567
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000568 def test_sym_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000569 self.assertRaises(TypeError, lambda: self.set ^ self.other)
570 self.assertRaises(TypeError, lambda: self.other ^ self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000571 if self.otherIsIterable:
572 self.set.symmetric_difference(self.other)
573 else:
574 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000575
Raymond Hettinger6a180122003-08-17 08:34:09 +0000576 def test_difference_update_operator(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000577 try:
578 self.set -= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000579 except TypeError:
580 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000581 else:
582 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000583
Raymond Hettinger6a180122003-08-17 08:34:09 +0000584 def test_difference_update(self):
585 if self.otherIsIterable:
586 self.set.difference_update(self.other)
587 else:
588 self.assertRaises(TypeError,
589 self.set.difference_update,
590 self.other)
591
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000592 def test_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000593 self.assertRaises(TypeError, lambda: self.set - self.other)
594 self.assertRaises(TypeError, lambda: self.other - self.set)
Raymond Hettinger6a180122003-08-17 08:34:09 +0000595 if self.otherIsIterable:
596 self.set.difference(self.other)
597 else:
598 self.assertRaises(TypeError, self.set.difference, self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000599#------------------------------------------------------------------------------
600
601class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
602 def setUp(self):
603 self.set = Set((1, 2, 3))
604 self.other = 19
Raymond Hettinger6a180122003-08-17 08:34:09 +0000605 self.otherIsIterable = False
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000606
607#------------------------------------------------------------------------------
608
609class TestOnlySetsDict(TestOnlySetsInBinaryOps):
610 def setUp(self):
611 self.set = Set((1, 2, 3))
612 self.other = {1:2, 3:4}
Raymond Hettinger6a180122003-08-17 08:34:09 +0000613 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000614
615#------------------------------------------------------------------------------
616
617class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
618 def setUp(self):
619 self.set = Set((1, 2, 3))
620 self.other = operator.add
Raymond Hettinger6a180122003-08-17 08:34:09 +0000621 self.otherIsIterable = False
622
623#------------------------------------------------------------------------------
624
625class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
626 def setUp(self):
627 self.set = Set((1, 2, 3))
628 self.other = (2, 4, 6)
629 self.otherIsIterable = True
630
631#------------------------------------------------------------------------------
632
633class TestOnlySetsString(TestOnlySetsInBinaryOps):
634 def setUp(self):
635 self.set = Set((1, 2, 3))
636 self.other = 'abc'
637 self.otherIsIterable = True
638
639#------------------------------------------------------------------------------
640
641class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
642 def setUp(self):
643 def gen():
644 for i in xrange(0, 10, 2):
645 yield i
646 self.set = Set((1, 2, 3))
647 self.other = gen()
648 self.otherIsIterable = True
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000649
650#==============================================================================
651
652class TestCopying(unittest.TestCase):
653
654 def test_copy(self):
655 dup = self.set.copy()
656 dup_list = list(dup); dup_list.sort()
657 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000658 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000659 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000660 self.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000661
662 def test_deep_copy(self):
663 dup = copy.deepcopy(self.set)
664 ##print type(dup), `dup`
665 dup_list = list(dup); dup_list.sort()
666 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000667 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000668 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000669 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000670
671#------------------------------------------------------------------------------
672
673class TestCopyingEmpty(TestCopying):
674 def setUp(self):
675 self.set = Set()
676
677#------------------------------------------------------------------------------
678
679class TestCopyingSingleton(TestCopying):
680 def setUp(self):
681 self.set = Set(["hello"])
682
683#------------------------------------------------------------------------------
684
685class TestCopyingTriple(TestCopying):
686 def setUp(self):
687 self.set = Set(["zero", 0, None])
688
689#------------------------------------------------------------------------------
690
691class TestCopyingTuple(TestCopying):
692 def setUp(self):
693 self.set = Set([(1, 2)])
694
695#------------------------------------------------------------------------------
696
697class TestCopyingNested(TestCopying):
698 def setUp(self):
699 self.set = Set([((1, 2), (3, 4))])
700
701#==============================================================================
702
Raymond Hettinger6a180122003-08-17 08:34:09 +0000703class TestIdentities(unittest.TestCase):
704 def setUp(self):
705 self.a = Set('abracadabra')
706 self.b = Set('alacazam')
707
708 def test_binopsVsSubsets(self):
709 a, b = self.a, self.b
710 self.assert_(a - b < a)
711 self.assert_(b - a < b)
712 self.assert_(a & b < a)
713 self.assert_(a & b < b)
714 self.assert_(a | b > a)
715 self.assert_(a | b > b)
716 self.assert_(a ^ b < a | b)
717
718 def test_commutativity(self):
719 a, b = self.a, self.b
720 self.assertEqual(a&b, b&a)
721 self.assertEqual(a|b, b|a)
722 self.assertEqual(a^b, b^a)
723 if a != b:
724 self.assertNotEqual(a-b, b-a)
725
726 def test_summations(self):
727 # check that sums of parts equal the whole
728 a, b = self.a, self.b
729 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
730 self.assertEqual((a&b)|(a^b), a|b)
731 self.assertEqual(a|(b-a), a|b)
732 self.assertEqual((a-b)|b, a|b)
733 self.assertEqual((a-b)|(a&b), a)
734 self.assertEqual((b-a)|(a&b), b)
735 self.assertEqual((a-b)|(b-a), a^b)
736
737 def test_exclusion(self):
738 # check that inverse operations show non-overlap
739 a, b, zero = self.a, self.b, Set()
740 self.assertEqual((a-b)&b, zero)
741 self.assertEqual((b-a)&a, zero)
742 self.assertEqual((a&b)&(a^b), zero)
743
744#==============================================================================
745
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000746libreftest = """
747Example from the Library Reference: Doc/lib/libsets.tex
748
Tim Peters3ba491e2003-03-01 23:33:34 +0000749>>> from sets import Set as Base # override _repr to get sorted output
750>>> class Set(Base):
751... def _repr(self):
752... return Base._repr(self, sorted=True)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000753>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
754>>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
Raymond Hettinger19540352003-08-16 00:59:59 +0000755>>> managers = Set(['Jane', 'Jack', 'Susan', 'Zack'])
756>>> employees = engineers | programmers | managers # union
757>>> engineering_management = engineers & managers # intersection
758>>> fulltime_management = managers - engineers - programmers # difference
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000759>>> engineers.add('Marvin')
760>>> print engineers
Tim Peters3ba491e2003-03-01 23:33:34 +0000761Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000762>>> employees.issuperset(engineers) # superset test
763False
Raymond Hettinger6a180122003-08-17 08:34:09 +0000764>>> employees.union_update(engineers) # update from another set
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000765>>> employees.issuperset(engineers)
766True
Raymond Hettinger19540352003-08-16 00:59:59 +0000767>>> for group in [engineers, programmers, managers, employees]:
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000768... group.discard('Susan') # unconditionally remove element
769... print group
770...
Tim Peters3ba491e2003-03-01 23:33:34 +0000771Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
772Set(['Jack', 'Janice', 'Sam'])
773Set(['Jack', 'Jane', 'Zack'])
774Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin', 'Sam', 'Zack'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000775"""
776
777#==============================================================================
778
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000779__test__ = {'libreftest' : libreftest}
780
781def test_main(verbose=None):
782 from test import test_sets
Walter Dörwald21d3a322003-05-01 17:45:56 +0000783 test_support.run_unittest(
784 TestSetOfSets,
785 TestExceptionPropagation,
786 TestBasicOpsEmpty,
787 TestBasicOpsSingleton,
788 TestBasicOpsTuple,
789 TestBasicOpsTriple,
790 TestBinaryOps,
791 TestUpdateOps,
792 TestMutate,
793 TestSubsetEqualEmpty,
794 TestSubsetEqualNonEmpty,
795 TestSubsetEmptyNonEmpty,
796 TestSubsetPartial,
797 TestSubsetNonOverlap,
798 TestOnlySetsNumeric,
799 TestOnlySetsDict,
800 TestOnlySetsOperator,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000801 TestOnlySetsTuple,
802 TestOnlySetsString,
803 TestOnlySetsGenerator,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000804 TestCopyingEmpty,
805 TestCopyingSingleton,
806 TestCopyingTriple,
807 TestCopyingTuple,
Raymond Hettinger6a180122003-08-17 08:34:09 +0000808 TestCopyingNested,
809 TestIdentities,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000810 )
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000811 test_support.run_doctest(test_sets, verbose)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000812
813if __name__ == "__main__":
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000814 test_main(verbose=True)