blob: 76b56b118d861f3449b9e76636c9c0e1cdf4c031 [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 Hettinger1eb1fb82002-11-08 05:03:21 +0000135def baditer():
136 raise TypeError
137 yield True
138
139def gooditer():
140 yield True
141
142class TestExceptionPropagation(unittest.TestCase):
143 """SF 628246: Set constructor should not trap iterator TypeErrors"""
144
145 def test_instanceWithException(self):
146 self.assertRaises(TypeError, Set, baditer())
147
148 def test_instancesWithoutException(self):
149 """All of these iterables should load without exception."""
150 Set([1,2,3])
151 Set((1,2,3))
152 Set({'one':1, 'two':2, 'three':3})
153 Set(xrange(3))
154 Set('abc')
155 Set(gooditer())
156
157#==============================================================================
158
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000159class TestSetOfSets(unittest.TestCase):
160 def test_constructor(self):
161 inner = Set([1])
162 outer = Set([inner])
163 element = outer.pop()
Tim Peters4127e912002-08-25 18:02:29 +0000164 self.assertEqual(type(element), ImmutableSet)
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000165 outer.add(inner) # Rebuild set of sets with .add method
166 outer.remove(inner)
Tim Peters4127e912002-08-25 18:02:29 +0000167 self.assertEqual(outer, Set()) # Verify that remove worked
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000168 outer.discard(inner) # Absence of KeyError indicates working fine
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000169
170#==============================================================================
171
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000172class TestBinaryOps(unittest.TestCase):
173 def setUp(self):
174 self.set = Set((2, 4, 6))
175
176 def test_union_subset(self):
177 result = self.set | Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000178 self.assertEqual(result, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000179
180 def test_union_superset(self):
181 result = self.set | Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000182 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000183
184 def test_union_overlap(self):
185 result = self.set | Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000186 self.assertEqual(result, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000187
188 def test_union_non_overlap(self):
189 result = self.set | Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000190 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000191
192 def test_intersection_subset(self):
193 result = self.set & Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000194 self.assertEqual(result, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000195
196 def test_intersection_superset(self):
197 result = self.set & Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000198 self.assertEqual(result, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000199
200 def test_intersection_overlap(self):
201 result = self.set & Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000202 self.assertEqual(result, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000203
204 def test_intersection_non_overlap(self):
205 result = self.set & Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000206 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000207
208 def test_sym_difference_subset(self):
209 result = self.set ^ Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000210 self.assertEqual(result, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000211
212 def test_sym_difference_superset(self):
213 result = self.set ^ Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000214 self.assertEqual(result, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000215
216 def test_sym_difference_overlap(self):
217 result = self.set ^ Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000218 self.assertEqual(result, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000219
220 def test_sym_difference_non_overlap(self):
221 result = self.set ^ Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000222 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000223
224#==============================================================================
225
226class TestUpdateOps(unittest.TestCase):
227 def setUp(self):
228 self.set = Set((2, 4, 6))
229
230 def test_union_subset(self):
231 self.set |= Set([2])
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_union_superset(self):
235 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000236 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000237
238 def test_union_overlap(self):
239 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000240 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000241
242 def test_union_non_overlap(self):
243 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000244 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000245
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000246 def test_union_method_call(self):
247 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000248 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000249
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000250 def test_intersection_subset(self):
251 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000252 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000253
254 def test_intersection_superset(self):
255 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000256 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000257
258 def test_intersection_overlap(self):
259 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000260 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000261
262 def test_intersection_non_overlap(self):
263 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000264 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000265
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000266 def test_intersection_method_call(self):
267 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000268 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000269
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000270 def test_sym_difference_subset(self):
271 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000272 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000273
274 def test_sym_difference_superset(self):
275 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000276 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000277
278 def test_sym_difference_overlap(self):
279 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000280 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000281
282 def test_sym_difference_non_overlap(self):
283 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000284 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000285
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000286 def test_sym_difference_method_call(self):
287 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000288 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000289
290 def test_difference_subset(self):
291 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000292 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000293
294 def test_difference_superset(self):
295 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000296 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000297
298 def test_difference_overlap(self):
299 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000300 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000301
302 def test_difference_non_overlap(self):
303 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000304 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000305
306 def test_difference_method_call(self):
307 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000308 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000309
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000310#==============================================================================
311
312class TestMutate(unittest.TestCase):
313 def setUp(self):
314 self.values = ["a", "b", "c"]
315 self.set = Set(self.values)
316
317 def test_add_present(self):
318 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000319 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000320
321 def test_add_absent(self):
322 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000323 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000324
325 def test_add_until_full(self):
326 tmp = Set()
327 expected_len = 0
328 for v in self.values:
329 tmp.add(v)
330 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000331 self.assertEqual(len(tmp), expected_len)
332 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000333
334 def test_remove_present(self):
335 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000336 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000337
338 def test_remove_absent(self):
339 try:
340 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000341 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000342 except LookupError:
343 pass
344
345 def test_remove_until_empty(self):
346 expected_len = len(self.set)
347 for v in self.values:
348 self.set.remove(v)
349 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000350 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000351
352 def test_discard_present(self):
353 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000354 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000355
356 def test_discard_absent(self):
357 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000358 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000359
360 def test_clear(self):
361 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000362 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000363
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000364 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000365 popped = {}
366 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000367 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000368 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000369 for v in self.values:
Tim Peters4127e912002-08-25 18:02:29 +0000370 self.failUnless(v in popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000371
372 def test_update_empty_tuple(self):
373 self.set.update(())
Tim Petersa7777992002-08-25 17:38:49 +0000374 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000375
376 def test_update_unit_tuple_overlap(self):
377 self.set.update(("a",))
Tim Petersa7777992002-08-25 17:38:49 +0000378 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000379
380 def test_update_unit_tuple_non_overlap(self):
381 self.set.update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000382 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000383
384#==============================================================================
385
386class TestSubsets(unittest.TestCase):
387
Tim Peters93d8d482002-08-25 18:21:47 +0000388 case2method = {"<=": "issubset",
389 ">=": "issuperset",
390 }
Tim Petersea76c982002-08-25 18:43:10 +0000391
392 reverse = {"==": "==",
393 "!=": "!=",
394 "<": ">",
395 ">": "<",
396 "<=": ">=",
397 ">=": "<=",
398 }
Tim Peters93d8d482002-08-25 18:21:47 +0000399
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000400 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000401 x = self.left
402 y = self.right
403 for case in "!=", "==", "<", "<=", ">", ">=":
404 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000405 # Test the binary infix spelling.
406 result = eval("x" + case + "y", locals())
407 self.assertEqual(result, expected)
408 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000409 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000410 method = getattr(x, TestSubsets.case2method[case])
411 result = method(y)
412 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000413
Tim Petersea76c982002-08-25 18:43:10 +0000414 # Now do the same for the operands reversed.
415 rcase = TestSubsets.reverse[case]
416 result = eval("y" + rcase + "x", locals())
417 self.assertEqual(result, expected)
418 if rcase in TestSubsets.case2method:
419 method = getattr(y, TestSubsets.case2method[rcase])
420 result = method(x)
421 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000422#------------------------------------------------------------------------------
423
424class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000425 left = Set()
426 right = Set()
427 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000428 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000429
430#------------------------------------------------------------------------------
431
432class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000433 left = Set([1, 2])
434 right = Set([1, 2])
435 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000436 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000437
438#------------------------------------------------------------------------------
439
440class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000441 left = Set()
442 right = Set([1, 2])
443 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000444 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000445
446#------------------------------------------------------------------------------
447
448class TestSubsetPartial(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000449 left = Set([1])
450 right = Set([1, 2])
Tim Petersea76c982002-08-25 18:43:10 +0000451 name = "one a non-empty proper subset of other"
Tim Peters93d8d482002-08-25 18:21:47 +0000452 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000453
454#------------------------------------------------------------------------------
455
456class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000457 left = Set([1])
458 right = Set([2])
459 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000460 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000461
462#==============================================================================
463
464class TestOnlySetsInBinaryOps(unittest.TestCase):
465
466 def test_cmp(self):
467 try:
Raymond Hettingere87ab3f2002-08-24 07:33:06 +0000468 self.other == self.set
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 try:
Raymond Hettingere87ab3f2002-08-24 07:33:06 +0000473 self.set != self.other
Tim Peters4127e912002-08-25 18:02:29 +0000474 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000475 except TypeError:
476 pass
477
478 def test_union_update(self):
479 try:
480 self.set |= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000481 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000482 except TypeError:
483 pass
484
485 def test_union(self):
486 try:
487 self.other | self.set
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 try:
492 self.set | self.other
Tim Peters4127e912002-08-25 18:02:29 +0000493 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000494 except TypeError:
495 pass
496
497 def test_intersection_update(self):
498 try:
499 self.set &= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000500 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000501 except TypeError:
502 pass
503
504 def test_intersection(self):
505 try:
506 self.other & self.set
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 try:
511 self.set & self.other
Tim Peters4127e912002-08-25 18:02:29 +0000512 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000513 except TypeError:
514 pass
515
516 def test_sym_difference_update(self):
517 try:
518 self.set ^= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000519 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000520 except TypeError:
521 pass
522
523 def test_sym_difference(self):
524 try:
525 self.other ^ self.set
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 try:
530 self.set ^ self.other
Tim Peters4127e912002-08-25 18:02:29 +0000531 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000532 except TypeError:
533 pass
534
535 def test_difference_update(self):
536 try:
537 self.set -= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000538 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000539 except TypeError:
540 pass
541
542 def test_difference(self):
543 try:
544 self.other - self.set
Tim Peters4127e912002-08-25 18:02:29 +0000545 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000546 except TypeError:
547 pass
548 try:
549 self.set - self.other
Tim Peters4127e912002-08-25 18:02:29 +0000550 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000551 except TypeError:
552 pass
553
554#------------------------------------------------------------------------------
555
556class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
557 def setUp(self):
558 self.set = Set((1, 2, 3))
559 self.other = 19
560
561#------------------------------------------------------------------------------
562
563class TestOnlySetsDict(TestOnlySetsInBinaryOps):
564 def setUp(self):
565 self.set = Set((1, 2, 3))
566 self.other = {1:2, 3:4}
567
568#------------------------------------------------------------------------------
569
570class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
571 def setUp(self):
572 self.set = Set((1, 2, 3))
573 self.other = operator.add
574
575#==============================================================================
576
577class TestCopying(unittest.TestCase):
578
579 def test_copy(self):
580 dup = self.set.copy()
581 dup_list = list(dup); dup_list.sort()
582 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000583 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000584 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000585 self.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000586
587 def test_deep_copy(self):
588 dup = copy.deepcopy(self.set)
589 ##print type(dup), `dup`
590 dup_list = list(dup); dup_list.sort()
591 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000592 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000593 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000594 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000595
596#------------------------------------------------------------------------------
597
598class TestCopyingEmpty(TestCopying):
599 def setUp(self):
600 self.set = Set()
601
602#------------------------------------------------------------------------------
603
604class TestCopyingSingleton(TestCopying):
605 def setUp(self):
606 self.set = Set(["hello"])
607
608#------------------------------------------------------------------------------
609
610class TestCopyingTriple(TestCopying):
611 def setUp(self):
612 self.set = Set(["zero", 0, None])
613
614#------------------------------------------------------------------------------
615
616class TestCopyingTuple(TestCopying):
617 def setUp(self):
618 self.set = Set([(1, 2)])
619
620#------------------------------------------------------------------------------
621
622class TestCopyingNested(TestCopying):
623 def setUp(self):
624 self.set = Set([((1, 2), (3, 4))])
625
626#==============================================================================
627
628def makeAllTests():
629 suite = unittest.TestSuite()
Tim Peters62c62432002-08-25 17:49:04 +0000630 for klass in (TestSetOfSets,
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000631 TestExceptionPropagation,
Tim Peters62c62432002-08-25 17:49:04 +0000632 TestBasicOpsEmpty,
633 TestBasicOpsSingleton,
634 TestBasicOpsTuple,
635 TestBasicOpsTriple,
636 TestBinaryOps,
637 TestUpdateOps,
638 TestMutate,
639 TestSubsetEqualEmpty,
640 TestSubsetEqualNonEmpty,
641 TestSubsetEmptyNonEmpty,
642 TestSubsetPartial,
643 TestSubsetNonOverlap,
644 TestOnlySetsNumeric,
645 TestOnlySetsDict,
646 TestOnlySetsOperator,
647 TestCopyingEmpty,
648 TestCopyingSingleton,
649 TestCopyingTriple,
650 TestCopyingTuple,
651 TestCopyingNested,
652 ):
653 suite.addTest(unittest.makeSuite(klass))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000654 return suite
655
656#------------------------------------------------------------------------------
657
658def test_main():
659 suite = makeAllTests()
660 test_support.run_suite(suite)
661
662if __name__ == "__main__":
663 test_main()