1/*
2 * Copyright (C) 2008 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.common.collect;
18
19import com.google.common.annotations.GwtCompatible;
20import com.google.common.collect.ImmutableMultimap.Builder;
21import com.google.common.collect.testing.SampleElements;
22import com.google.common.collect.testing.SampleElements.Unhashables;
23import com.google.common.collect.testing.UnhashableObject;
24
25import junit.framework.TestCase;
26
27import java.util.Arrays;
28import java.util.Map.Entry;
29
30/**
31 * Tests for {@link ImmutableMultimap}.
32 *
33 * @author Jared Levy
34 */
35@GwtCompatible
36public class ImmutableMultimapTest extends TestCase {
37
38  public void testBuilder_withImmutableEntry() {
39    ImmutableMultimap<String, Integer> multimap = new Builder<String, Integer>()
40        .put(Maps.immutableEntry("one", 1))
41        .build();
42    assertEquals(Arrays.asList(1), multimap.get("one"));
43  }
44
45  public void testBuilder_withImmutableEntryAndNullContents() {
46    Builder<String, Integer> builder = new Builder<String, Integer>();
47    try {
48      builder.put(Maps.immutableEntry("one", (Integer) null));
49      fail();
50    } catch (NullPointerException expected) {
51    }
52    try {
53      builder.put(Maps.immutableEntry((String) null, 1));
54      fail();
55    } catch (NullPointerException expected) {
56    }
57  }
58
59  private static class StringHolder {
60    String string;
61  }
62
63  public void testBuilder_withMutableEntry() {
64    ImmutableMultimap.Builder<String, Integer> builder =
65        new Builder<String, Integer>();
66    final StringHolder holder = new StringHolder();
67    holder.string = "one";
68    Entry<String, Integer> entry = new AbstractMapEntry<String, Integer>() {
69      @Override public String getKey() {
70        return holder.string;
71      }
72      @Override public Integer getValue() {
73        return 1;
74      }
75    };
76
77    builder.put(entry);
78    holder.string = "two";
79    assertEquals(Arrays.asList(1), builder.build().get("one"));
80  }
81
82  // TODO: test ImmutableMultimap builder and factory methods
83
84  public void testCopyOf() {
85    ImmutableSetMultimap<String, String> setMultimap
86        = ImmutableSetMultimap.of("k1", "v1");
87    ImmutableMultimap<String, String> setMultimapCopy
88        = ImmutableMultimap.copyOf(setMultimap);
89    assertSame("copyOf(ImmutableSetMultimap) should not create a new instance",
90        setMultimap, setMultimapCopy);
91
92    ImmutableListMultimap<String, String> listMultimap
93        = ImmutableListMultimap.of("k1", "v1");
94    ImmutableMultimap<String, String> listMultimapCopy
95        = ImmutableMultimap.copyOf(listMultimap);
96    assertSame("copyOf(ImmutableListMultimap) should not create a new instance",
97        listMultimap, listMultimapCopy);
98  }
99
100  public void testUnhashableSingletonValue() {
101    SampleElements<UnhashableObject> unhashables = new Unhashables();
102    Multimap<Integer, UnhashableObject> multimap = ImmutableMultimap.of(
103        0, unhashables.e0);
104    assertEquals(1, multimap.get(0).size());
105    assertTrue(multimap.get(0).contains(unhashables.e0));
106  }
107
108  public void testUnhashableMixedValues() {
109    SampleElements<UnhashableObject> unhashables = new Unhashables();
110    Multimap<Integer, Object> multimap = ImmutableMultimap.<Integer, Object>of(
111        0, unhashables.e0, 2, "hey you", 0, unhashables.e1);
112    assertEquals(2, multimap.get(0).size());
113    assertTrue(multimap.get(0).contains(unhashables.e0));
114    assertTrue(multimap.get(0).contains(unhashables.e1));
115    assertTrue(multimap.get(2).contains("hey you"));
116  }
117}
118