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
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.base.Preconditions.checkArgument;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static org.truth0.Truth.ASSERT;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.ListTestSuiteBuilder;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MinimalCollection;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SetTestSuiteBuilder;
287dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.TestStringListGenerator;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestStringSetGenerator;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.MultisetTestSuiteBuilder;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.TestStringMultisetGenerator;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.UnmodifiableCollectionTests;
357dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.testing.EqualsTester;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
390888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.Test;
400888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
410888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestSuite;
420888a09821a98ac0680fad765217302858e70fa4Paul Duffin
437dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.ArrayList;
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
457dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.HashSet;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@link ImmutableMultiset}.
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ImmutableMultisetTest extends TestCase {
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("suite") // TODO(cpovirk): add to collect/gwt/suites
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite() {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite();
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(ImmutableMultisetTest.class);
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(MultisetTestSuiteBuilder.using(
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new TestStringMultisetGenerator() {
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected Multiset<String> create(String[] elements) {
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return ImmutableMultiset.copyOf(elements);
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableMultiset")
707dd252788645e940eada959bdde927426e2531c9Paul Duffin        .withFeatures(CollectionSize.ANY,
717dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS,
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
757dd252788645e940eada959bdde927426e2531c9Paul Duffin    suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() {
767dd252788645e940eada959bdde927426e2531c9Paul Duffin          @Override protected Set<String> create(String[] elements) {
777dd252788645e940eada959bdde927426e2531c9Paul Duffin            return ImmutableMultiset.copyOf(elements).elementSet();
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
807dd252788645e940eada959bdde927426e2531c9Paul Duffin        .named("ImmutableMultiset, element set")
813c77433663281544363151bf284b0240dfd22a42Paul Duffin        .withFeatures(CollectionSize.ANY,
827dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
833c77433663281544363151bf284b0240dfd22a42Paul Duffin            CollectionFeature.ALLOWS_NULL_QUERIES)
843c77433663281544363151bf284b0240dfd22a42Paul Duffin        .createTestSuite());
853c77433663281544363151bf284b0240dfd22a42Paul Duffin
867dd252788645e940eada959bdde927426e2531c9Paul Duffin    suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
877dd252788645e940eada959bdde927426e2531c9Paul Duffin          @Override protected List<String> create(String[] elements) {
887dd252788645e940eada959bdde927426e2531c9Paul Duffin            return ImmutableMultiset.copyOf(elements).asList();
897dd252788645e940eada959bdde927426e2531c9Paul Duffin          }
907dd252788645e940eada959bdde927426e2531c9Paul Duffin
917dd252788645e940eada959bdde927426e2531c9Paul Duffin          @Override
927dd252788645e940eada959bdde927426e2531c9Paul Duffin          public List<String> order(List<String> insertionOrder) {
937dd252788645e940eada959bdde927426e2531c9Paul Duffin            List<String> order = new ArrayList<String>();
947dd252788645e940eada959bdde927426e2531c9Paul Duffin            for (String s : insertionOrder) {
957dd252788645e940eada959bdde927426e2531c9Paul Duffin              int index = order.indexOf(s);
967dd252788645e940eada959bdde927426e2531c9Paul Duffin              if (index == -1) {
977dd252788645e940eada959bdde927426e2531c9Paul Duffin                order.add(s);
987dd252788645e940eada959bdde927426e2531c9Paul Duffin              } else {
997dd252788645e940eada959bdde927426e2531c9Paul Duffin                order.add(index, s);
1007dd252788645e940eada959bdde927426e2531c9Paul Duffin              }
1017dd252788645e940eada959bdde927426e2531c9Paul Duffin            }
1027dd252788645e940eada959bdde927426e2531c9Paul Duffin            return order;
1033c77433663281544363151bf284b0240dfd22a42Paul Duffin          }
1043c77433663281544363151bf284b0240dfd22a42Paul Duffin        })
1057dd252788645e940eada959bdde927426e2531c9Paul Duffin        .named("ImmutableMultiset.asList")
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1077dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
1087dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.ALLOWS_NULL_QUERIES)
1097dd252788645e940eada959bdde927426e2531c9Paul Duffin        .createTestSuite());
1107dd252788645e940eada959bdde927426e2531c9Paul Duffin
1117dd252788645e940eada959bdde927426e2531c9Paul Duffin    suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
1127dd252788645e940eada959bdde927426e2531c9Paul Duffin          @Override protected List<String> create(String[] elements) {
1137dd252788645e940eada959bdde927426e2531c9Paul Duffin            Set<String> set = new HashSet<String>();
1147dd252788645e940eada959bdde927426e2531c9Paul Duffin            ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
1157dd252788645e940eada959bdde927426e2531c9Paul Duffin            for (String s : elements) {
1167dd252788645e940eada959bdde927426e2531c9Paul Duffin              checkArgument(set.add(s));
1177dd252788645e940eada959bdde927426e2531c9Paul Duffin              builder.addCopies(s, 2);
1187dd252788645e940eada959bdde927426e2531c9Paul Duffin            }
1197dd252788645e940eada959bdde927426e2531c9Paul Duffin            ImmutableSet<String> elementSet = (ImmutableSet<String>) builder.build().elementSet();
1207dd252788645e940eada959bdde927426e2531c9Paul Duffin            return elementSet.asList();
1217dd252788645e940eada959bdde927426e2531c9Paul Duffin          }
1227dd252788645e940eada959bdde927426e2531c9Paul Duffin        })
1237dd252788645e940eada959bdde927426e2531c9Paul Duffin        .named("ImmutableMultiset.elementSet.asList")
1247dd252788645e940eada959bdde927426e2531c9Paul Duffin        .withFeatures(CollectionSize.ANY,
1257dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.REJECTS_DUPLICATES_AT_CREATION,
1267dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_noArgs() {
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of();
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_oneElement() {
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of("a");
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a")), multiset);
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_twoElements() {
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of("a", "b");
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b")), multiset);
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_threeElements() {
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of("a", "b", "c");
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "c")), multiset);
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_fourElements() {
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of("a", "b", "c", "d");
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "c", "d")), multiset);
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_fiveElements() {
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of("a", "b", "c", "d", "e");
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "c", "d", "e")),
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multiset);
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_sixElements() {
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of(
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "a", "b", "c", "d", "e", "f");
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "c", "d", "e", "f")),
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multiset);
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_sevenElements() {
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of(
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "a", "b", "c", "d", "e", "f", "g");
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(asList("a", "b", "c", "d", "e", "f", "g")),
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multiset);
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_emptyArray() {
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = new String[0];
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(array);
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_arrayOfOneElement() {
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = new String[] { "a" };
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(array);
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a")), multiset);
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_arrayOfArray() {
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = new String[] { "a" };
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String[]> multiset = ImmutableMultiset.<String[]>of(array);
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String[]> expected = HashMultiset.create();
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.add(array);
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, multiset);
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreation_arrayContainingOnlyNull() {
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = new String[] { null };
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMultiset.copyOf(array);
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_collection_empty() {
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // "<String>" is required to work around a javac 1.5 bug.
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = MinimalCollection.<String>of();
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(c);
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_collection_oneElement() {
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = MinimalCollection.of("a");
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(c);
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a")), multiset);
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_collection_general() {
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = MinimalCollection.of("a", "b", "a");
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(c);
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset);
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_collectionContainingNull() {
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = MinimalCollection.of("a", null, "b");
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMultiset.copyOf(c);
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_multiset_empty() {
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> c = HashMultiset.create();
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(c);
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_multiset_oneElement() {
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> c = HashMultiset.create(asList("a"));
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(c);
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a")), multiset);
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_multiset_general() {
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> c = HashMultiset.create(asList("a", "b", "a"));
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(c);
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset);
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_multisetContainingNull() {
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> c = HashMultiset.create(asList("a", null, "b"));
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMultiset.copyOf(c);
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_iterator_empty() {
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.emptyIterator();
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(iterator);
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_iterator_oneElement() {
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.singletonIterator("a");
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(iterator);
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a")), multiset);
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_iterator_general() {
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = asList("a", "b", "a").iterator();
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(iterator);
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset);
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_iteratorContainingNull() {
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = asList("a", null, "b").iterator();
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMultiset.copyOf(iterator);
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class CountingIterable implements Iterable<String> {
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int count = 0;
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Iterator<String> iterator() {
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      count++;
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return asList("a", "b", "a").iterator();
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_plainIterable() {
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    CountingIterable iterable = new CountingIterable();
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.copyOf(iterable);
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "a")), multiset);
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, iterable.count);
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_shortcut_empty() {
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of();
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(c, ImmutableMultiset.copyOf(c));
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_shortcut_singleton() {
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of("a");
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(c, ImmutableMultiset.copyOf(c));
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf_shortcut_immutableMultiset() {
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of("a", "b", "c");
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(c, ImmutableMultiset.copyOf(c));
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAdd() {
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .add("a")
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .add("b")
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .add("a")
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .add("c")
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "a", "c")), multiset);
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddAll() {
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> a = asList("a", "b");
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> b = asList("c", "d");
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addAll(a)
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addAll(b)
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "c", "d")), multiset);
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddAllMultiset() {
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> a = HashMultiset.create(asList("a", "b", "b"));
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> b = HashMultiset.create(asList("c", "b"));
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addAll(a)
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addAll(b)
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(asList("a", "b", "b", "b", "c")), multiset);
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddAllIterator() {
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = asList("a", "b", "a", "c").iterator();
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addAll(iterator)
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(asList("a", "b", "a", "c")), multiset);
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddCopies() {
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addCopies("a", 2)
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addCopies("b", 3)
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addCopies("c", 0)
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(asList("a", "a", "b", "b", "b")), multiset);
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderSetCount() {
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset = new ImmutableMultiset.Builder<String>()
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .add("a")
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .setCount("a", 2)
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .setCount("b", 3)
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(asList("a", "a", "b", "b", "b")), multiset);
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddHandlesNullsCorrectly() {
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.add((String) null);
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddAllHandlesNullsCorrectly() {
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.addAll((Collection<String>) null);
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder = ImmutableMultiset.builder();
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> listWithNulls = asList("a", null, "b");
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.addAll(listWithNulls);
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder = ImmutableMultiset.builder();
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multisetWithNull
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = LinkedHashMultiset.create(asList("a", null, "b"));
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.addAll(multisetWithNull);
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddCopiesHandlesNullsCorrectly() {
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.addCopies(null, 2);
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderAddCopiesIllegal() {
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.addCopies("a", -2);
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected IllegalArgumentException");
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderSetCountHandlesNullsCorrectly() {
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.setCount(null, 2);
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected NullPointerException");
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderSetCountIllegal() {
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset.Builder<String> builder = ImmutableMultiset.builder();
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.setCount("a", -2);
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected IllegalArgumentException");
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
4407dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testNullPointers() {
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(ImmutableMultiset.class);
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization_empty() {
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of();
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(c, SerializableTester.reserialize(c));
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization_multiple() {
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of("a", "b", "a");
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> copy = SerializableTester.reserializeAndAssert(c);
4550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(copy).has().exactly("a", "a", "b").inOrder();
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization_elementSet() {
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> c = ImmutableMultiset.of("a", "b", "a");
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> copy =
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        LenientSerializableTester.reserializeAndAssertLenient(c.elementSet());
4630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(copy).has().exactly("a", "b").inOrder();
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization_entrySet() {
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> c = ImmutableMultiset.of("a", "b", "c");
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(c.entrySet());
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals_immutableMultiset() {
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of("a", "b", "a");
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c, ImmutableMultiset.of("a", "b", "a"));
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(c, ImmutableMultiset.of("a", "a", "b"));
4760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(c).isNotEqualTo(ImmutableMultiset.of("a", "b"));
4770888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(c).isNotEqualTo(ImmutableMultiset.of("a", "b", "c", "d"));
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIterationOrder() {
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> c = ImmutableMultiset.of("a", "b", "a");
4820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ASSERT.that(c).has().exactly("a", "a", "b").inOrder();
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMultisetWrites() {
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = ImmutableMultiset.of("a", "b", "a");
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    UnmodifiableCollectionTests.assertMultisetIsUnmodifiable(multiset, "test");
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsList() {
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableMultiset.of("a", "a", "b", "b", "b");
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableList<String> list = multiset.asList();
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableList.of("a", "a", "b", "b", "b"), list);
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, list.indexOf("b"));
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, list.lastIndexOf("b"));
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization_asList() {
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMultiset<String> multiset
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableMultiset.of("a", "a", "b", "b", "b");
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(multiset.asList());
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5057dd252788645e940eada959bdde927426e2531c9Paul Duffin
5067dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testEquals() {
5077dd252788645e940eada959bdde927426e2531c9Paul Duffin    new EqualsTester()
5087dd252788645e940eada959bdde927426e2531c9Paul Duffin        .addEqualityGroup(ImmutableMultiset.of(), ImmutableMultiset.of())
5097dd252788645e940eada959bdde927426e2531c9Paul Duffin        .addEqualityGroup(ImmutableMultiset.of(1), ImmutableMultiset.of(1))
5107dd252788645e940eada959bdde927426e2531c9Paul Duffin        .addEqualityGroup(ImmutableMultiset.of(1, 1), ImmutableMultiset.of(1, 1))
5117dd252788645e940eada959bdde927426e2531c9Paul Duffin        .addEqualityGroup(ImmutableMultiset.of(1, 2, 1), ImmutableMultiset.of(2, 1, 1))
5127dd252788645e940eada959bdde927426e2531c9Paul Duffin        .testEquals();
5137dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
515