11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static org.truth0.Truth.ASSERT;
207dd252788645e940eada959bdde927426e2531c9Paul Duffin
217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.GwtCompatible;
227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.GwtIncompatible;
237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.DerivedComparable;
247dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.testing.NullPointerTester;
25dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffin
260888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
270888a09821a98ac0680fad765217302858e70fa4Paul Duffin
28dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffinimport java.util.Arrays;
29dbd967a6e5c96cc1a97c5521f88dc1564ba2f81bPaul Duffinimport java.util.Collections;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@link Multisets}.
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Bostock
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class MultisetsTest extends TestCase {
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /* See MultisetsImmutableEntryTest for immutableEntry() tests. */
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewTreeMultisetDerived() {
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultiset<DerivedComparable> set = TreeMultiset.create();
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(set.isEmpty());
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    set.add(new DerivedComparable("foo"), 2);
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    set.add(new DerivedComparable("bar"), 3);
480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(set).has().exactly(
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new DerivedComparable("bar"), new DerivedComparable("bar"), new DerivedComparable("bar"),
507dd252788645e940eada959bdde927426e2531c9Paul Duffin        new DerivedComparable("foo"), new DerivedComparable("foo")).inOrder();
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewTreeMultisetNonGeneric() {
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultiset<LegacyComparable> set = TreeMultiset.create();
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(set.isEmpty());
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    set.add(new LegacyComparable("foo"), 2);
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    set.add(new LegacyComparable("bar"), 3);
580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(set).has().exactly(new LegacyComparable("bar"),
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new LegacyComparable("bar"), new LegacyComparable("bar"),
607dd252788645e940eada959bdde927426e2531c9Paul Duffin        new LegacyComparable("foo"), new LegacyComparable("foo")).inOrder();
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewTreeMultisetComparator() {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultiset<String> multiset
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = TreeMultiset.create(Collections.reverseOrder());
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multiset.add("bar", 3);
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multiset.add("foo", 2);
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(multiset).has().exactly("foo", "foo", "bar", "bar", "bar").inOrder();
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainOccurrencesEmpty() {
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = HashMultiset.create();
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> toRetain =
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(Arrays.asList("a", "b", "a"));
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Multisets.retainOccurrences(multiset, toRetain));
760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(multiset).isEmpty();
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveOccurrencesEmpty() {
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = HashMultiset.create();
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> toRemove =
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(Arrays.asList("a", "b", "a"));
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Multisets.retainOccurrences(multiset, toRemove));
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
877dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testUnion() {
887dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms1 = HashMultiset.create(Arrays.asList("a", "b", "a"));
897dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms2 = HashMultiset.create(
907dd252788645e940eada959bdde927426e2531c9Paul Duffin        Arrays.asList("a", "b", "b", "c"));
910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(Multisets.union(ms1, ms2)).has().exactly("a", "a", "b", "b", "c");
927dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
937dd252788645e940eada959bdde927426e2531c9Paul Duffin
947dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testUnionEqualMultisets() {
957dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms1 = HashMultiset.create(Arrays.asList("a", "b", "a"));
967dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms2 = HashMultiset.create(Arrays.asList("a", "b", "a"));
977dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(ms1, Multisets.union(ms1, ms2));
987dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
997dd252788645e940eada959bdde927426e2531c9Paul Duffin
1007dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testUnionEmptyNonempty() {
1017dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms1 = HashMultiset.create();
1027dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms2 = HashMultiset.create(Arrays.asList("a", "b", "a"));
1037dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(ms2, Multisets.union(ms1, ms2));
1047dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1057dd252788645e940eada959bdde927426e2531c9Paul Duffin
1067dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testUnionNonemptyEmpty() {
1077dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms1 = HashMultiset.create(Arrays.asList("a", "b", "a"));
1087dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms2 = HashMultiset.create();
1097dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(ms1, Multisets.union(ms1, ms2));
1107dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1117dd252788645e940eada959bdde927426e2531c9Paul Duffin
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIntersectEmptyNonempty() {
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> ms1 = HashMultiset.create();
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> ms2 = HashMultiset.create(Arrays.asList("a", "b", "a"));
1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(Multisets.intersection(ms1, ms2)).isEmpty();
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIntersectNonemptyEmpty() {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> ms1 = HashMultiset.create(Arrays.asList("a", "b", "a"));
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> ms2 = HashMultiset.create();
1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(Multisets.intersection(ms1, ms2)).isEmpty();
1227dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1237dd252788645e940eada959bdde927426e2531c9Paul Duffin
1247dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSum() {
1257dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms1 = HashMultiset.create(Arrays.asList("a", "b", "a"));
1267dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms2 = HashMultiset.create(Arrays.asList("b", "c"));
1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(Multisets.sum(ms1, ms2)).has().exactly("a", "a", "b", "b", "c");
1287dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1297dd252788645e940eada959bdde927426e2531c9Paul Duffin
1307dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSumEmptyNonempty() {
1317dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms1 = HashMultiset.create();
1327dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms2 = HashMultiset.create(Arrays.asList("a", "b", "a"));
1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(Multisets.sum(ms1, ms2)).has().exactly("a", "b", "a");
1347dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1357dd252788645e940eada959bdde927426e2531c9Paul Duffin
1367dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSumNonemptyEmpty() {
1377dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms1 = HashMultiset.create(Arrays.asList("a", "b", "a"));
1387dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms2 = HashMultiset.create();
1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(Multisets.sum(ms1, ms2)).has().exactly("a", "b", "a");
1407dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1417dd252788645e940eada959bdde927426e2531c9Paul Duffin
1427dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testDifferenceWithNoRemovedElements() {
1437dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms1 = HashMultiset.create(Arrays.asList("a", "b", "a"));
1447dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms2 = HashMultiset.create(Arrays.asList("a"));
1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(Multisets.difference(ms1, ms2)).has().exactly("a", "b");
1467dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1477dd252788645e940eada959bdde927426e2531c9Paul Duffin
1487dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testDifferenceWithRemovedElement() {
1497dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms1 = HashMultiset.create(Arrays.asList("a", "b", "a"));
1507dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms2 = HashMultiset.create(Arrays.asList("b"));
1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(Multisets.difference(ms1, ms2)).has().exactly("a", "a");
1527dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1537dd252788645e940eada959bdde927426e2531c9Paul Duffin
1547dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testDifferenceWithMoreElementsInSecondMultiset() {
1557dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms1 = HashMultiset.create(Arrays.asList("a", "b", "a"));
1567dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms2 = HashMultiset.create(Arrays.asList("a", "b", "b", "b"));
1577dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> diff = Multisets.difference(ms1, ms2);
1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(diff).has().item("a");
1597dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(0, diff.count("b"));
1607dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(1, diff.count("a"));
1617dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertFalse(diff.contains("b"));
1627dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertTrue(diff.contains("a"));
1637dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1647dd252788645e940eada959bdde927426e2531c9Paul Duffin
1657dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testDifferenceEmptyNonempty() {
1667dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms1 = HashMultiset.create();
1677dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms2 = HashMultiset.create(Arrays.asList("a", "b", "a"));
1687dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(ms1, Multisets.difference(ms1, ms2));
1697dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1707dd252788645e940eada959bdde927426e2531c9Paul Duffin
1717dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testDifferenceNonemptyEmpty() {
1727dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms1 = HashMultiset.create(Arrays.asList("a", "b", "a"));
1737dd252788645e940eada959bdde927426e2531c9Paul Duffin    Multiset<String> ms2 = HashMultiset.create();
1747dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(ms1, Multisets.difference(ms1, ms2));
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1767dd252788645e940eada959bdde927426e2531c9Paul Duffin
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsOccurrencesEmpty() {
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> superMultiset = HashMultiset.create(Arrays.asList("a", "b", "a"));
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> subMultiset = HashMultiset.create();
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Multisets.containsOccurrences(superMultiset, subMultiset));
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Multisets.containsOccurrences(subMultiset, superMultiset));
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsOccurrences() {
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> superMultiset = HashMultiset.create(Arrays.asList("a", "b", "a"));
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> subMultiset = HashMultiset.create(Arrays.asList("a", "b"));
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Multisets.containsOccurrences(superMultiset, subMultiset));
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Multisets.containsOccurrences(subMultiset, superMultiset));
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> diffMultiset = HashMultiset.create(Arrays.asList("a", "b", "c"));
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Multisets.containsOccurrences(superMultiset, diffMultiset));
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Multisets.containsOccurrences(diffMultiset, subMultiset));
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1937dd252788645e940eada959bdde927426e2531c9Paul Duffin
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainEmptyOccurrences() {
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset =
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(Arrays.asList("a", "b", "a"));
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> toRetain = HashMultiset.create();
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Multisets.retainOccurrences(multiset, toRetain));
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainOccurrences() {
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset =
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        TreeMultiset.create(Arrays.asList("a", "b", "a", "c"));
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> toRetain =
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(Arrays.asList("a", "b", "b"));
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Multisets.retainOccurrences(multiset, toRetain));
2080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(multiset).has().exactly("a", "b").inOrder();
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveEmptyOccurrences() {
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset =
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        TreeMultiset.create(Arrays.asList("a", "b", "a"));
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> toRemove = HashMultiset.create();
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Multisets.removeOccurrences(multiset, toRemove));
2160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(multiset).has().exactly("a", "a", "b").inOrder();
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveOccurrences() {
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset =
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        TreeMultiset.create(Arrays.asList("a", "b", "a", "c"));
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> toRemove =
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(Arrays.asList("a", "b", "b"));
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Multisets.removeOccurrences(multiset, toRemove));
2250888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(multiset).has().exactly("a", "c").inOrder();
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("deprecation")
2297dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testUnmodifiableMultisetShortCircuit() {
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> mod = HashMultiset.create();
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> unmod = Multisets.unmodifiableMultiset(mod);
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNotSame(mod, unmod);
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(unmod, Multisets.unmodifiableMultiset(unmod));
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> immutable = ImmutableMultiset.of("a", "a", "b", "a");
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(immutable, Multisets.unmodifiableMultiset(immutable));
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(immutable, Multisets.unmodifiableMultiset((Multiset<String>) immutable));
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2387dd252788645e940eada959bdde927426e2531c9Paul Duffin
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testHighestCountFirst() {
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = HashMultiset.create(
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Arrays.asList("a", "a", "a", "b", "c", "c"));
2427dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableMultiset<String> sortedMultiset =
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Multisets.copyHighestCountFirst(multiset);
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(sortedMultiset.entrySet()).has().exactly(
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Multisets.immutableEntry("a", 3), Multisets.immutableEntry("c", 2),
2477dd252788645e940eada959bdde927426e2531c9Paul Duffin        Multisets.immutableEntry("b", 1)).inOrder();
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(sortedMultiset).has().exactly(
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "a",
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "a",
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "a",
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "c",
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "c",
2557dd252788645e940eada959bdde927426e2531c9Paul Duffin        "b").inOrder();
2567dd252788645e940eada959bdde927426e2531c9Paul Duffin
2570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(Multisets.copyHighestCountFirst(ImmutableMultiset.of())).isEmpty();
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2597dd252788645e940eada959bdde927426e2531c9Paul Duffin
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
2617dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testNullPointers() {
2627dd252788645e940eada959bdde927426e2531c9Paul Duffin    new NullPointerTester().testAllPublicStaticMethods(Multisets.class);
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
265