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.BiMap;
import com.google.common.collect.EnumBiMap;
import com.google.common.collect.EnumHashBiMap;
import com.google.common.collect.HashBiMap;
import com.google.gwt.core.client.GWT;
/**
* Unit tests to verify serialization and deserialization of {@link BiMap}s.
*/
public class BiMapGwtTest extends GwtJacksonGuavaTestCase {
public static enum AlphaEnum {
A, B, C, D
}
public static enum NumericEnum {
ONE, TWO, THREE, FOUR
}
public interface BeanWithBiMapTypesMapper extends ObjectMapper<BeanWithBiMapTypes>, ObjectMapperTester<BeanWithBiMapTypes> {
static BeanWithBiMapTypesMapper INSTANCE = GWT.create( BeanWithBiMapTypesMapper.class );
}
public static class BeanWithBiMapTypes {
public BiMap<String, Integer> biMap;
public HashBiMap<String, Integer> hashBiMap;
public EnumHashBiMap<AlphaEnum, Integer> enumHashBiMap;
public EnumBiMap<AlphaEnum, NumericEnum> enumBiMap;
}
public void testSerialization() {
BeanWithBiMapTypes bean = new BeanWithBiMapTypes();
bean.hashBiMap = HashBiMap.create();
// only one value since it is not sorted
bean.hashBiMap.put( "one", 1 );
bean.biMap = bean.hashBiMap;
bean.enumHashBiMap = EnumHashBiMap.create( AlphaEnum.class );
bean.enumHashBiMap.put( AlphaEnum.A, 1 );
bean.enumHashBiMap.put( AlphaEnum.D, 4 );
bean.enumHashBiMap.put( AlphaEnum.C, 3 );
bean.enumHashBiMap.put( AlphaEnum.B, 2 );
bean.enumBiMap = EnumBiMap.create( AlphaEnum.class, NumericEnum.class );
bean.enumBiMap.put( AlphaEnum.A, NumericEnum.ONE );
bean.enumBiMap.put( AlphaEnum.D, NumericEnum.FOUR );
bean.enumBiMap.put( AlphaEnum.C, NumericEnum.THREE );
bean.enumBiMap.put( AlphaEnum.B, NumericEnum.TWO );
String expected = "{" +
"\"biMap\":{\"one\":1}," +
"\"hashBiMap\":{\"one\":1}," +
"\"enumHashBiMap\":{\"A\":1,\"B\":2,\"C\":3,\"D\":4}," +
"\"enumBiMap\":{\"A\":\"ONE\",\"B\":\"TWO\",\"C\":\"THREE\",\"D\":\"FOUR\"}" +
"}";
assertEquals( expected, BeanWithBiMapTypesMapper.INSTANCE.write( bean ) );
}
public void testDeserialization() {
String input = "{" +
"\"biMap\":{\"one\":1,\"two\":2,\"three\":3,\"four\":4}," +
"\"hashBiMap\":{\"one\":1,\"two\":2,\"three\":3,\"four\":4}," +
"\"enumHashBiMap\":{\"A\":1,\"B\":2,\"C\":3,\"D\":4}," +
"\"enumBiMap\":{\"A\":\"ONE\",\"B\":\"TWO\",\"C\":\"THREE\",\"D\":\"FOUR\"}" +
"}";
BeanWithBiMapTypes result = BeanWithBiMapTypesMapper.INSTANCE.read( input );
assertNotNull( result );
HashBiMap<String, Integer> expectedHashBiMap = HashBiMap.create();
expectedHashBiMap.put( "one", 1 );
expectedHashBiMap.put( "two", 2 );
expectedHashBiMap.put( "three", 3 );
expectedHashBiMap.put( "four", 4 );
assertNotNull( result.biMap );
assertEquals( expectedHashBiMap, result.biMap );
assertEquals( expectedHashBiMap, result.hashBiMap );
EnumHashBiMap<AlphaEnum, Integer> expectedEnumHashBiMap = EnumHashBiMap.create( AlphaEnum.class );
expectedEnumHashBiMap.put( AlphaEnum.A, 1 );
expectedEnumHashBiMap.put( AlphaEnum.D, 4 );
expectedEnumHashBiMap.put( AlphaEnum.C, 3 );
expectedEnumHashBiMap.put( AlphaEnum.B, 2 );
assertEquals( expectedEnumHashBiMap, result.enumHashBiMap );
EnumBiMap<AlphaEnum, NumericEnum> expectedEnumBiMap = EnumBiMap.create( AlphaEnum.class, NumericEnum.class );
expectedEnumBiMap.put( AlphaEnum.A, NumericEnum.ONE );
expectedEnumBiMap.put( AlphaEnum.D, NumericEnum.FOUR );
expectedEnumBiMap.put( AlphaEnum.C, NumericEnum.THREE );
expectedEnumBiMap.put( AlphaEnum.B, NumericEnum.TWO );
assertEquals( expectedEnumBiMap, result.enumBiMap );
}
}