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
193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport static com.google.common.truth.Truth.assertThat;
200888a09821a98ac0680fad765217302858e70fa4Paul Duffin
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableListMultimap.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.ListMultimapTestSuiteBuilder;
287dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.TestStringListMultimapGenerator;
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
330888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.Test;
340888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
350888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestSuite;
360888a09821a98ac0680fad765217302858e70fa4Paul Duffin
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@link ImmutableListMultimap}.
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ImmutableListMultimapTest extends TestCase {
497dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableListMultimapGenerator extends TestStringListMultimapGenerator {
507dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
517dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected ListMultimap<String, String> create(Entry<String, String>[] entries) {
527dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableListMultimap.Builder<String, String> builder = ImmutableListMultimap.builder();
537dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (Entry<String, String> entry : entries) {
547dd252788645e940eada959bdde927426e2531c9Paul Duffin        builder.put(entry.getKey(), entry.getValue());
557dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
567dd252788645e940eada959bdde927426e2531c9Paul Duffin      return builder.build();
577dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
587dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
597dd252788645e940eada959bdde927426e2531c9Paul Duffin
607dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("suite")
617dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static Test suite() {
627dd252788645e940eada959bdde927426e2531c9Paul Duffin    TestSuite suite = new TestSuite();
637dd252788645e940eada959bdde927426e2531c9Paul Duffin    suite.addTest(ListMultimapTestSuiteBuilder.using(new ImmutableListMultimapGenerator())
647dd252788645e940eada959bdde927426e2531c9Paul Duffin      .named("ImmutableListMultimap")
657dd252788645e940eada959bdde927426e2531c9Paul Duffin      .withFeatures(
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin          MapFeature.ALLOWS_ANY_NULL_QUERIES,
677dd252788645e940eada959bdde927426e2531c9Paul Duffin          CollectionFeature.SERIALIZABLE,
687dd252788645e940eada959bdde927426e2531c9Paul Duffin          CollectionFeature.KNOWN_ORDER,
697dd252788645e940eada959bdde927426e2531c9Paul Duffin          CollectionSize.ANY)
707dd252788645e940eada959bdde927426e2531c9Paul Duffin      .createTestSuite());
717dd252788645e940eada959bdde927426e2531c9Paul Duffin    suite.addTestSuite(ImmutableListMultimapTest.class);
727dd252788645e940eada959bdde927426e2531c9Paul Duffin    return suite;
737dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_withImmutableEntry() {
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap<String, Integer> multimap = new Builder<String, Integer>()
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .put(Maps.immutableEntry("one", 1))
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .build();
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(1), multimap.get("one"));
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_withImmutableEntryAndNullContents() {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Builder<String, Integer> builder = new Builder<String, Integer>();
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put(Maps.immutableEntry("one", (Integer) null));
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put(Maps.immutableEntry((String) null, 1));
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class StringHolder {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String string;
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilder_withMutableEntry() {
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap.Builder<String, Integer> builder =
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Builder<String, Integer>();
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final StringHolder holder = new StringHolder();
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    holder.string = "one";
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<String, Integer> entry = new AbstractMapEntry<String, Integer>() {
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public String getKey() {
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return holder.string;
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public Integer getValue() {
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return 1;
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put(entry);
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    holder.string = "two";
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(1), builder.build().get("one"));
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutAllIterable() {
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap.Builder<String, Integer> builder
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableListMultimap.builder();
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", Arrays.asList(1, 2, 3));
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("bar", Arrays.asList(4, 5));
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", Arrays.asList(6, 7));
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = builder.build();
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(1, 2, 3, 6, 7), multimap.get("foo"));
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(4, 5), multimap.get("bar"));
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, multimap.size());
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutAllVarargs() {
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap.Builder<String, Integer> builder
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableListMultimap.builder();
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", 1, 2, 3);
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("bar", 4, 5);
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", 6, 7);
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = builder.build();
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(1, 2, 3, 6, 7), multimap.get("foo"));
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(4, 5), multimap.get("bar"));
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, multimap.size());
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutAllMultimap() {
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> toPut = LinkedListMultimap.create();
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", 1);
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("bar", 4);
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", 2);
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", 3);
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> moreToPut = LinkedListMultimap.create();
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    moreToPut.put("foo", 6);
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    moreToPut.put("bar", 5);
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    moreToPut.put("foo", 7);
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap.Builder<String, Integer> builder
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableListMultimap.builder();
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll(toPut);
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll(moreToPut);
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = builder.build();
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(1, 2, 3, 6, 7), multimap.get("foo"));
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(4, 5), multimap.get("bar"));
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, multimap.size());
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutAllWithDuplicates() {
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap.Builder<String, Integer> builder
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableListMultimap.builder();
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", 1, 2, 3);
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("bar", 4, 5);
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", 1, 6, 7);
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap<String, Integer> multimap = builder.build();
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(1, 2, 3, 1, 6, 7), multimap.get("foo"));
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(4, 5), multimap.get("bar"));
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(8, multimap.size());
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutWithDuplicates() {
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap.Builder<String, Integer> builder
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableListMultimap.builder();
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("foo", 1, 2, 3);
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll("bar", 4, 5);
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("foo", 1);
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap<String, Integer> multimap = builder.build();
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(1, 2, 3, 1), multimap.get("foo"));
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(4, 5), multimap.get("bar"));
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(6, multimap.size());
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutAllMultimapWithDuplicates() {
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> toPut = LinkedListMultimap.create();
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", 1);
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("bar", 4);
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", 2);
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", 1);
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("bar", 5);
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> moreToPut = LinkedListMultimap.create();
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    moreToPut.put("foo", 6);
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    moreToPut.put("bar", 4);
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    moreToPut.put("foo", 7);
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    moreToPut.put("foo", 2);
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap.Builder<String, Integer> builder
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableListMultimap.builder();
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll(toPut);
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.putAll(moreToPut);
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = builder.build();
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(1, 2, 1, 6, 7, 2), multimap.get("foo"));
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Arrays.asList(4, 5, 4), multimap.get("bar"));
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(9, multimap.size());
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutNullKey() {
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> toPut = LinkedListMultimap.create();
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put("foo", null);
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap.Builder<String, Integer> builder
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableListMultimap.builder();
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put(null, 1);
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.putAll(null, Arrays.asList(1, 2, 3));
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.putAll(null, 1, 2, 3);
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.putAll(toPut);
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderPutNullValue() {
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> toPut = LinkedListMultimap.create();
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toPut.put(null, 1);
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap.Builder<String, Integer> builder
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableListMultimap.builder();
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put("foo", null);
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.putAll("foo", Arrays.asList(1, null, 3));
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.putAll("foo", 1, null, 3);
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.putAll(toPut);
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderOrderKeysBy() {
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap.Builder<String, Integer> builder
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableListMultimap.builder();
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("b", 3);
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("d", 2);
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("a", 5);
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderKeysBy(Collections.reverseOrder());
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("c", 4);
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("a", 2);
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("b", 6);
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap<String, Integer> multimap = builder.build();
2663ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.keySet()).has().exactly("d", "c", "b", "a").inOrder();
2673ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.values()).has().exactly(2, 4, 3, 6, 5, 2).inOrder();
2683ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("a")).has().exactly(5, 2).inOrder();
2693ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("b")).has().exactly(3, 6).inOrder();
2707dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2717dd252788645e940eada959bdde927426e2531c9Paul Duffin
2727dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testBuilderOrderKeysByDuplicates() {
2737dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableListMultimap.Builder<String, Integer> builder
2747dd252788645e940eada959bdde927426e2531c9Paul Duffin        = ImmutableListMultimap.builder();
2757dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.put("bb", 3);
2767dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.put("d", 2);
2777dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.put("a", 5);
2787dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.orderKeysBy(new Ordering<String>() {
2797dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2807dd252788645e940eada959bdde927426e2531c9Paul Duffin      public int compare(String left, String right) {
2817dd252788645e940eada959bdde927426e2531c9Paul Duffin        return left.length() - right.length();
2827dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2837dd252788645e940eada959bdde927426e2531c9Paul Duffin    });
2847dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.put("cc", 4);
2857dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.put("a", 2);
2867dd252788645e940eada959bdde927426e2531c9Paul Duffin    builder.put("bb", 6);
2877dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableListMultimap<String, Integer> multimap = builder.build();
2883ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.keySet()).has().exactly("d", "a", "bb", "cc").inOrder();
2893ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.values()).has().exactly(2, 5, 2, 3, 6, 4).inOrder();
2903ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("a")).has().exactly(5, 2).inOrder();
2913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("bb")).has().exactly(3, 6).inOrder();
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderOrderValuesBy() {
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap.Builder<String, Integer> builder
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableListMultimap.builder();
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("b", 3);
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("d", 2);
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("a", 5);
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderValuesBy(Collections.reverseOrder());
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("c", 4);
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("a", 2);
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("b", 6);
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap<String, Integer> multimap = builder.build();
3053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.keySet()).has().exactly("b", "d", "a", "c").inOrder();
3063ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.values()).has().exactly(6, 3, 2, 5, 2, 4).inOrder();
3073ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("a")).has().exactly(5, 2).inOrder();
3083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("b")).has().exactly(6, 3).inOrder();
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuilderOrderKeysAndValuesBy() {
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap.Builder<String, Integer> builder
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableListMultimap.builder();
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("b", 3);
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("d", 2);
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("a", 5);
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderKeysBy(Collections.reverseOrder());
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.orderValuesBy(Collections.reverseOrder());
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("c", 4);
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("a", 2);
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.put("b", 6);
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap<String, Integer> multimap = builder.build();
3233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.keySet()).has().exactly("d", "c", "b", "a").inOrder();
3243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.values()).has().exactly(2, 4, 6, 3, 5, 2).inOrder();
3253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("a")).has().exactly(5, 2).inOrder();
3263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(multimap.get("b")).has().exactly(6, 3).inOrder();
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOf() {
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayListMultimap<String, Integer> input = ArrayListMultimap.create();
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("foo", 1);
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("bar", 2);
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("foo", 3);
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = ImmutableListMultimap.copyOf(input);
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap, input);
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(input, multimap);
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOfWithDuplicates() {
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayListMultimap<String, Integer> input = ArrayListMultimap.create();
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("foo", 1);
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("bar", 2);
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("foo", 3);
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put("foo", 1);
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = ImmutableListMultimap.copyOf(input);
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap, input);
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(input, multimap);
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOfEmpty() {
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayListMultimap<String, Integer> input = ArrayListMultimap.create();
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = ImmutableListMultimap.copyOf(input);
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap, input);
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(input, multimap);
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOfImmutableListMultimap() {
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = createMultimap();
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(multimap, ImmutableListMultimap.copyOf(multimap));
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOfNullKey() {
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayListMultimap<String, Integer> input = ArrayListMultimap.create();
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.put(null, 1);
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableListMultimap.copyOf(input);
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCopyOfNullValue() {
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayListMultimap<String, Integer> input = ArrayListMultimap.create();
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.putAll("foo", Arrays.asList(1, null, 3));
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableListMultimap.copyOf(input);
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyMultimapReads() {
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = ImmutableListMultimap.of();
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsValue(1));
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", 1));
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.entries().isEmpty());
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.equals(ArrayListMultimap.create()));
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), multimap.get("foo"));
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multimap.hashCode());
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(), multimap.keys());
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptySet(), multimap.keySet());
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multimap.size());
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.values().isEmpty());
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{}", multimap.toString());
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyMultimapWrites() {
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = ImmutableListMultimap.of();
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    UnmodifiableCollectionTests.assertMultimapIsUnmodifiable(
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap, "foo", 1);
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Multimap<String, Integer> createMultimap() {
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ImmutableListMultimap.<String, Integer>builder()
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .put("foo", 1).put("bar", 2).put("foo", 3).build();
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMultimapReads() {
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = createMultimap();
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsKey("foo"));
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("cat"));
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsValue(1));
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsValue(5));
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 1));
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("cat", 1));
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", 5));
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.entries().isEmpty());
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, multimap.size());
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.isEmpty());
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{foo=[1, 3], bar=[2]}", multimap.toString());
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMultimapWrites() {
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = createMultimap();
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    UnmodifiableCollectionTests.assertMultimapIsUnmodifiable(
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap, "bar", 2);
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMultimapEquals() {
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = createMultimap();
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> arrayListMultimap
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ArrayListMultimap.create();
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    arrayListMultimap.putAll("foo", Arrays.asList(1, 3));
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    arrayListMultimap.put("bar", 2);
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(multimap, createMultimap(), arrayListMultimap,
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            ImmutableListMultimap.<String, Integer>builder()
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                .put("bar", 2).put("foo", 1).put("foo", 3).build())
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(ImmutableListMultimap.<String, Integer>builder()
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put("bar", 2).put("foo", 3).put("foo", 1).build())
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(ImmutableListMultimap.<String, Integer>builder()
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put("foo", 2).put("foo", 3).put("foo", 1).build())
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(ImmutableListMultimap.<String, Integer>builder()
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put("bar", 2).put("foo", 3).build())
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOf() {
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertMultimapEquals(
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of("one", 1),
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "one", 1);
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertMultimapEquals(
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of("one", 1, "two", 2),
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "one", 1, "two", 2);
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertMultimapEquals(
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of("one", 1, "two", 2, "three", 3),
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "one", 1, "two", 2, "three", 3);
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertMultimapEquals(
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of("one", 1, "two", 2, "three", 3, "four", 4),
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "one", 1, "two", 2, "three", 3, "four", 4);
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertMultimapEquals(
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of(
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            "one", 1, "two", 2, "three", 3, "four", 4, "five", 5),
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testInverse() {
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.<Integer, String>of(),
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.<String, Integer>of().inverse());
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of(1, "one"),
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of("one", 1).inverse());
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of(1, "one", 2, "two"),
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of("one", 1, "two", 2).inverse());
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of("of", 'o', "of", 'f', "to", 't', "to", 'o').inverse(),
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of('o', "of", 'f', "of", 't', "to", 'o', "to"));
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of('f', "foo", 'o', "foo", 'o', "foo"),
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.of("foo", 'f', "foo", 'o', "foo", 'o').inverse());
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testInverseMinimizesWork() {
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableListMultimap<String, Character> multimap =
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableListMultimap.<String, Character>builder()
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put("foo", 'f')
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put("foo", 'o')
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put("foo", 'o')
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put("poo", 'p')
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put("poo", 'o')
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .put("poo", 'o')
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .build();
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(multimap.inverse(), multimap.inverse());
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(multimap, multimap.inverse().inverse());
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static <K, V> void assertMultimapEquals(Multimap<K, V> multimap,
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Object... alternatingKeysAndValues) {
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.size(), alternatingKeysAndValues.length / 2);
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int i = 0;
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Entry<K, V> entry : multimap.entries()) {
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(alternatingKeysAndValues[i++], entry.getKey());
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(alternatingKeysAndValues[i++], entry.getValue());
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization() {
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = createMultimap();
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(multimap);
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.size(),
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        SerializableTester.reserialize(multimap).size());
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(multimap.get("foo"));
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LenientSerializableTester.reserializeAndAssertLenient(multimap.keySet());
5187dd252788645e940eada959bdde927426e2531c9Paul Duffin    LenientSerializableTester.reserializeAndAssertLenient(multimap.keys());
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(multimap.asMap());
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> valuesCopy
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = SerializableTester.reserialize(multimap.values());
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashMultiset.create(multimap.values()),
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(valuesCopy));
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptySerialization() {
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = ImmutableListMultimap.of();
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(multimap, SerializableTester.reserialize(multimap));
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
532