/* * 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.options; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import com.github.nmorel.gwtjackson.client.GwtJacksonTestCase; import com.github.nmorel.gwtjackson.client.JsonDeserializationContext; import com.github.nmorel.gwtjackson.client.JsonSerializationContext; import com.github.nmorel.gwtjackson.client.ObjectReader; import com.github.nmorel.gwtjackson.client.ObjectWriter; import com.github.nmorel.gwtjackson.client.deser.BaseNumberJsonDeserializer.IntegerJsonDeserializer; import com.github.nmorel.gwtjackson.client.deser.StringJsonDeserializer; import com.github.nmorel.gwtjackson.client.deser.array.ArrayJsonDeserializer; import com.github.nmorel.gwtjackson.client.deser.array.ArrayJsonDeserializer.ArrayCreator; import com.github.nmorel.gwtjackson.client.deser.array.PrimitiveIntegerArrayJsonDeserializer; import com.github.nmorel.gwtjackson.client.deser.collection.ListJsonDeserializer; import com.github.nmorel.gwtjackson.client.ser.BaseNumberJsonSerializer.IntegerJsonSerializer; import com.github.nmorel.gwtjackson.client.ser.BaseNumberJsonSerializer.LongJsonSerializer; import com.github.nmorel.gwtjackson.client.ser.BooleanJsonSerializer; import com.github.nmorel.gwtjackson.client.ser.IterableJsonSerializer; import com.github.nmorel.gwtjackson.client.ser.StringJsonSerializer; import com.github.nmorel.gwtjackson.client.ser.array.ArrayJsonSerializer; import com.github.nmorel.gwtjackson.client.ser.array.PrimitiveBooleanArrayJsonSerializer; import com.github.nmorel.gwtjackson.client.ser.array.PrimitiveIntegerArrayJsonSerializer; import com.github.nmorel.gwtjackson.client.stream.JsonWriter; import com.google.gwt.core.client.GWT; /** * @author Nicolas Morel */ public class SingleArrayOptionGwtTest extends GwtJacksonTestCase { public interface StringListBeanWriter extends ObjectWriter<StringListBean> { static StringListBeanWriter INSTANCE = GWT.create( StringListBeanWriter.class ); } public interface ListXBeanReader extends ObjectReader<List<XBean>> { static ListXBeanReader INSTANCE = GWT.create( ListXBeanReader.class ); } public interface ArrayXBeanReader extends ObjectReader<XBean[]> { static ArrayXBeanReader INSTANCE = GWT.create( ArrayXBeanReader.class ); } static class StringListBean { @SuppressWarnings( "unused" ) public Collection<String> values; public StringListBean( Collection<String> v ) { values = v; } } static class XBean { public int x; } private JsonSerializationContext createSerializationContext() { return JsonSerializationContext.builder().writeSingleElemArraysUnwrapped( true ).build(); } public void testSerialize() { JsonSerializationContext context = createSerializationContext(); // Lists: ArrayList<String> strs = new ArrayList<String>(); strs.add( "xyz" ); JsonWriter writer = context.newJsonWriter(); IterableJsonSerializer.newInstance( StringJsonSerializer.getInstance() ).serialize( writer, strs, context ); assertEquals( ("\"xyz\""), writer.getOutput() ); ArrayList<Integer> ints = new ArrayList<Integer>(); ints.add( 13 ); writer = context.newJsonWriter(); IterableJsonSerializer.newInstance( IntegerJsonSerializer.getInstance() ).serialize( writer, ints, context ); assertEquals( "13", writer.getOutput() ); // other Collections, like Sets: HashSet<Long> longs = new HashSet<Long>(); longs.add( 42L ); writer = context.newJsonWriter(); IterableJsonSerializer.newInstance( LongJsonSerializer.getInstance() ).serialize( writer, longs, context ); assertEquals( "42", writer.getOutput() ); // [Issue#180] final String EXP_STRINGS = "{\"values\":\"foo\"}"; assertEquals( EXP_STRINGS, StringListBeanWriter.INSTANCE.write( new StringListBean( Collections .singletonList( "foo" ) ), createSerializationContext() ) ); final Set<String> SET = new HashSet<String>(); SET.add( "foo" ); assertEquals( EXP_STRINGS, StringListBeanWriter.INSTANCE.write( new StringListBean( SET ), createSerializationContext() ) ); // arrays: writer = context.newJsonWriter(); PrimitiveBooleanArrayJsonSerializer.getInstance().serialize( writer, new boolean[]{true}, context ); assertEquals( "true", writer.getOutput() ); writer = context.newJsonWriter(); ArrayJsonSerializer.newInstance( BooleanJsonSerializer.getInstance() ).serialize( writer, new Boolean[]{Boolean.TRUE}, context ); assertEquals( "true", writer.getOutput() ); writer = context.newJsonWriter(); PrimitiveIntegerArrayJsonSerializer.getInstance().serialize( writer, new int[]{3}, context ); assertEquals( "3", writer.getOutput() ); writer = context.newJsonWriter(); ArrayJsonSerializer.newInstance( StringJsonSerializer.getInstance() ).serialize( writer, new String[]{"foo"}, context ); assertEquals( "\"foo\"", writer.getOutput() ); } private JsonDeserializationContext createDeserializationContext() { return JsonDeserializationContext.builder().acceptSingleValueAsArray( true ).build(); } public void testDeserialize() { JsonDeserializationContext context = createDeserializationContext(); // first with simple scalar types (numbers), with collections List<Integer> ints = ListJsonDeserializer.newInstance( IntegerJsonDeserializer.getInstance() ).deserialize( context .newJsonReader( "4" ), context ); assertEquals( 1, ints.size() ); assertEquals( Integer.valueOf( 4 ), ints.get( 0 ) ); List<String> strings = ListJsonDeserializer.newInstance( StringJsonDeserializer.getInstance() ).deserialize( context .newJsonReader( "\"abc\"" ), context ); assertEquals( 1, strings.size() ); assertEquals( "abc", strings.get( 0 ) ); // and arrays: int[] intArray = PrimitiveIntegerArrayJsonDeserializer.getInstance().deserialize( context.newJsonReader( "-7" ), context ); assertEquals( 1, intArray.length ); assertEquals( -7, intArray[0] ); String[] stringArray = ArrayJsonDeserializer.newInstance( StringJsonDeserializer.getInstance(), new ArrayCreator<String>() { @Override public String[] create( int length ) { return new String[length]; } } ).deserialize( context.newJsonReader( "\"xyz\"" ), context ); assertEquals( 1, stringArray.length ); assertEquals( "xyz", stringArray[0] ); // and then with Beans: List<XBean> xbeanList = ListXBeanReader.INSTANCE.read( "{\"x\":4}", createDeserializationContext() ); assertEquals( 1, xbeanList.size() ); assertEquals( XBean.class, xbeanList.get( 0 ).getClass() ); XBean[] xbeanArray = ArrayXBeanReader.INSTANCE.read( "{\"x\":29}", createDeserializationContext() ); assertEquals( 1, xbeanArray.length ); assertEquals( XBean.class, xbeanArray[0].getClass() ); } }