blob: 5b9c4e0a70a39d007d3db584a65cac8d4e87dff0 [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):
155 """All of these iterables should load without exception."""
156 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):
395 self.set.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):
399 self.set.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):
403 self.set.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
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000506 def test_union_update(self):
507 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
514 def test_union(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000515 self.assertRaises(TypeError, lambda: self.set | self.other)
516 self.assertRaises(TypeError, lambda: self.other | self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000517
518 def test_intersection_update(self):
519 try:
520 self.set &= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000521 except TypeError:
522 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000523 else:
524 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000525
526 def test_intersection(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000527 self.assertRaises(TypeError, lambda: self.set & self.other)
528 self.assertRaises(TypeError, lambda: self.other & self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000529
530 def test_sym_difference_update(self):
531 try:
532 self.set ^= self.other
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000533 except TypeError:
534 pass
Tim Peters6cca7542003-03-02 00:36:10 +0000535 else:
536 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000537
538 def test_sym_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000539 self.assertRaises(TypeError, lambda: self.set ^ self.other)
540 self.assertRaises(TypeError, lambda: self.other ^ self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000541
542 def test_difference_update(self):
543 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
550 def test_difference(self):
Tim Peters6cca7542003-03-02 00:36:10 +0000551 self.assertRaises(TypeError, lambda: self.set - self.other)
552 self.assertRaises(TypeError, lambda: self.other - self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000553
554#------------------------------------------------------------------------------
555
556class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
557 def setUp(self):
558 self.set = Set((1, 2, 3))
559 self.other = 19
560
561#------------------------------------------------------------------------------
562
563class TestOnlySetsDict(TestOnlySetsInBinaryOps):
564 def setUp(self):
565 self.set = Set((1, 2, 3))
566 self.other = {1:2, 3:4}
567
568#------------------------------------------------------------------------------
569
570class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
571 def setUp(self):
572 self.set = Set((1, 2, 3))
573 self.other = operator.add
574
575#==============================================================================
576
577class TestCopying(unittest.TestCase):
578
579 def test_copy(self):
580 dup = self.set.copy()
581 dup_list = list(dup); dup_list.sort()
582 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000583 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000584 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000585 self.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000586
587 def test_deep_copy(self):
588 dup = copy.deepcopy(self.set)
589 ##print type(dup), `dup`
590 dup_list = list(dup); dup_list.sort()
591 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000592 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000593 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000594 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000595
596#------------------------------------------------------------------------------
597
598class TestCopyingEmpty(TestCopying):
599 def setUp(self):
600 self.set = Set()
601
602#------------------------------------------------------------------------------
603
604class TestCopyingSingleton(TestCopying):
605 def setUp(self):
606 self.set = Set(["hello"])
607
608#------------------------------------------------------------------------------
609
610class TestCopyingTriple(TestCopying):
611 def setUp(self):
612 self.set = Set(["zero", 0, None])
613
614#------------------------------------------------------------------------------
615
616class TestCopyingTuple(TestCopying):
617 def setUp(self):
618 self.set = Set([(1, 2)])
619
620#------------------------------------------------------------------------------
621
622class TestCopyingNested(TestCopying):
623 def setUp(self):
624 self.set = Set([((1, 2), (3, 4))])
625
626#==============================================================================
627
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000628libreftest = """
629Example from the Library Reference: Doc/lib/libsets.tex
630
Tim Peters3ba491e2003-03-01 23:33:34 +0000631>>> from sets import Set as Base # override _repr to get sorted output
632>>> class Set(Base):
633... def _repr(self):
634... return Base._repr(self, sorted=True)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000635>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
636>>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
637>>> management = Set(['Jane', 'Jack', 'Susan', 'Zack'])
638>>> employees = engineers | programmers | management # union
639>>> engineering_management = engineers & programmers # intersection
640>>> fulltime_management = management - engineers - programmers # difference
641>>> engineers.add('Marvin')
642>>> print engineers
Tim Peters3ba491e2003-03-01 23:33:34 +0000643Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000644>>> employees.issuperset(engineers) # superset test
645False
646>>> employees.update(engineers) # update from another set
647>>> employees.issuperset(engineers)
648True
649>>> for group in [engineers, programmers, management, employees]:
650... group.discard('Susan') # unconditionally remove element
651... print group
652...
Tim Peters3ba491e2003-03-01 23:33:34 +0000653Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
654Set(['Jack', 'Janice', 'Sam'])
655Set(['Jack', 'Jane', 'Zack'])
656Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin', 'Sam', 'Zack'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000657"""
658
659#==============================================================================
660
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000661__test__ = {'libreftest' : libreftest}
662
663def test_main(verbose=None):
664 from test import test_sets
Walter Dörwald21d3a322003-05-01 17:45:56 +0000665 test_support.run_unittest(
666 TestSetOfSets,
667 TestExceptionPropagation,
668 TestBasicOpsEmpty,
669 TestBasicOpsSingleton,
670 TestBasicOpsTuple,
671 TestBasicOpsTriple,
672 TestBinaryOps,
673 TestUpdateOps,
674 TestMutate,
675 TestSubsetEqualEmpty,
676 TestSubsetEqualNonEmpty,
677 TestSubsetEmptyNonEmpty,
678 TestSubsetPartial,
679 TestSubsetNonOverlap,
680 TestOnlySetsNumeric,
681 TestOnlySetsDict,
682 TestOnlySetsOperator,
683 TestCopyingEmpty,
684 TestCopyingSingleton,
685 TestCopyingTriple,
686 TestCopyingTuple,
687 TestCopyingNested
688 )
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000689 test_support.run_doctest(test_sets, verbose)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000690
691if __name__ == "__main__":
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000692 test_main(verbose=True)