blob: cf0cd59dc9978c8ae18f31e4a0b2d8c1212fed11 [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)
79 print repr(p)
80 copy = pickle.loads(p)
81 repr(copy)
82 self.assertEqual(self.set, copy,
83 "%s != %s" % (self.set, copy))
84
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000085#------------------------------------------------------------------------------
86
87class TestBasicOpsEmpty(TestBasicOps):
88 def setUp(self):
89 self.case = "empty set"
90 self.values = []
91 self.set = Set(self.values)
92 self.dup = Set(self.values)
93 self.length = 0
94 self.repr = "Set([])"
95
96#------------------------------------------------------------------------------
97
98class TestBasicOpsSingleton(TestBasicOps):
99 def setUp(self):
100 self.case = "unit set (number)"
101 self.values = [3]
102 self.set = Set(self.values)
103 self.dup = Set(self.values)
104 self.length = 1
105 self.repr = "Set([3])"
106
107 def test_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000108 self.failUnless(3 in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000109
110 def test_not_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000111 self.failUnless(2 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000112
113#------------------------------------------------------------------------------
114
115class TestBasicOpsTuple(TestBasicOps):
116 def setUp(self):
117 self.case = "unit set (tuple)"
118 self.values = [(0, "zero")]
119 self.set = Set(self.values)
120 self.dup = Set(self.values)
121 self.length = 1
122 self.repr = "Set([(0, 'zero')])"
123
124 def test_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000125 self.failUnless((0, "zero") in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000126
127 def test_not_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000128 self.failUnless(9 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000129
130#------------------------------------------------------------------------------
131
132class TestBasicOpsTriple(TestBasicOps):
133 def setUp(self):
134 self.case = "triple set"
135 self.values = [0, "zero", operator.add]
136 self.set = Set(self.values)
137 self.dup = Set(self.values)
138 self.length = 3
139 self.repr = None
140
141#==============================================================================
142
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000143def baditer():
144 raise TypeError
145 yield True
146
147def gooditer():
148 yield True
149
150class TestExceptionPropagation(unittest.TestCase):
151 """SF 628246: Set constructor should not trap iterator TypeErrors"""
152
153 def test_instanceWithException(self):
154 self.assertRaises(TypeError, Set, baditer())
155
156 def test_instancesWithoutException(self):
157 """All of these iterables should load without exception."""
158 Set([1,2,3])
159 Set((1,2,3))
160 Set({'one':1, 'two':2, 'three':3})
161 Set(xrange(3))
162 Set('abc')
163 Set(gooditer())
164
165#==============================================================================
166
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000167class TestSetOfSets(unittest.TestCase):
168 def test_constructor(self):
169 inner = Set([1])
170 outer = Set([inner])
171 element = outer.pop()
Tim Peters4127e912002-08-25 18:02:29 +0000172 self.assertEqual(type(element), ImmutableSet)
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000173 outer.add(inner) # Rebuild set of sets with .add method
174 outer.remove(inner)
Tim Peters4127e912002-08-25 18:02:29 +0000175 self.assertEqual(outer, Set()) # Verify that remove worked
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000176 outer.discard(inner) # Absence of KeyError indicates working fine
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000177
178#==============================================================================
179
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000180class TestBinaryOps(unittest.TestCase):
181 def setUp(self):
182 self.set = Set((2, 4, 6))
183
184 def test_union_subset(self):
185 result = self.set | Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000186 self.assertEqual(result, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000187
188 def test_union_superset(self):
189 result = self.set | Set([2, 4, 6, 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_union_overlap(self):
193 result = self.set | Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000194 self.assertEqual(result, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000195
196 def test_union_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 def test_intersection_subset(self):
201 result = self.set & Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000202 self.assertEqual(result, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000203
204 def test_intersection_superset(self):
205 result = self.set & Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000206 self.assertEqual(result, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000207
208 def test_intersection_overlap(self):
209 result = self.set & Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000210 self.assertEqual(result, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000211
212 def test_intersection_non_overlap(self):
213 result = self.set & Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000214 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000215
216 def test_sym_difference_subset(self):
217 result = self.set ^ Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000218 self.assertEqual(result, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000219
220 def test_sym_difference_superset(self):
221 result = self.set ^ Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000222 self.assertEqual(result, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000223
224 def test_sym_difference_overlap(self):
225 result = self.set ^ Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000226 self.assertEqual(result, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000227
228 def test_sym_difference_non_overlap(self):
229 result = self.set ^ Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000230 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000231
232#==============================================================================
233
234class TestUpdateOps(unittest.TestCase):
235 def setUp(self):
236 self.set = Set((2, 4, 6))
237
238 def test_union_subset(self):
239 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000240 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000241
242 def test_union_superset(self):
243 self.set |= Set([2, 4, 6, 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
246 def test_union_overlap(self):
247 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000248 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000249
250 def test_union_non_overlap(self):
251 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000252 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000253
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000254 def test_union_method_call(self):
255 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000256 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000257
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000258 def test_intersection_subset(self):
259 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000260 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000261
262 def test_intersection_superset(self):
263 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000264 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000265
266 def test_intersection_overlap(self):
267 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000268 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000269
270 def test_intersection_non_overlap(self):
271 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000272 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000273
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000274 def test_intersection_method_call(self):
275 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000276 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000277
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000278 def test_sym_difference_subset(self):
279 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000280 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000281
282 def test_sym_difference_superset(self):
283 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000284 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000285
286 def test_sym_difference_overlap(self):
287 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000288 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000289
290 def test_sym_difference_non_overlap(self):
291 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000292 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000293
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000294 def test_sym_difference_method_call(self):
295 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000296 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000297
298 def test_difference_subset(self):
299 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000300 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000301
302 def test_difference_superset(self):
303 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000304 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000305
306 def test_difference_overlap(self):
307 self.set -= 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
310 def test_difference_non_overlap(self):
311 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000312 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000313
314 def test_difference_method_call(self):
315 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000316 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000317
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000318#==============================================================================
319
320class TestMutate(unittest.TestCase):
321 def setUp(self):
322 self.values = ["a", "b", "c"]
323 self.set = Set(self.values)
324
325 def test_add_present(self):
326 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000327 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000328
329 def test_add_absent(self):
330 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000331 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000332
333 def test_add_until_full(self):
334 tmp = Set()
335 expected_len = 0
336 for v in self.values:
337 tmp.add(v)
338 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000339 self.assertEqual(len(tmp), expected_len)
340 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000341
342 def test_remove_present(self):
343 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000344 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000345
346 def test_remove_absent(self):
347 try:
348 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000349 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000350 except LookupError:
351 pass
352
353 def test_remove_until_empty(self):
354 expected_len = len(self.set)
355 for v in self.values:
356 self.set.remove(v)
357 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000358 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000359
360 def test_discard_present(self):
361 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000362 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000363
364 def test_discard_absent(self):
365 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000366 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000367
368 def test_clear(self):
369 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000370 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000371
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000372 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000373 popped = {}
374 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000375 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000376 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000377 for v in self.values:
Tim Peters4127e912002-08-25 18:02:29 +0000378 self.failUnless(v in popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000379
380 def test_update_empty_tuple(self):
381 self.set.update(())
Tim Petersa7777992002-08-25 17:38:49 +0000382 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000383
384 def test_update_unit_tuple_overlap(self):
385 self.set.update(("a",))
Tim Petersa7777992002-08-25 17:38:49 +0000386 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000387
388 def test_update_unit_tuple_non_overlap(self):
389 self.set.update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000390 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000391
392#==============================================================================
393
394class TestSubsets(unittest.TestCase):
395
Tim Peters93d8d482002-08-25 18:21:47 +0000396 case2method = {"<=": "issubset",
397 ">=": "issuperset",
398 }
Tim Petersea76c982002-08-25 18:43:10 +0000399
400 reverse = {"==": "==",
401 "!=": "!=",
402 "<": ">",
403 ">": "<",
404 "<=": ">=",
405 ">=": "<=",
406 }
Tim Peters93d8d482002-08-25 18:21:47 +0000407
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000408 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000409 x = self.left
410 y = self.right
411 for case in "!=", "==", "<", "<=", ">", ">=":
412 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000413 # Test the binary infix spelling.
414 result = eval("x" + case + "y", locals())
415 self.assertEqual(result, expected)
416 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000417 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000418 method = getattr(x, TestSubsets.case2method[case])
419 result = method(y)
420 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000421
Tim Petersea76c982002-08-25 18:43:10 +0000422 # Now do the same for the operands reversed.
423 rcase = TestSubsets.reverse[case]
424 result = eval("y" + rcase + "x", locals())
425 self.assertEqual(result, expected)
426 if rcase in TestSubsets.case2method:
427 method = getattr(y, TestSubsets.case2method[rcase])
428 result = method(x)
429 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000430#------------------------------------------------------------------------------
431
432class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000433 left = Set()
434 right = Set()
435 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000436 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000437
438#------------------------------------------------------------------------------
439
440class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000441 left = Set([1, 2])
442 right = Set([1, 2])
443 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000444 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000445
446#------------------------------------------------------------------------------
447
448class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000449 left = Set()
450 right = Set([1, 2])
451 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000452 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000453
454#------------------------------------------------------------------------------
455
456class TestSubsetPartial(TestSubsets):
Tim Peters3de75262002-11-09 05:26:15 +0000457 left = Set([1])
458 right = Set([1, 2])
459 name = "one a non-empty proper subset of other"
460 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000461
462#------------------------------------------------------------------------------
463
464class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000465 left = Set([1])
466 right = Set([2])
467 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000468 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000469
470#==============================================================================
471
472class TestOnlySetsInBinaryOps(unittest.TestCase):
473
474 def test_cmp(self):
475 try:
Raymond Hettingere87ab3f2002-08-24 07:33:06 +0000476 self.other == self.set
Tim Peters4127e912002-08-25 18:02:29 +0000477 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000478 except TypeError:
479 pass
480 try:
Raymond Hettingere87ab3f2002-08-24 07:33:06 +0000481 self.set != self.other
Tim Peters4127e912002-08-25 18:02:29 +0000482 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000483 except TypeError:
484 pass
485
486 def test_union_update(self):
487 try:
488 self.set |= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000489 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000490 except TypeError:
491 pass
492
493 def test_union(self):
494 try:
495 self.other | self.set
Tim Peters4127e912002-08-25 18:02:29 +0000496 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000497 except TypeError:
498 pass
499 try:
500 self.set | self.other
Tim Peters4127e912002-08-25 18:02:29 +0000501 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000502 except TypeError:
503 pass
504
505 def test_intersection_update(self):
506 try:
507 self.set &= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000508 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000509 except TypeError:
510 pass
511
512 def test_intersection(self):
513 try:
514 self.other & self.set
Tim Peters4127e912002-08-25 18:02:29 +0000515 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000516 except TypeError:
517 pass
518 try:
519 self.set & self.other
Tim Peters4127e912002-08-25 18:02:29 +0000520 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000521 except TypeError:
522 pass
523
524 def test_sym_difference_update(self):
525 try:
526 self.set ^= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000527 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000528 except TypeError:
529 pass
530
531 def test_sym_difference(self):
532 try:
533 self.other ^ self.set
Tim Peters4127e912002-08-25 18:02:29 +0000534 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000535 except TypeError:
536 pass
537 try:
538 self.set ^ self.other
Tim Peters4127e912002-08-25 18:02:29 +0000539 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000540 except TypeError:
541 pass
542
543 def test_difference_update(self):
544 try:
545 self.set -= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000546 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000547 except TypeError:
548 pass
549
550 def test_difference(self):
551 try:
552 self.other - self.set
Tim Peters4127e912002-08-25 18:02:29 +0000553 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000554 except TypeError:
555 pass
556 try:
557 self.set - self.other
Tim Peters4127e912002-08-25 18:02:29 +0000558 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000559 except TypeError:
560 pass
561
562#------------------------------------------------------------------------------
563
564class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
565 def setUp(self):
566 self.set = Set((1, 2, 3))
567 self.other = 19
568
569#------------------------------------------------------------------------------
570
571class TestOnlySetsDict(TestOnlySetsInBinaryOps):
572 def setUp(self):
573 self.set = Set((1, 2, 3))
574 self.other = {1:2, 3:4}
575
576#------------------------------------------------------------------------------
577
578class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
579 def setUp(self):
580 self.set = Set((1, 2, 3))
581 self.other = operator.add
582
583#==============================================================================
584
585class TestCopying(unittest.TestCase):
586
587 def test_copy(self):
588 dup = self.set.copy()
589 dup_list = list(dup); dup_list.sort()
590 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000591 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000592 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000593 self.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000594
595 def test_deep_copy(self):
596 dup = copy.deepcopy(self.set)
597 ##print type(dup), `dup`
598 dup_list = list(dup); dup_list.sort()
599 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000600 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000601 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000602 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000603
604#------------------------------------------------------------------------------
605
606class TestCopyingEmpty(TestCopying):
607 def setUp(self):
608 self.set = Set()
609
610#------------------------------------------------------------------------------
611
612class TestCopyingSingleton(TestCopying):
613 def setUp(self):
614 self.set = Set(["hello"])
615
616#------------------------------------------------------------------------------
617
618class TestCopyingTriple(TestCopying):
619 def setUp(self):
620 self.set = Set(["zero", 0, None])
621
622#------------------------------------------------------------------------------
623
624class TestCopyingTuple(TestCopying):
625 def setUp(self):
626 self.set = Set([(1, 2)])
627
628#------------------------------------------------------------------------------
629
630class TestCopyingNested(TestCopying):
631 def setUp(self):
632 self.set = Set([((1, 2), (3, 4))])
633
634#==============================================================================
635
636def makeAllTests():
637 suite = unittest.TestSuite()
Tim Peters62c62432002-08-25 17:49:04 +0000638 for klass in (TestSetOfSets,
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000639 TestExceptionPropagation,
Tim Peters62c62432002-08-25 17:49:04 +0000640 TestBasicOpsEmpty,
641 TestBasicOpsSingleton,
642 TestBasicOpsTuple,
643 TestBasicOpsTriple,
644 TestBinaryOps,
645 TestUpdateOps,
646 TestMutate,
647 TestSubsetEqualEmpty,
648 TestSubsetEqualNonEmpty,
649 TestSubsetEmptyNonEmpty,
650 TestSubsetPartial,
651 TestSubsetNonOverlap,
652 TestOnlySetsNumeric,
653 TestOnlySetsDict,
654 TestOnlySetsOperator,
655 TestCopyingEmpty,
656 TestCopyingSingleton,
657 TestCopyingTriple,
658 TestCopyingTuple,
659 TestCopyingNested,
660 ):
661 suite.addTest(unittest.makeSuite(klass))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000662 return suite
663
664#------------------------------------------------------------------------------
665
666def test_main():
667 suite = makeAllTests()
668 test_support.run_suite(suite)
669
670if __name__ == "__main__":
671 test_main()