blob: 9bc3eeba748045e0d6cf7feba627ec49f277427b [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
182 def test_union_subset(self):
183 result = self.set | Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000184 self.assertEqual(result, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000185
186 def test_union_superset(self):
187 result = self.set | Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000188 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000189
190 def test_union_overlap(self):
191 result = self.set | Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000192 self.assertEqual(result, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000193
194 def test_union_non_overlap(self):
195 result = self.set | Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000196 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000197
198 def test_intersection_subset(self):
199 result = self.set & Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000200 self.assertEqual(result, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000201
202 def test_intersection_superset(self):
203 result = self.set & Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000204 self.assertEqual(result, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000205
206 def test_intersection_overlap(self):
207 result = self.set & Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000208 self.assertEqual(result, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000209
210 def test_intersection_non_overlap(self):
211 result = self.set & Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000212 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000213
214 def test_sym_difference_subset(self):
215 result = self.set ^ Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000216 self.assertEqual(result, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000217
218 def test_sym_difference_superset(self):
219 result = self.set ^ Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000220 self.assertEqual(result, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000221
222 def test_sym_difference_overlap(self):
223 result = self.set ^ Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000224 self.assertEqual(result, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000225
226 def test_sym_difference_non_overlap(self):
227 result = self.set ^ Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000228 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000229
230#==============================================================================
231
232class TestUpdateOps(unittest.TestCase):
233 def setUp(self):
234 self.set = Set((2, 4, 6))
235
236 def test_union_subset(self):
237 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000238 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000239
240 def test_union_superset(self):
241 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000242 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000243
244 def test_union_overlap(self):
245 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000246 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000247
248 def test_union_non_overlap(self):
249 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000250 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000251
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000252 def test_union_method_call(self):
253 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000254 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000255
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000256 def test_intersection_subset(self):
257 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000258 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000259
260 def test_intersection_superset(self):
261 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000262 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000263
264 def test_intersection_overlap(self):
265 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000266 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000267
268 def test_intersection_non_overlap(self):
269 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000270 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000271
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000272 def test_intersection_method_call(self):
273 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000274 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000275
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000276 def test_sym_difference_subset(self):
277 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000278 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000279
280 def test_sym_difference_superset(self):
281 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000282 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000283
284 def test_sym_difference_overlap(self):
285 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000286 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000287
288 def test_sym_difference_non_overlap(self):
289 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000290 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000291
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000292 def test_sym_difference_method_call(self):
293 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000294 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000295
296 def test_difference_subset(self):
297 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000298 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000299
300 def test_difference_superset(self):
301 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000302 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000303
304 def test_difference_overlap(self):
305 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000306 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000307
308 def test_difference_non_overlap(self):
309 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000310 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000311
312 def test_difference_method_call(self):
313 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000314 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000315
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000316#==============================================================================
317
318class TestMutate(unittest.TestCase):
319 def setUp(self):
320 self.values = ["a", "b", "c"]
321 self.set = Set(self.values)
322
323 def test_add_present(self):
324 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000325 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000326
327 def test_add_absent(self):
328 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000329 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000330
331 def test_add_until_full(self):
332 tmp = Set()
333 expected_len = 0
334 for v in self.values:
335 tmp.add(v)
336 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000337 self.assertEqual(len(tmp), expected_len)
338 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000339
340 def test_remove_present(self):
341 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000342 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000343
344 def test_remove_absent(self):
345 try:
346 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000347 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000348 except LookupError:
349 pass
350
351 def test_remove_until_empty(self):
352 expected_len = len(self.set)
353 for v in self.values:
354 self.set.remove(v)
355 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000356 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000357
358 def test_discard_present(self):
359 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000360 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000361
362 def test_discard_absent(self):
363 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000364 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000365
366 def test_clear(self):
367 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000368 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000369
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000370 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000371 popped = {}
372 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000373 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000374 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000375 for v in self.values:
Tim Peters4127e912002-08-25 18:02:29 +0000376 self.failUnless(v in popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000377
378 def test_update_empty_tuple(self):
379 self.set.update(())
Tim Petersa7777992002-08-25 17:38:49 +0000380 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000381
382 def test_update_unit_tuple_overlap(self):
383 self.set.update(("a",))
Tim Petersa7777992002-08-25 17:38:49 +0000384 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000385
386 def test_update_unit_tuple_non_overlap(self):
387 self.set.update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000388 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000389
390#==============================================================================
391
392class TestSubsets(unittest.TestCase):
393
Tim Peters93d8d482002-08-25 18:21:47 +0000394 case2method = {"<=": "issubset",
395 ">=": "issuperset",
396 }
Tim Petersea76c982002-08-25 18:43:10 +0000397
398 reverse = {"==": "==",
399 "!=": "!=",
400 "<": ">",
401 ">": "<",
402 "<=": ">=",
403 ">=": "<=",
404 }
Tim Peters93d8d482002-08-25 18:21:47 +0000405
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000406 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000407 x = self.left
408 y = self.right
409 for case in "!=", "==", "<", "<=", ">", ">=":
410 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000411 # Test the binary infix spelling.
412 result = eval("x" + case + "y", locals())
413 self.assertEqual(result, expected)
414 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000415 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000416 method = getattr(x, TestSubsets.case2method[case])
417 result = method(y)
418 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000419
Tim Petersea76c982002-08-25 18:43:10 +0000420 # Now do the same for the operands reversed.
421 rcase = TestSubsets.reverse[case]
422 result = eval("y" + rcase + "x", locals())
423 self.assertEqual(result, expected)
424 if rcase in TestSubsets.case2method:
425 method = getattr(y, TestSubsets.case2method[rcase])
426 result = method(x)
427 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000428#------------------------------------------------------------------------------
429
430class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000431 left = Set()
432 right = Set()
433 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000434 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000435
436#------------------------------------------------------------------------------
437
438class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000439 left = Set([1, 2])
440 right = Set([1, 2])
441 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000442 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000443
444#------------------------------------------------------------------------------
445
446class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000447 left = Set()
448 right = Set([1, 2])
449 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000450 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000451
452#------------------------------------------------------------------------------
453
454class TestSubsetPartial(TestSubsets):
Tim Peters3de75262002-11-09 05:26:15 +0000455 left = Set([1])
456 right = Set([1, 2])
457 name = "one a non-empty proper subset of other"
458 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000459
460#------------------------------------------------------------------------------
461
462class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000463 left = Set([1])
464 right = Set([2])
465 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000466 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000467
468#==============================================================================
469
470class TestOnlySetsInBinaryOps(unittest.TestCase):
471
472 def test_cmp(self):
473 try:
Raymond Hettingere87ab3f2002-08-24 07:33:06 +0000474 self.other == self.set
Tim Peters4127e912002-08-25 18:02:29 +0000475 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000476 except TypeError:
477 pass
478 try:
Raymond Hettingere87ab3f2002-08-24 07:33:06 +0000479 self.set != self.other
Tim Peters4127e912002-08-25 18:02:29 +0000480 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000481 except TypeError:
482 pass
483
484 def test_union_update(self):
485 try:
486 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(self):
492 try:
493 self.other | self.set
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 try:
498 self.set | self.other
Tim Peters4127e912002-08-25 18:02:29 +0000499 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000500 except TypeError:
501 pass
502
503 def test_intersection_update(self):
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(self):
511 try:
512 self.other & self.set
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 try:
517 self.set & self.other
Tim Peters4127e912002-08-25 18:02:29 +0000518 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000519 except TypeError:
520 pass
521
522 def test_sym_difference_update(self):
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(self):
530 try:
531 self.other ^ self.set
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 try:
536 self.set ^ self.other
Tim Peters4127e912002-08-25 18:02:29 +0000537 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000538 except TypeError:
539 pass
540
541 def test_difference_update(self):
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(self):
549 try:
550 self.other - self.set
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 try:
555 self.set - self.other
Tim Peters4127e912002-08-25 18:02:29 +0000556 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000557 except TypeError:
558 pass
559
560#------------------------------------------------------------------------------
561
562class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
563 def setUp(self):
564 self.set = Set((1, 2, 3))
565 self.other = 19
566
567#------------------------------------------------------------------------------
568
569class TestOnlySetsDict(TestOnlySetsInBinaryOps):
570 def setUp(self):
571 self.set = Set((1, 2, 3))
572 self.other = {1:2, 3:4}
573
574#------------------------------------------------------------------------------
575
576class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
577 def setUp(self):
578 self.set = Set((1, 2, 3))
579 self.other = operator.add
580
581#==============================================================================
582
583class TestCopying(unittest.TestCase):
584
585 def test_copy(self):
586 dup = self.set.copy()
587 dup_list = list(dup); dup_list.sort()
588 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000589 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000590 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000591 self.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000592
593 def test_deep_copy(self):
594 dup = copy.deepcopy(self.set)
595 ##print type(dup), `dup`
596 dup_list = list(dup); dup_list.sort()
597 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000598 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000599 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000600 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000601
602#------------------------------------------------------------------------------
603
604class TestCopyingEmpty(TestCopying):
605 def setUp(self):
606 self.set = Set()
607
608#------------------------------------------------------------------------------
609
610class TestCopyingSingleton(TestCopying):
611 def setUp(self):
612 self.set = Set(["hello"])
613
614#------------------------------------------------------------------------------
615
616class TestCopyingTriple(TestCopying):
617 def setUp(self):
618 self.set = Set(["zero", 0, None])
619
620#------------------------------------------------------------------------------
621
622class TestCopyingTuple(TestCopying):
623 def setUp(self):
624 self.set = Set([(1, 2)])
625
626#------------------------------------------------------------------------------
627
628class TestCopyingNested(TestCopying):
629 def setUp(self):
630 self.set = Set([((1, 2), (3, 4))])
631
632#==============================================================================
633
634def makeAllTests():
635 suite = unittest.TestSuite()
Tim Peters62c62432002-08-25 17:49:04 +0000636 for klass in (TestSetOfSets,
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000637 TestExceptionPropagation,
Tim Peters62c62432002-08-25 17:49:04 +0000638 TestBasicOpsEmpty,
639 TestBasicOpsSingleton,
640 TestBasicOpsTuple,
641 TestBasicOpsTriple,
642 TestBinaryOps,
643 TestUpdateOps,
644 TestMutate,
645 TestSubsetEqualEmpty,
646 TestSubsetEqualNonEmpty,
647 TestSubsetEmptyNonEmpty,
648 TestSubsetPartial,
649 TestSubsetNonOverlap,
650 TestOnlySetsNumeric,
651 TestOnlySetsDict,
652 TestOnlySetsOperator,
653 TestCopyingEmpty,
654 TestCopyingSingleton,
655 TestCopyingTriple,
656 TestCopyingTuple,
657 TestCopyingNested,
658 ):
659 suite.addTest(unittest.makeSuite(klass))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000660 return suite
661
662#------------------------------------------------------------------------------
663
664def test_main():
665 suite = makeAllTests()
666 test_support.run_suite(suite)
667
668if __name__ == "__main__":
669 test_main()