1 /*
2  * Copyright (C) 2013 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.annotations.GwtIncompatible;
21 import com.google.common.collect.MultimapBuilder.MultimapBuilderWithKeys;
22 
23 import junit.framework.TestCase;
24 
25 import java.io.ByteArrayInputStream;
26 import java.io.ByteArrayOutputStream;
27 import java.io.ObjectInputStream;
28 import java.io.ObjectOutputStream;
29 import java.math.RoundingMode;
30 import java.util.SortedMap;
31 import java.util.SortedSet;
32 
33 /**
34  * Tests for {@link MultimapBuilder}.
35  *
36  * @author Louis Wasserman
37  */
38 @GwtCompatible(emulated = true)
39 public class MultimapBuilderTest extends TestCase {
40 
41   @GwtIncompatible("doesn't build without explicit type parameters on build() methods")
42   public void testGenerics() {
43     ListMultimap<String, Integer> a = MultimapBuilder.hashKeys().arrayListValues().build();
44     SortedSetMultimap<String, Integer> b = MultimapBuilder.linkedHashKeys().treeSetValues().build();
45     SetMultimap<String, Integer> c =
46         MultimapBuilder.treeKeys(String.CASE_INSENSITIVE_ORDER).hashSetValues().build();
47   }
48 
49   public void testGenerics_gwtCompatible() {
50     ListMultimap<String, Integer> a =
51         MultimapBuilder.hashKeys().arrayListValues().<String, Integer>build();
52     SortedSetMultimap<String, Integer> b =
53         MultimapBuilder.linkedHashKeys().treeSetValues().<String, Integer>build();
54     SetMultimap<String, Integer> c = MultimapBuilder.treeKeys(String.CASE_INSENSITIVE_ORDER)
55         .hashSetValues().<String, Integer>build();
56   }
57 
58   @GwtIncompatible("doesn't build without explicit type parameters on build() methods")
59   public void testTreeKeys() {
60     ListMultimap<String, Integer> multimap = MultimapBuilder.treeKeys().arrayListValues().build();
61     assertTrue(multimap.keySet() instanceof SortedSet);
62     assertTrue(multimap.asMap() instanceof SortedMap);
63   }
64 
65   public void testTreeKeys_gwtCompatible() {
66     ListMultimap<String, Integer> multimap =
67         MultimapBuilder.treeKeys().arrayListValues().<String, Integer>build();
68     assertTrue(multimap.keySet() instanceof SortedSet);
69     assertTrue(multimap.asMap() instanceof SortedMap);
70   }
71 
72   @GwtIncompatible("serialization")
73   public void testSerialization() throws Exception {
74     for (MultimapBuilderWithKeys<?> builderWithKeys : ImmutableList.of(
75         MultimapBuilder.hashKeys(), MultimapBuilder.linkedHashKeys(), MultimapBuilder.treeKeys(),
76         MultimapBuilder.enumKeys(RoundingMode.class))) {
77       for (MultimapBuilder<?, ?> builder : ImmutableList.of(
78           builderWithKeys.arrayListValues(),
79           builderWithKeys.linkedListValues(),
80           builderWithKeys.hashSetValues(),
81           builderWithKeys.linkedHashSetValues(),
82           builderWithKeys.treeSetValues(),
83           builderWithKeys.enumSetValues(RoundingMode.class))) {
84         /*
85          * Temporarily inlining SerializableTester here for obscure internal reasons.
86          */
87         reserializeAndAssert(builder.build());
88       }
89     }
90   }
91 
92   @GwtIncompatible("serialization")
93   private static void reserializeAndAssert(Object object) throws Exception {
94     Object copy = reserialize(object);
95     assertEquals(object, copy);
96     assertEquals(object.getClass(), copy.getClass());
97   }
98 
99   @GwtIncompatible("serialization")
100   private static Object reserialize(Object object) throws Exception {
101     ByteArrayOutputStream bytes = new ByteArrayOutputStream();
102     new ObjectOutputStream(bytes).writeObject(object);
103     return new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray())).readObject();
104   }
105 }
106