/*
* Copyright 2013 Nicolas Morel
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.github.nmorel.gwtjackson.client.mapper;
import java.util.AbstractMap;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.SortedMap;
import java.util.TreeMap;
import com.github.nmorel.gwtjackson.client.GwtJacksonTestCase;
import com.github.nmorel.gwtjackson.client.ObjectMapper;
import com.github.nmorel.gwtjackson.shared.model.AnEnum;
import com.google.gwt.core.client.GWT;
/**
* @author Nicolas Morel
*/
public class AllMapsObjectMapperTest extends GwtJacksonTestCase {
public static interface BeanWithMapsTypeMapper extends ObjectMapper<BeanWithMapsType> {
static BeanWithMapsTypeMapper INSTANCE = GWT.create( BeanWithMapsTypeMapper.class );
}
public static class BeanWithMapsType {
public AbstractMap<String, Integer> abstractMap;
public EnumMap<AnEnum, Integer> enumMap;
public HashMap<String, Integer> hashMap;
public IdentityHashMap<String, Integer> identityHashMap;
public LinkedHashMap<String, Integer> linkedHashMap;
public Map<String, Integer> map;
public SortedMap<String, Integer> sortedMap;
public TreeMap<String, Integer> treeMap;
}
public void testDeserializeValue() {
String input = "{" +
"\"abstractMap\":{\"one\":1,\"four\":2,\"two\":2,\"three\":3,\"four\":4}," +
"\"enumMap\":{\"A\":1,\"C\":3,\"B\":2,\"D\":4,\"D\":5}," +
"\"hashMap\":{\"one\":1,\"two\":2,\"three\":3,\"four\":4}," +
"\"identityHashMap\":{\"three\":3}," +
"\"linkedHashMap\":{\"one\":1,\"two\":2,\"three\":3,\"four\":4}," +
"\"map\":{\"one\":1,\"two\":2,\"three\":3,\"four\":4}," +
"\"sortedMap\":{\"four\":4,\"two\":2,\"one\":1,\"three\":3}," +
"\"treeMap\":{\"one\":1,\"three\":3,\"four\":4,\"two\":2}" +
"}";
BeanWithMapsType bean = BeanWithMapsTypeMapper.INSTANCE.read( input );
assertNotNull( bean );
LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<String, Integer>();
linkedHashMap.put( "one", 1 );
linkedHashMap.put( "two", 2 );
linkedHashMap.put( "three", 3 );
linkedHashMap.put( "four", 4 );
assertEquals( linkedHashMap, bean.abstractMap );
assertEquals( linkedHashMap, bean.hashMap );
assertEquals( linkedHashMap, bean.linkedHashMap );
assertEquals( linkedHashMap, bean.map );
Entry<String, Integer> entry = bean.identityHashMap.entrySet().iterator().next();
assertEquals( "three", entry.getKey() );
assertEquals( 3, (int) entry.getValue() );
TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>();
treeMap.put( "one", 1 );
treeMap.put( "two", 2 );
treeMap.put( "three", 3 );
treeMap.put( "four", 4 );
assertEquals( treeMap, bean.treeMap );
assertEquals( treeMap, bean.sortedMap );
EnumMap<AnEnum, Integer> enumMap = new EnumMap<AnEnum, Integer>( AnEnum.class );
enumMap.put( AnEnum.A, 1 );
enumMap.put( AnEnum.D, 5 );
enumMap.put( AnEnum.C, 3 );
enumMap.put( AnEnum.B, 2 );
assertEquals( enumMap, bean.enumMap );
}
public void testSerializeValue() {
BeanWithMapsType bean = new BeanWithMapsType();
LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<String, Integer>();
linkedHashMap.put( "one", 1 );
linkedHashMap.put( "two", 2 );
linkedHashMap.put( "three", 3 );
linkedHashMap.put( "four", 4 );
bean.abstractMap = linkedHashMap;
bean.hashMap = linkedHashMap;
bean.linkedHashMap = linkedHashMap;
bean.map = linkedHashMap;
IdentityHashMap<String, Integer> identityHashMap = new IdentityHashMap<String, Integer>();
identityHashMap.put( "one", 1 );
bean.identityHashMap = identityHashMap;
TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>();
treeMap.put( "one", 1 );
treeMap.put( "two", 2 );
treeMap.put( "three", 3 );
treeMap.put( "four", 4 );
bean.sortedMap = treeMap;
bean.treeMap = treeMap;
EnumMap<AnEnum, Integer> enumMap = new EnumMap<AnEnum, Integer>( AnEnum.class );
enumMap.put( AnEnum.A, 1 );
enumMap.put( AnEnum.D, 4 );
enumMap.put( AnEnum.C, 3 );
enumMap.put( AnEnum.B, 2 );
bean.enumMap = enumMap;
String expected = "{" +
"\"abstractMap\":{\"one\":1,\"two\":2,\"three\":3,\"four\":4}," +
"\"enumMap\":{\"A\":1,\"B\":2,\"C\":3,\"D\":4}," +
"\"hashMap\":{\"one\":1,\"two\":2,\"three\":3,\"four\":4}," +
"\"identityHashMap\":{\"one\":1}," +
"\"linkedHashMap\":{\"one\":1,\"two\":2,\"three\":3,\"four\":4}," +
"\"map\":{\"one\":1,\"two\":2,\"three\":3,\"four\":4}," +
"\"sortedMap\":{\"four\":4,\"one\":1,\"three\":3,\"two\":2}," +
"\"treeMap\":{\"four\":4,\"one\":1,\"three\":3,\"two\":2}" +
"}";
assertEquals( expected, BeanWithMapsTypeMapper.INSTANCE.write( bean ) );
}
}