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
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Multiset.Entry;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.UnmodifiableCollectionTests;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.HashSet;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.NoSuchElementException;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Common tests for a {@link Multiset}.
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic abstract class AbstractMultisetTest extends AbstractCollectionTest {
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected abstract <E> Multiset<E> create();
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Multiset<String> ms;
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // public for GWT
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void setUp() throws Exception {
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    super.setUp();
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    c = ms = create();
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Validates that multiset size returned by {@code size()} is the same as the
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * size generated by summing the counts of all multiset entries.
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected void assertSize(Multiset<String> multiset) {
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    long size = 0;
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Multiset.Entry<String> entry : multiset.entrySet()) {
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      size += entry.getCount();
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((int) Math.min(size, Integer.MAX_VALUE), multiset.size());
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected void assertSize() {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(ms);
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected void assertContents(String... expected) {
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    super.assertContents(expected);
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Don't run {@code NullPointerTester} on multisets, since they fail with
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Java 6 due to a bug in the JDK, as illustrated in the commented out
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * method {@code HashMultisetTest#testAnnotations()}.
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO: Figure out if this is still true...
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testNullPointerExceptions() throws Exception {}
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCountZero() {
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, ms.count("a"));
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCountOne() {
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, ms.count("a"));
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCountTwo() {
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, ms.count("a"));
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCountAfterRemoval() {
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.remove("a");
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, ms.count("a"));
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCountNull() {
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, ms.count(null));
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCountWrongType() {
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, ms.count(new WrongType()));
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static class WrongType {}
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddNoneToNone() {
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, ms.add("a", 0));
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddNoneToSome() {
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, ms.add("a", 0));
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a");
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddSeveralAtOnce() {
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, ms.add("a", 3));
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a", "a", "a");
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddSomeToSome() {
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, ms.add("a", 3));
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a", "a", "a", "a", "a");
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testAddSeveralTimes() {
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.add("a"));
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.add("b"));
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.add("a"));
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.add("b"));
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a", "b", "a", "b");
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddNegative() {
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ms.add("a", -1);
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testEqualsNo() {
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> ms2 = create();
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms2.add("a", 2);
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms2.add("b");
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(ms.equals(ms2));
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddTooMany() {
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", Integer.MAX_VALUE); // so far so good
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b", Integer.MAX_VALUE); // so far so good
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ms.add("a");
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllEmptySet() {
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    c = ms = createSample();
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(ms.addAll(Collections.<String>emptySet()));
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(createSample(), ms);
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllEmptyMultiset() {
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    c = ms = createSample();
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> empty = create();
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(ms.addAll(empty));
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(createSample(), ms);
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllSet() {
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    c = ms = createSample();
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> more = ImmutableSet.of("c", "d", "e");
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.addAll(more));
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a", "b", "b", "c", "c", "d", "d", "d", "d", "e");
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllMultiset() {
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    c = ms = createSample();
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> more = HashMultiset.create(
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        asList("c", "c", "d", "d", "e"));
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.addAll(more));
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a", "b", "b", "c", "c", "c", "d", "d", "d", "d", "d", "e");
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveNoneFromNone() {
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, ms.remove("a", 0));
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveNoneFromSome() {
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, ms.remove("a", 0));
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a");
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveOneFromNone() {
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, ms.remove("a", 1));
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveOneFromOne() {
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, ms.remove("a", 1));
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveSomeFromSome() {
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 5);
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, ms.remove("a", 3));
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a", "a");
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveTooMany() {
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, ms.remove("a", 5));
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveNegative() {
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ms.remove("a", -1);
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsSeveral() {
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.contains(new String("a")));
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsAllNo() {
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b", 3);
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(ms.containsAll(asList("a", "c")));
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsAllYes() {
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b", 3);
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("c", 4);
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.containsAll(asList("a", "c")));
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAllOfOne() {
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.removeAll(asList("a", "c")));
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("b");
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAllOfDisjoint() {
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(ms.removeAll(asList("c", "d")));
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a", "a", "b");
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAllOfEverything() {
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.removeAll(asList("a", "b")));
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAllOfOne() {
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.retainAll(asList("a", "c")));
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a", "a");
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAllOfDisjoint() {
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.retainAll(asList("c", "d")));
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAllOfEverything() {
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(ms.retainAll(asList("a", "b")));
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a", "a", "b");
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsAllVacuousViaElementSet() {
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.elementSet().containsAll(Collections.emptySet()));
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsAllNoViaElementSet() {
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b", 3);
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(ms.elementSet().containsAll(asList("a", "c")));
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsAllYesViaElementSet() {
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b", 3);
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("c", 4);
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.elementSet().containsAll(asList("a", "c")));
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAllVacuousViaElementSet() {
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(ms.elementSet().removeAll(Collections.emptySet()));
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAllOfOneViaElementSet() {
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.elementSet().removeAll(asList("a", "c")));
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("b");
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAllOfDisjointViaElementSet() {
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(ms.elementSet().removeAll(asList("c", "d")));
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a", "a", "b");
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAllOfEverythingViaElementSet() {
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.elementSet().removeAll(asList("a", "b")));
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAllVacuousViaElementSet() {
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(ms.elementSet().retainAll(asList("a")));
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAllOfNothingViaElementSet() {
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.elementSet().retainAll(Collections.emptySet()));
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAllOfOneViaElementSet() {
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.elementSet().retainAll(asList("a", "c")));
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a", "a");
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAllOfDisjointViaElementSet() {
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.elementSet().retainAll(asList("c", "d")));
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAllOfEverythingViaElementSet() {
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 2);
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(ms.elementSet().retainAll(asList("a", "b")));
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a", "a", "b");
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testElementSetBasic() {
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b", 2);
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("c", 1);
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashSet<String> expected = Sets.newHashSet("a", "b", "c");
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> actual = ms.elementSet();
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, actual);
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(actual, expected);
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testElementSetIsNotACopy() {
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 1);
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b", 2);
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> elementSet = ms.elementSet();
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("c", 3);
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.setCount("b", 0);
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Sets.newHashSet("a", "c"), elementSet);
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveFromElementSetYes() {
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 1);
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b", 2);
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> elementSet = ms.elementSet();
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(elementSet.remove("b"));
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a");
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveFromElementSetNo() {
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 1);
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> elementSet = ms.elementSet();
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(elementSet.remove("b"));
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents("a");
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveFromElementSetNull() {
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(false, ms.elementSet().remove(null));
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveFromElementSetWrongType() {
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(false, ms.elementSet().remove(new WrongType()));
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCantAddToElementSet() {
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ms.elementSet().add("a");
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearViaElementSet() {
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms = createSample();
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.elementSet().clear();
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClearViaEntrySet() {
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms = createSample();
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.entrySet().clear();
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertContents();
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySet() {
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms = createSample();
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Multiset.Entry<String> entry : ms.entrySet()) {
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(entry, entry);
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String element = entry.getElement();
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (element.equals("a")) {
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(1, entry.getCount());
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } else if (element.equals("b")) {
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(2, entry.getCount());
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } else if (element.equals("c")) {
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(1, entry.getCount());
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } else if (element.equals("d")) {
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(3, entry.getCount());
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } else {
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetEmpty() {
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptySet(), ms.entrySet());
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReallyBig() {
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", Integer.MAX_VALUE - 1);
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Integer.MAX_VALUE - 1, ms.size());
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b", 3);
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // See Collection.size() contract
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Integer.MAX_VALUE, ms.size());
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Make sure we didn't forget our size
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.remove("a", 4);
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Integer.MAX_VALUE - 2, ms.size());
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToStringNull() {
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("c", 1);
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b", 2);
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add(null, 4);
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // This test is brittle. The original test was meant to validate the
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // contents of the string itself, but key ordering tended to change
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // under unpredictable circumstances. Instead, we're just ensuring
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // that the string not return null, and implicitly, not throw an exception.
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNotNull(ms.toString());
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerializable() {
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms = createSample();
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ms, SerializableTester.reserialize(ms));
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIteratorRemove() {
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("c");
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = ms.iterator();
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String element1 = iterator.next();
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String element2 = iterator.next();
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(ms.contains(element1));
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.contains(element2));
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIteratorRemoveRepeated() {
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b", 1);
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("c", 2);
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = ms.iterator();
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < 6; i++) {
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(iterator.hasNext());
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.next();
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.remove();
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(ms.isEmpty());
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIteratorRemoveTooSoon() {
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("c");
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = ms.iterator();
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.remove();
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {}
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIteratorRemoveTwiceConsecutive() {
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("c");
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = ms.iterator();
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.remove();
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {}
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIteratorNoSuchElementException() {
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a");
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("c");
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = ms.iterator();
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.next();
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {}
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize();
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntryAfterRemove() {
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 8);
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset.Entry<String> entry = ms.entrySet().iterator().next();
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(8, entry.getCount());
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.remove("a");
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, entry.getCount());
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.remove("a", 4);
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, entry.getCount());
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.elementSet().remove("a");
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, entry.getCount());
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 5);
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, entry.getCount());
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntryAfterClear() {
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset.Entry<String> entry = ms.entrySet().iterator().next();
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.clear();
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, entry.getCount());
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 5);
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, entry.getCount());
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntryAfterEntrySetClear() {
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset.Entry<String> entry = ms.entrySet().iterator().next();
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.entrySet().clear();
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, entry.getCount());
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 5);
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, entry.getCount());
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntryAfterEntrySetIteratorRemove() {
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Multiset.Entry<String>> iterator = ms.entrySet().iterator();
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset.Entry<String> entry = iterator.next();
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, entry.getCount());
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.remove();
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {}
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 5);
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, entry.getCount());
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntryAfterElementSetIteratorRemove() {
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset.Entry<String> entry = ms.entrySet().iterator().next();
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = ms.elementSet().iterator();
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, entry.getCount());
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 5);
6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, entry.getCount());
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetContains() {
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Entry<String>> es = ms.entrySet();
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(es.contains(Multisets.immutableEntry("a", 3)));
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(es.contains(null));
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(es.contains(Maps.immutableEntry("a", 3)));
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(es.contains(Multisets.immutableEntry("a", 2)));
6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(es.contains(Multisets.immutableEntry("b", 3)));
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(es.contains(Multisets.immutableEntry("b", 0)));
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetRemove() {
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Entry<String>> es = ms.entrySet();
6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(es.remove(null));
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(es.remove(Maps.immutableEntry("a", 3)));
6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(es.remove(Multisets.immutableEntry("a", 2)));
6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(es.remove(Multisets.immutableEntry("b", 3)));
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(es.remove(Multisets.immutableEntry("b", 0)));
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, ms.count("a"));
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(es.remove(Multisets.immutableEntry("a", 3)));
6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, ms.count("a"));
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetToArray() {
6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Multiset.Entry<String>> es = ms.entrySet();
6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<?>[] array = new Entry<?>[3];
6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(array, es.toArray(array));
6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Multisets.immutableEntry("a", 3), array[0]);
6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(array[1]);
6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testUnmodifiableMultiset() {
6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 3);
6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b");
6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("c", 2);
6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<Object> unmodifiable = Multisets.<Object>unmodifiableMultiset(ms);
6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    UnmodifiableCollectionTests.assertMultisetIsUnmodifiable(unmodifiable, "a");
6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Multiset<String> createSample() {
6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> ms = create();
6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("a", 1);
6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("b", 2);
6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("c", 1);
6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ms.add("d", 3);
6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ms;
6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
692