/* * 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.AbstractCollection; import java.util.AbstractList; import java.util.AbstractQueue; import java.util.AbstractSequentialList; import java.util.AbstractSet; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.PriorityQueue; import java.util.Queue; import java.util.Set; import java.util.SortedSet; import java.util.Stack; import java.util.TreeSet; import java.util.Vector; 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 AllCollectionsObjectMapperTest extends GwtJacksonTestCase { public static interface BeanWithCollectionsTypeMapper extends ObjectMapper<BeanWithCollectionsType> { static BeanWithCollectionsTypeMapper INSTANCE = GWT.create( BeanWithCollectionsTypeMapper.class ); } public static class BeanWithCollectionsType { public AbstractCollection<String> abstractCollection; public AbstractList<String> abstractList; public AbstractQueue<String> abstractQueue; public AbstractSequentialList<String> abstractSequentialList; public AbstractSet<String> abstractSet; public ArrayList<String> arrayList; public Collection<String> collection; public EnumSet<AnEnum> enumSet; public HashSet<String> hashSet; public Iterable<String> iterable; public LinkedHashSet<String> linkedHashSet; public LinkedList<String> linkedList; public List<String> list; public PriorityQueue<String> priorityQueue; public Queue<String> queue; public Set<String> set; public SortedSet<String> sortedSet; public Stack<String> stack; public TreeSet<String> treeSet; public Vector<String> vector; public List<Set<String>> listSet; } public void testDeserializeValue() { String input = "{" + "\"abstractCollection\":[\"Hello\",null,\"World\",\"!\"]," + "\"abstractList\":[\"Hello\",null,\"World\",\"!\"]," + "\"abstractQueue\":[\"Hello\",null,\"World\",\"!\"]," + "\"abstractSequentialList\":[\"Hello\",null,\"World\",\"!\"]," + "\"abstractSet\":[\"Hello\",null,\"World\",\"!\"]," + "\"arrayList\":[\"Hello\",null,\"World\",\"!\"]," + "\"collection\":[\"Hello\",null,\"World\",\"!\"]," + "\"enumSet\":[\"B\",null,\"C\",\"A\"]," + "\"hashSet\":[\"Hello\",null,\"World\",\"!\"]," + "\"iterable\":[\"Hello\",null,\"World\",\"!\"]," + "\"linkedHashSet\":[\"Hello\",null,\"World\",\"!\"]," + "\"linkedList\":[\"Hello\",null,\"World\",\"!\"]," + "\"list\":[\"Hello\",null,\"World\",\"!\"]," + "\"priorityQueue\":[\"Hello\",null,\"World\",\"!\"]," + "\"queue\":[\"Hello\",null,\"World\",\"!\"]," + "\"set\":[\"Hello\",null,\"World\",\"!\"]," + "\"sortedSet\":[\"Hello\",null,\"World\",\"!\"]," + "\"stack\":[\"Hello\",null,\"World\",\"!\"]," + "\"treeSet\":[\"Hello\",null,\"World\",\"!\"]," + "\"vector\":[\"Hello\",null,\"World\",\"!\"]," + "\"listSet\":[[\"Hello\"],[\"World\"],[]]" + "}"; BeanWithCollectionsType bean = BeanWithCollectionsTypeMapper.INSTANCE.read( input ); assertNotNull( bean ); Collection<String> baseExpectedList = Arrays.asList( "Hello", null, "World", "!" ); Collection<String> baseExpectedCollectionWithoutNull = Arrays.asList( "Hello", "World", "!" ); Collection<String> baseExpectedSet = new LinkedHashSet<String>( Arrays.asList( "Hello", null, "World", "!" ) ); Collection<String> baseExpectedSortedSet = new TreeSet<String>( Arrays.asList( "!", "Hello", "World" ) ); assertEquals( baseExpectedList, bean.abstractCollection ); assertEquals( baseExpectedList, bean.abstractList ); assertEquals( baseExpectedList, bean.abstractSequentialList ); assertEquals( baseExpectedList, bean.arrayList ); assertEquals( baseExpectedList, bean.collection ); assertEquals( baseExpectedList, bean.iterable ); assertEquals( baseExpectedList, bean.linkedList ); assertEquals( baseExpectedList, bean.list ); assertEquals( baseExpectedList, bean.stack ); assertEquals( baseExpectedList, bean.vector ); // LinkedList by default and we don't add null element assertEquals( baseExpectedCollectionWithoutNull, bean.queue ); assertEquals( baseExpectedSet, bean.set ); assertEquals( baseExpectedSet, bean.abstractSet ); assertEquals( baseExpectedSet, bean.hashSet ); assertEquals( baseExpectedSet, bean.linkedHashSet ); assertEquals( EnumSet.copyOf( Arrays.asList( AnEnum.A, AnEnum.B, AnEnum.C ) ), bean.enumSet ); assertTrue( Arrays.deepEquals( new PriorityQueue<String>( baseExpectedCollectionWithoutNull ).toArray(), bean.abstractQueue .toArray() ) ); assertTrue( Arrays.deepEquals( new PriorityQueue<String>( baseExpectedCollectionWithoutNull ).toArray(), bean.priorityQueue .toArray() ) ); assertEquals( baseExpectedSortedSet, bean.sortedSet ); assertEquals( baseExpectedSortedSet, bean.treeSet ); List<Set<String>> expectedListSet = Arrays.asList( Collections.<String>singleton( "Hello" ), Collections .<String>singleton( "World" ), Collections.<String>emptySet() ); assertEquals( expectedListSet, bean.listSet ); } public void testSerializeValue() { ArrayList<String> list = new ArrayList<String>( Arrays.asList( "Hello", null, "World", "!" ) ); LinkedList<String> linkedList = new LinkedList<String>( list ); List<Set<String>> listSet = Arrays.asList( Collections.<String>singleton( "Hello" ), Collections .<String>singleton( "World" ), Collections.<String>emptySet() ); BeanWithCollectionsType bean = new BeanWithCollectionsType(); bean.abstractCollection = list; bean.abstractList = list; bean.abstractSequentialList = linkedList; bean.arrayList = list; bean.collection = list; bean.iterable = list; bean.linkedList = linkedList; bean.list = list; bean.stack = new Stack<String>(); bean.stack.add( "Hello" ); bean.stack.add( null ); bean.stack.add( "World" ); bean.stack.add( "!" ); bean.vector = new Vector<String>( list ); PriorityQueue<String> queue = new PriorityQueue<String>( Arrays.asList( "!", "World", "Hello" ) ); bean.queue = queue; bean.abstractQueue = queue; bean.priorityQueue = queue; bean.enumSet = EnumSet.copyOf( Arrays.asList( AnEnum.A ) ); bean.linkedHashSet = new LinkedHashSet<String>( list ); bean.abstractSet = bean.linkedHashSet; bean.set = bean.linkedHashSet; bean.hashSet = bean.linkedHashSet; bean.treeSet = new TreeSet<String>( Arrays.asList( "Hello", "World", "!" ) ); bean.sortedSet = bean.treeSet; bean.listSet = listSet; String expected = "{" + "\"abstractCollection\":[\"Hello\",null,\"World\",\"!\"]," + "\"abstractList\":[\"Hello\",null,\"World\",\"!\"]," + "\"abstractQueue\":[\"!\",\"World\",\"Hello\"]," + "\"abstractSequentialList\":[\"Hello\",null,\"World\",\"!\"]," + "\"abstractSet\":[\"Hello\",null,\"World\",\"!\"]," + "\"arrayList\":[\"Hello\",null,\"World\",\"!\"]," + "\"collection\":[\"Hello\",null,\"World\",\"!\"]," + "\"enumSet\":[\"A\"]," + "\"hashSet\":[\"Hello\",null,\"World\",\"!\"]," + "\"iterable\":[\"Hello\",null,\"World\",\"!\"]," + "\"linkedHashSet\":[\"Hello\",null,\"World\",\"!\"]," + "\"linkedList\":[\"Hello\",null,\"World\",\"!\"]," + "\"list\":[\"Hello\",null,\"World\",\"!\"]," + "\"priorityQueue\":[\"!\",\"World\",\"Hello\"]," + "\"queue\":[\"!\",\"World\",\"Hello\"]," + "\"set\":[\"Hello\",null,\"World\",\"!\"]," + "\"sortedSet\":[\"!\",\"Hello\",\"World\"]," + "\"stack\":[\"Hello\",null,\"World\",\"!\"]," + "\"treeSet\":[\"!\",\"Hello\",\"World\"]," + "\"vector\":[\"Hello\",null,\"World\",\"!\"]," + "\"listSet\":[[\"Hello\"],[\"World\"],[]]" + "}"; assertEquals( expected, BeanWithCollectionsTypeMapper.INSTANCE.write( bean ) ); } }