package com.google.gson.common; import java.util.Collection; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import com.google.gson.annotations.SerializedName; import java.lang.reflect.Type; /** * Types used for testing JSON serialization and deserialization * * @author Inderjeet Singh * @author Joel Leitch */ public class TestTypes { public static class Base { public static final String BASE_NAME = Base.class.getSimpleName(); public static final String BASE_FIELD_KEY = "baseName"; public static final String SERIALIZER_KEY = "serializerName"; public String baseName = BASE_NAME; public String serializerName; } public static class Sub extends Base { public static final String SUB_NAME = Sub.class.getSimpleName(); public static final String SUB_FIELD_KEY = "subName"; public final String subName = SUB_NAME; } public static class ClassWithBaseField { public static final String FIELD_KEY = "base"; public final Base base; public ClassWithBaseField(Base base) { this.base = base; } } public static class ClassWithBaseArrayField { public static final String FIELD_KEY = "base"; public final Base[] base; public ClassWithBaseArrayField(Base[] base) { this.base = base; } } public static class ClassWithBaseCollectionField { public static final String FIELD_KEY = "base"; public final Collection<Base> base; public ClassWithBaseCollectionField(Collection<Base> base) { this.base = base; } } public static class BaseSerializer implements JsonSerializer<Base> { public static final String NAME = BaseSerializer.class.getSimpleName(); public JsonElement serialize(Base src, Type typeOfSrc, JsonSerializationContext context) { JsonObject obj = new JsonObject(); obj.addProperty(Base.SERIALIZER_KEY, NAME); return obj; } } public static class SubSerializer implements JsonSerializer<Sub> { public static final String NAME = SubSerializer.class.getSimpleName(); public JsonElement serialize(Sub src, Type typeOfSrc, JsonSerializationContext context) { JsonObject obj = new JsonObject(); obj.addProperty(Base.SERIALIZER_KEY, NAME); return obj; } } public static class StringWrapper { public final String someConstantStringInstanceField; public StringWrapper(String value) { someConstantStringInstanceField = value; } } public static class BagOfPrimitives { public static final long DEFAULT_VALUE = 0; public long longValue; public int intValue; public boolean booleanValue; public String stringValue; public BagOfPrimitives() { this(DEFAULT_VALUE, 0, false, ""); } public BagOfPrimitives(long longValue ,int intValue ,boolean booleanValue ,String stringValue) { this.longValue = longValue; this.intValue = intValue; this.booleanValue = booleanValue; this.stringValue = stringValue; } public int getIntValue() { return intValue; } public String getExpectedJson() { StringBuilder sb = new StringBuilder(); sb.append("{"); sb.append("\"longValue\":").append(longValue).append(","); sb.append("\"intValue\":").append(intValue).append(","); sb.append("\"booleanValue\":").append(booleanValue).append(","); sb.append("\"stringValue\":\"").append(stringValue).append("\""); sb.append("}"); return sb.toString(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = (prime * result) + (booleanValue ? 1231 : 1237); result = (prime * result) + (intValue); result = (prime * result) + ((int)(((longValue) ^ ((longValue) >>> 32)))); result = (prime * result) + ((stringValue) == null ? 0 : stringValue.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if ((getClass()) != (obj.getClass())) return false; BagOfPrimitives other = ((BagOfPrimitives)(obj)); if ((booleanValue) != (other.booleanValue)) return false; if ((intValue) != (other.intValue)) return false; if ((longValue) != (other.longValue)) return false; if ((stringValue) == null) { if ((other.stringValue) != null) return false; } else if (!(stringValue.equals(other.stringValue))) return false; return true; } @Override public String toString() { return String.format("(longValue=%d,intValue=%d,booleanValue=%b,stringValue=%s)", longValue, intValue, booleanValue, stringValue); } } public static class BagOfPrimitiveWrappers { private final Long longValue; private final Integer intValue; private final Boolean booleanValue; public BagOfPrimitiveWrappers(Long longValue ,Integer intValue ,Boolean booleanValue) { this.longValue = longValue; this.intValue = intValue; this.booleanValue = booleanValue; } public String getExpectedJson() { StringBuilder sb = new StringBuilder(); sb.append("{"); sb.append("\"longValue\":").append(longValue).append(","); sb.append("\"intValue\":").append(intValue).append(","); sb.append("\"booleanValue\":").append(booleanValue); sb.append("}"); return sb.toString(); } } public static class PrimitiveArray { private final long[] longArray; public PrimitiveArray() { this(new long[0]); } public PrimitiveArray(long[] longArray) { this.longArray = longArray; } public String getExpectedJson() { StringBuilder sb = new StringBuilder(); sb.append("{\"longArray\":["); boolean first = true; for (long l : longArray) { if (!first) { sb.append(","); } else { first = false; } sb.append(l); } sb.append("]}"); return sb.toString(); } } public static class ClassWithNoFields { @Override public boolean equals(Object other) { return (other.getClass()) == (ClassWithNoFields.class); } } public static class Nested { private final BagOfPrimitives primitive1; private final BagOfPrimitives primitive2; public Nested() { this(null, null); } public Nested(BagOfPrimitives primitive1 ,BagOfPrimitives primitive2) { this.primitive1 = primitive1; this.primitive2 = primitive2; } public String getExpectedJson() { StringBuilder sb = new StringBuilder(); sb.append("{"); appendFields(sb); sb.append("}"); return sb.toString(); } public void appendFields(StringBuilder sb) { if ((primitive1) != null) { sb.append("\"primitive1\":").append(primitive1.getExpectedJson()); } if (((primitive1) != null) && ((primitive2) != null)) { sb.append(","); } if ((primitive2) != null) { sb.append("\"primitive2\":").append(primitive2.getExpectedJson()); } } } public static class ClassWithTransientFields<T> { public transient T transientT; public final transient long transientLongValue; private final long[] longValue; public ClassWithTransientFields() { this(0L); } public ClassWithTransientFields(long value) { longValue = new long[]{ value }; transientLongValue = value + 1; } public String getExpectedJson() { StringBuilder sb = new StringBuilder(); sb.append("{"); sb.append("\"longValue\":[").append(longValue[0]).append("]"); sb.append("}"); return sb.toString(); } } public static class ClassWithCustomTypeConverter { private final BagOfPrimitives bag; private final int value; public ClassWithCustomTypeConverter() { this(new BagOfPrimitives(), 10); } public ClassWithCustomTypeConverter(int value) { this(new BagOfPrimitives(value , value , false , ""), value); } public ClassWithCustomTypeConverter(BagOfPrimitives bag ,int value) { this.bag = bag; this.value = value; } public BagOfPrimitives getBag() { return bag; } public String getExpectedJson() { return ((("{\"url\":\"" + (bag.getExpectedJson())) + "\",\"value\":") + (value)) + "}"; } public int getValue() { return value; } } public static class ArrayOfObjects { private final BagOfPrimitives[] elements; public ArrayOfObjects() { elements = new BagOfPrimitives[3]; for (int i = 0 ; i < (elements.length) ; ++i) { elements[i] = new BagOfPrimitives(i , (i + 2) , false , ("i" + i)); } } public String getExpectedJson() { StringBuilder sb = new StringBuilder("{\"elements\":["); boolean first = true; for (BagOfPrimitives element : elements) { if (first) { first = false; } else { sb.append(","); } sb.append(element.getExpectedJson()); } sb.append("]}"); return sb.toString(); } } public static class ClassOverridingEquals { public ClassOverridingEquals ref; public String getExpectedJson() { if ((ref) == null) { return "{}"; } return ("{\"ref\":" + (ref.getExpectedJson())) + "}"; } @Override public boolean equals(Object obj) { return true; } @Override public int hashCode() { return 1; } } public static class ClassWithArray { public final Object[] array; public ClassWithArray() { array = null; } public ClassWithArray(Object[] array) { this.array = array; } } public static class ClassWithObjects { public final BagOfPrimitives bag; public ClassWithObjects() { this(new BagOfPrimitives()); } public ClassWithObjects(BagOfPrimitives bag) { this.bag = bag; } } public static class ClassWithSerializedNameFields { @SerializedName(value = "fooBar") public final int f; @SerializedName(value = "Another Foo") public final int g; public ClassWithSerializedNameFields() { this(1, 4); } public ClassWithSerializedNameFields(int f ,int g) { this.f = f; this.g = g; } public String getExpectedJson() { return (((('{' + "\"fooBar\":") + (f)) + ",\"Another Foo\":") + (g)) + '}'; } } public static class CrazyLongTypeAdapter implements JsonDeserializer<java.lang.Long> , JsonSerializer<java.lang.Long> { public static final long DIFFERENCE = 5L; public JsonElement serialize(Long src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive((src + (DIFFERENCE))); } public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { return (json.getAsLong()) - (DIFFERENCE); } } }