package com.fasterxml.jackson.databind.deser;
import java.util.*;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.*;
/**
* Unit tests related to handling of overloaded methods.
* and specifically addressing problems [JACKSON-189]
* and [JACKSON-739]
*/
public class TestOverloaded
extends BaseMapTest
{
static class BaseListBean
{
List<String> list;
BaseListBean() { }
public void setList(List<String> l) { list = l; }
}
static class ArrayListBean extends BaseListBean
{
ArrayListBean() { }
public void setList(ArrayList<String> l) { super.setList(l); }
}
// 27-Feb-2010, tatus: Won't fix immediately, need to comment out
/*
static class OverloadBean
{
String a;
public OverloadBean() { }
public void setA(int value) { a = String.valueOf(value); }
public void setA(String value) { a = value; }
}
*/
static class NumberBean {
protected Object value;
public void setValue(Number n) { value = n; }
}
static class WasNumberBean extends NumberBean {
public void setValue(String str) { value = str; }
}
// [JACKSON-739]
static class Overloaded739
{
protected Object _value;
@JsonProperty
public void setValue(String str) { _value = str; }
// no annotation, should not be chosen:
public void setValue(Object o) { throw new UnsupportedOperationException(); }
}
/**
* And then a Bean that is conflicting and should not work
*/
static class ConflictBean {
public void setA(ArrayList<Object> a) { }
public void setA(LinkedList<Object> a) { }
}
/*
/************************************************************
/* Unit tests, valid
/************************************************************
*/
private final ObjectMapper MAPPER = new ObjectMapper();
/**
* Unit test related to [JACKSON-189]
*/
// 27-Feb-2010, tatus: Won't fix immediately, need to comment out
/*
public void testSimpleOverload() throws Exception
{
OverloadBean bean;
try {
bean = new ObjectMapper().readValue("{ \"a\" : 13 }", OverloadBean.class);
} catch (JsonMappingException e) {
fail("Did not expect an exception, got: "+e.getMessage());
return;
}
assertEquals("13", bean.a);
}
*/
/**
* It should be ok to overload with specialized
* version; more specific method should be used.
*/
public void testSpecialization() throws Exception
{
ArrayListBean bean = MAPPER.readValue
("{\"list\":[\"a\",\"b\",\"c\"]}", ArrayListBean.class);
assertNotNull(bean.list);
assertEquals(3, bean.list.size());
assertEquals(ArrayList.class, bean.list.getClass());
assertEquals("a", bean.list.get(0));
assertEquals("b", bean.list.get(1));
assertEquals("c", bean.list.get(2));
}
/**
* As per [JACKSON-255], should also allow more general overriding,
* as long as there are no in-class conflicts.
*/
public void testOverride() throws Exception
{
WasNumberBean bean = MAPPER.readValue
("{\"value\" : \"abc\"}", WasNumberBean.class);
assertNotNull(bean);
assertEquals("abc", bean.value);
}
// for [JACKSON-739]
public void testConflictResolution() throws Exception
{
Overloaded739 bean = MAPPER.readValue
("{\"value\":\"abc\"}", Overloaded739.class);
assertNotNull(bean);
assertEquals("abc", bean._value);
}
/*
/************************************************************
/* Unit tests, failures
/************************************************************
*/
/**
* For genuine setter conflict, an exception is to be thrown.
*/
public void testSetterConflict() throws Exception
{
try {
MAPPER.readValue("{ }", ConflictBean.class);
} catch (Exception e) {
verifyException(e, "Conflicting setter definitions");
}
}
}