/* * Copyright (C) 2008 Google Inc. * * 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.google.gson.functional; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonStreamParser; import com.google.gson.JsonSyntaxException; import com.google.gson.common.TestTypes.BagOfPrimitives; import com.google.gson.reflect.TypeToken; import java.io.CharArrayReader; import java.io.CharArrayWriter; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import java.util.Arrays; import java.util.Map; import org.junit.Before; import org.junit.Test; /** * Functional tests for the support of {@link Reader}s and {@link Writer}s. * * @author Inderjeet Singh * @author Joel Leitch */ public class ReadersWritersTest { private Gson gson; @Before public void setUp() throws Exception { gson = new Gson(); } @Test public void testWriterForSerialization() throws Exception { Writer writer = new StringWriter(); BagOfPrimitives src = new BagOfPrimitives(); gson.toJson(src, writer); assertEquals(src.getExpectedJson(), writer.toString()); } @Test public void testReaderForDeserialization() throws Exception { BagOfPrimitives expected = new BagOfPrimitives(); Reader json = new StringReader(expected.getExpectedJson()); BagOfPrimitives actual = gson.fromJson(json, BagOfPrimitives.class); assertEquals(expected, actual); } @Test public void testTopLevelNullObjectSerializationWithWriter() { StringWriter writer = new StringWriter(); gson.toJson(null, writer); assertEquals("null", writer.toString()); } @Test public void testTopLevelNullObjectDeserializationWithReader() { StringReader reader = new StringReader("null"); Integer nullIntObject = gson.fromJson(reader, Integer.class); assertNull(nullIntObject); } @Test public void testTopLevelNullObjectSerializationWithWriterAndSerializeNulls() { Gson gson = new GsonBuilder().serializeNulls().create(); StringWriter writer = new StringWriter(); gson.toJson(null, writer); assertEquals("null", writer.toString()); } @Test public void testTopLevelNullObjectDeserializationWithReaderAndSerializeNulls() { Gson gson = new GsonBuilder().serializeNulls().create(); StringReader reader = new StringReader("null"); Integer nullIntObject = gson.fromJson(reader, Integer.class); assertNull(nullIntObject); } @Test public void testReadWriteTwoStrings() throws IOException { Gson gson = new Gson(); CharArrayWriter writer = new CharArrayWriter(); writer.write(gson.toJson("one").toCharArray()); writer.write(gson.toJson("two").toCharArray()); CharArrayReader reader = new CharArrayReader(writer.toCharArray()); JsonStreamParser parser = new JsonStreamParser(reader); String actualOne = gson.fromJson(parser.next(), String.class); assertEquals("one", actualOne); String actualTwo = gson.fromJson(parser.next(), String.class); assertEquals("two", actualTwo); } @Test public void testReadWriteTwoObjects() throws IOException { Gson gson = new Gson(); CharArrayWriter writer = new CharArrayWriter(); BagOfPrimitives expectedOne = new BagOfPrimitives(1, 1, true, "one"); writer.write(gson.toJson(expectedOne).toCharArray()); BagOfPrimitives expectedTwo = new BagOfPrimitives(2, 2, false, "two"); writer.write(gson.toJson(expectedTwo).toCharArray()); CharArrayReader reader = new CharArrayReader(writer.toCharArray()); JsonStreamParser parser = new JsonStreamParser(reader); BagOfPrimitives actualOne = gson.fromJson(parser.next(), BagOfPrimitives.class); assertEquals("one", actualOne.stringValue); BagOfPrimitives actualTwo = gson.fromJson(parser.next(), BagOfPrimitives.class); assertEquals("two", actualTwo.stringValue); assertFalse(parser.hasNext()); } @Test public void testTypeMismatchThrowsJsonSyntaxExceptionForStrings() { try { gson.fromJson("true", new TypeToken>() {}.getType()); fail(); } catch (JsonSyntaxException expected) { } } @Test public void testTypeMismatchThrowsJsonSyntaxExceptionForReaders() { try { gson.fromJson(new StringReader("true"), new TypeToken>() {}.getType()); fail(); } catch (JsonSyntaxException expected) { } } /** * Verifies that passing an {@link Appendable} which is not an instance of {@link Writer} * to {@code Gson.toJson} works correctly. */ @Test public void testToJsonAppendable() { class CustomAppendable implements Appendable { final StringBuilder stringBuilder = new StringBuilder(); int toStringCallCount = 0; @Override public Appendable append(char c) throws IOException { stringBuilder.append(c); return this; } @Override public Appendable append(CharSequence csq) throws IOException { if (csq == null) { csq = "null"; // Requirement by Writer.append } append(csq, 0, csq.length()); return this; } @Override public Appendable append(CharSequence csq, int start, int end) throws IOException { if (csq == null) { csq = "null"; // Requirement by Writer.append } // According to doc, toString() must return string representation String s = csq.toString(); toStringCallCount++; stringBuilder.append(s, start, end); return this; } } CustomAppendable appendable = new CustomAppendable(); gson.toJson(Arrays.asList("test", 123, true), appendable); // Make sure CharSequence.toString() was called at least two times to verify that // CurrentWrite.cachedString is properly overwritten when char array changes assertTrue(appendable.toStringCallCount >= 2); assertEquals("[\"test\",123,true]", appendable.stringBuilder.toString()); } }