Skip to content

Commit

Permalink
Test case for issue FasterXML#351.
Browse files Browse the repository at this point in the history
  • Loading branch information
Pascal Gélinas committed Jan 13, 2014
1 parent 52313b8 commit a0e8d5d
Showing 1 changed file with 102 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package com.fasterxml.jackson.databind.struct;

import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.struct.TestObjectId.Company;
import com.fasterxml.jackson.databind.struct.TestObjectId.Employee;

/**
* Unit test to verify handling of Object Id deserialization
Expand Down Expand Up @@ -102,6 +107,26 @@ public void setCustomId(int i) {
}
}

static class MappedCompany {
public Map<Integer, Employee> employees;
}

static class ArrayCompany {
public Employee[] employees;
}

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class)
static class AnySetterObjectId {
private Map<String, AnySetterObjectId> values = new HashMap<String, AnySetterObjectId>();

@JsonAnySetter
public void anySet(String field, AnySetterObjectId value) {
// Ensure that it is never called with null because of unresolved reference.
assertNotNull(value);
values.put(field, value);
}
}

private final ObjectMapper mapper = new ObjectMapper();

/*
Expand Down Expand Up @@ -166,7 +191,82 @@ public void testSimpleDeserWithForwardRefs() throws Exception
assertEquals(7, result.node.value);
assertSame(result.node, result.node.next.node);
}


public void testLateForwardReferenceInCollection() throws Exception
{
String json = "{\"employees\":["
+ "{\"id\":1,\"name\":\"First\",\"manager\":null,\"reports\":[2]},"
+ "{\"id\":2,\"name\":\"Second\",\"manager\":1,\"reports\":[]}"
+ "]}";
Company company = mapper.readValue(json, Company.class);
assertEquals(2, company.employees.size());
// Deser must keep object ordering.
Employee firstEmployee = company.employees.get(0);
Employee secondEmployee = company.employees.get(1);
assertEquals(1, firstEmployee.id);
assertEquals(2, secondEmployee.id);
assertSame(secondEmployee, firstEmployee.reports.get(0)); // Ensure that forward reference was properly resolved and in order.
assertSame(firstEmployee, secondEmployee.manager); // And that back reference is also properly resolved.
}

// Variant of before but forward reference is not "wrapped" inside a collection, might be easier to fix first.
public void testLateForwardReference() throws Exception
{
String json = "{\"employees\":["
+ "{\"id\":1,\"name\":\"First\",\"manager\":2,\"reports\":[]},"
+ "{\"id\":2,\"name\":\"Second\",\"manager\":null,\"reports\":[1]}"
+ "]}";
Company company = mapper.readValue(json, Company.class);
assertEquals(2, company.employees.size());
// Deser must keep object ordering.
Employee firstEmployee = company.employees.get(0);
Employee secondEmployee = company.employees.get(1);
assertEquals(1, firstEmployee.id);
assertEquals(2, secondEmployee.id);
assertEquals(secondEmployee, firstEmployee.manager); // Ensure that forward reference was properly resolved.
assertEquals(firstEmployee, secondEmployee.reports.get(0)); // And that back reference is also properly resolved.
}

public void testLateForwardReferenceInMap() throws Exception
{
String json = "{\"employees\":{"
+ "\"1\":{\"id\":1,\"name\":\"First\",\"manager\":2,\"reports\":[]},"
+ "\"2\": 2,"
+ "\"3\":{\"id\":2,\"name\":\"Second\",\"manager\":null,\"reports\":[1]}"
+ "}}";
MappedCompany company = mapper.readValue(json, MappedCompany.class);
assertEquals(3, company.employees.size());
// Deser must keep object ordering.
Employee firstEmployee = company.employees.get(1);
Employee secondEmployee = company.employees.get(3);
assertEquals(1, firstEmployee.id);
assertEquals(2, secondEmployee.id);
assertEquals(secondEmployee, firstEmployee.manager); // Ensure that forward reference was properly resolved.
assertEquals(firstEmployee, secondEmployee.reports.get(0)); // And that back reference is also properly resolved.
}

public void testLateForwardReferenceInArray() throws Exception {
String json = "{\"employees\":["
+ "{\"id\":1,\"name\":\"First\",\"manager\":null,\"reports\":[2]},"
+ "2,{\"id\":2,\"name\":\"Second\",\"manager\":1,\"reports\":[]}"
+ "]}";
ArrayCompany company = mapper.readValue(json, ArrayCompany.class);
assertEquals(3, company.employees.length);
// Deser must keep object ordering.
Employee firstEmployee = company.employees[0];
Employee secondEmployee = company.employees[1];
assertEquals(1, firstEmployee.id);
assertEquals(2, secondEmployee.id);
assertSame(secondEmployee, firstEmployee.reports.get(0)); // Ensure that forward reference was properly resolved and in order.
assertSame(firstEmployee, secondEmployee.manager); // And that back reference is also properly resolved.
}

public void testForwardReferenceAnySetterCombo() throws Exception {
String json = "{\"@id\":1, \"foo\":2, \"bar\":{\"@id\":2, \"foo\":1}}";
AnySetterObjectId value = mapper.readValue(json, AnySetterObjectId.class);
assertSame(value.values.get("bar"), value.values.get("foo"));
}

/*
/*****************************************************
/* Unit tests, custom (property-based) id deserialization
Expand Down

0 comments on commit a0e8d5d

Please sign in to comment.