blob: c275a76de11c94efa5db88cc3cdb1b3a38932598 [file] [log] [blame]
package org.codehaus.jackson.map.jsontype;
import java.util.*;
import org.codehaus.jackson.annotate.*;
import org.codehaus.jackson.map.BaseMapTest;
import org.codehaus.jackson.map.ObjectMapper;
/**
* Testing to verify that {@link JsonTypeInfo} works
* for properties as well as types (see [JACKSON-280] for details)
*
* @since 1.7
*/
@SuppressWarnings("serial")
public class TestPropertyTypeInfo extends BaseMapTest
{
/*
/**********************************************************
/* Helper types
/**********************************************************
*/
static class FieldWrapperBean
{
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY)
public Object value;
public FieldWrapperBean() { }
public FieldWrapperBean(Object o) { value = o; }
}
static class FieldWrapperBeanList extends ArrayList<FieldWrapperBean> { }
static class FieldWrapperBeanMap extends HashMap<String,FieldWrapperBean> { }
static class FieldWrapperBeanArray {
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY)
public FieldWrapperBean[] beans;
public FieldWrapperBeanArray() { }
public FieldWrapperBeanArray(FieldWrapperBean[] beans) { this.beans = beans; }
}
static class MethodWrapperBean
{
private Object value;
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY)
public Object getValue() { return value; }
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY)
public void setValue(Object v) { value = v; }
public MethodWrapperBean() { }
public MethodWrapperBean(Object o) { value = o; }
}
static class MethodWrapperBeanList extends ArrayList<MethodWrapperBean> { }
static class MethodWrapperBeanMap extends HashMap<String,MethodWrapperBean> { }
static class MethodWrapperBeanArray {
protected MethodWrapperBean[] beans;
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY)
public MethodWrapperBean[] getValue() { return beans; }
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY)
public void setValue(MethodWrapperBean[] v) { beans = v; }
public MethodWrapperBeanArray() { }
public MethodWrapperBeanArray(MethodWrapperBean[] beans) { this.beans = beans; }
}
static class OtherBean {
public int x = 1, y = 1;
}
/*
/**********************************************************
/* Unit tests
/**********************************************************
*/
public void testSimpleField() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(new FieldWrapperBean(new StringWrapper("foo")));
//System.out.println("JSON/field+object == "+json);
FieldWrapperBean bean = mapper.readValue(json, FieldWrapperBean.class);
assertNotNull(bean.value);
assertEquals(StringWrapper.class, bean.value.getClass());
assertEquals(((StringWrapper) bean.value).str, "foo");
}
public void testSimpleMethod() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(new FieldWrapperBean(new IntWrapper(37)));
//System.out.println("JSON/method+object == "+json);
FieldWrapperBean bean = mapper.readValue(json, FieldWrapperBean.class);
assertNotNull(bean.value);
assertEquals(IntWrapper.class, bean.value.getClass());
assertEquals(((IntWrapper) bean.value).i, 37);
}
public void testSimpleListField() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
FieldWrapperBeanList list = new FieldWrapperBeanList();
list.add(new FieldWrapperBean(new OtherBean()));
String json = mapper.writeValueAsString(list);
//System.out.println("JSON/field+list == "+json);
FieldWrapperBeanList result = mapper.readValue(json, FieldWrapperBeanList.class);
assertNotNull(result);
assertEquals(1, result.size());
FieldWrapperBean bean = list.get(0);
assertEquals(OtherBean.class, bean.value.getClass());
assertEquals(((OtherBean) bean.value).x, 1);
assertEquals(((OtherBean) bean.value).y, 1);
}
public void testSimpleListMethod() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
MethodWrapperBeanList list = new MethodWrapperBeanList();
list.add(new MethodWrapperBean(new BooleanWrapper(true)));
list.add(new MethodWrapperBean(new StringWrapper("x")));
list.add(new MethodWrapperBean(new OtherBean()));
String json = mapper.writeValueAsString(list);
MethodWrapperBeanList result = mapper.readValue(json, MethodWrapperBeanList.class);
assertNotNull(result);
assertEquals(3, result.size());
MethodWrapperBean bean = result.get(0);
assertEquals(BooleanWrapper.class, bean.value.getClass());
assertEquals(((BooleanWrapper) bean.value).b, Boolean.TRUE);
bean = result.get(1);
assertEquals(StringWrapper.class, bean.value.getClass());
assertEquals(((StringWrapper) bean.value).str, "x");
bean = result.get(2);
assertEquals(OtherBean.class, bean.value.getClass());
}
public void testSimpleArrayField() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
FieldWrapperBeanArray array = new FieldWrapperBeanArray(new
FieldWrapperBean[] { new FieldWrapperBean(new BooleanWrapper(true)) });
String json = mapper.writeValueAsString(array);
FieldWrapperBeanArray result = mapper.readValue(json, FieldWrapperBeanArray.class);
assertNotNull(result);
FieldWrapperBean[] beans = result.beans;
assertEquals(1, beans.length);
FieldWrapperBean bean = beans[0];
assertEquals(BooleanWrapper.class, bean.value.getClass());
assertEquals(((BooleanWrapper) bean.value).b, Boolean.TRUE);
}
public void testSimpleArrayMethod() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
MethodWrapperBeanArray array = new MethodWrapperBeanArray(new
MethodWrapperBean[] { new MethodWrapperBean(new StringWrapper("A")) });
String json = mapper.writeValueAsString(array);
MethodWrapperBeanArray result = mapper.readValue(json, MethodWrapperBeanArray.class);
assertNotNull(result);
MethodWrapperBean[] beans = result.beans;
assertEquals(1, beans.length);
MethodWrapperBean bean = beans[0];
assertEquals(StringWrapper.class, bean.value.getClass());
assertEquals(((StringWrapper) bean.value).str, "A");
}
public void testSimpleMapField() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
FieldWrapperBeanMap map = new FieldWrapperBeanMap();
map.put("foop", new FieldWrapperBean(new IntWrapper(13)));
String json = mapper.writeValueAsString(map);
FieldWrapperBeanMap result = mapper.readValue(json, FieldWrapperBeanMap.class);
assertNotNull(result);
assertEquals(1, result.size());
FieldWrapperBean bean = result.get("foop");
assertNotNull(bean);
Object ob = bean.value;
assertEquals(IntWrapper.class, ob.getClass());
assertEquals(((IntWrapper) ob).i, 13);
}
public void testSimpleMapMethod() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
MethodWrapperBeanMap map = new MethodWrapperBeanMap();
map.put("xyz", new MethodWrapperBean(new BooleanWrapper(true)));
String json = mapper.writeValueAsString(map);
MethodWrapperBeanMap result = mapper.readValue(json, MethodWrapperBeanMap.class);
assertNotNull(result);
assertEquals(1, result.size());
MethodWrapperBean bean = result.get("xyz");
assertNotNull(bean);
Object ob = bean.value;
assertEquals(BooleanWrapper.class, ob.getClass());
assertEquals(((BooleanWrapper) ob).b, Boolean.TRUE);
}
}