blob: f80d58e82ef2eaf966d8c829997c2fdf64e45f45 [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
233#==============================================================================
234
235class TestUpdateOps(unittest.TestCase):
236 def setUp(self):
237 self.set = Set((2, 4, 6))
238
239 def test_union_subset(self):
240 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000241 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000242
243 def test_union_superset(self):
244 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000245 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000246
247 def test_union_overlap(self):
248 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000249 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000250
251 def test_union_non_overlap(self):
252 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000253 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000254
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000255 def test_union_method_call(self):
256 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000257 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000258
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000259 def test_intersection_subset(self):
260 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000261 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000262
263 def test_intersection_superset(self):
264 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000265 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000266
267 def test_intersection_overlap(self):
268 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000269 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000270
271 def test_intersection_non_overlap(self):
272 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000273 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000274
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000275 def test_intersection_method_call(self):
276 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000277 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000278
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000279 def test_sym_difference_subset(self):
280 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000281 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000282
283 def test_sym_difference_superset(self):
284 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000285 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000286
287 def test_sym_difference_overlap(self):
288 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000289 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000290
291 def test_sym_difference_non_overlap(self):
292 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000293 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000294
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000295 def test_sym_difference_method_call(self):
296 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000297 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000298
299 def test_difference_subset(self):
300 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000301 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000302
303 def test_difference_superset(self):
304 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000305 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000306
307 def test_difference_overlap(self):
308 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000309 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000310
311 def test_difference_non_overlap(self):
312 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000313 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000314
315 def test_difference_method_call(self):
316 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000317 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000318
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000319#==============================================================================
320
321class TestMutate(unittest.TestCase):
322 def setUp(self):
323 self.values = ["a", "b", "c"]
324 self.set = Set(self.values)
325
326 def test_add_present(self):
327 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000328 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000329
330 def test_add_absent(self):
331 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000332 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000333
334 def test_add_until_full(self):
335 tmp = Set()
336 expected_len = 0
337 for v in self.values:
338 tmp.add(v)
339 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000340 self.assertEqual(len(tmp), expected_len)
341 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000342
343 def test_remove_present(self):
344 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000345 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000346
347 def test_remove_absent(self):
348 try:
349 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000350 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000351 except LookupError:
352 pass
353
354 def test_remove_until_empty(self):
355 expected_len = len(self.set)
356 for v in self.values:
357 self.set.remove(v)
358 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000359 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000360
361 def test_discard_present(self):
362 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000363 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000364
365 def test_discard_absent(self):
366 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000367 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000368
369 def test_clear(self):
370 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000371 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000372
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000373 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000374 popped = {}
375 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000376 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000377 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000378 for v in self.values:
Tim Peters4127e912002-08-25 18:02:29 +0000379 self.failUnless(v in popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000380
381 def test_update_empty_tuple(self):
382 self.set.update(())
Tim Petersa7777992002-08-25 17:38:49 +0000383 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000384
385 def test_update_unit_tuple_overlap(self):
386 self.set.update(("a",))
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_non_overlap(self):
390 self.set.update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000391 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000392
393#==============================================================================
394
395class TestSubsets(unittest.TestCase):
396
Tim Peters93d8d482002-08-25 18:21:47 +0000397 case2method = {"<=": "issubset",
398 ">=": "issuperset",
399 }
Tim Petersea76c982002-08-25 18:43:10 +0000400
401 reverse = {"==": "==",
402 "!=": "!=",
403 "<": ">",
404 ">": "<",
405 "<=": ">=",
406 ">=": "<=",
407 }
Tim Peters93d8d482002-08-25 18:21:47 +0000408
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000409 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000410 x = self.left
411 y = self.right
412 for case in "!=", "==", "<", "<=", ">", ">=":
413 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000414 # Test the binary infix spelling.
415 result = eval("x" + case + "y", locals())
416 self.assertEqual(result, expected)
417 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000418 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000419 method = getattr(x, TestSubsets.case2method[case])
420 result = method(y)
421 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000422
Tim Petersea76c982002-08-25 18:43:10 +0000423 # Now do the same for the operands reversed.
424 rcase = TestSubsets.reverse[case]
425 result = eval("y" + rcase + "x", locals())
426 self.assertEqual(result, expected)
427 if rcase in TestSubsets.case2method:
428 method = getattr(y, TestSubsets.case2method[rcase])
429 result = method(x)
430 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000431#------------------------------------------------------------------------------
432
433class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000434 left = Set()
435 right = Set()
436 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000437 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000438
439#------------------------------------------------------------------------------
440
441class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000442 left = Set([1, 2])
443 right = Set([1, 2])
444 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000445 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000446
447#------------------------------------------------------------------------------
448
449class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000450 left = Set()
451 right = Set([1, 2])
452 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000453 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000454
455#------------------------------------------------------------------------------
456
457class TestSubsetPartial(TestSubsets):
Tim Peters3de75262002-11-09 05:26:15 +0000458 left = Set([1])
459 right = Set([1, 2])
460 name = "one a non-empty proper subset of other"
461 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000462
463#------------------------------------------------------------------------------
464
465class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000466 left = Set([1])
467 right = Set([2])
468 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000469 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000470
471#==============================================================================
472
473class TestOnlySetsInBinaryOps(unittest.TestCase):
474
475 def test_cmp(self):
476 try:
Raymond Hettingere87ab3f2002-08-24 07:33:06 +0000477 self.other == self.set
Tim Peters4127e912002-08-25 18:02:29 +0000478 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000479 except TypeError:
480 pass
481 try:
Raymond Hettingere87ab3f2002-08-24 07:33:06 +0000482 self.set != self.other
Tim Peters4127e912002-08-25 18:02:29 +0000483 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000484 except TypeError:
485 pass
486
487 def test_union_update(self):
488 try:
489 self.set |= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000490 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000491 except TypeError:
492 pass
493
494 def test_union(self):
495 try:
496 self.other | self.set
Tim Peters4127e912002-08-25 18:02:29 +0000497 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000498 except TypeError:
499 pass
500 try:
501 self.set | self.other
Tim Peters4127e912002-08-25 18:02:29 +0000502 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000503 except TypeError:
504 pass
505
506 def test_intersection_update(self):
507 try:
508 self.set &= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000509 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000510 except TypeError:
511 pass
512
513 def test_intersection(self):
514 try:
515 self.other & self.set
Tim Peters4127e912002-08-25 18:02:29 +0000516 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000517 except TypeError:
518 pass
519 try:
520 self.set & self.other
Tim Peters4127e912002-08-25 18:02:29 +0000521 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000522 except TypeError:
523 pass
524
525 def test_sym_difference_update(self):
526 try:
527 self.set ^= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000528 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000529 except TypeError:
530 pass
531
532 def test_sym_difference(self):
533 try:
534 self.other ^ self.set
Tim Peters4127e912002-08-25 18:02:29 +0000535 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000536 except TypeError:
537 pass
538 try:
539 self.set ^ self.other
Tim Peters4127e912002-08-25 18:02:29 +0000540 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000541 except TypeError:
542 pass
543
544 def test_difference_update(self):
545 try:
546 self.set -= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000547 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000548 except TypeError:
549 pass
550
551 def test_difference(self):
552 try:
553 self.other - self.set
Tim Peters4127e912002-08-25 18:02:29 +0000554 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000555 except TypeError:
556 pass
557 try:
558 self.set - self.other
Tim Peters4127e912002-08-25 18:02:29 +0000559 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000560 except TypeError:
561 pass
562
563#------------------------------------------------------------------------------
564
565class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
566 def setUp(self):
567 self.set = Set((1, 2, 3))
568 self.other = 19
569
570#------------------------------------------------------------------------------
571
572class TestOnlySetsDict(TestOnlySetsInBinaryOps):
573 def setUp(self):
574 self.set = Set((1, 2, 3))
575 self.other = {1:2, 3:4}
576
577#------------------------------------------------------------------------------
578
579class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
580 def setUp(self):
581 self.set = Set((1, 2, 3))
582 self.other = operator.add
583
584#==============================================================================
585
586class TestCopying(unittest.TestCase):
587
588 def test_copy(self):
589 dup = self.set.copy()
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.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000595
596 def test_deep_copy(self):
597 dup = copy.deepcopy(self.set)
598 ##print type(dup), `dup`
599 dup_list = list(dup); dup_list.sort()
600 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000601 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000602 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000603 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000604
605#------------------------------------------------------------------------------
606
607class TestCopyingEmpty(TestCopying):
608 def setUp(self):
609 self.set = Set()
610
611#------------------------------------------------------------------------------
612
613class TestCopyingSingleton(TestCopying):
614 def setUp(self):
615 self.set = Set(["hello"])
616
617#------------------------------------------------------------------------------
618
619class TestCopyingTriple(TestCopying):
620 def setUp(self):
621 self.set = Set(["zero", 0, None])
622
623#------------------------------------------------------------------------------
624
625class TestCopyingTuple(TestCopying):
626 def setUp(self):
627 self.set = Set([(1, 2)])
628
629#------------------------------------------------------------------------------
630
631class TestCopyingNested(TestCopying):
632 def setUp(self):
633 self.set = Set([((1, 2), (3, 4))])
634
635#==============================================================================
636
637def makeAllTests():
638 suite = unittest.TestSuite()
Tim Peters62c62432002-08-25 17:49:04 +0000639 for klass in (TestSetOfSets,
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000640 TestExceptionPropagation,
Tim Peters62c62432002-08-25 17:49:04 +0000641 TestBasicOpsEmpty,
642 TestBasicOpsSingleton,
643 TestBasicOpsTuple,
644 TestBasicOpsTriple,
645 TestBinaryOps,
646 TestUpdateOps,
647 TestMutate,
648 TestSubsetEqualEmpty,
649 TestSubsetEqualNonEmpty,
650 TestSubsetEmptyNonEmpty,
651 TestSubsetPartial,
652 TestSubsetNonOverlap,
653 TestOnlySetsNumeric,
654 TestOnlySetsDict,
655 TestOnlySetsOperator,
656 TestCopyingEmpty,
657 TestCopyingSingleton,
658 TestCopyingTriple,
659 TestCopyingTuple,
660 TestCopyingNested,
661 ):
662 suite.addTest(unittest.makeSuite(klass))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000663 return suite
664
665#------------------------------------------------------------------------------
666
667def test_main():
668 suite = makeAllTests()
669 test_support.run_suite(suite)
670
671if __name__ == "__main__":
672 test_main()