DeserializationContextTest.java
package tools.jackson.databind;
import org.junit.jupiter.api.Test;
import tools.jackson.core.JsonParser;
import tools.jackson.databind.node.JsonNodeFactory;
import tools.jackson.databind.testutil.DatabindTestUtil;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
public class DeserializationContextTest extends DatabindTestUtil
{
// Not testing "no nulls for primitives", so
private final ObjectMapper MAPPER = jsonMapperBuilder()
.disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES)
.build();
static class Bean4934 {
public String value;
}
// [databind#4934]
@Test
public void testTreeAsValueFromNulls() throws Exception
{
final JsonNodeFactory nodeF = MAPPER.getNodeFactory();
try (JsonParser p = MAPPER.createParser("abc")) {
DeserializationContext ctxt = MAPPER.readerFor(String.class)._deserializationContext(p);
assertNull(ctxt.readTreeAsValue(nodeF.nullNode(), Boolean.class));
assertEquals(Boolean.FALSE, ctxt.readTreeAsValue(nodeF.nullNode(), Boolean.TYPE));
assertNull(ctxt.readTreeAsValue(nodeF.nullNode(), MAPPER.constructType(String.class)));
assertNull(ctxt.readTreeAsValue(null, MAPPER.constructType(String.class)));
assertNull(ctxt.readTreeAsValue(nodeF.nullNode(), Bean4934.class));
}
}
// [databind#4934]
@Test
public void testTreeAsValueFromMissing() throws Exception
{
final JsonNodeFactory nodeF = MAPPER.getNodeFactory();
try (JsonParser p = MAPPER.createParser("abc")) {
DeserializationContext ctxt = MAPPER.readerFor(String.class)._deserializationContext(p);
// Absent becomes `null` for now as well
assertNull(ctxt.readTreeAsValue(nodeF.missingNode(), Boolean.class));
assertNull(ctxt.readTreeAsValue(nodeF.missingNode(), Boolean.TYPE));
assertNull(ctxt.readTreeAsValue(nodeF.missingNode(), String.class));
assertNull(ctxt.readTreeAsValue(nodeF.missingNode(), Bean4934.class));
}
}
@Test
void withParserRestoresNestedScopes() {
try (JsonParser original = MAPPER.createParser("1");
JsonParser first = MAPPER.createParser("2");
JsonParser second = MAPPER.createParser("3")) {
DeserializationContext ctxt = MAPPER.readerFor(Integer.class)
._deserializationContext(original);
IllegalStateException failure = new IllegalStateException("failed operation");
String result = ctxt.withParser(first, () -> {
assertSame(first, ctxt.getParser());
assertSame(failure, assertThrows(IllegalStateException.class,
() -> ctxt.withParser(second, () -> {
assertSame(second, ctxt.getParser());
throw failure;
})));
assertSame(first, ctxt.getParser());
return "success";
});
assertEquals("success", result);
assertSame(original, ctxt.getParser());
}
}
}