gson-comments/gson/src/test/java/com/google/gson/functional/JsonAdapterAnnotationOnFiel...

171 lines
6.0 KiB
Java
Raw Normal View History

/*
* Copyright (C) 2014 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 com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
2014-03-26 18:59:54 +01:00
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import junit.framework.TestCase;
/**
2014-03-26 18:59:54 +01:00
* Functional tests for the {@link com.google.gson.annotations.JsonAdapter} annotation on fields.
*/
2014-03-26 18:59:54 +01:00
public final class JsonAdapterAnnotationOnFieldsTest extends TestCase {
public void testClassAnnotationAdapterTakesPrecedenceOverDefault() {
Gson gson = new Gson();
String json = gson.toJson(new Computer(new User("Inderjeet Singh")));
assertEquals("{\"user\":\"UserClassAnnotationAdapter\"}", json);
Computer computer = gson.fromJson("{'user':'Inderjeet Singh'}", Computer.class);
assertEquals("UserClassAnnotationAdapter", computer.user.name);
}
public void testRegisteredTypeAdapterTakesPrecedenceOverClassAnnotationAdapter() {
Gson gson = new GsonBuilder()
.registerTypeAdapter(User.class, new RegisteredUserAdapter())
.create();
String json = gson.toJson(new Computer(new User("Inderjeet Singh")));
assertEquals("{\"user\":\"RegisteredUserAdapter\"}", json);
Computer computer = gson.fromJson("{'user':'Inderjeet Singh'}", Computer.class);
assertEquals("RegisteredUserAdapter", computer.user.name);
}
public void testFieldAnnotationTakesPrecedenceOverRegisteredTypeAdapter() {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Part.class, new TypeAdapter<Part>() {
@Override public void write(JsonWriter out, Part part) throws IOException {
throw new AssertionError();
}
@Override public Part read(JsonReader in) throws IOException {
throw new AssertionError();
}
}).create();
String json = gson.toJson(new Gadget(new Part("screen")));
assertEquals("{\"part\":\"PartJsonFieldAnnotationAdapter\"}", json);
Gadget gadget = gson.fromJson("{'part':'screen'}", Gadget.class);
assertEquals("PartJsonFieldAnnotationAdapter", gadget.part.name);
}
public void testFieldAnnotationTakesPrecedenceOverClassAnnotation() {
Gson gson = new Gson();
String json = gson.toJson(new Computer2(new User("Inderjeet Singh")));
assertEquals("{\"user\":\"UserFieldAnnotationAdapter\"}", json);
Computer2 target = gson.fromJson("{'user':'Interjeet Singh'}", Computer2.class);
assertEquals("UserFieldAnnotationAdapter", target.user.name);
}
private static final class Gadget {
@JsonAdapter(PartJsonFieldAnnotationAdapter.class)
final Part part;
Gadget(Part part) {
this.part = part;
}
}
private static final class Part {
final String name;
Part(String name) {
this.name = name;
}
}
private static class PartJsonFieldAnnotationAdapter extends TypeAdapter<Part> {
@Override public void write(JsonWriter out, Part part) throws IOException {
out.value("PartJsonFieldAnnotationAdapter");
}
@Override public Part read(JsonReader in) throws IOException {
in.nextString();
return new Part("PartJsonFieldAnnotationAdapter");
}
}
private static final class Computer {
final User user;
Computer(User user) {
this.user = user;
}
}
@JsonAdapter(UserClassAnnotationAdapter.class)
private static class User {
public final String name;
private User(String name) {
this.name = name;
}
}
private static class UserClassAnnotationAdapter extends TypeAdapter<User> {
@Override public void write(JsonWriter out, User user) throws IOException {
out.value("UserClassAnnotationAdapter");
}
@Override public User read(JsonReader in) throws IOException {
in.nextString();
return new User("UserClassAnnotationAdapter");
}
}
private static final class Computer2 {
// overrides the JsonAdapter annotation of User with this
@JsonAdapter(UserFieldAnnotationAdapter.class)
final User user;
Computer2(User user) {
this.user = user;
}
}
private static final class UserFieldAnnotationAdapter extends TypeAdapter<User> {
@Override public void write(JsonWriter out, User user) throws IOException {
out.value("UserFieldAnnotationAdapter");
}
@Override public User read(JsonReader in) throws IOException {
in.nextString();
return new User("UserFieldAnnotationAdapter");
}
}
private static final class RegisteredUserAdapter extends TypeAdapter<User> {
@Override public void write(JsonWriter out, User user) throws IOException {
out.value("RegisteredUserAdapter");
}
@Override public User read(JsonReader in) throws IOException {
in.nextString();
return new User("RegisteredUserAdapter");
}
}
public void testJsonAdapterInvokedOnlyForAnnotatedFields() {
Gson gson = new Gson();
String json = "{'part1':'name','part2':{'name':'name2'}}";
GadgetWithTwoParts gadget = gson.fromJson(json, GadgetWithTwoParts.class);
assertEquals("PartJsonFieldAnnotationAdapter", gadget.part1.name);
assertEquals("name2", gadget.part2.name);
}
private static final class GadgetWithTwoParts {
@JsonAdapter(PartJsonFieldAnnotationAdapter.class) final Part part1;
final Part part2; // Doesn't have the JsonAdapter annotation
@SuppressWarnings("unused") GadgetWithTwoParts(Part part1, Part part2) {
this.part1 = part1;
this.part2 = part2;
}
}
}