Home | History | Annotate | Download | only in collect
      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 
     17 package com.google.common.collect;
     18 
     19 import com.google.common.annotations.GwtCompatible;
     20 import com.google.common.collect.ImmutableMultimap.Builder;
     21 import com.google.common.collect.testing.SampleElements;
     22 import com.google.common.collect.testing.SampleElements.Unhashables;
     23 import com.google.common.collect.testing.UnhashableObject;
     24 import com.google.common.testing.EqualsTester;
     25 
     26 import junit.framework.TestCase;
     27 
     28 import java.util.Arrays;
     29 import java.util.Map.Entry;
     30 
     31 /**
     32  * Tests for {@link ImmutableMultimap}.
     33  *
     34  * @author Jared Levy
     35  */
     36 @GwtCompatible(emulated = true)
     37 public class ImmutableMultimapTest extends TestCase {
     38 
     39   public void testBuilder_withImmutableEntry() {
     40     ImmutableMultimap<String, Integer> multimap = new Builder<String, Integer>()
     41         .put(Maps.immutableEntry("one", 1))
     42         .build();
     43     assertEquals(Arrays.asList(1), multimap.get("one"));
     44   }
     45 
     46   public void testBuilder_withImmutableEntryAndNullContents() {
     47     Builder<String, Integer> builder = new Builder<String, Integer>();
     48     try {
     49       builder.put(Maps.immutableEntry("one", (Integer) null));
     50       fail();
     51     } catch (NullPointerException expected) {
     52     }
     53     try {
     54       builder.put(Maps.immutableEntry((String) null, 1));
     55       fail();
     56     } catch (NullPointerException expected) {
     57     }
     58   }
     59 
     60   private static class StringHolder {
     61     String string;
     62   }
     63 
     64   public void testBuilder_withMutableEntry() {
     65     ImmutableMultimap.Builder<String, Integer> builder =
     66         new Builder<String, Integer>();
     67     final StringHolder holder = new StringHolder();
     68     holder.string = "one";
     69     Entry<String, Integer> entry = new AbstractMapEntry<String, Integer>() {
     70       @Override public String getKey() {
     71         return holder.string;
     72       }
     73       @Override public Integer getValue() {
     74         return 1;
     75       }
     76     };
     77 
     78     builder.put(entry);
     79     holder.string = "two";
     80     assertEquals(Arrays.asList(1), builder.build().get("one"));
     81   }
     82 
     83   // TODO: test ImmutableMultimap builder and factory methods
     84 
     85   public void testCopyOf() {
     86     ImmutableSetMultimap<String, String> setMultimap
     87         = ImmutableSetMultimap.of("k1", "v1");
     88     ImmutableMultimap<String, String> setMultimapCopy
     89         = ImmutableMultimap.copyOf(setMultimap);
     90     assertSame("copyOf(ImmutableSetMultimap) should not create a new instance",
     91         setMultimap, setMultimapCopy);
     92 
     93     ImmutableListMultimap<String, String> listMultimap
     94         = ImmutableListMultimap.of("k1", "v1");
     95     ImmutableMultimap<String, String> listMultimapCopy
     96         = ImmutableMultimap.copyOf(listMultimap);
     97     assertSame("copyOf(ImmutableListMultimap) should not create a new instance",
     98         listMultimap, listMultimapCopy);
     99   }
    100 
    101   public void testUnhashableSingletonValue() {
    102     SampleElements<UnhashableObject> unhashables = new Unhashables();
    103     Multimap<Integer, UnhashableObject> multimap = ImmutableMultimap.of(
    104         0, unhashables.e0);
    105     assertEquals(1, multimap.get(0).size());
    106     assertTrue(multimap.get(0).contains(unhashables.e0));
    107   }
    108 
    109   public void testUnhashableMixedValues() {
    110     SampleElements<UnhashableObject> unhashables = new Unhashables();
    111     Multimap<Integer, Object> multimap = ImmutableMultimap.<Integer, Object>of(
    112         0, unhashables.e0, 2, "hey you", 0, unhashables.e1);
    113     assertEquals(2, multimap.get(0).size());
    114     assertTrue(multimap.get(0).contains(unhashables.e0));
    115     assertTrue(multimap.get(0).contains(unhashables.e1));
    116     assertTrue(multimap.get(2).contains("hey you"));
    117   }
    118 
    119   public void testEquals() {
    120     new EqualsTester()
    121         .addEqualityGroup(ImmutableMultimap.of(), ImmutableMultimap.of())
    122         .addEqualityGroup(ImmutableMultimap.of(1, "a"), ImmutableMultimap.of(1, "a"))
    123         .addEqualityGroup(
    124             ImmutableMultimap.of(1, "a", 2, "b"),
    125             ImmutableMultimap.of(2, "b", 1, "a"))
    126         .testEquals();
    127   }
    128 }
    129 
    130