blob: 6a896fd172048afb4880b93407d7c56c0b98a412 [file] [log] [blame]
package org.codehaus.jackson.map.jsontype;
import java.util.*;
import static org.junit.Assert.*;
import org.codehaus.jackson.map.*;
/**
* Unit tests to verify that Java/JSON scalar values (non-structured values)
* are handled properly with respect to additional type information.
*
* @since 1.5
* @author tatu
*/
public class TestDefaultForScalars
extends BaseMapTest
{
static class Jackson417Bean {
public String foo = "bar";
public java.io.Serializable bar = new Integer(13);
}
/*
/**********************************************************
/* Unit tests
/**********************************************************
*/
/**
* Unit test to verify that limited number of core types do NOT include
* type information, even if declared as Object. This is only done for types
* that JSON scalar values natively map to: String, Integer and Boolean (and
* nulls never have type information)
*/
public void testNumericScalars() throws Exception
{
ObjectMapper m = new ObjectMapper();
m.enableDefaultTyping();
// no typing for Integer, Double, yes for others
assertEquals("[123]", m.writeValueAsString(new Object[] { Integer.valueOf(123) }));
assertEquals("[[\"java.lang.Long\",37]]", m.writeValueAsString(new Object[] { Long.valueOf(37) }));
assertEquals("[0.25]", m.writeValueAsString(new Object[] { Double.valueOf(0.25) }));
assertEquals("[[\"java.lang.Float\",0.5]]", m.writeValueAsString(new Object[] { Float.valueOf(0.5f) }));
}
public void testDateScalars() throws Exception
{
ObjectMapper m = new ObjectMapper();
m.enableDefaultTyping();
long ts = 12345678L;
assertEquals("[[\"java.util.Date\","+ts+"]]",
m.writeValueAsString(new Object[] { new Date(ts) }));
// Calendar is trickier... hmmh. Need to ensure round-tripping
Calendar c = Calendar.getInstance();
c.setTimeInMillis(ts);
String json = m.writeValueAsString(new Object[] { c });
assertEquals("[[\""+c.getClass().getName()+"\","+ts+"]]", json);
// and let's make sure it also comes back same way:
Object[] result = m.readValue(json, Object[].class);
assertEquals(1, result.length);
assertTrue(result[0] instanceof Calendar);
assertEquals(ts, ((Calendar) result[0]).getTimeInMillis());
}
public void testMiscScalars() throws Exception
{
ObjectMapper m = new ObjectMapper();
m.enableDefaultTyping();
// no typing for Strings, booleans
assertEquals("[\"abc\"]", m.writeValueAsString(new Object[] { "abc" }));
assertEquals("[true,null,false]", m.writeValueAsString(new Boolean[] { true, null, false }));
}
/**
* Test for verifying that contents of "untyped" homogenous arrays are properly
* handled,
*/
public void testScalarArrays() throws Exception
{
ObjectMapper m = new ObjectMapper();
m.enableDefaultTyping(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT);
Object[] input = new Object[] {
"abc", new Date(1234567), null, Integer.valueOf(456)
};
String json = m.writeValueAsString(input);
assertEquals("[\"abc\",[\"java.util.Date\",1234567],null,456]", json);
// and should deserialize back as well:
Object[] output = m.readValue(json, Object[].class);
assertArrayEquals(input, output);
}
/**
* Loosely scalar; for [JACKSON-417]
*/
public void test417() throws Exception
{
ObjectMapper m = new ObjectMapper();
m.enableDefaultTyping();
Jackson417Bean input = new Jackson417Bean();
String json = m.writeValueAsString(input);
Jackson417Bean result = m.readValue(json, Jackson417Bean.class);
assertEquals(input.foo, result.foo);
assertEquals(input.bar, result.bar);
}
}