gson-comments/gson/src/test/java/com/google/gson/common/TestTypes.java

423 lines
12 KiB
Java

/*
* 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.common;
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;
import java.util.Collection;
/**
* 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();
@Override
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();
@Override
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();
}
}
// for missing hashCode() override
@SuppressWarnings({"overrides", "EqualsHashCode"})
public static class ClassWithNoFields {
// Nothing here..
@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("fooBar") public final int f;
@SerializedName("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 JsonSerializer<Long>, JsonDeserializer<Long> {
public static final long DIFFERENCE = 5L;
@Override
public JsonElement serialize(Long src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src + DIFFERENCE);
}
@Override
public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
return json.getAsLong() - DIFFERENCE;
}
}
}