blob: d8b7f3ff369a8be7edef0a41aeffa64daecbf57b [file] [log] [blame]
Guido van Rossumd6cf3af2002-08-19 16:19:15 +00001#!/usr/bin/env python
2
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +00003import unittest, operator, copy, pickle
Guido van Rossumd6cf3af2002-08-19 16:19:15 +00004from sets import Set, ImmutableSet
5from test import test_support
6
7empty_set = Set()
8
9#==============================================================================
10
11class TestBasicOps(unittest.TestCase):
12
13 def test_repr(self):
14 if self.repr is not None:
Tim Petersa7777992002-08-25 17:38:49 +000015 self.assertEqual(`self.set`, self.repr)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000016
17 def test_length(self):
Tim Petersa7777992002-08-25 17:38:49 +000018 self.assertEqual(len(self.set), self.length)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000019
20 def test_self_equality(self):
Tim Petersa7777992002-08-25 17:38:49 +000021 self.assertEqual(self.set, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000022
23 def test_equivalent_equality(self):
Tim Petersa7777992002-08-25 17:38:49 +000024 self.assertEqual(self.set, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000025
26 def test_copy(self):
Tim Petersa7777992002-08-25 17:38:49 +000027 self.assertEqual(self.set.copy(), self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000028
29 def test_self_union(self):
30 result = self.set | self.set
Tim Petersa7777992002-08-25 17:38:49 +000031 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000032
33 def test_empty_union(self):
34 result = self.set | empty_set
Tim Petersa7777992002-08-25 17:38:49 +000035 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000036
37 def test_union_empty(self):
38 result = empty_set | self.set
Tim Petersa7777992002-08-25 17:38:49 +000039 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000040
41 def test_self_intersection(self):
42 result = self.set & self.set
Tim Petersa7777992002-08-25 17:38:49 +000043 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000044
45 def test_empty_intersection(self):
46 result = self.set & empty_set
Tim Petersa7777992002-08-25 17:38:49 +000047 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000048
49 def test_intersection_empty(self):
50 result = empty_set & self.set
Tim Petersa7777992002-08-25 17:38:49 +000051 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000052
53 def test_self_symmetric_difference(self):
54 result = self.set ^ self.set
Tim Petersa7777992002-08-25 17:38:49 +000055 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000056
57 def checkempty_symmetric_difference(self):
58 result = self.set ^ empty_set
Tim Petersa7777992002-08-25 17:38:49 +000059 self.assertEqual(result, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000060
61 def test_self_difference(self):
62 result = self.set - self.set
Tim Petersa7777992002-08-25 17:38:49 +000063 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000064
65 def test_empty_difference(self):
66 result = self.set - empty_set
Tim Petersa7777992002-08-25 17:38:49 +000067 self.assertEqual(result, self.dup)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000068
69 def test_empty_difference_rev(self):
70 result = empty_set - self.set
Tim Petersa7777992002-08-25 17:38:49 +000071 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000072
73 def test_iteration(self):
74 for v in self.set:
Tim Peters4127e912002-08-25 18:02:29 +000075 self.assert_(v in self.values)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000076
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000077 def test_pickling(self):
78 p = pickle.dumps(self.set)
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000079 copy = pickle.loads(p)
Jeremy Hyltoncd58b8f2002-11-13 19:34:26 +000080 self.assertEqual(self.set, copy,
81 "%s != %s" % (self.set, copy))
82
Guido van Rossumd6cf3af2002-08-19 16:19:15 +000083#------------------------------------------------------------------------------
84
85class TestBasicOpsEmpty(TestBasicOps):
86 def setUp(self):
87 self.case = "empty set"
88 self.values = []
89 self.set = Set(self.values)
90 self.dup = Set(self.values)
91 self.length = 0
92 self.repr = "Set([])"
93
94#------------------------------------------------------------------------------
95
96class TestBasicOpsSingleton(TestBasicOps):
97 def setUp(self):
98 self.case = "unit set (number)"
99 self.values = [3]
100 self.set = Set(self.values)
101 self.dup = Set(self.values)
102 self.length = 1
103 self.repr = "Set([3])"
104
105 def test_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000106 self.failUnless(3 in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000107
108 def test_not_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000109 self.failUnless(2 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000110
111#------------------------------------------------------------------------------
112
113class TestBasicOpsTuple(TestBasicOps):
114 def setUp(self):
115 self.case = "unit set (tuple)"
116 self.values = [(0, "zero")]
117 self.set = Set(self.values)
118 self.dup = Set(self.values)
119 self.length = 1
120 self.repr = "Set([(0, 'zero')])"
121
122 def test_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000123 self.failUnless((0, "zero") in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000124
125 def test_not_in(self):
Tim Peters4127e912002-08-25 18:02:29 +0000126 self.failUnless(9 not in self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000127
128#------------------------------------------------------------------------------
129
130class TestBasicOpsTriple(TestBasicOps):
131 def setUp(self):
132 self.case = "triple set"
133 self.values = [0, "zero", operator.add]
134 self.set = Set(self.values)
135 self.dup = Set(self.values)
136 self.length = 3
137 self.repr = None
138
139#==============================================================================
140
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000141def baditer():
142 raise TypeError
143 yield True
144
145def gooditer():
146 yield True
147
148class TestExceptionPropagation(unittest.TestCase):
149 """SF 628246: Set constructor should not trap iterator TypeErrors"""
150
151 def test_instanceWithException(self):
152 self.assertRaises(TypeError, Set, baditer())
153
154 def test_instancesWithoutException(self):
155 """All of these iterables should load without exception."""
156 Set([1,2,3])
157 Set((1,2,3))
158 Set({'one':1, 'two':2, 'three':3})
159 Set(xrange(3))
160 Set('abc')
161 Set(gooditer())
162
163#==============================================================================
164
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000165class TestSetOfSets(unittest.TestCase):
166 def test_constructor(self):
167 inner = Set([1])
168 outer = Set([inner])
169 element = outer.pop()
Tim Peters4127e912002-08-25 18:02:29 +0000170 self.assertEqual(type(element), ImmutableSet)
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000171 outer.add(inner) # Rebuild set of sets with .add method
172 outer.remove(inner)
Tim Peters4127e912002-08-25 18:02:29 +0000173 self.assertEqual(outer, Set()) # Verify that remove worked
Raymond Hettinger045e51a2002-08-24 02:56:01 +0000174 outer.discard(inner) # Absence of KeyError indicates working fine
Raymond Hettingerc3e61e52002-08-21 06:38:44 +0000175
176#==============================================================================
177
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000178class TestBinaryOps(unittest.TestCase):
179 def setUp(self):
180 self.set = Set((2, 4, 6))
181
Raymond Hettinger35e48d22002-11-25 20:43:55 +0000182 def test_eq(self): # SF bug 643115
183 self.assertEqual(self.set, Set({2:1,4:3,6:5}))
184
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000185 def test_union_subset(self):
186 result = self.set | Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000187 self.assertEqual(result, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000188
189 def test_union_superset(self):
190 result = self.set | Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000191 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000192
193 def test_union_overlap(self):
194 result = self.set | Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000195 self.assertEqual(result, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000196
197 def test_union_non_overlap(self):
198 result = self.set | Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000199 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000200
201 def test_intersection_subset(self):
202 result = self.set & Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000203 self.assertEqual(result, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000204
205 def test_intersection_superset(self):
206 result = self.set & Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000207 self.assertEqual(result, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000208
209 def test_intersection_overlap(self):
210 result = self.set & Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000211 self.assertEqual(result, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000212
213 def test_intersection_non_overlap(self):
214 result = self.set & Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000215 self.assertEqual(result, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000216
217 def test_sym_difference_subset(self):
218 result = self.set ^ Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000219 self.assertEqual(result, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000220
221 def test_sym_difference_superset(self):
222 result = self.set ^ Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000223 self.assertEqual(result, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000224
225 def test_sym_difference_overlap(self):
226 result = self.set ^ Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000227 self.assertEqual(result, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000228
229 def test_sym_difference_non_overlap(self):
230 result = self.set ^ Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000231 self.assertEqual(result, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000232
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000233 def test_cmp(self):
234 a, b = Set('a'), Set('b')
Tim Peters44f14b02003-03-02 00:19:49 +0000235 self.assertRaises(TypeError, cmp, a, b)
236
237 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
238 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns,
239 # which Python thinks is good enough to synthesize a cmp() result
240 # without calling __cmp__.
241 self.assertEqual(cmp(a, a), 0)
242
243 self.assertRaises(TypeError, cmp, a, 12)
244 self.assertRaises(TypeError, cmp, "abc", a)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000245
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000246#==============================================================================
247
248class TestUpdateOps(unittest.TestCase):
249 def setUp(self):
250 self.set = Set((2, 4, 6))
251
252 def test_union_subset(self):
253 self.set |= Set([2])
Tim Petersa7777992002-08-25 17:38:49 +0000254 self.assertEqual(self.set, Set((2, 4, 6)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000255
256 def test_union_superset(self):
257 self.set |= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000258 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000259
260 def test_union_overlap(self):
261 self.set |= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000262 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000263
264 def test_union_non_overlap(self):
265 self.set |= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000266 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000267
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000268 def test_union_method_call(self):
269 self.set.union_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000270 self.assertEqual(self.set, Set([2, 3, 4, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000271
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000272 def test_intersection_subset(self):
273 self.set &= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000274 self.assertEqual(self.set, Set((2, 4)))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000275
276 def test_intersection_superset(self):
277 self.set &= Set([2, 4, 6, 8])
Tim Petersa7777992002-08-25 17:38:49 +0000278 self.assertEqual(self.set, Set([2, 4, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000279
280 def test_intersection_overlap(self):
281 self.set &= Set([3, 4, 5])
Tim Petersa7777992002-08-25 17:38:49 +0000282 self.assertEqual(self.set, Set([4]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000283
284 def test_intersection_non_overlap(self):
285 self.set &= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000286 self.assertEqual(self.set, empty_set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000287
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000288 def test_intersection_method_call(self):
289 self.set.intersection_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000290 self.assertEqual(self.set, Set([4]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000291
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000292 def test_sym_difference_subset(self):
293 self.set ^= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000294 self.assertEqual(self.set, Set([6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000295
296 def test_sym_difference_superset(self):
297 self.set ^= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000298 self.assertEqual(self.set, Set([8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000299
300 def test_sym_difference_overlap(self):
301 self.set ^= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000302 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000303
304 def test_sym_difference_non_overlap(self):
305 self.set ^= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000306 self.assertEqual(self.set, Set([2, 4, 6, 8]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000307
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000308 def test_sym_difference_method_call(self):
309 self.set.symmetric_difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000310 self.assertEqual(self.set, Set([2, 3, 5, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000311
312 def test_difference_subset(self):
313 self.set -= Set((2, 4))
Tim Petersa7777992002-08-25 17:38:49 +0000314 self.assertEqual(self.set, Set([6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000315
316 def test_difference_superset(self):
317 self.set -= Set((2, 4, 6, 8))
Tim Petersa7777992002-08-25 17:38:49 +0000318 self.assertEqual(self.set, Set([]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000319
320 def test_difference_overlap(self):
321 self.set -= Set((3, 4, 5))
Tim Petersa7777992002-08-25 17:38:49 +0000322 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000323
324 def test_difference_non_overlap(self):
325 self.set -= Set([8])
Tim Petersa7777992002-08-25 17:38:49 +0000326 self.assertEqual(self.set, Set([2, 4, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000327
328 def test_difference_method_call(self):
329 self.set.difference_update(Set([3, 4, 5]))
Tim Petersa7777992002-08-25 17:38:49 +0000330 self.assertEqual(self.set, Set([2, 6]))
Raymond Hettinger1b9f5d42002-08-24 06:19:02 +0000331
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000332#==============================================================================
333
334class TestMutate(unittest.TestCase):
335 def setUp(self):
336 self.values = ["a", "b", "c"]
337 self.set = Set(self.values)
338
339 def test_add_present(self):
340 self.set.add("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000341 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000342
343 def test_add_absent(self):
344 self.set.add("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000345 self.assertEqual(self.set, Set("abcd"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000346
347 def test_add_until_full(self):
348 tmp = Set()
349 expected_len = 0
350 for v in self.values:
351 tmp.add(v)
352 expected_len += 1
Tim Petersa7777992002-08-25 17:38:49 +0000353 self.assertEqual(len(tmp), expected_len)
354 self.assertEqual(tmp, self.set)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000355
356 def test_remove_present(self):
357 self.set.remove("b")
Tim Petersde830ca2002-08-25 17:40:29 +0000358 self.assertEqual(self.set, Set("ac"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000359
360 def test_remove_absent(self):
361 try:
362 self.set.remove("d")
Tim Peters4127e912002-08-25 18:02:29 +0000363 self.fail("Removing missing element should have raised LookupError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000364 except LookupError:
365 pass
366
367 def test_remove_until_empty(self):
368 expected_len = len(self.set)
369 for v in self.values:
370 self.set.remove(v)
371 expected_len -= 1
Tim Peters4127e912002-08-25 18:02:29 +0000372 self.assertEqual(len(self.set), expected_len)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000373
374 def test_discard_present(self):
375 self.set.discard("c")
Tim Petersde830ca2002-08-25 17:40:29 +0000376 self.assertEqual(self.set, Set("ab"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000377
378 def test_discard_absent(self):
379 self.set.discard("d")
Tim Petersde830ca2002-08-25 17:40:29 +0000380 self.assertEqual(self.set, Set("abc"))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000381
382 def test_clear(self):
383 self.set.clear()
Tim Petersa7777992002-08-25 17:38:49 +0000384 self.assertEqual(len(self.set), 0)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000385
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000386 def test_pop(self):
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000387 popped = {}
388 while self.set:
Guido van Rossumc9196bc2002-08-20 21:51:59 +0000389 popped[self.set.pop()] = None
Tim Petersa7777992002-08-25 17:38:49 +0000390 self.assertEqual(len(popped), len(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000391 for v in self.values:
Tim Peters4127e912002-08-25 18:02:29 +0000392 self.failUnless(v in popped)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000393
394 def test_update_empty_tuple(self):
395 self.set.update(())
Tim Petersa7777992002-08-25 17:38:49 +0000396 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000397
398 def test_update_unit_tuple_overlap(self):
399 self.set.update(("a",))
Tim Petersa7777992002-08-25 17:38:49 +0000400 self.assertEqual(self.set, Set(self.values))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000401
402 def test_update_unit_tuple_non_overlap(self):
403 self.set.update(("a", "z"))
Tim Petersa7777992002-08-25 17:38:49 +0000404 self.assertEqual(self.set, Set(self.values + ["z"]))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000405
406#==============================================================================
407
408class TestSubsets(unittest.TestCase):
409
Tim Peters93d8d482002-08-25 18:21:47 +0000410 case2method = {"<=": "issubset",
411 ">=": "issuperset",
412 }
Tim Petersea76c982002-08-25 18:43:10 +0000413
414 reverse = {"==": "==",
415 "!=": "!=",
416 "<": ">",
417 ">": "<",
418 "<=": ">=",
419 ">=": "<=",
420 }
Tim Peters93d8d482002-08-25 18:21:47 +0000421
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000422 def test_issubset(self):
Tim Peters93d8d482002-08-25 18:21:47 +0000423 x = self.left
424 y = self.right
425 for case in "!=", "==", "<", "<=", ">", ">=":
426 expected = case in self.cases
Tim Petersea76c982002-08-25 18:43:10 +0000427 # Test the binary infix spelling.
428 result = eval("x" + case + "y", locals())
429 self.assertEqual(result, expected)
430 # Test the "friendly" method-name spelling, if one exists.
Tim Peters93d8d482002-08-25 18:21:47 +0000431 if case in TestSubsets.case2method:
Tim Peters93d8d482002-08-25 18:21:47 +0000432 method = getattr(x, TestSubsets.case2method[case])
433 result = method(y)
434 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000435
Tim Petersea76c982002-08-25 18:43:10 +0000436 # Now do the same for the operands reversed.
437 rcase = TestSubsets.reverse[case]
438 result = eval("y" + rcase + "x", locals())
439 self.assertEqual(result, expected)
440 if rcase in TestSubsets.case2method:
441 method = getattr(y, TestSubsets.case2method[rcase])
442 result = method(x)
443 self.assertEqual(result, expected)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000444#------------------------------------------------------------------------------
445
446class TestSubsetEqualEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000447 left = Set()
448 right = Set()
449 name = "both empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000450 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000451
452#------------------------------------------------------------------------------
453
454class TestSubsetEqualNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000455 left = Set([1, 2])
456 right = Set([1, 2])
457 name = "equal pair"
Tim Peters93d8d482002-08-25 18:21:47 +0000458 cases = "==", "<=", ">="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000459
460#------------------------------------------------------------------------------
461
462class TestSubsetEmptyNonEmpty(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000463 left = Set()
464 right = Set([1, 2])
465 name = "one empty, one non-empty"
Tim Peters93d8d482002-08-25 18:21:47 +0000466 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000467
468#------------------------------------------------------------------------------
469
470class TestSubsetPartial(TestSubsets):
Tim Peters3de75262002-11-09 05:26:15 +0000471 left = Set([1])
472 right = Set([1, 2])
473 name = "one a non-empty proper subset of other"
474 cases = "!=", "<", "<="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000475
476#------------------------------------------------------------------------------
477
478class TestSubsetNonOverlap(TestSubsets):
Tim Peters0bbb3082002-08-25 17:22:23 +0000479 left = Set([1])
480 right = Set([2])
481 name = "neither empty, neither contains"
Tim Peters93d8d482002-08-25 18:21:47 +0000482 cases = "!="
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000483
484#==============================================================================
485
486class TestOnlySetsInBinaryOps(unittest.TestCase):
487
Tim Peters44f14b02003-03-02 00:19:49 +0000488 def test_eq_ne(self):
489 # Unlike the others, this is testing that == and != *are* allowed.
490 self.assertEqual(self.other == self.set, False)
491 self.assertEqual(self.set == self.other, False)
492 self.assertEqual(self.other != self.set, True)
493 self.assertEqual(self.set != self.other, True)
494
495 def test_ge_gt_lt_le(self):
496 # Unlike the others, this is testing that == and != *are* allowed.
497 self.assertRaises(TypeError, lambda: self.set < self.other)
498 self.assertRaises(TypeError, lambda: self.set <= self.other)
499 self.assertRaises(TypeError, lambda: self.set > self.other)
500 self.assertRaises(TypeError, lambda: self.set >= self.other)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000501
502 def test_union_update(self):
503 try:
504 self.set |= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000505 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000506 except TypeError:
507 pass
508
509 def test_union(self):
510 try:
511 self.other | self.set
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 try:
516 self.set | self.other
Tim Peters4127e912002-08-25 18:02:29 +0000517 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000518 except TypeError:
519 pass
520
521 def test_intersection_update(self):
522 try:
523 self.set &= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000524 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000525 except TypeError:
526 pass
527
528 def test_intersection(self):
529 try:
530 self.other & self.set
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 try:
535 self.set & self.other
Tim Peters4127e912002-08-25 18:02:29 +0000536 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000537 except TypeError:
538 pass
539
540 def test_sym_difference_update(self):
541 try:
542 self.set ^= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000543 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000544 except TypeError:
545 pass
546
547 def test_sym_difference(self):
548 try:
549 self.other ^ self.set
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 try:
554 self.set ^ self.other
Tim Peters4127e912002-08-25 18:02:29 +0000555 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000556 except TypeError:
557 pass
558
559 def test_difference_update(self):
560 try:
561 self.set -= self.other
Tim Peters4127e912002-08-25 18:02:29 +0000562 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000563 except TypeError:
564 pass
565
566 def test_difference(self):
567 try:
568 self.other - self.set
Tim Peters4127e912002-08-25 18:02:29 +0000569 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000570 except TypeError:
571 pass
572 try:
573 self.set - self.other
Tim Peters4127e912002-08-25 18:02:29 +0000574 self.fail("expected TypeError")
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000575 except TypeError:
576 pass
577
578#------------------------------------------------------------------------------
579
580class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
581 def setUp(self):
582 self.set = Set((1, 2, 3))
583 self.other = 19
584
585#------------------------------------------------------------------------------
586
587class TestOnlySetsDict(TestOnlySetsInBinaryOps):
588 def setUp(self):
589 self.set = Set((1, 2, 3))
590 self.other = {1:2, 3:4}
591
592#------------------------------------------------------------------------------
593
594class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
595 def setUp(self):
596 self.set = Set((1, 2, 3))
597 self.other = operator.add
598
599#==============================================================================
600
601class TestCopying(unittest.TestCase):
602
603 def test_copy(self):
604 dup = self.set.copy()
605 dup_list = list(dup); dup_list.sort()
606 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000607 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000608 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000609 self.failUnless(dup_list[i] is set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000610
611 def test_deep_copy(self):
612 dup = copy.deepcopy(self.set)
613 ##print type(dup), `dup`
614 dup_list = list(dup); dup_list.sort()
615 set_list = list(self.set); set_list.sort()
Tim Peters4127e912002-08-25 18:02:29 +0000616 self.assertEqual(len(dup_list), len(set_list))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000617 for i in range(len(dup_list)):
Tim Peters4127e912002-08-25 18:02:29 +0000618 self.assertEqual(dup_list[i], set_list[i])
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000619
620#------------------------------------------------------------------------------
621
622class TestCopyingEmpty(TestCopying):
623 def setUp(self):
624 self.set = Set()
625
626#------------------------------------------------------------------------------
627
628class TestCopyingSingleton(TestCopying):
629 def setUp(self):
630 self.set = Set(["hello"])
631
632#------------------------------------------------------------------------------
633
634class TestCopyingTriple(TestCopying):
635 def setUp(self):
636 self.set = Set(["zero", 0, None])
637
638#------------------------------------------------------------------------------
639
640class TestCopyingTuple(TestCopying):
641 def setUp(self):
642 self.set = Set([(1, 2)])
643
644#------------------------------------------------------------------------------
645
646class TestCopyingNested(TestCopying):
647 def setUp(self):
648 self.set = Set([((1, 2), (3, 4))])
649
650#==============================================================================
651
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000652libreftest = """
653Example from the Library Reference: Doc/lib/libsets.tex
654
Tim Peters3ba491e2003-03-01 23:33:34 +0000655>>> from sets import Set as Base # override _repr to get sorted output
656>>> class Set(Base):
657... def _repr(self):
658... return Base._repr(self, sorted=True)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000659>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
660>>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
661>>> management = Set(['Jane', 'Jack', 'Susan', 'Zack'])
662>>> employees = engineers | programmers | management # union
663>>> engineering_management = engineers & programmers # intersection
664>>> fulltime_management = management - engineers - programmers # difference
665>>> engineers.add('Marvin')
666>>> print engineers
Tim Peters3ba491e2003-03-01 23:33:34 +0000667Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000668>>> employees.issuperset(engineers) # superset test
669False
670>>> employees.update(engineers) # update from another set
671>>> employees.issuperset(engineers)
672True
673>>> for group in [engineers, programmers, management, employees]:
674... group.discard('Susan') # unconditionally remove element
675... print group
676...
Tim Peters3ba491e2003-03-01 23:33:34 +0000677Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin'])
678Set(['Jack', 'Janice', 'Sam'])
679Set(['Jack', 'Jane', 'Zack'])
680Set(['Jack', 'Jane', 'Janice', 'John', 'Marvin', 'Sam', 'Zack'])
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000681"""
682
683#==============================================================================
684
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000685def makeAllTests():
686 suite = unittest.TestSuite()
Tim Peters62c62432002-08-25 17:49:04 +0000687 for klass in (TestSetOfSets,
Raymond Hettinger1eb1fb82002-11-08 05:03:21 +0000688 TestExceptionPropagation,
Tim Peters62c62432002-08-25 17:49:04 +0000689 TestBasicOpsEmpty,
690 TestBasicOpsSingleton,
691 TestBasicOpsTuple,
692 TestBasicOpsTriple,
693 TestBinaryOps,
694 TestUpdateOps,
695 TestMutate,
696 TestSubsetEqualEmpty,
697 TestSubsetEqualNonEmpty,
698 TestSubsetEmptyNonEmpty,
699 TestSubsetPartial,
700 TestSubsetNonOverlap,
701 TestOnlySetsNumeric,
702 TestOnlySetsDict,
703 TestOnlySetsOperator,
704 TestCopyingEmpty,
705 TestCopyingSingleton,
706 TestCopyingTriple,
707 TestCopyingTuple,
708 TestCopyingNested,
709 ):
710 suite.addTest(unittest.makeSuite(klass))
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000711 return suite
712
713#------------------------------------------------------------------------------
714
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000715__test__ = {'libreftest' : libreftest}
716
717def test_main(verbose=None):
718 from test import test_sets
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000719 suite = makeAllTests()
720 test_support.run_suite(suite)
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000721 test_support.run_doctest(test_sets, verbose)
Guido van Rossumd6cf3af2002-08-19 16:19:15 +0000722
723if __name__ == "__main__":
Raymond Hettinger2dc505e2003-01-15 16:15:38 +0000724 test_main(verbose=True)