Kotlin129ManagedReferenceTest.java

package tools.jackson.databind.struct;

import java.util.ArrayList;
import java.util.List;

import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.annotation.JsonProperty;

import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.testutil.DatabindTestUtil;

import static org.junit.jupiter.api.Assertions.*;

// For [databind#1516], https://github.com/FasterXML/jackson-module-kotlin/issues/129
public class Kotlin129ManagedReferenceTest extends DatabindTestUtil
{
    private final ObjectMapper MAPPER = newJsonMapper();

    static class Car {
        private final long id;

        @JsonManagedReference
        private final List<Color> colors;

        @JsonCreator
        public Car(@JsonProperty("id") long id,
                   @JsonProperty("colors") List<Color> colors) {
            this.id = id;
            this.colors = colors != null ? colors : new ArrayList<>();
        }

        public long getId() { return id; }
        public List<Color> getColors() { return colors; }
    }

    static class Color {
        private final long id;
        private final String code;

        @JsonBackReference
        private Car car;

        @JsonCreator
        public Color(@JsonProperty("id") long id,
                     @JsonProperty("code") String code) {
            this.id = id;
            this.code = code;
        }

        public long getId() { return id; }
        public String getCode() { return code; }
        public Car getCar() { return car; }
        public void setCar(Car car) { this.car = car; }
    }

    @Test
    public void testManagedReferenceOnCreator() throws Exception
    {
        Car car = new Car(100, new ArrayList<>());
        Color color = new Color(100, "#FFFFF");
        color.setCar(car);
        car.getColors().add(color);

        String json = MAPPER.writeValueAsString(car);
        Car result = MAPPER.readValue(json, Car.class);

        assertNotNull(result);
        assertEquals(100, result.getId());
        assertNotNull(result.getColors());
        assertEquals(1, result.getColors().size());

        Color resultColor = result.getColors().get(0);
        assertEquals(100, resultColor.getId());
        assertEquals("#FFFFF", resultColor.getCode());

        assertNotNull(resultColor.getCar());
        assertSame(result, resultColor.getCar());
    }
}