• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.fasterxml.jackson.databind.node;
2 
3 import java.io.StringWriter;
4 import java.math.BigDecimal;
5 import java.math.BigInteger;
6 
7 import com.fasterxml.jackson.databind.JsonNode;
8 import com.fasterxml.jackson.databind.ObjectMapper;
9 
10 public class TestNullNode extends NodeTestBase
11 {
12     final static class CovarianceBean {
13         ObjectNode _object;
14         ArrayNode _array;
15 
setObject(ObjectNode n)16         public void setObject(ObjectNode n) { _object = n; }
setArray(ArrayNode n)17         public void setArray(ArrayNode n) { _array = n; }
18     }
19 
20     @SuppressWarnings("serial")
21     static class MyNull extends NullNode { }
22 
23     private final ObjectMapper MAPPER = sharedMapper();
24 
testBasicsWithNullNode()25     public void testBasicsWithNullNode() throws Exception
26     {
27         // Let's use something that doesn't add much beyond JsonNode base
28         NullNode n = NullNode.instance;
29 
30         // basic properties
31         assertFalse(n.isContainerNode());
32         assertFalse(n.isBigDecimal());
33         assertFalse(n.isBigInteger());
34         assertFalse(n.isBinary());
35         assertFalse(n.isBoolean());
36         assertFalse(n.isPojo());
37         assertFalse(n.isMissingNode());
38 
39         // fallback accessors
40         assertFalse(n.booleanValue());
41         assertNull(n.numberValue());
42         assertEquals(0, n.intValue());
43         assertEquals(0L, n.longValue());
44         assertEquals(BigDecimal.ZERO, n.decimalValue());
45         assertEquals(BigInteger.ZERO, n.bigIntegerValue());
46 
47         assertEquals(0, n.size());
48         assertTrue(n.isEmpty());
49         assertFalse(n.elements().hasNext());
50         assertFalse(n.fieldNames().hasNext());
51         // path is never null; but does point to missing node
52         assertNotNull(n.path("xyz"));
53         assertTrue(n.path("xyz").isMissingNode());
54 
55         assertFalse(n.has("field"));
56         assertFalse(n.has(3));
57 
58         assertNodeNumbersForNonNumeric(n);
59 
60         // 2.4
61         assertEquals("foo", n.asText("foo"));
62     }
63 
testNullHandling()64     public void testNullHandling() throws Exception
65     {
66         // First, a stand-alone null
67         JsonNode n = MAPPER.readTree("null");
68         assertNotNull(n);
69         assertTrue(n.isNull());
70         assertFalse(n.isNumber());
71         assertFalse(n.isTextual());
72         assertEquals("null", n.asText());
73         assertEquals(n, NullNode.instance);
74 
75         n = objectMapper().readTree("null");
76         assertNotNull(n);
77         assertTrue(n.isNull());
78 
79         // Then object property
80         ObjectNode root = (ObjectNode) objectReader().readTree("{\"x\":null}");
81         assertEquals(1, root.size());
82         n = root.get("x");
83         assertNotNull(n);
84         assertTrue(n.isNull());
85     }
86 
testNullSerialization()87     public void testNullSerialization() throws Exception
88     {
89         StringWriter sw = new StringWriter();
90         MAPPER.writeValue(sw, NullNode.instance);
91         assertEquals("null", sw.toString());
92     }
93 
testNullHandlingCovariance()94     public void testNullHandlingCovariance() throws Exception
95     {
96         String JSON = "{\"object\" : null, \"array\" : null }";
97         CovarianceBean bean = MAPPER.readValue(JSON, CovarianceBean.class);
98 
99         ObjectNode on = bean._object;
100         assertNull(on);
101 
102         ArrayNode an = bean._array;
103         assertNull(an);
104     }
105 
106     @SuppressWarnings("unlikely-arg-type")
testNullEquality()107     public void testNullEquality() throws Exception
108     {
109         JsonNode n = MAPPER.nullNode();
110         assertTrue(n.isNull());
111         assertEquals(n, new MyNull());
112         assertEquals(new MyNull(), n);
113 
114         assertFalse(n.equals(null));
115         assertFalse(n.equals("foo"));
116     }
117 }
118