|
7 | 7 | import operator |
8 | 8 | import pickle |
9 | 9 | from random import choice, randrange |
| 10 | +from itertools import product, chain, combinations |
10 | 11 | import string |
11 | 12 | import sys |
12 | 13 | from test import support |
@@ -2219,6 +2220,64 @@ def test_helper_function(self): |
2219 | 2220 | self.assertTrue(c.called) |
2220 | 2221 | self.assertEqual(dict(c), {'a': 5, 'b': 2, 'c': 1, 'd': 1, 'r':2 }) |
2221 | 2222 |
|
| 2223 | + def test_multiset_operations_equivalent_to_set_operations(self): |
| 2224 | + # When the multiplicities are all zero or one, multiset operations |
| 2225 | + # are guaranteed to be equivalent to the corresponding operations |
| 2226 | + # for regular sets. |
| 2227 | + s = list(product(('a', 'b', 'c'), range(2))) |
| 2228 | + powerset = chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) |
| 2229 | + counters = [Counter(dict(groups)) for groups in powerset] |
| 2230 | + for cp, cq in product(counters, repeat=2): |
| 2231 | + sp = set(cp.elements()) |
| 2232 | + sq = set(cq.elements()) |
| 2233 | + self.assertEqual(set(cp + cq), sp | sq) |
| 2234 | + self.assertEqual(set(cp - cq), sp - sq) |
| 2235 | + self.assertEqual(set(cp | cq), sp | sq) |
| 2236 | + self.assertEqual(set(cp & cq), sp & sq) |
| 2237 | + self.assertEqual(cp.isequal(cq), sp == sq) |
| 2238 | + self.assertEqual(cp.issubset(cq), sp.issubset(sq)) |
| 2239 | + self.assertEqual(cp.issuperset(cq), sp.issuperset(sq)) |
| 2240 | + self.assertEqual(cp.isdisjoint(cq), sp.isdisjoint(sq)) |
| 2241 | + |
| 2242 | + def test_multiset_equal(self): |
| 2243 | + self.assertTrue(Counter(a=3, b=2, c=0).isequal('ababa')) |
| 2244 | + self.assertFalse(Counter(a=3, b=2).isequal('babab')) |
| 2245 | + |
| 2246 | + def test_multiset_subset(self): |
| 2247 | + self.assertTrue(Counter(a=3, b=2, c=0).issubset('ababa')) |
| 2248 | + self.assertFalse(Counter(a=3, b=2).issubset('babab')) |
| 2249 | + |
| 2250 | + def test_multiset_superset(self): |
| 2251 | + self.assertTrue(Counter(a=3, b=2, c=0).issuperset('aab')) |
| 2252 | + self.assertFalse(Counter(a=3, b=2, c=0).issuperset('aabd')) |
| 2253 | + |
| 2254 | + def test_multiset_disjoint(self): |
| 2255 | + self.assertTrue(Counter(a=3, b=2, c=0).isdisjoint('cde')) |
| 2256 | + self.assertFalse(Counter(a=3, b=2, c=0).isdisjoint('bcd')) |
| 2257 | + |
| 2258 | + def test_multiset_predicates_with_negative_counts(self): |
| 2259 | + # Multiset predicates run on the output of the elements() method, |
| 2260 | + # meaning that zero counts and negative counts are ignored. |
| 2261 | + # The tests below confirm that we get that same results as the |
| 2262 | + # tests above, even after a negative count has been included |
| 2263 | + # in either *self* or *other*. |
| 2264 | + self.assertTrue(Counter(a=3, b=2, c=0, d=-1).isequal('ababa')) |
| 2265 | + self.assertFalse(Counter(a=3, b=2, d=-1).isequal('babab')) |
| 2266 | + self.assertTrue(Counter(a=3, b=2, c=0, d=-1).issubset('ababa')) |
| 2267 | + self.assertFalse(Counter(a=3, b=2, d=-1).issubset('babab')) |
| 2268 | + self.assertTrue(Counter(a=3, b=2, c=0, d=-1).issuperset('aab')) |
| 2269 | + self.assertFalse(Counter(a=3, b=2, c=0, d=-1).issuperset('aabd')) |
| 2270 | + self.assertTrue(Counter(a=3, b=2, c=0, d=-1).isdisjoint('cde')) |
| 2271 | + self.assertFalse(Counter(a=3, b=2, c=0, d=-1).isdisjoint('bcd')) |
| 2272 | + self.assertTrue(Counter(a=3, b=2, c=0, d=-1).isequal(Counter(a=3, b=2, c=-1))) |
| 2273 | + self.assertFalse(Counter(a=3, b=2, d=-1).isequal(Counter(a=2, b=3, c=-1))) |
| 2274 | + self.assertTrue(Counter(a=3, b=2, c=0, d=-1).issubset(Counter(a=3, b=2, c=-1))) |
| 2275 | + self.assertFalse(Counter(a=3, b=2, d=-1).issubset(Counter(a=2, b=3, c=-1))) |
| 2276 | + self.assertTrue(Counter(a=3, b=2, c=0, d=-1).issuperset(Counter(a=2, b=1, c=-1))) |
| 2277 | + self.assertFalse(Counter(a=3, b=2, c=0, d=-1).issuperset(Counter(a=2, b=1, c=-1, d=1))) |
| 2278 | + self.assertTrue(Counter(a=3, b=2, c=0, d=-1).isdisjoint(Counter(c=1, d=2, e=3, f=-1))) |
| 2279 | + self.assertFalse(Counter(a=3, b=2, c=0, d=-1).isdisjoint(Counter(b=1, c=1, d=1, e=-1))) |
| 2280 | + |
2222 | 2281 |
|
2223 | 2282 | ################################################################################ |
2224 | 2283 | ### Run tests |
|
0 commit comments