| 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); |
| } |
| } |