blob: 318e8bf01c419a9f1dcd55a8177c643774716faa [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.johnzon.mapper;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import static java.util.Arrays.asList;
@RunWith(Parameterized.class)
public class AdvancedGenericsTest {
@Parameterized.Parameter
public String accessMode;
@Parameterized.Parameters(name = "{0}")
public static Iterable<String> modes() {
return asList("field", "method", "both", "strict-method");
}
@Test
public void testSerializeHierarchyOne() {
Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
.build();
{
String customerAsString = mapper.writeObjectAsString(new Customer("Bruce", "Wayne"));
Assert.assertTrue("Serialized String must contain \"firstName\":\"Bruce\"", customerAsString.contains("\"firstName\":\"Bruce\""));
Assert.assertTrue("Serialized String must contain \"lastName\":\"Wayne\"", customerAsString.contains("\"lastName\":\"Wayne\""));
Assert.assertFalse("Serialized String must not contain \"id\": " + customerAsString, customerAsString.contains("\"id\""));
Assert.assertFalse("Serialized String must not contain \"version\"", customerAsString.contains("\"version\""));
}
{
String customerAsString = mapper.writeObjectAsString(new Customer(160784L, 35, "Clark", "Kent"));
Assert.assertTrue("Serialized String must contain \"firstName\":\"Bruce\"", customerAsString.contains("\"firstName\":\"Clark\""));
Assert.assertTrue("Serialized String must contain \"lastName\":\"Wayne\"", customerAsString.contains("\"lastName\":\"Kent\""));
Assert.assertTrue("Serialized String must contain \"id\":160784", customerAsString.contains("\"id\":160784"));
Assert.assertTrue("Serialized String must contain \"version\":35", customerAsString.contains("\"version\":35"));
}
}
@Test
public void testDeserializeHierarchyOne() {
Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
.build();
{
Customer customer = mapper.readObject("{ \"lastName\":\"Odinson\", \"firstName\":\"Thor\" }", Customer.class);
Assert.assertNotNull(customer);
Assert.assertNull(customer.getId());
Assert.assertNull(customer.getVersion());
Assert.assertEquals("Thor", customer.getFirstName());
Assert.assertEquals("Odinson", customer.getLastName());
}
{
// id as JsonString
Customer customer = mapper.readObject("{ \"firstName\":\"Loki\", \"lastName\":\"Laufeyson\", \"id\":\"160883\" }", Customer.class);
Assert.assertNotNull(customer);
Assert.assertEquals(160883L, customer.getId().longValue());
Assert.assertNull(customer.getVersion());
Assert.assertEquals("Loki", customer.getFirstName());
Assert.assertEquals("Laufeyson", customer.getLastName());
}
{
// id as JsonNumber, version as JsonString
Customer customer = mapper.readObject("{ \"lastName\":\"Banner\", \"firstName\":\"Bruce\", \"id\":7579, \"version\":\"74\" }", Customer.class);
Assert.assertNotNull(customer);
Assert.assertEquals(7579L, customer.getId().longValue());
Assert.assertEquals(74, customer.getVersion().intValue());
Assert.assertEquals("Bruce", customer.firstName);
Assert.assertEquals("Banner", customer.lastName);
}
}
@Test
public void testSerializeHierarchyTwo() {
Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
.build();
String vipCustomerAsString = mapper.writeObjectAsString(new VIPCustomer(new Customer(15L, 37, "Lois", "Lane"), 12.5));
Assert.assertNotNull(vipCustomerAsString);
Assert.assertTrue("Serialized String must contain \"firstName\":\"Lois\"", vipCustomerAsString.contains("\"firstName\":\"Lois\""));
Assert.assertTrue("Serialized String must contain \"lastName\":\"Lane\"", vipCustomerAsString.contains("\"lastName\":\"Lane\""));
Assert.assertTrue("Serialized String must contain \"id\":15", vipCustomerAsString.contains("\"id\":15"));
Assert.assertTrue("Serialized String must contain \"version\":37", vipCustomerAsString.contains("\"version\":37"));
Assert.assertTrue("Serialized String must contain \"discount\":12.5", vipCustomerAsString.contains("\"discount\":12.5"));
}
@Test
public void testDeserializeHierarchyTwo() {
Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
.build();
{
// id as JsonString
VIPCustomer customer = mapper.readObject("{ \"discount\":5, \"id\":\"888\", \"lastName\":\"Ross\", \"firstName\":\"Betty\", \"version\":\"5555\" }", VIPCustomer.class);
Assert.assertNotNull(customer);
Assert.assertEquals(888L, customer.getId().longValue());
Assert.assertEquals(5555, customer.getVersion().intValue());
Assert.assertEquals("Betty", customer.getFirstName());
Assert.assertEquals("Ross", customer.getLastName());
Assert.assertEquals(5.0, customer.getDiscount(), 0);
}
{
// id as JsonNumber
VIPCustomer customer = mapper.readObject("{ \"discount\":25.5, \"id\":478965, \"firstName\":\"Selina\", \"version\":\"3\", \"lastName\":\"Kyle\" }",
VIPCustomer.class);
Assert.assertNotNull(customer);
Assert.assertEquals(478965L, customer.getId().longValue());
Assert.assertEquals(3, customer.getVersion().intValue());
Assert.assertEquals("Selina", customer.getFirstName());
Assert.assertEquals("Kyle", customer.getLastName());
Assert.assertEquals(25.5, customer.getDiscount(), 0);
}
}
@Test
public void testSerializeHierarchyThree() {
Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
.build();
String vipCustomerAsString = mapper.writeObjectAsString(new GoldCustomer(new VIPCustomer(new Customer(6547L, 497, "Peter", "Parker"), 4.2), 1));
Assert.assertNotNull(vipCustomerAsString);
Assert.assertTrue("Serialized String must contain \"firstName\":\"Lois\"", vipCustomerAsString.contains("\"firstName\":\"Peter\""));
Assert.assertTrue("Serialized String must contain \"lastName\":\"Lane\"", vipCustomerAsString.contains("\"lastName\":\"Parker\""));
Assert.assertTrue("Serialized String must contain \"id\":6547", vipCustomerAsString.contains("\"id\":6547"));
Assert.assertTrue("Serialized String must contain \"version\":497", vipCustomerAsString.contains("\"version\":497"));
Assert.assertTrue("Serialized String must contain \"discount\":4.2", vipCustomerAsString.contains("\"discount\":4.2"));
Assert.assertTrue("Serialized String must contain \"rating\":1", vipCustomerAsString.contains("\"rating\":1"));
}
@Test
public void testDeserializeHierarchyThree() {
Mapper mapper = new MapperBuilder().setAccessModeName(accessMode)
.build();
// id as JsonString, without rating
GoldCustomer customer = mapper.readObject("{ \"discount\":5, \"id\":\"8745321\", \"lastName\":\"Watson\", \"firstName\":\"Mary Jane\", \"version\":\"821\" }",
GoldCustomer.class);
Assert.assertNotNull(customer);
Assert.assertEquals(8745321L, customer.getId().longValue());
Assert.assertEquals(821, customer.getVersion().intValue());
Assert.assertEquals("Mary Jane", customer.getFirstName());
Assert.assertEquals("Watson", customer.getLastName());
Assert.assertEquals(5.0, customer.getDiscount(), 0);
Assert.assertEquals(0, customer.getRating());
}
private static abstract class Versioned<T> {
private T id;
private Integer version;
public Versioned() {
}
public Versioned(T id, Integer version) {
this.id = id;
this.version = version;
}
public T getId() {
return id;
}
public void setId(T id) {
this.id = id;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
}
private static class Customer extends Versioned<Long> {
private String firstName;
private String lastName;
public Customer() {
this(null, null);
}
private Customer(String firstName, String lastName) {
this(null, null, firstName, lastName);
}
private Customer(Long id, Integer version, String firstName, String lastName) {
super(id, version);
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
private static class VIPCustomer extends Customer {
private Double discount;
private VIPCustomer() {
}
public VIPCustomer(String firstName, String lastName, Double discount) {
super(null, null, firstName, lastName);
this.discount = discount;
}
public VIPCustomer(Customer customer, Double discount) {
super(customer.getId(), customer.getVersion(), customer.getFirstName(), customer.getLastName());
this.discount = discount;
}
public Double getDiscount() {
return discount;
}
public void setDiscount(Double discount) {
this.discount = discount;
}
}
private static class GoldCustomer extends VIPCustomer {
private int rating;
private GoldCustomer() {
}
private GoldCustomer(VIPCustomer customer, int rating) {
super(customer, customer.getDiscount());
this.rating = rating;
}
public int getRating() {
return rating;
}
public void setRating(int rating) {
this.rating = rating;
}
}
}