11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2009 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
193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport static com.google.common.truth.Truth.assertThat;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableSetMultimap.Builder;
247dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.CollectionFeature;
257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.CollectionSize;
267dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.MapFeature;
277dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.SetMultimapTestSuiteBuilder;
287dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.TestStringSetMultimapGenerator;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.UnmodifiableCollectionTests;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.EqualsTester;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
337dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.Test;
347dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.TestCase;
357dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.TestSuite;
367dd252788645e940eada959bdde927426e2531c9Paul Duffin
370888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Arrays;
380888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collection;
390888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collections;
400888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Map.Entry;
417dd252788645e940eada959bdde927426e2531c9Paul Duffin
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@link ImmutableSetMultimap}.
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Ward
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ImmutableSetMultimapTest extends TestCase {
497dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("suite")
507dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static Test suite() {
517dd252788645e940eada959bdde927426e2531c9Paul Duffin    TestSuite suite = new TestSuite();
527dd252788645e940eada959bdde927426e2531c9Paul Duffin    suite.addTestSuite(ImmutableSetMultimapTest.class);
537dd252788645e940eada959bdde927426e2531c9Paul Duffin    suite.addTest(SetMultimapTestSuiteBuilder.using(new TestStringSetMultimapGenerator() {
547dd252788645e940eada959bdde927426e2531c9Paul Duffin        @Override
557dd252788645e940eada959bdde927426e2531c9Paul Duffin        protected SetMultimap<String, String> create(Entry<String, String>[] entries) {
567dd252788645e940eada959bdde927426e2531c9Paul Duffin          ImmutableSetMultimap.Builder<String, String> builder = ImmutableSetMultimap.builder();
577dd252788645e940eada959bdde927426e2531c9Paul Duffin          for (Entry<String, String> entry : entries) {
587dd252788645e940eada959bdde927426e2531c9Paul Duffin            builder.put(entry.getKey(), entry.getValue());
597dd252788645e940eada959bdde927426e2531c9Paul Duffin          }
607dd252788645e940eada959bdde927426e2531c9Paul Duffin          return builder.build();
617dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
627dd252788645e940eada959bdde927426e2531c9Paul Duffin      })
637dd252788645e940eada959bdde927426e2531c9Paul Duffin      .named("ImmutableSetMultimap")
647dd252788645e940eada959bdde927426e2531c9Paul Duffin      .withFeatures(
650888a09821a98ac0680fad765217302858e70fa4Paul Duffin          MapFeature.ALLOWS_ANY_NULL_QUERIES,
667dd252788645e940eada959bdde927426e2531c9Paul Duffin          CollectionFeature.KNOWN_ORDER,
677dd252788645e940eada959bdde927426e2531c9Paul Duffin          CollectionFeature.SERIALIZABLE,
687dd252788645e940eada959bdde927426e2531c9Paul Duffin          CollectionSize.ANY)
697dd252788645e940eada959bdde927426e2531c9Paul Duffin      .createTestSuite());
707dd252788645e940eada959bdde927426e2531c9Paul Duffin    return suite;
717dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_withImmutableEntry() {
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap<String, Integer> multimap = new Builder<String, Integer>()
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .put(Maps.immutableEntry("one", 1))
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of(1), multimap.get("one"));
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_withImmutableEntryAndNullContents() {
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Builder<String, Integer> builder = new Builder<String, Integer>();
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put(Maps.immutableEntry("one", (Integer) null));
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put(Maps.immutableEntry((String) null, 1));
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class StringHolder {
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String string;
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_withMutableEntry() {
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap.Builder<String, Integer> builder =
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Builder<String, Integer>();
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final StringHolder holder = new StringHolder();
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    holder.string = "one";
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<String, Integer> entry = new AbstractMapEntry<String, Integer>() {
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public String getKey() {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return holder.string;
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public Integer getValue() {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return 1;
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put(entry);
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    holder.string = "two";
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of(1), builder.build().get("one"));
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutAllIterable() {
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap.Builder<String, Integer> builder
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSetMultimap.builder();
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", Arrays.asList(1, 2, 3));
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("bar", Arrays.asList(4, 5));
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", Arrays.asList(6, 7));
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = builder.build();
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of(1, 2, 3, 6, 7), multimap.get("foo"));
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of(4, 5), multimap.get("bar"));
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, multimap.size());
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutAllVarargs() {
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap.Builder<String, Integer> builder
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSetMultimap.builder();
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", 1, 2, 3);
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("bar", 4, 5);
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", 6, 7);
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = builder.build();
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of(1, 2, 3, 6, 7), multimap.get("foo"));
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of(4, 5), multimap.get("bar"));
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, multimap.size());
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutAllMultimap() {
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> toPut = LinkedListMultimap.create();
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", 1);
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("bar", 4);
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", 2);
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", 3);
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> moreToPut = LinkedListMultimap.create();
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    moreToPut.put("foo", 6);
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    moreToPut.put("bar", 5);
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    moreToPut.put("foo", 7);
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap.Builder<String, Integer> builder
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSetMultimap.builder();
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll(toPut);
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll(moreToPut);
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = builder.build();
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of(1, 2, 3, 6, 7), multimap.get("foo"));
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of(4, 5), multimap.get("bar"));
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, multimap.size());
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutAllWithDuplicates() {
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap.Builder<String, Integer> builder
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSetMultimap.builder();
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", 1, 2, 3);
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("bar", 4, 5);
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", 1, 6, 7);
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap<String, Integer> multimap = builder.build();
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, multimap.size());
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutWithDuplicates() {
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap.Builder<String, Integer> builder
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSetMultimap.builder();
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", 1, 2, 3);
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("bar", 4, 5);
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("foo", 1);
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap<String, Integer> multimap = builder.build();
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, multimap.size());
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutAllMultimapWithDuplicates() {
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> toPut = LinkedListMultimap.create();
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", 1);
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("bar", 4);
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", 2);
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", 1);
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("bar", 5);
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap.Builder<String, Integer> builder
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSetMultimap.builder();
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll(toPut);
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap<String, Integer> multimap = builder.build();
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, multimap.size());
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutNullKey() {
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> toPut = LinkedListMultimap.create();
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", null);
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap.Builder<String, Integer> builder
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSetMultimap.builder();
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put(null, 1);
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.putAll(null, Arrays.asList(1, 2, 3));
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.putAll(null, 1, 2, 3);
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.putAll(toPut);
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutNullValue() {
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> toPut = LinkedListMultimap.create();
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put(null, 1);
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap.Builder<String, Integer> builder
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSetMultimap.builder();
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put("foo", null);
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.putAll("foo", Arrays.asList(1, null, 3));
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.putAll("foo", 4, null, 6);
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.putAll(toPut);
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderOrderKeysBy() {
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap.Builder<String, Integer> builder
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSetMultimap.builder();
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("b", 3);
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("d", 2);
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("a", 5);
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderKeysBy(Collections.reverseOrder());
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("c", 4);
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("a", 2);
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("b", 6);
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap<String, Integer> multimap = builder.build();
2523ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.keySet()).has().exactly("d", "c", "b", "a").inOrder();
2533ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.values()).has().exactly(2, 4, 3, 6, 5, 2).inOrder();
2543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("a")).has().exactly(5, 2).inOrder();
2553ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("b")).has().exactly(3, 6).inOrder();
2567dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertFalse(multimap.get("a") instanceof ImmutableSortedSet);
2577dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertFalse(multimap.get("x") instanceof ImmutableSortedSet);
2587dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertFalse(multimap.asMap().get("a") instanceof ImmutableSortedSet);
2597dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2607dd252788645e940eada959bdde927426e2531c9Paul Duffin
2617dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testBuilderOrderKeysByDuplicates() {
2627dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableSetMultimap.Builder<String, Integer> builder
2637dd252788645e940eada959bdde927426e2531c9Paul Duffin        = ImmutableSetMultimap.builder();
2647dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.put("bb", 3);
2657dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.put("d", 2);
2667dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.put("a", 5);
2677dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.orderKeysBy(new Ordering<String>() {
2687dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2697dd252788645e940eada959bdde927426e2531c9Paul Duffin      public int compare(String left, String right) {
2707dd252788645e940eada959bdde927426e2531c9Paul Duffin        return left.length() - right.length();
2717dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2727dd252788645e940eada959bdde927426e2531c9Paul Duffin    });
2737dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.put("cc", 4);
2747dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.put("a", 2);
2757dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.put("bb", 6);
2767dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableSetMultimap<String, Integer> multimap = builder.build();
2773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.keySet()).has().exactly("d", "a", "bb", "cc").inOrder();
2783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.values()).has().exactly(2, 5, 2, 3, 6, 4).inOrder();
2793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("a")).has().exactly(5, 2).inOrder();
2803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("bb")).has().exactly(3, 6).inOrder();
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.get("a") instanceof ImmutableSortedSet);
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.get("x") instanceof ImmutableSortedSet);
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.asMap().get("a") instanceof ImmutableSortedSet);
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderOrderValuesBy() {
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap.Builder<String, Integer> builder
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSetMultimap.builder();
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("b", 3);
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("d", 2);
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("a", 5);
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderValuesBy(Collections.reverseOrder());
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("c", 4);
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("a", 2);
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("b", 6);
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap<String, Integer> multimap = builder.build();
2973ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.keySet()).has().exactly("b", "d", "a", "c").inOrder();
2983ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.values()).has().exactly(6, 3, 2, 5, 2, 4).inOrder();
2993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("a")).has().exactly(5, 2).inOrder();
3003ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("b")).has().exactly(6, 3).inOrder();
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.get("a") instanceof ImmutableSortedSet);
3027dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(Collections.reverseOrder(),
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ((ImmutableSortedSet<Integer>) multimap.get("a")).comparator());
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.get("x") instanceof ImmutableSortedSet);
3057dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(Collections.reverseOrder(),
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ((ImmutableSortedSet<Integer>) multimap.get("x")).comparator());
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.asMap().get("a") instanceof ImmutableSortedSet);
3087dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(Collections.reverseOrder(),
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ((ImmutableSortedSet<Integer>) multimap.asMap().get("a")).comparator());
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderOrderKeysAndValuesBy() {
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap.Builder<String, Integer> builder
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSetMultimap.builder();
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("b", 3);
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("d", 2);
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("a", 5);
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderKeysBy(Collections.reverseOrder());
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderValuesBy(Collections.reverseOrder());
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("c", 4);
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("a", 2);
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("b", 6);
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap<String, Integer> multimap = builder.build();
3243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.keySet()).has().exactly("d", "c", "b", "a").inOrder();
3253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.values()).has().exactly(2, 4, 6, 3, 5, 2).inOrder();
3263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("a")).has().exactly(5, 2).inOrder();
3273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("b")).has().exactly(6, 3).inOrder();
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.get("a") instanceof ImmutableSortedSet);
3297dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(Collections.reverseOrder(),
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ((ImmutableSortedSet<Integer>) multimap.get("a")).comparator());
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.get("x") instanceof ImmutableSortedSet);
3327dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(Collections.reverseOrder(),
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ((ImmutableSortedSet<Integer>) multimap.get("x")).comparator());
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.asMap().get("a") instanceof ImmutableSortedSet);
3357dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(Collections.reverseOrder(),
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ((ImmutableSortedSet<Integer>) multimap.asMap().get("a")).comparator());
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3387dd252788645e940eada959bdde927426e2531c9Paul Duffin
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf() {
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashMultimap<String, Integer> input = HashMultimap.create();
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("foo", 1);
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("bar", 2);
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("foo", 3);
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = ImmutableSetMultimap.copyOf(input);
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap, input);
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(input, multimap);
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOfWithDuplicates() {
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayListMultimap<Object, Object> input = ArrayListMultimap.create();
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("foo", 1);
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("bar", 2);
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("foo", 3);
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("foo", 1);
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap<Object, Object> copy
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableSetMultimap.copyOf(input);
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, copy.size());
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOfEmpty() {
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashMultimap<String, Integer> input = HashMultimap.create();
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = ImmutableSetMultimap.copyOf(input);
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap, input);
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(input, multimap);
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOfImmutableSetMultimap() {
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = createMultimap();
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(multimap, ImmutableSetMultimap.copyOf(multimap));
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOfNullKey() {
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashMultimap<String, Integer> input = HashMultimap.create();
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put(null, 1);
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSetMultimap.copyOf(input);
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOfNullValue() {
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HashMultimap<String, Integer> input = HashMultimap.create();
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.putAll("foo", Arrays.asList(1, null, 3));
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableSetMultimap.copyOf(input);
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyMultimapReads() {
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = ImmutableSetMultimap.of();
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsValue(1));
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", 1));
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.entries().isEmpty());
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.equals(HashMultimap.create()));
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptySet(), multimap.get("foo"));
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multimap.hashCode());
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(), multimap.keys());
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptySet(), multimap.keySet());
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multimap.size());
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.values().isEmpty());
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{}", multimap.toString());
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyMultimapWrites() {
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = ImmutableSetMultimap.of();
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    UnmodifiableCollectionTests.assertMultimapIsUnmodifiable(
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap, "foo", 1);
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMultimapReads() {
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = createMultimap();
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsKey("foo"));
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("cat"));
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsValue(1));
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsValue(5));
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 1));
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("cat", 1));
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", 5));
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.entries().isEmpty());
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, multimap.size());
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.isEmpty());
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{foo=[1, 3], bar=[2]}", multimap.toString());
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMultimapWrites() {
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = createMultimap();
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    UnmodifiableCollectionTests.assertMultimapIsUnmodifiable(
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap, "bar", 2);
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMultimapEquals() {
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = createMultimap();
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> hashMultimap = HashMultimap.create();
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    hashMultimap.putAll("foo", Arrays.asList(1, 3));
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    hashMultimap.put("bar", 2);
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            multimap,
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            createMultimap(),
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            hashMultimap,
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            ImmutableSetMultimap.<String, Integer>builder()
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                .put("bar", 2).put("foo", 1).put("foo", 3).build(),
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            ImmutableSetMultimap.<String, Integer>builder()
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                .put("bar", 2).put("foo", 3).put("foo", 1).build())
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(ImmutableSetMultimap.<String, Integer>builder()
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put("foo", 2).put("foo", 3).put("foo", 1).build())
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(ImmutableSetMultimap.<String, Integer>builder()
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put("bar", 2).put("foo", 3).build())
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOf() {
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertMultimapEquals(
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.of("one", 1),
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "one", 1);
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertMultimapEquals(
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.of("one", 1, "two", 2),
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "one", 1, "two", 2);
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertMultimapEquals(
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.of("one", 1, "two", 2, "three", 3),
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "one", 1, "two", 2, "three", 3);
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertMultimapEquals(
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.of("one", 1, "two", 2, "three", 3, "four", 4),
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "one", 1, "two", 2, "three", 3, "four", 4);
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertMultimapEquals(
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.of(
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            "one", 1, "two", 2, "three", 3, "four", 4, "five", 5),
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testInverse() {
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.<Integer, String>of(),
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.<String, Integer>of().inverse());
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.of(1, "one"),
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.of("one", 1).inverse());
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.of(1, "one", 2, "two"),
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.of("one", 1, "two", 2).inverse());
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.of('o', "of", 'f', "of", 't', "to", 'o', "to"),
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.of("of", 'o', "of", 'f', "to", 't', "to", 'o').inverse());
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testInverseMinimizesWork() {
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableSetMultimap<String, Character> multimap =
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableSetMultimap.of("of", 'o', "of", 'f', "to", 't', "to", 'o');
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(multimap.inverse(), multimap.inverse());
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(multimap, multimap.inverse().inverse());
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static <K, V> void assertMultimapEquals(Multimap<K, V> multimap,
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Object... alternatingKeysAndValues) {
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.size(), alternatingKeysAndValues.length / 2);
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int i = 0;
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Entry<K, V> entry : multimap.entries()) {
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(alternatingKeysAndValues[i++], entry.getKey());
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(alternatingKeysAndValues[i++], entry.getValue());
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5057dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization() {
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = createMultimap();
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(multimap);
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.size(),
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        SerializableTester.reserialize(multimap).size());
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(multimap.get("foo"));
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LenientSerializableTester.reserializeAndAssertLenient(multimap.keySet());
5157dd252788645e940eada959bdde927426e2531c9Paul Duffin    LenientSerializableTester.reserializeAndAssertLenient(multimap.keys());
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(multimap.asMap());
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> valuesCopy
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = SerializableTester.reserialize(multimap.values());
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(multimap.values()),
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(valuesCopy));
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptySerialization() {
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = ImmutableSetMultimap.of();
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(multimap, SerializableTester.reserialize(multimap));
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5290888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @GwtIncompatible("SerializableTester")
5300888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testSortedSerialization() {
5310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Multimap<String, Integer> multimap = new ImmutableSetMultimap.Builder<String, Integer>()
5320888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .orderKeysBy(Ordering.natural().reverse())
5330888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .orderValuesBy(Ordering.usingToString())
5340888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .put("a", 2)
5350888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .put("a", 10)
5360888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .put("b", 1)
5370888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .build();
5380888a09821a98ac0680fad765217302858e70fa4Paul Duffin    multimap = SerializableTester.reserialize(multimap);
5393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.keySet()).has().exactly("b", "a").inOrder();
5403ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("a")).has().exactly(10, 2).inOrder();
5410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(Ordering.usingToString(),
5420888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ((ImmutableSortedSet<Integer>) multimap.get("a")).comparator());
5430888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(Ordering.usingToString(),
5440888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ((ImmutableSortedSet<Integer>) multimap.get("z")).comparator());
5450888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
5460888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private ImmutableSetMultimap<String, Integer> createMultimap() {
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableSetMultimap.<String, Integer>builder()
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .put("foo", 1).put("bar", 2).put("foo", 3).build();
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
552