blob: 840036cc654d8c9f97b700ffdebf8cac8770bc37 [file] [log] [blame]
Guido van Rossumd6cf3af2002-08-19 16:19:15 +00001#!/usr/bin/env python
2
3import unittest, operator, copy
4from 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
77#------------------------------------------------------------------------------
78
79class TestBasicOpsEmpty(TestBasicOps):
80 def setUp(self):
81 self.case = "empty set"
82 self.values = []
83 self.set = Set(self.values)
84 self.dup = Set(self.values)
85 self.length = 0
86 self.repr = "Set([])"
87
88#------------------------------------------------------------------------------
89
90class TestBasicOpsSingleton(TestBasicOps):
91 def setUp(self):
92 self.case = "unit set (number)"
93 self.values = [3]
94 self.set = Set(self.values)
95 self.dup = Set(self.values)
96 self.length = 1
97 self.repr = "Set([3])"
98
99 def test_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000100 self.failUnless(3 in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000101
102 def test_not_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000103 self.failUnless(2 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000104
105#------------------------------------------------------------------------------
106
107class TestBasicOpsTuple(TestBasicOps):
108 def setUp(self):
109 self.case = "unit set (tuple)"
110 self.values = [(0, "zero")]
111 self.set = Set(self.values)
112 self.dup = Set(self.values)
113 self.length = 1
114 self.repr = "Set([(0, 'zero')])"
115
116 def test_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000117 self.failUnless((0, "zero") in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000118
119 def test_not_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000120 self.failUnless(9 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000121
122#------------------------------------------------------------------------------
123
124class TestBasicOpsTriple(TestBasicOps):
125 def setUp(self):
126 self.case = "triple set"
127 self.values = [0, "zero", operator.add]
128 self.set = Set(self.values)
129 self.dup = Set(self.values)
130 self.length = 3
131 self.repr = None
132
133#==============================================================================
134
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000135class TestSetOfSets(unittest.TestCase):
136 def test_constructor(self):
137 inner = Set([1])
138 outer = Set([inner])
139 element = outer.pop()
Tim Peters4127e912002-08-25 18:02:29 +0000140 self.assertEqual(type(element), ImmutableSet)
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000141 outer.add(inner) # Rebuild set of sets with .add method
142 outer.remove(inner)
Tim Peters4127e912002-08-25 18:02:29 +0000143 self.assertEqual(outer, Set()) # Verify that remove worked
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000144 outer.discard(inner) # Absence of KeyError indicates working fine
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000145
146#==============================================================================
147
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000148class TestBinaryOps(unittest.TestCase):
149 def setUp(self):
150 self.set = Set((2, 4, 6))
151
152 def test_union_subset(self):
153 result = self.set | Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000154 self.assertEqual(result, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000155
156 def test_union_superset(self):
157 result = self.set | Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000158 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000159
160 def test_union_overlap(self):
161 result = self.set | Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000162 self.assertEqual(result, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000163
164 def test_union_non_overlap(self):
165 result = self.set | Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000166 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000167
168 def test_intersection_subset(self):
169 result = self.set & Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000170 self.assertEqual(result, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000171
172 def test_intersection_superset(self):
173 result = self.set & Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000174 self.assertEqual(result, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000175
176 def test_intersection_overlap(self):
177 result = self.set & Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000178 self.assertEqual(result, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000179
180 def test_intersection_non_overlap(self):
181 result = self.set & Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000182 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000183
184 def test_sym_difference_subset(self):
185 result = self.set ^ Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000186 self.assertEqual(result, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000187
188 def test_sym_difference_superset(self):
189 result = self.set ^ Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000190 self.assertEqual(result, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000191
192 def test_sym_difference_overlap(self):
193 result = self.set ^ Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000194 self.assertEqual(result, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000195
196 def test_sym_difference_non_overlap(self):
197 result = self.set ^ Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000198 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000199
200#==============================================================================
201
202class TestUpdateOps(unittest.TestCase):
203 def setUp(self):
204 self.set = Set((2, 4, 6))
205
206 def test_union_subset(self):
207 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000208 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000209
210 def test_union_superset(self):
211 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000212 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000213
214 def test_union_overlap(self):
215 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000216 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000217
218 def test_union_non_overlap(self):
219 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000220 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000221
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000222 def test_union_method_call(self):
223 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000224 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000225
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000226 def test_intersection_subset(self):
227 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000228 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000229
230 def test_intersection_superset(self):
231 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000232 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000233
234 def test_intersection_overlap(self):
235 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000236 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000237
238 def test_intersection_non_overlap(self):
239 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000240 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000241
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000242 def test_intersection_method_call(self):
243 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000244 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000245
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000246 def test_sym_difference_subset(self):
247 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000248 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000249
250 def test_sym_difference_superset(self):
251 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000252 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000253
254 def test_sym_difference_overlap(self):
255 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000256 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000257
258 def test_sym_difference_non_overlap(self):
259 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000260 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000261
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000262 def test_sym_difference_method_call(self):
263 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000264 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000265
266 def test_difference_subset(self):
267 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000268 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000269
270 def test_difference_superset(self):
271 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000272 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000273
274 def test_difference_overlap(self):
275 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000276 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000277
278 def test_difference_non_overlap(self):
279 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000280 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000281
282 def test_difference_method_call(self):
283 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000284 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000285
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000286#==============================================================================
287
288class TestMutate(unittest.TestCase):
289 def setUp(self):
290 self.values = ["a", "b", "c"]
291 self.set = Set(self.values)
292
293 def test_add_present(self):
294 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000295 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000296
297 def test_add_absent(self):
298 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000299 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000300
301 def test_add_until_full(self):
302 tmp = Set()
303 expected_len = 0
304 for v in self.values:
305 tmp.add(v)
306 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000307 self.assertEqual(len(tmp), expected_len)
308 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000309
310 def test_remove_present(self):
311 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000312 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000313
314 def test_remove_absent(self):
315 try:
316 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000317 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000318 except LookupError:
319 pass
320
321 def test_remove_until_empty(self):
322 expected_len = len(self.set)
323 for v in self.values:
324 self.set.remove(v)
325 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000326 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000327
328 def test_discard_present(self):
329 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000330 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000331
332 def test_discard_absent(self):
333 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000334 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000335
336 def test_clear(self):
337 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000338 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000339
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000340 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000341 popped = {}
342 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000343 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000344 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000345 for v in self.values:
Tim Peters4127e912002-08-25 18:02:29 +0000346 self.failUnless(v in popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000347
348 def test_update_empty_tuple(self):
349 self.set.update(())
Tim Petersa7777992002-08-25 17:38:49 +0000350 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000351
352 def test_update_unit_tuple_overlap(self):
353 self.set.update(("a",))
Tim Petersa7777992002-08-25 17:38:49 +0000354 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000355
356 def test_update_unit_tuple_non_overlap(self):
357 self.set.update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000358 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000359
360#==============================================================================
361
362class TestSubsets(unittest.TestCase):
363
Tim Peters93d8d482002-08-25 18:21:47 +0000364 case2method = {"<=": "issubset",
365 ">=": "issuperset",
366 }
Tim Petersea76c982002-08-25 18:43:10 +0000367
368 reverse = {"==": "==",
369 "!=": "!=",
370 "<": ">",
371 ">": "<",
372 "<=": ">=",
373 ">=": "<=",
374 }
Tim Peters93d8d482002-08-25 18:21:47 +0000375
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000376 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000377 x = self.left
378 y = self.right
379 for case in "!=", "==", "<", "<=", ">", ">=":
380 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000381 # Test the binary infix spelling.
382 result = eval("x" + case + "y", locals())
383 self.assertEqual(result, expected)
384 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000385 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000386 method = getattr(x, TestSubsets.case2method[case])
387 result = method(y)
388 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000389
Tim Petersea76c982002-08-25 18:43:10 +0000390 # Now do the same for the operands reversed.
391 rcase = TestSubsets.reverse[case]
392 result = eval("y" + rcase + "x", locals())
393 self.assertEqual(result, expected)
394 if rcase in TestSubsets.case2method:
395 method = getattr(y, TestSubsets.case2method[rcase])
396 result = method(x)
397 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000398#------------------------------------------------------------------------------
399
400class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000401 left = Set()
402 right = Set()
403 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000404 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000405
406#------------------------------------------------------------------------------
407
408class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000409 left = Set([1, 2])
410 right = Set([1, 2])
411 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000412 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000413
414#------------------------------------------------------------------------------
415
416class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000417 left = Set()
418 right = Set([1, 2])
419 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000420 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000421
422#------------------------------------------------------------------------------
423
424class TestSubsetPartial(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000425 left = Set([1])
426 right = Set([1, 2])
Tim Petersea76c982002-08-25 18:43:10 +0000427 name = "one a non-empty proper subset of other"
Tim Peters93d8d482002-08-25 18:21:47 +0000428 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000429
430#------------------------------------------------------------------------------
431
432class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000433 left = Set([1])
434 right = Set([2])
435 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000436 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000437
438#==============================================================================
439
440class TestOnlySetsInBinaryOps(unittest.TestCase):
441
442 def test_cmp(self):
443 try:
Raymond Hettingere87ab3f2002-08-24 07:33:06 +0000444 self.other == self.set
Tim Peters4127e912002-08-25 18:02:29 +0000445 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000446 except TypeError:
447 pass
448 try:
Raymond Hettingere87ab3f2002-08-24 07:33:06 +0000449 self.set != self.other
Tim Peters4127e912002-08-25 18:02:29 +0000450 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000451 except TypeError:
452 pass
453
454 def test_union_update(self):
455 try:
456 self.set |= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000457 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000458 except TypeError:
459 pass
460
461 def test_union(self):
462 try:
463 self.other | self.set
Tim Peters4127e912002-08-25 18:02:29 +0000464 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000465 except TypeError:
466 pass
467 try:
468 self.set | self.other
Tim Peters4127e912002-08-25 18:02:29 +0000469 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000470 except TypeError:
471 pass
472
473 def test_intersection_update(self):
474 try:
475 self.set &= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000476 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000477 except TypeError:
478 pass
479
480 def test_intersection(self):
481 try:
482 self.other & self.set
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 try:
487 self.set & self.other
Tim Peters4127e912002-08-25 18:02:29 +0000488 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000489 except TypeError:
490 pass
491
492 def test_sym_difference_update(self):
493 try:
494 self.set ^= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000495 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000496 except TypeError:
497 pass
498
499 def test_sym_difference(self):
500 try:
501 self.other ^ self.set
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 try:
506 self.set ^ self.other
Tim Peters4127e912002-08-25 18:02:29 +0000507 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000508 except TypeError:
509 pass
510
511 def test_difference_update(self):
512 try:
513 self.set -= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000514 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000515 except TypeError:
516 pass
517
518 def test_difference(self):
519 try:
520 self.other - self.set
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 try:
525 self.set - self.other
Tim Peters4127e912002-08-25 18:02:29 +0000526 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000527 except TypeError:
528 pass
529
530#------------------------------------------------------------------------------
531
532class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
533 def setUp(self):
534 self.set = Set((1, 2, 3))
535 self.other = 19
536
537#------------------------------------------------------------------------------
538
539class TestOnlySetsDict(TestOnlySetsInBinaryOps):
540 def setUp(self):
541 self.set = Set((1, 2, 3))
542 self.other = {1:2, 3:4}
543
544#------------------------------------------------------------------------------
545
546class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
547 def setUp(self):
548 self.set = Set((1, 2, 3))
549 self.other = operator.add
550
551#==============================================================================
552
553class TestCopying(unittest.TestCase):
554
555 def test_copy(self):
556 dup = self.set.copy()
557 dup_list = list(dup); dup_list.sort()
558 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000559 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000560 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000561 self.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000562
563 def test_deep_copy(self):
564 dup = copy.deepcopy(self.set)
565 ##print type(dup), `dup`
566 dup_list = list(dup); dup_list.sort()
567 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000568 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000569 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000570 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000571
572#------------------------------------------------------------------------------
573
574class TestCopyingEmpty(TestCopying):
575 def setUp(self):
576 self.set = Set()
577
578#------------------------------------------------------------------------------
579
580class TestCopyingSingleton(TestCopying):
581 def setUp(self):
582 self.set = Set(["hello"])
583
584#------------------------------------------------------------------------------
585
586class TestCopyingTriple(TestCopying):
587 def setUp(self):
588 self.set = Set(["zero", 0, None])
589
590#------------------------------------------------------------------------------
591
592class TestCopyingTuple(TestCopying):
593 def setUp(self):
594 self.set = Set([(1, 2)])
595
596#------------------------------------------------------------------------------
597
598class TestCopyingNested(TestCopying):
599 def setUp(self):
600 self.set = Set([((1, 2), (3, 4))])
601
602#==============================================================================
603
604def makeAllTests():
605 suite = unittest.TestSuite()
Tim Peters62c62432002-08-25 17:49:04 +0000606 for klass in (TestSetOfSets,
607 TestBasicOpsEmpty,
608 TestBasicOpsSingleton,
609 TestBasicOpsTuple,
610 TestBasicOpsTriple,
611 TestBinaryOps,
612 TestUpdateOps,
613 TestMutate,
614 TestSubsetEqualEmpty,
615 TestSubsetEqualNonEmpty,
616 TestSubsetEmptyNonEmpty,
617 TestSubsetPartial,
618 TestSubsetNonOverlap,
619 TestOnlySetsNumeric,
620 TestOnlySetsDict,
621 TestOnlySetsOperator,
622 TestCopyingEmpty,
623 TestCopyingSingleton,
624 TestCopyingTriple,
625 TestCopyingTuple,
626 TestCopyingNested,
627 ):
628 suite.addTest(unittest.makeSuite(klass))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000629 return suite
630
631#------------------------------------------------------------------------------
632
633def test_main():
634 suite = makeAllTests()
635 test_support.run_suite(suite)
636
637if __name__ == "__main__":
638 test_main()