WrapperNameAsPropertyNameTest.java

package tools.jackson.databind.struct;

import org.junit.jupiter.api.Test;

import tools.jackson.databind.*;
import tools.jackson.databind.cfg.MapperConfig;
import tools.jackson.databind.introspect.Annotated;
import tools.jackson.databind.introspect.AnnotatedField;
import tools.jackson.databind.introspect.NopAnnotationIntrospector;
import tools.jackson.databind.testutil.DatabindTestUtil;

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

// [databind#72] Test for `MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME`
public class WrapperNameAsPropertyNameTest extends DatabindTestUtil
{
    static class WrapperBean {
        public int value;
        public String name;

        public WrapperBean() { }

        public WrapperBean(int value, String name) {
            this.value = value;
            this.name = name;
        }
    }

    // Simple custom AnnotationIntrospector that provides wrapper names
    // for specific properties
    @SuppressWarnings("serial")
    static class WrapperNameIntrospector extends NopAnnotationIntrospector
    {
        @Override
        public PropertyName findWrapperName(MapperConfig<?> config, Annotated ann) {
            if (ann instanceof AnnotatedField) {
                String fieldName = ((AnnotatedField) ann).getName();
                if ("value".equals(fieldName)) {
                    return PropertyName.construct("wrappedValue");
                }
                if ("name".equals(fieldName)) {
                    return PropertyName.construct("wrappedName");
                }
            }
            return null;
        }
    }

    private final ObjectMapper MAPPER_WITH_WRAPPER = jsonMapperBuilder()
            .enable(MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME)
            .annotationIntrospector(new WrapperNameIntrospector())
            .build();

    private final ObjectMapper MAPPER_WITHOUT_WRAPPER = jsonMapperBuilder()
            .disable(MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME)
            .annotationIntrospector(new WrapperNameIntrospector())
            .build();

    @Test
    public void testSerializationWithWrapperName() throws Exception
    {
        String json = MAPPER_WITH_WRAPPER.writeValueAsString(new WrapperBean(42, "Bob"));
        // Properties should be renamed to wrapper names
        assertEquals(a2q("{'wrappedName':'Bob','wrappedValue':42}"), json);
    }

    @Test
    public void testDeserializationWithWrapperName() throws Exception
    {
        WrapperBean bean = MAPPER_WITH_WRAPPER.readValue(
                a2q("{'wrappedValue':42,'wrappedName':'Bob'}"),
                WrapperBean.class);
        assertEquals(42, bean.value);
        assertEquals("Bob", bean.name);
    }

    @Test
    public void testSerializationWithoutFeature() throws Exception
    {
        // Without feature enabled, original property names should be used
        String json = MAPPER_WITHOUT_WRAPPER.writeValueAsString(new WrapperBean(42, "Bob"));
        assertEquals(a2q("{'name':'Bob','value':42}"), json);
    }

    @Test
    public void testDeserializationWithoutFeature() throws Exception
    {
        // Without feature, original property names are used
        WrapperBean bean = MAPPER_WITHOUT_WRAPPER.readValue(
                a2q("{'value':42,'name':'Bob'}"),
                WrapperBean.class);
        assertEquals(42, bean.value);
        assertEquals("Bob", bean.name);
    }
}