blob: 92235964f2b687e868561437e319fcda62426947 [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')
235 self.assertRaises(TypeError, cmp, (a,b))
236
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000237#==============================================================================
238
239class TestUpdateOps(unittest.TestCase):
240 def setUp(self):
241 self.set = Set((2, 4, 6))
242
243 def test_union_subset(self):
244 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000245 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000246
247 def test_union_superset(self):
248 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000249 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000250
251 def test_union_overlap(self):
252 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000253 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000254
255 def test_union_non_overlap(self):
256 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000257 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000258
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000259 def test_union_method_call(self):
260 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000261 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000262
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000263 def test_intersection_subset(self):
264 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000265 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000266
267 def test_intersection_superset(self):
268 self.set &= Set([2, 4, 6, 8])
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_intersection_overlap(self):
272 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000273 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000274
275 def test_intersection_non_overlap(self):
276 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000277 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000278
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000279 def test_intersection_method_call(self):
280 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000281 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000282
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000283 def test_sym_difference_subset(self):
284 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000285 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000286
287 def test_sym_difference_superset(self):
288 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000289 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000290
291 def test_sym_difference_overlap(self):
292 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000293 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000294
295 def test_sym_difference_non_overlap(self):
296 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000297 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000298
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000299 def test_sym_difference_method_call(self):
300 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000301 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000302
303 def test_difference_subset(self):
304 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000305 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000306
307 def test_difference_superset(self):
308 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000309 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000310
311 def test_difference_overlap(self):
312 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000313 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000314
315 def test_difference_non_overlap(self):
316 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000317 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000318
319 def test_difference_method_call(self):
320 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000321 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000322
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000323#==============================================================================
324
325class TestMutate(unittest.TestCase):
326 def setUp(self):
327 self.values = ["a", "b", "c"]
328 self.set = Set(self.values)
329
330 def test_add_present(self):
331 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000332 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000333
334 def test_add_absent(self):
335 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000336 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000337
338 def test_add_until_full(self):
339 tmp = Set()
340 expected_len = 0
341 for v in self.values:
342 tmp.add(v)
343 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000344 self.assertEqual(len(tmp), expected_len)
345 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000346
347 def test_remove_present(self):
348 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000349 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000350
351 def test_remove_absent(self):
352 try:
353 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000354 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000355 except LookupError:
356 pass
357
358 def test_remove_until_empty(self):
359 expected_len = len(self.set)
360 for v in self.values:
361 self.set.remove(v)
362 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000363 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000364
365 def test_discard_present(self):
366 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000367 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000368
369 def test_discard_absent(self):
370 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000371 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000372
373 def test_clear(self):
374 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000375 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000376
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000377 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000378 popped = {}
379 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000380 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000381 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000382 for v in self.values:
Tim Peters4127e912002-08-25 18:02:29 +0000383 self.failUnless(v in popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000384
385 def test_update_empty_tuple(self):
386 self.set.update(())
Tim Petersa7777992002-08-25 17:38:49 +0000387 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000388
389 def test_update_unit_tuple_overlap(self):
390 self.set.update(("a",))
Tim Petersa7777992002-08-25 17:38:49 +0000391 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000392
393 def test_update_unit_tuple_non_overlap(self):
394 self.set.update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000395 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000396
397#==============================================================================
398
399class TestSubsets(unittest.TestCase):
400
Tim Peters93d8d482002-08-25 18:21:47 +0000401 case2method = {"<=": "issubset",
402 ">=": "issuperset",
403 }
Tim Petersea76c982002-08-25 18:43:10 +0000404
405 reverse = {"==": "==",
406 "!=": "!=",
407 "<": ">",
408 ">": "<",
409 "<=": ">=",
410 ">=": "<=",
411 }
Tim Peters93d8d482002-08-25 18:21:47 +0000412
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000413 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000414 x = self.left
415 y = self.right
416 for case in "!=", "==", "<", "<=", ">", ">=":
417 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000418 # Test the binary infix spelling.
419 result = eval("x" + case + "y", locals())
420 self.assertEqual(result, expected)
421 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000422 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000423 method = getattr(x, TestSubsets.case2method[case])
424 result = method(y)
425 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000426
Tim Petersea76c982002-08-25 18:43:10 +0000427 # Now do the same for the operands reversed.
428 rcase = TestSubsets.reverse[case]
429 result = eval("y" + rcase + "x", locals())
430 self.assertEqual(result, expected)
431 if rcase in TestSubsets.case2method:
432 method = getattr(y, TestSubsets.case2method[rcase])
433 result = method(x)
434 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000435#------------------------------------------------------------------------------
436
437class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000438 left = Set()
439 right = Set()
440 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000441 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000442
443#------------------------------------------------------------------------------
444
445class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000446 left = Set([1, 2])
447 right = Set([1, 2])
448 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000449 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000450
451#------------------------------------------------------------------------------
452
453class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000454 left = Set()
455 right = Set([1, 2])
456 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000457 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000458
459#------------------------------------------------------------------------------
460
461class TestSubsetPartial(TestSubsets):
Tim Peters3de75262002-11-09 05:26:15 +0000462 left = Set([1])
463 right = Set([1, 2])
464 name = "one a non-empty proper subset of other"
465 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000466
467#------------------------------------------------------------------------------
468
469class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000470 left = Set([1])
471 right = Set([2])
472 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000473 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000474
475#==============================================================================
476
477class TestOnlySetsInBinaryOps(unittest.TestCase):
478
479 def test_cmp(self):
480 try:
Raymond Hettingere87ab3f2002-08-24 07:33:06 +0000481 self.other == self.set
Tim Peters4127e912002-08-25 18:02:29 +0000482 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000483 except TypeError:
484 pass
485 try:
Raymond Hettingere87ab3f2002-08-24 07:33:06 +0000486 self.set != self.other
Tim Peters4127e912002-08-25 18:02:29 +0000487 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000488 except TypeError:
489 pass
490
491 def test_union_update(self):
492 try:
493 self.set |= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000494 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000495 except TypeError:
496 pass
497
498 def test_union(self):
499 try:
500 self.other | self.set
Tim Peters4127e912002-08-25 18:02:29 +0000501 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000502 except TypeError:
503 pass
504 try:
505 self.set | self.other
Tim Peters4127e912002-08-25 18:02:29 +0000506 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000507 except TypeError:
508 pass
509
510 def test_intersection_update(self):
511 try:
512 self.set &= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000513 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000514 except TypeError:
515 pass
516
517 def test_intersection(self):
518 try:
519 self.other & self.set
Tim Peters4127e912002-08-25 18:02:29 +0000520 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000521 except TypeError:
522 pass
523 try:
524 self.set & self.other
Tim Peters4127e912002-08-25 18:02:29 +0000525 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000526 except TypeError:
527 pass
528
529 def test_sym_difference_update(self):
530 try:
531 self.set ^= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000532 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000533 except TypeError:
534 pass
535
536 def test_sym_difference(self):
537 try:
538 self.other ^ self.set
Tim Peters4127e912002-08-25 18:02:29 +0000539 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000540 except TypeError:
541 pass
542 try:
543 self.set ^ self.other
Tim Peters4127e912002-08-25 18:02:29 +0000544 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000545 except TypeError:
546 pass
547
548 def test_difference_update(self):
549 try:
550 self.set -= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000551 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000552 except TypeError:
553 pass
554
555 def test_difference(self):
556 try:
557 self.other - self.set
Tim Peters4127e912002-08-25 18:02:29 +0000558 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000559 except TypeError:
560 pass
561 try:
562 self.set - self.other
Tim Peters4127e912002-08-25 18:02:29 +0000563 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000564 except TypeError:
565 pass
566
567#------------------------------------------------------------------------------
568
569class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
570 def setUp(self):
571 self.set = Set((1, 2, 3))
572 self.other = 19
573
574#------------------------------------------------------------------------------
575
576class TestOnlySetsDict(TestOnlySetsInBinaryOps):
577 def setUp(self):
578 self.set = Set((1, 2, 3))
579 self.other = {1:2, 3:4}
580
581#------------------------------------------------------------------------------
582
583class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
584 def setUp(self):
585 self.set = Set((1, 2, 3))
586 self.other = operator.add
587
588#==============================================================================
589
590class TestCopying(unittest.TestCase):
591
592 def test_copy(self):
593 dup = self.set.copy()
594 dup_list = list(dup); dup_list.sort()
595 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000596 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000597 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000598 self.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000599
600 def test_deep_copy(self):
601 dup = copy.deepcopy(self.set)
602 ##print type(dup), `dup`
603 dup_list = list(dup); dup_list.sort()
604 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000605 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000606 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000607 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000608
609#------------------------------------------------------------------------------
610
611class TestCopyingEmpty(TestCopying):
612 def setUp(self):
613 self.set = Set()
614
615#------------------------------------------------------------------------------
616
617class TestCopyingSingleton(TestCopying):
618 def setUp(self):
619 self.set = Set(["hello"])
620
621#------------------------------------------------------------------------------
622
623class TestCopyingTriple(TestCopying):
624 def setUp(self):
625 self.set = Set(["zero", 0, None])
626
627#------------------------------------------------------------------------------
628
629class TestCopyingTuple(TestCopying):
630 def setUp(self):
631 self.set = Set([(1, 2)])
632
633#------------------------------------------------------------------------------
634
635class TestCopyingNested(TestCopying):
636 def setUp(self):
637 self.set = Set([((1, 2), (3, 4))])
638
639#==============================================================================
640
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000641libreftest = """
642Example from the Library Reference: Doc/lib/libsets.tex
643
Tim Peters3ba491e2003-03-01 23:33:34 +0000644>>> from sets import Set as Base # override _repr to get sorted output
645>>> class Set(Base):
646... def _repr(self):
647... return Base._repr(self, sorted=True)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000648>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
649>>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
650>>> management = Set(['Jane', 'Jack', 'Susan', 'Zack'])
651>>> employees = engineers | programmers | management # union
652>>> engineering_management = engineers & programmers # intersection
653>>> fulltime_management = management - engineers - programmers # difference
654>>> engineers.add('Marvin')
655>>> print engineers
Tim Peters3ba491e2003-03-01 23:33:34 +0000656Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000657>>> employees.issuperset(engineers) # superset test
658False
659>>> employees.update(engineers) # update from another set
660>>> employees.issuperset(engineers)
661True
662>>> for group in [engineers, programmers, management, employees]:
663... group.discard('Susan') # unconditionally remove element
664... print group
665...
Tim Peters3ba491e2003-03-01 23:33:34 +0000666Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
667Set(['Jack', 'Janice', 'Sam'])
668Set(['Jack', 'Jane', 'Zack'])
669Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin', 'Sam', 'Zack'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000670"""
671
672#==============================================================================
673
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000674def makeAllTests():
675 suite = unittest.TestSuite()
Tim Peters62c62432002-08-25 17:49:04 +0000676 for klass in (TestSetOfSets,
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000677 TestExceptionPropagation,
Tim Peters62c62432002-08-25 17:49:04 +0000678 TestBasicOpsEmpty,
679 TestBasicOpsSingleton,
680 TestBasicOpsTuple,
681 TestBasicOpsTriple,
682 TestBinaryOps,
683 TestUpdateOps,
684 TestMutate,
685 TestSubsetEqualEmpty,
686 TestSubsetEqualNonEmpty,
687 TestSubsetEmptyNonEmpty,
688 TestSubsetPartial,
689 TestSubsetNonOverlap,
690 TestOnlySetsNumeric,
691 TestOnlySetsDict,
692 TestOnlySetsOperator,
693 TestCopyingEmpty,
694 TestCopyingSingleton,
695 TestCopyingTriple,
696 TestCopyingTuple,
697 TestCopyingNested,
698 ):
699 suite.addTest(unittest.makeSuite(klass))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000700 return suite
701
702#------------------------------------------------------------------------------
703
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000704__test__ = {'libreftest' : libreftest}
705
706def test_main(verbose=None):
707 from test import test_sets
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000708 suite = makeAllTests()
709 test_support.run_suite(suite)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000710 test_support.run_doctest(test_sets, verbose)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000711
712if __name__ == "__main__":
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000713 test_main(verbose=True)