/* * 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 java.math.BigDecimal; import java.math.BigInteger; import junit.framework.TestCase; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonParseException; import com.google.gson.common.TestTypes.CrazyLongTypeAdapter; /** * Functional tests for Json primitive values: integers, and floating point numbers. * * @author Inderjeet Singh * @author Joel Leitch */ public class PrimitiveTest extends TestCase { private Gson gson; @Override protected void setUp() throws Exception { super.setUp(); gson = new Gson(); } public void testPrimitiveIntegerAutoboxedSerialization() { assertEquals("1", gson.toJson(1)); } public void testPrimitiveIntegerAutoboxedDeserialization() { int expected = 1; int actual = gson.fromJson("1", int.class); assertEquals(expected, actual); actual = gson.fromJson("1", Integer.class); assertEquals(expected, actual); } public void testPrimitiveIntegerAutoboxedInASingleElementArraySerialization() { int target[] = {-9332}; assertEquals("[-9332]", gson.toJson(target)); assertEquals("[-9332]", gson.toJson(target, int[].class)); assertEquals("[-9332]", gson.toJson(target, Integer[].class)); } public void testPrimitiveIntegerAutoboxedInASingleElementArrayDeserialization() { int expected = 1; int actual = gson.fromJson("[1]", int.class); assertEquals(expected, actual); actual = gson.fromJson("[1]", Integer.class); assertEquals(expected, actual); } public void testReallyLongValuesSerialization() { long value = 333961828784581L; assertEquals("333961828784581", gson.toJson(value)); } public void testReallyLongValuesDeserialization() { String json = "333961828784581"; long value = gson.fromJson(json, Long.class); assertEquals(333961828784581L, value); } public void testPrimitiveLongAutoboxedSerialization() { assertEquals("1", gson.toJson(1L, long.class)); assertEquals("1", gson.toJson(1L, Long.class)); } public void testPrimitiveLongAutoboxedDeserialization() { long expected = 1L; long actual = gson.fromJson("1", long.class); assertEquals(expected, actual); actual = gson.fromJson("1", Long.class); assertEquals(expected, actual); } public void testPrimitiveLongAutoboxedInASingleElementArraySerialization() { long[] target = {-23L}; assertEquals("[-23]", gson.toJson(target)); assertEquals("[-23]", gson.toJson(target, long[].class)); assertEquals("[-23]", gson.toJson(target, Long[].class)); } public void testPrimitiveLongAutoboxedInASingleElementArrayDeserialization() { long expected = 1L; long actual = gson.fromJson("[1]", long.class); assertEquals(expected, actual); actual = gson.fromJson("[1]", Long.class); assertEquals(expected, actual); } public void testPrimitiveBooleanAutoboxedSerialization() { assertEquals("true", gson.toJson(true)); assertEquals("false", gson.toJson(false)); } public void testPrimitiveBooleanAutoboxedDeserialization() { assertEquals(Boolean.FALSE, gson.fromJson("[false]", Boolean.class)); assertEquals(Boolean.TRUE, gson.fromJson("[true]", Boolean.class)); boolean value = gson.fromJson("false", boolean.class); assertEquals(false, value); value = gson.fromJson("true", boolean.class); assertEquals(true, value); } public void testPrimitiveBooleanAutoboxedInASingleElementArraySerialization() { boolean target[] = {false}; assertEquals("[false]", gson.toJson(target)); assertEquals("[false]", gson.toJson(target, boolean[].class)); assertEquals("[false]", gson.toJson(target, Boolean[].class)); } public void testPrimitiveBooleanAutoboxedInASingleElementArrayDeserialization() { assertEquals(Boolean.FALSE, gson.fromJson("[false]", Boolean.class)); assertEquals(Boolean.TRUE, gson.fromJson("[true]", Boolean.class)); boolean value = gson.fromJson("[false]", boolean.class); assertEquals(false, value); value = gson.fromJson("[true]", boolean.class); assertEquals(true, value); } public void testNumberSerialization() { Number expected = 1L; String json = gson.toJson(expected); assertEquals(expected.toString(), json); json = gson.toJson(expected, Number.class); assertEquals(expected.toString(), json); } public void testNumberDeserialization() { String json = "1"; Number expected = new Integer(json); Number actual = gson.fromJson(json, Number.class); assertEquals(expected.intValue(), actual.intValue()); json = String.valueOf(Long.MAX_VALUE); expected = new Long(json); actual = gson.fromJson(json, Number.class); assertEquals(expected.longValue(), actual.longValue()); } public void testPrimitiveDoubleAutoboxedSerialization() { assertEquals("-122.08234335", gson.toJson(-122.08234335)); assertEquals("122.08112002", gson.toJson(new Double(122.08112002))); } public void testPrimitiveDoubleAutoboxedDeserialization() { double actual = gson.fromJson("-122.08858585", double.class); assertEquals(-122.08858585, actual); actual = gson.fromJson("122.023900008000", Double.class); assertEquals(122.023900008, actual); } public void testPrimitiveDoubleAutoboxedInASingleElementArraySerialization() { double[] target = {-122.08D}; assertEquals("[-122.08]", gson.toJson(target)); assertEquals("[-122.08]", gson.toJson(target, double[].class)); assertEquals("[-122.08]", gson.toJson(target, Double[].class)); } public void testDoubleAsStringRepresentationDeserialization() { String doubleValue = "1.0043E+5"; Double expected = Double.valueOf(doubleValue); Double actual = gson.fromJson(doubleValue, Double.class); assertEquals(expected, actual); double actual1 = gson.fromJson(doubleValue, double.class); assertEquals(expected.doubleValue(), actual1); } public void testDoubleNoFractAsStringRepresentationDeserialization() { String doubleValue = "1E+5"; Double expected = Double.valueOf(doubleValue); Double actual = gson.fromJson(doubleValue, Double.class); assertEquals(expected, actual); double actual1 = gson.fromJson(doubleValue, double.class); assertEquals(expected.doubleValue(), actual1); } public void testPrimitiveDoubleAutoboxedInASingleElementArrayDeserialization() { double expected = -122.08; double actual = gson.fromJson("[-122.08]", double.class); assertEquals(expected, actual); actual = gson.fromJson("[-122.08]", Double.class); assertEquals(expected, actual); } public void testBigDecimalSerialization() { BigDecimal target = new BigDecimal("-122.0e-21"); String json = gson.toJson(target); assertEquals(target, new BigDecimal(json)); } public void testBigDecimalDeserialization() { BigDecimal target = new BigDecimal("-122.0e-21"); String json = "-122.0e-21"; assertEquals(target, gson.fromJson(json, BigDecimal.class)); } public void testBigDecimalInASingleElementArraySerialization() { BigDecimal[] target = {new BigDecimal("-122.08e-21")}; String json = gson.toJson(target); String actual = extractElementFromArray(json); assertEquals(target[0], new BigDecimal(actual)); json = gson.toJson(target, BigDecimal[].class); actual = extractElementFromArray(json); assertEquals(target[0], new BigDecimal(actual)); } public void testBigDecimalInASingleElementArrayDeserialization() { BigDecimal expected = new BigDecimal("-122.08e-21"); BigDecimal actual = gson.fromJson("[-122.08e-21]", BigDecimal.class); assertEquals(expected, actual); } public void testSmallValueForBigDecimalSerialization() { BigDecimal target = new BigDecimal("1.55"); String actual = gson.toJson(target); assertEquals(target.toString(), actual); } public void testSmallValueForBigDecimalDeserialization() { BigDecimal expected = new BigDecimal("1.55"); BigDecimal actual = gson.fromJson("1.55", BigDecimal.class); assertEquals(expected, actual); } public void testBigDecimalPreservePrecisionSerialization() { String expectedValue = "1.000"; BigDecimal obj = new BigDecimal(expectedValue); String actualValue = gson.toJson(obj); assertEquals(expectedValue, actualValue); } public void testBigDecimalPreservePrecisionDeserialization() { String json = "1.000"; BigDecimal expected = new BigDecimal(json); BigDecimal actual = gson.fromJson(json, BigDecimal.class); assertEquals(expected, actual); } public void testBigDecimalAsStringRepresentationDeserialization() { String doubleValue = "0.05E+5"; BigDecimal expected = new BigDecimal(doubleValue); BigDecimal actual = gson.fromJson(doubleValue, BigDecimal.class); assertEquals(expected, actual); } public void testBigDecimalNoFractAsStringRepresentationDeserialization() { String doubleValue = "5E+5"; BigDecimal expected = new BigDecimal(doubleValue); BigDecimal actual = gson.fromJson(doubleValue, BigDecimal.class); assertEquals(expected, actual); } public void testBigIntegerSerialization() { BigInteger target = new BigInteger("12121211243123245845384534687435634558945453489543985435"); assertEquals(target.toString(), gson.toJson(target)); } public void testBigIntegerDeserialization() { String json = "12121211243123245845384534687435634558945453489543985435"; BigInteger target = new BigInteger(json); assertEquals(target, gson.fromJson(json, BigInteger.class)); } public void testBigIntegerInASingleElementArraySerialization() { BigInteger[] target = {new BigInteger("1212121243434324323254365345367456456456465464564564")}; String json = gson.toJson(target); String actual = extractElementFromArray(json); assertEquals(target[0], new BigInteger(actual)); json = gson.toJson(target, BigInteger[].class); actual = extractElementFromArray(json); assertEquals(target[0], new BigInteger(actual)); } public void testBigIntegerInASingleElementArrayDeserialization() { BigInteger expected = new BigInteger("34343434343424242423432323243243242"); BigInteger actual = gson.fromJson("[34343434343424242423432323243243242]", BigInteger.class); assertEquals(expected, actual); } public void testSmallValueForBigIntegerSerialization() { BigInteger target = new BigInteger("15"); String actual = gson.toJson(target); assertEquals(target.toString(), actual); } public void testSmallValueForBigIntegerDeserialization() { BigInteger expected = new BigInteger("15"); BigInteger actual = gson.fromJson("15", BigInteger.class); assertEquals(expected, actual); } public void testBadValueForBigIntegerDeserialization() { try { gson.fromJson("15.099", BigInteger.class); fail("BigInteger can not be decimal values."); } catch (JsonParseException expected) { } } public void testOverridingDefaultPrimitiveSerialization() { CrazyLongTypeAdapter typeAdapter = new CrazyLongTypeAdapter(); gson = new GsonBuilder() .registerTypeAdapter(long.class, typeAdapter) .registerTypeAdapter(Long.class, typeAdapter) .create(); long value = 1L; String serializedValue = gson.toJson(value); assertEquals(String.valueOf(value + CrazyLongTypeAdapter.DIFFERENCE), serializedValue); long deserializedValue = gson.fromJson(serializedValue, long.class); assertEquals(value, deserializedValue); } private String extractElementFromArray(String json) { return json.substring(json.indexOf('[') + 1, json.indexOf(']')); } public void testDoubleNaNSerializationNotSupported() { double nan = (double) Double.NaN; try { gson.toJson(nan); gson.toJson(Double.NaN); fail("Gson should not accept NaN for serialization"); } catch (IllegalArgumentException expected) { } } public void testDoubleNaNDeserializationNotSupported() { assertTrue(Double.isNaN(gson.fromJson("NaN", Double.class))); assertTrue(Double.isNaN(gson.fromJson("NaN", double.class))); } public void testFloatNaNSerializationNotSupported() { float nan = (float) Float.NaN; try { gson.toJson(nan); gson.toJson(Float.NaN); fail("Gson should not accept NaN for serialization"); } catch (IllegalArgumentException expected) { } } public void testFloatNaNDeserializationNotSupported() { assertTrue(Float.isNaN(gson.fromJson("NaN", Float.class))); assertTrue(Float.isNaN(gson.fromJson("NaN", float.class))); } public void testBigDecimalNaNDeserializationNotSupported() { try { gson.fromJson("NaN", BigDecimal.class); fail("Gson should not accept NaN for deserialization"); } catch (JsonParseException expected) { } } public void testDoubleInfinitySerializationNotSupported() { double infinity = (double)Double.POSITIVE_INFINITY; try { gson.toJson(infinity); gson.toJson(Double.POSITIVE_INFINITY); fail("Gson should not accept positive infinity for serialization"); } catch (IllegalArgumentException expected) { } } public void testDoubleInfinityDeserializationNotSupported() { assertTrue(Double.isInfinite(gson.fromJson("Infinity", Double.class))); assertTrue(Double.isInfinite(gson.fromJson("Infinity", double.class))); } public void testFloatInfinitySerializationNotSupported() { float infinity = (float) Float.POSITIVE_INFINITY; try { gson.toJson(infinity); gson.toJson(Float.POSITIVE_INFINITY); fail("Gson should not accept positive infinity for serialization"); } catch (IllegalArgumentException expected) { } } public void testFloatInfinityDeserializationNotSupported() { assertTrue(Float.isInfinite(gson.fromJson("Infinity", Float.class))); assertTrue(Float.isInfinite(gson.fromJson("Infinity", float.class))); } public void testBigDecimalInfinityDeserializationNotSupported() { try { gson.fromJson("Infinity", BigDecimal.class); fail("Gson should not accept positive infinity for deserialization"); } catch (JsonParseException expected) { } } public void testNegativeInfinitySerializationNotSupported() { double negativeInfinity = (double)Double.NEGATIVE_INFINITY; try { gson.toJson(negativeInfinity); gson.toJson(Double.NEGATIVE_INFINITY); fail("Gson should not accept positive infinity for serialization"); } catch (IllegalArgumentException expected) { } } public void testNegativeInfinityDeserializationNotSupported() { assertTrue(Double.isInfinite(gson.fromJson("-Infinity", double.class))); assertTrue(Double.isInfinite(gson.fromJson("-Infinity", Double.class))); } public void testNegativeInfinityFloatSerializationNotSupported() { float negativeInfinity = (float) Float.NEGATIVE_INFINITY; try { gson.toJson(negativeInfinity); gson.toJson(Float.NEGATIVE_INFINITY); fail("Gson should not accept positive infinity for serialization"); } catch (IllegalArgumentException expected) { } } public void testNegativeInfinityFloatDeserializationNotSupported() { assertTrue(Float.isInfinite(gson.fromJson("-Infinity", float.class))); assertTrue(Float.isInfinite(gson.fromJson("-Infinity", Float.class))); } public void testNegativeInfinityBigDecimalDeserializationNotSupported() { try { gson.fromJson("-Infinity", BigDecimal.class); fail("Gson should not accept positive infinity for deserialization"); } catch (JsonParseException expected) { } } }