/*
* 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.shared.advanced;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.github.nmorel.gwtjackson.shared.AbstractTester;
import com.github.nmorel.gwtjackson.shared.ObjectMapperTester;
import com.github.nmorel.gwtjackson.shared.ObjectReaderTester;
import com.github.nmorel.gwtjackson.shared.ObjectWriterTester;
/**
* @author Nicolas Morel
*/
public final class GenericsTester extends AbstractTester {
@JsonIdentityInfo( generator = ObjectIdGenerators.PropertyGenerator.class, property = "name" )
public static class GenericOneType<T> {
public String name;
public T genericValue;
public List<T> listWithGenericValues;
}
public static class GenericTwoType<T, V> {
public T firstType;
public V secondType;
public List<T> listFirstType;
public LinkedHashSet<V> setSecondType;
}
public static final GenericsTester INSTANCE = new GenericsTester();
private GenericsTester() {
}
public void testSerializeString( ObjectWriterTester<GenericOneType<String>> writer ) {
GenericOneType<String> bean = new GenericOneType<String>();
bean.name = "generic";
bean.genericValue = "value";
bean.listWithGenericValues = Arrays.asList( "Hello", "World" );
String expected = "{" +
"\"name\":\"generic\"," +
"\"genericValue\":\"value\"," +
"\"listWithGenericValues\":[\"Hello\",\"World\"]" +
"}";
assertEquals( expected, writer.write( bean ) );
}
public void testDeserializeString( ObjectReaderTester<GenericOneType<String>> reader ) {
String input = "{" +
"\"name\":\"generic\"," +
"\"genericValue\":\"value\"," +
"\"listWithGenericValues\":[\"Hello\",\"World\"]" +
"}";
GenericOneType<String> bean = reader.read( input );
assertNotNull( bean );
assertEquals( "generic", bean.name );
assertEquals( "value", bean.genericValue );
assertEquals( Arrays.asList( "Hello", "World" ), bean.listWithGenericValues );
}
public void testSerializeStringString( ObjectWriterTester<GenericTwoType<String, String>> writer ) {
GenericTwoType<String, String> bean = new GenericTwoType<String, String>();
bean.firstType = "first";
bean.secondType = "second";
bean.listFirstType = Arrays.asList( "Hello", "World" );
bean.setSecondType = new LinkedHashSet<String>( Arrays.asList( "Bonjour", "le", "monde" ) );
String expected = "{" +
"\"firstType\":\"first\"," +
"\"secondType\":\"second\"," +
"\"listFirstType\":[\"Hello\",\"World\"]," +
"\"setSecondType\":[\"Bonjour\",\"le\",\"monde\"]" +
"}";
String result = writer.write( bean );
assertEquals( expected, result );
}
public void testDeserializeStringString( ObjectReaderTester<GenericTwoType<String, String>> reader ) {
String input = "{" +
"\"firstType\":\"first\"," +
"\"secondType\":\"second\"," +
"\"listFirstType\":[\"Hello\",\"World\"]," +
"\"setSecondType\":[\"Bonjour\",\"le\",\"monde\"]" +
"}";
GenericTwoType<String, String> bean = reader.read( input );
assertNotNull( bean );
assertEquals( "first", bean.firstType );
assertEquals( "second", bean.secondType );
assertEquals( Arrays.asList( "Hello", "World" ), bean.listFirstType );
assertEquals( new LinkedHashSet<String>( Arrays.asList( "Bonjour", "le", "monde" ) ), bean.setSecondType );
}
public void testSerializeIntegerString( ObjectWriterTester<GenericTwoType<Integer, String>> writer ) {
GenericTwoType<Integer, String> bean = new GenericTwoType<Integer, String>();
bean.firstType = 1;
bean.secondType = "second";
bean.listFirstType = Arrays.asList( 1, 2 );
bean.setSecondType = new LinkedHashSet<String>( Arrays.asList( "Bonjour", "le", "monde" ) );
String expected = "{" +
"\"firstType\":1," +
"\"secondType\":\"second\"," +
"\"listFirstType\":[1,2]," +
"\"setSecondType\":[\"Bonjour\",\"le\",\"monde\"]" +
"}";
String result = writer.write( bean );
assertEquals( expected, result );
}
public void testDeserializeIntegerString( ObjectReaderTester<GenericTwoType<Integer, String>> reader ) {
String input = "{" +
"\"firstType\":1," +
"\"secondType\":\"second\"," +
"\"listFirstType\":[1,2]," +
"\"setSecondType\":[\"Bonjour\",\"le\",\"monde\"]" +
"}";
GenericTwoType<Integer, String> bean = reader.read( input );
assertNotNull( bean );
assertEquals( 1, (int) bean.firstType );
assertEquals( "second", bean.secondType );
assertEquals( Arrays.asList( 1, 2 ), bean.listFirstType );
assertEquals( new LinkedHashSet<String>( Arrays.asList( "Bonjour", "le", "monde" ) ), bean.setSecondType );
}
public void testSerializeIntegerGenericString( ObjectWriterTester<GenericTwoType<Integer, GenericOneType<String>>> writer ) {
GenericOneType<String> gen1 = new GenericOneType<String>();
gen1.name = "generic1";
gen1.genericValue = "value1";
gen1.listWithGenericValues = Arrays.asList( "Hello", "World" );
GenericOneType<String> gen2 = new GenericOneType<String>();
gen2.name = "generic2";
gen2.genericValue = "value2";
gen2.listWithGenericValues = Arrays.asList( "I", "Am", "2" );
GenericTwoType<Integer, GenericOneType<String>> bean = new GenericTwoType<Integer, GenericOneType<String>>();
bean.firstType = 1;
bean.secondType = gen1;
bean.listFirstType = Arrays.asList( 1, 2 );
bean.setSecondType = new LinkedHashSet<GenericOneType<String>>();
bean.setSecondType.add( gen2 );
bean.setSecondType.add( gen1 );
String expected = "{" +
"\"firstType\":1," +
"\"secondType\":{" +
"\"name\":\"generic1\"," +
"\"genericValue\":\"value1\"," +
"\"listWithGenericValues\":[\"Hello\",\"World\"]" +
"}," +
"\"listFirstType\":[1,2]," +
"\"setSecondType\":[" +
"{" +
"\"name\":\"generic2\"," +
"\"genericValue\":\"value2\"," +
"\"listWithGenericValues\":[\"I\",\"Am\",\"2\"]" +
"}," +
"\"generic1\"]" +
"}";
String result = writer.write( bean );
assertEquals( expected, result );
}
public void testDeserializeIntegerGenericString( ObjectReaderTester<GenericTwoType<Integer, GenericOneType<String>>> reader ) {
String input = "{" +
"\"firstType\":1," +
"\"secondType\":{" +
"\"name\":\"generic1\"," +
"\"genericValue\":\"value1\"," +
"\"listWithGenericValues\":[\"Hello\",\"World\"]" +
"}," +
"\"listFirstType\":[1,2]," +
"\"setSecondType\":[" +
"{" +
"\"name\":\"generic2\"," +
"\"genericValue\":\"value2\"," +
"\"listWithGenericValues\":[\"I\",\"Am\",\"2\"]" +
"}," +
"\"generic1\"]" +
"}";
GenericTwoType<Integer, GenericOneType<String>> bean = reader.read( input );
assertNotNull( bean );
assertEquals( 1, (int) bean.firstType );
assertEquals( "generic1", bean.secondType.name );
assertEquals( "value1", bean.secondType.genericValue );
assertEquals( Arrays.asList( "Hello", "World" ), bean.secondType.listWithGenericValues );
assertEquals( Arrays.asList( 1, 2 ), bean.listFirstType );
Iterator<GenericOneType<String>> iterator = bean.setSecondType.iterator();
GenericOneType<String> gen2 = iterator.next();
assertEquals( "generic2", gen2.name );
assertEquals( "value2", gen2.genericValue );
assertEquals( Arrays.asList( "I", "Am", "2" ), gen2.listWithGenericValues );
GenericOneType<String> gen1 = iterator.next();
assertSame( bean.secondType, gen1 );
}
public void testListLongLong( ObjectMapperTester<GenericTwoType<List<Long>, Long>> mapper ) {
GenericTwoType<List<Long>, Long> bean = new GenericTwoType<List<Long>, Long>();
bean.firstType = Arrays.asList( 1l, 5l );
bean.secondType = 3l;
bean.listFirstType = Arrays.asList( Arrays.asList( 3l, 666l ), Arrays.asList( 123456789l ) );
bean.setSecondType = new LinkedHashSet<Long>( Arrays.asList( 456l, 2345l ) );
String json = mapper.write( bean );
assertEquals( json, "{\"firstType\":[1,5],\"secondType\":3,\"listFirstType\":[[3,666],[123456789]],\"setSecondType\":[456,2345]}" );
GenericTwoType<List<Long>, Long> result = mapper.read( json );
assertEquals( result.firstType, Arrays.asList( 1l, 5l ) );
assertEquals( result.secondType, new Long( 3l ) );
assertEquals( result.listFirstType, Arrays.asList( Arrays.asList( 3l, 666l ), Arrays.asList( 123456789l ) ) );
assertEquals( result.setSecondType, new LinkedHashSet<Long>( Arrays.asList( 456l, 2345l ) ) );
}
}