package com.fasterxml.jackson.databind.deser.creators;

import java.io.IOException;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.fasterxml.jackson.databind.BaseMapTest;
import com.fasterxml.jackson.databind.ObjectMapper;

public class TestCreatorsWithIdentity extends BaseMapTest
{
	@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id", scope=Parent.class)
	public static class Parent {
	    @JsonProperty("id")
	    String id;
	
	    @JsonProperty
	    String parentProp;
	
	    @JsonCreator
	    public Parent(@JsonProperty("parentProp") String parentProp) {
	        this.parentProp = parentProp;
	    }
	}

	public static class Child {
	    @JsonProperty
	    Parent parent;

	    @JsonProperty
	    String childProp;

	    @JsonCreator
	    public Child(@JsonProperty("parent") Parent parent, @JsonProperty("childProp") String childProp) {
	        this.parent = parent;
	        this.childProp = childProp;
	    }
	}

	private static final ObjectMapper JSON_MAPPER = new ObjectMapper();

	public void testSimple() throws IOException
	{
	    String parentStr = "{\"id\" : \"1\", \"parentProp\" : \"parent\"}";
	    String childStr = "{\"childProp\" : \"child\", \"parent\" : " + parentStr + "}";
	    Parent parent = JSON_MAPPER.readValue(parentStr, Parent.class);
	    assertNotNull(parent);
	    Child child = JSON_MAPPER.readValue(childStr, Child.class);
	    assertNotNull(child);
	    assertNotNull(child.parent);
	}
}
