11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 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 Bringertimport static org.junit.contrib.truth.Truth.ASSERT;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MinimalCollection;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SetTestSuiteBuilder;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestStringSetGenerator;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.MultisetTestSuiteBuilder;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.TestStringMultisetGenerator;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.UnmodifiableCollectionTests;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.Test;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestSuite;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@link ImmutableMultiset}.
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ImmutableMultisetTest extends TestCase {
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("suite") // TODO(cpovirk): add to collect/gwt/suites
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite() {
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite();
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(ImmutableMultisetTest.class);
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(MultisetTestSuiteBuilder.using(
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new TestStringMultisetGenerator() {
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Multiset<String> create(String[] elements) {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return ImmutableMultiset.copyOf(elements);
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableMultiset")
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(MultisetTestSuiteBuilder.using(
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new TestStringMultisetGenerator() {
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Multiset<String> create(String[] elements) {
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return SerializableTester.reserialize(
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                ImmutableMultiset.copyOf(elements));
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableMultiset, reserialized")
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Set<String> create(String[] elements) {
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return SerializableTester.reserialize(
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                ImmutableMultiset.copyOf(elements).elementSet());
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableMultiset, element set")
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_noArgs() {
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of();
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_oneElement() {
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of("a");
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a")), multiset);
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_twoElements() {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of("a", "b");
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b")), multiset);
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_threeElements() {
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of("a", "b", "c");
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "c")), multiset);
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_fourElements() {
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of("a", "b", "c", "d");
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "c", "d")), multiset);
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_fiveElements() {
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of("a", "b", "c", "d", "e");
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "c", "d", "e")),
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multiset);
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_sixElements() {
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of(
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "a", "b", "c", "d", "e", "f");
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "c", "d", "e", "f")),
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multiset);
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_sevenElements() {
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of(
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "a", "b", "c", "d", "e", "f", "g");
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(asList("a", "b", "c", "d", "e", "f", "g")),
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multiset);
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_emptyArray() {
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = new String[0];
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(array);
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_arrayOfOneElement() {
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = new String[] { "a" };
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(array);
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a")), multiset);
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_arrayOfArray() {
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = new String[] { "a" };
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String[]> multiset = ImmutableMultiset.<String[]>of(array);
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String[]> expected = HashMultiset.create();
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.add(array);
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, multiset);
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_arrayContainingOnlyNull() {
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = new String[] { null };
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMultiset.copyOf(array);
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_collection_empty() {
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // "<String>" is required to work around a javac 1.5 bug.
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = MinimalCollection.<String>of();
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(c);
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_collection_oneElement() {
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = MinimalCollection.of("a");
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(c);
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a")), multiset);
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_collection_general() {
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = MinimalCollection.of("a", "b", "a");
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(c);
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset);
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_collectionContainingNull() {
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = MinimalCollection.of("a", null, "b");
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMultiset.copyOf(c);
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_multiset_empty() {
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> c = HashMultiset.create();
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(c);
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_multiset_oneElement() {
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> c = HashMultiset.create(asList("a"));
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(c);
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a")), multiset);
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_multiset_general() {
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> c = HashMultiset.create(asList("a", "b", "a"));
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(c);
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset);
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_multisetContainingNull() {
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> c = HashMultiset.create(asList("a", null, "b"));
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMultiset.copyOf(c);
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_iterator_empty() {
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.emptyIterator();
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(iterator);
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_iterator_oneElement() {
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.singletonIterator("a");
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(iterator);
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a")), multiset);
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_iterator_general() {
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = asList("a", "b", "a").iterator();
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(iterator);
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset);
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_iteratorContainingNull() {
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = asList("a", null, "b").iterator();
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMultiset.copyOf(iterator);
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class CountingIterable implements Iterable<String> {
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int count = 0;
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Iterator<String> iterator() {
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      count++;
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return asList("a", "b", "a").iterator();
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_plainIterable() {
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CountingIterable iterable = new CountingIterable();
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(iterable);
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset);
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, iterable.count);
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_shortcut_empty() {
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of();
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(c, ImmutableMultiset.copyOf(c));
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_shortcut_singleton() {
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of("a");
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(c, ImmutableMultiset.copyOf(c));
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_shortcut_immutableMultiset() {
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of("a", "b", "c");
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(c, ImmutableMultiset.copyOf(c));
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAdd() {
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .add("a")
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .add("b")
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .add("a")
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .add("c")
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "a", "c")), multiset);
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddAll() {
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> a = asList("a", "b");
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> b = asList("c", "d");
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addAll(a)
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addAll(b)
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "c", "d")), multiset);
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddAllMultiset() {
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> a = HashMultiset.create(asList("a", "b", "b"));
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> b = HashMultiset.create(asList("c", "b"));
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addAll(a)
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addAll(b)
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(asList("a", "b", "b", "b", "c")), multiset);
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddAllIterator() {
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = asList("a", "b", "a", "c").iterator();
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addAll(iterator)
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "a", "c")), multiset);
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddCopies() {
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addCopies("a", 2)
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addCopies("b", 3)
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addCopies("c", 0)
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(asList("a", "a", "b", "b", "b")), multiset);
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderSetCount() {
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .add("a")
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .setCount("a", 2)
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .setCount("b", 3)
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(asList("a", "a", "b", "b", "b")), multiset);
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddHandlesNullsCorrectly() {
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.add((String) null);
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddAllHandlesNullsCorrectly() {
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.addAll((Collection<String>) null);
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder = ImmutableMultiset.builder();
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> listWithNulls = asList("a", null, "b");
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.addAll(listWithNulls);
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder = ImmutableMultiset.builder();
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multisetWithNull
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = LinkedHashMultiset.create(asList("a", null, "b"));
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.addAll(multisetWithNull);
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddCopiesHandlesNullsCorrectly() {
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.addCopies(null, 2);
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddCopiesIllegal() {
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.addCopies("a", -2);
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected IllegalArgumentException");
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderSetCountHandlesNullsCorrectly() {
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.setCount(null, 2);
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderSetCountIllegal() {
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.setCount("a", -2);
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected IllegalArgumentException");
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullPointers() throws Exception {
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(ImmutableMultiset.class);
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization_empty() {
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of();
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(c, SerializableTester.reserialize(c));
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization_multiple() {
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of("a", "b", "a");
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> copy = SerializableTester.reserializeAndAssert(c);
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(copy).hasContentsInOrder("a", "a", "b");
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization_elementSet() {
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> c = ImmutableMultiset.of("a", "b", "a");
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> copy =
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        LenientSerializableTester.reserializeAndAssertLenient(c.elementSet());
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(copy).hasContentsInOrder("a", "b");
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization_entrySet() {
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> c = ImmutableMultiset.of("a", "b", "c");
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(c.entrySet());
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals_immutableMultiset() {
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of("a", "b", "a");
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c, ImmutableMultiset.of("a", "b", "a"));
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c, ImmutableMultiset.of("a", "a", "b"));
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(c).isNotEqualTo(ImmutableMultiset.of("a", "b"));
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(c).isNotEqualTo(ImmutableMultiset.of("a", "b", "c", "d"));
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIterationOrder() {
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of("a", "b", "a");
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(c).hasContentsInOrder("a", "a", "b");
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMultisetWrites() {
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of("a", "b", "a");
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    UnmodifiableCollectionTests.assertMultisetIsUnmodifiable(multiset, "test");
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsList() {
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableMultiset.of("a", "a", "b", "b", "b");
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableList<String> list = multiset.asList();
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableList.of("a", "a", "b", "b", "b"), list);
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, list.indexOf("b"));
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, list.lastIndexOf("b"));
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization_asList() {
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableMultiset.of("a", "a", "b", "b", "b");
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(multiset.asList());
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
467