package com.github.nmorel.gwtjackson.guava.client; import com.github.nmorel.gwtjackson.client.ObjectMapper; import com.github.nmorel.gwtjackson.shared.ObjectMapperTester; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.BiMap; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.SetMultimap; import com.google.common.collect.SortedSetMultimap; import com.google.common.collect.TreeMultimap; import com.google.gwt.core.client.GWT; /** * Unit tests to verify serialization and deserialization of {@link BiMap}s. */ public class MultimapGwtTest extends GwtJacksonGuavaTestCase { public static enum AlphaEnum { A, B, C, D } public interface BeanWithMultimapTypesMapper extends ObjectMapper<BeanWithMultimapTypes>, ObjectMapperTester<BeanWithMultimapTypes> { static BeanWithMultimapTypesMapper INSTANCE = GWT.create( BeanWithMultimapTypesMapper.class ); } public static class BeanWithMultimapTypes { public Multimap<String, Integer> multimap; public ImmutableMultimap<String, Integer> immutableMultimap; public ImmutableSetMultimap<String, Integer> immutableSetMultimap; public ImmutableListMultimap<String, Integer> immutableListMultimap; public SetMultimap<String, Integer> setMultimap; public HashMultimap<String, Integer> hashMultimap; public LinkedHashMultimap<String, Integer> linkedHashMultimap; public SortedSetMultimap<String, Integer> sortedSetMultimap; public TreeMultimap<String, Integer> treeMultimap; public ListMultimap<String, Integer> listMultimap; public ArrayListMultimap<String, Integer> arrayListMultimap; public LinkedListMultimap<String, Integer> linkedListMultimap; } public void testSerialization() { BeanWithMultimapTypes bean = new BeanWithMultimapTypes(); // insertion order for both keys and values bean.immutableMultimap = ImmutableMultimap.of( "foo", 3, "bar", 4, "foo", 2, "foo", 5 ); bean.immutableListMultimap = ImmutableListMultimap.of( "foo", 3, "bar", 4, "foo", 2, "foo", 5 ); bean.multimap = LinkedListMultimap.create( bean.immutableListMultimap ); bean.setMultimap = LinkedHashMultimap.create( bean.immutableListMultimap ); bean.linkedHashMultimap = LinkedHashMultimap.create( bean.immutableMultimap ); bean.linkedListMultimap = LinkedListMultimap.create( bean.immutableListMultimap ); bean.listMultimap = LinkedListMultimap.create( bean.immutableMultimap ); // no order bean.immutableSetMultimap = ImmutableSetMultimap.of( "foo", 3 ); bean.hashMultimap = HashMultimap.create( bean.immutableSetMultimap ); // natural ordering on both keys and values bean.sortedSetMultimap = TreeMultimap.create( bean.immutableMultimap ); bean.treeMultimap = TreeMultimap.create( bean.immutableMultimap ); // insertion order on values but no order on keys bean.arrayListMultimap = ArrayListMultimap.create( ImmutableListMultimap.of( "foo", 3, "foo", 2, "foo", 5 ) ); String expected = "{" + "\"multimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"immutableMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"immutableSetMultimap\":{\"foo\":[3]}," + "\"immutableListMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"setMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"hashMultimap\":{\"foo\":[3]}," + "\"linkedHashMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"sortedSetMultimap\":{\"bar\":[4],\"foo\":[2,3,5]}," + "\"treeMultimap\":{\"bar\":[4],\"foo\":[2,3,5]}," + "\"listMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"arrayListMultimap\":{\"foo\":[3,2,5]}," + "\"linkedListMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}" + "}"; assertEquals( expected, BeanWithMultimapTypesMapper.INSTANCE.write( bean ) ); } public void testDeserialization() { String input = "{" + "\"multimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"immutableMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"immutableSetMultimap\":{\"foo\":[3]}," + "\"immutableListMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"setMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"hashMultimap\":{\"foo\":[3]}," + "\"linkedHashMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"sortedSetMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"treeMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"listMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}," + "\"arrayListMultimap\":{\"foo\":[3,2,5]}," + "\"linkedListMultimap\":{\"foo\":[3,2,5],\"bar\":[4]}" + "}"; BeanWithMultimapTypes result = BeanWithMultimapTypesMapper.INSTANCE.read( input ); assertNotNull( result ); ImmutableListMultimap<String, Integer> expectedOrderedKeysAndValues = ImmutableListMultimap .of( "foo", 3, "bar", 4, "foo", 2, "foo", 5 ); ImmutableSetMultimap<String, Integer> expectedNonOrdered = ImmutableSetMultimap.of( "foo", 3 ); assertEquals( LinkedHashMultimap.create( expectedOrderedKeysAndValues ), result.multimap ); assertEquals( ImmutableMultimap.copyOf( expectedOrderedKeysAndValues ), result.immutableMultimap ); assertEquals( expectedOrderedKeysAndValues, result.immutableListMultimap ); assertEquals( LinkedHashMultimap.create( expectedOrderedKeysAndValues ), result.setMultimap ); assertEquals( LinkedHashMultimap.create( expectedOrderedKeysAndValues ), result.linkedHashMultimap ); assertEquals( LinkedListMultimap.create( expectedOrderedKeysAndValues ), result.listMultimap ); assertEquals( LinkedListMultimap.create( expectedOrderedKeysAndValues ), result.linkedListMultimap ); assertEquals( TreeMultimap.create( expectedOrderedKeysAndValues ), result.sortedSetMultimap ); assertEquals( TreeMultimap.create( expectedOrderedKeysAndValues ), result.treeMultimap ); assertEquals( expectedNonOrdered, result.immutableSetMultimap ); assertEquals( HashMultimap.create( expectedNonOrdered ), result.hashMultimap ); assertEquals( ArrayListMultimap.create( ImmutableListMultimap.of( "foo", 3, "foo", 2, "foo", 5 ) ), result.arrayListMultimap ); } }