blob: 8a932951b3ddcb9ff67e8de6a50e63bd23b68478 [file] [log] [blame]
package org.codehaus.jackson.map.deser;
import java.awt.Point; // just for convenience
import java.math.BigDecimal;
import java.util.*;
import org.codehaus.jackson.annotate.*;
import org.codehaus.jackson.map.*;
/**
* This unit test suite that tests use of {@link JsonCreator}
* with "delegate" constructors and factory methods: ones that
* take a deserializable type that is bound from JSON content.
* This is usually done to get two-phase data binding, often using
* {@link java.util.Map} as the intermediate form.
*/
public class TestConstructFromMap
extends BaseMapTest
{
static class ConstructorFromMap
{
int _x;
String _y;
@JsonCreator
ConstructorFromMap(Map<?,?> arg)
{
_x = ((Number) arg.get("x")).intValue();
_y = (String) arg.get("y");
}
}
static class FactoryFromPoint
{
int _x, _y;
private FactoryFromPoint(Point p) {
_x = p.x;
_y = p.y;
}
@JsonCreator
static FactoryFromPoint createIt(Point p)
{
return new FactoryFromPoint(p);
}
}
// Also: let's test BigDecimal-from-JSON-String factory
static class FactoryFromDecimalString
{
int _value;
private FactoryFromDecimalString(BigDecimal d) {
_value = d.intValue();
}
@JsonCreator
static FactoryFromDecimalString whateverNameWontMatter(BigDecimal d)
{
return new FactoryFromDecimalString(d);
}
}
/*
/**********************************************************
/* Test methods
/**********************************************************
*/
public void testViaConstructor() throws Exception
{
ObjectMapper m = new ObjectMapper();
ConstructorFromMap result = m.readValue
("{ \"x\":1, \"y\" : \"abc\" }", ConstructorFromMap.class);
assertEquals(1, result._x);
assertEquals("abc", result._y);
}
public void testViaFactory() throws Exception
{
ObjectMapper m = new ObjectMapper();
FactoryFromPoint result = m.readValue("{ \"x\" : 3, \"y\" : 4 }", FactoryFromPoint.class);
assertEquals(3, result._x);
assertEquals(4, result._y);
}
public void testViaFactoryUsingString() throws Exception
{
ObjectMapper m = new ObjectMapper();
FactoryFromDecimalString result = m.readValue("\"12.57\"", FactoryFromDecimalString.class);
assertNotNull(result);
assertEquals(12, result._value);
}
}