Skip to content

Commit 1ce786e

Browse files
committed
unit tests
1 parent 7a8513d commit 1ce786e

11 files changed

+104
-12
lines changed

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/DurationDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public Duration deserialize(JsonParser parser, DeserializationContext context) t
8080
case JsonTokenId.ID_START_ARRAY:
8181
return _deserializeFromArray(parser, context);
8282
}
83-
return _reportWrongToken(parser, context, JsonToken.VALUE_STRING,
83+
return _handleUnexpectedToken(context, parser, JsonToken.VALUE_STRING,
8484
JsonToken.VALUE_NUMBER_INT, JsonToken.VALUE_NUMBER_FLOAT);
8585
}
8686
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ public T deserialize(JsonParser parser, DeserializationContext context) throws I
222222
case JsonTokenId.ID_START_ARRAY:
223223
return _deserializeFromArray(parser, context);
224224
}
225-
return _reportWrongToken(parser, context, JsonToken.VALUE_STRING,
225+
return _handleUnexpectedToken(context, parser, JsonToken.VALUE_STRING,
226226
JsonToken.VALUE_NUMBER_INT, JsonToken.VALUE_NUMBER_FLOAT);
227227
}
228228

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/JSR310DeserializerBase.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import java.io.IOException;
2020
import java.time.DateTimeException;
21-
import java.time.format.DateTimeParseException;
2221
import java.util.Arrays;
2322

2423
import com.fasterxml.jackson.core.JsonParser;
@@ -93,6 +92,30 @@ protected <R> R _handleDateTimeException(DeserializationContext context,
9392
}
9493
}
9594

95+
@SuppressWarnings("unchecked")
96+
protected <R> R _handleUnexpectedToken(DeserializationContext context,
97+
JsonParser parser, String message, Object... args) throws JsonMappingException {
98+
try {
99+
return (R) context.handleUnexpectedToken(handledType(), parser.getCurrentToken(),
100+
parser, message, args);
101+
102+
} catch (JsonMappingException e) {
103+
throw e;
104+
} catch (IOException e) {
105+
throw JsonMappingException.fromUnexpectedIOE(e);
106+
}
107+
}
108+
109+
@SuppressWarnings("unchecked")
110+
protected <R> R _handleUnexpectedToken(DeserializationContext context,
111+
JsonParser parser, JsonToken... expTypes) throws JsonMappingException {
112+
return _handleUnexpectedToken(context, parser,
113+
"Unexpected token (%s), expected one of %s for %s value",
114+
parser.currentToken(),
115+
Arrays.asList(expTypes),
116+
handledType().getName());
117+
}
118+
96119
/**
97120
* Helper method used to peel off spurious wrappings of DateTimeException
98121
*

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ public LocalDate deserialize(JsonParser parser, DeserializationContext context)
118118
if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) {
119119
return LocalDate.ofEpochDay(parser.getLongValue());
120120
}
121-
throw context.wrongTokenException(parser, handledType(), JsonToken.VALUE_STRING,
122-
"Expected array or string.");
121+
return _handleUnexpectedToken(context, parser, "Expected array or string.");
123122
}
124123
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateTimeDeserializer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,6 @@ public LocalDateTime deserialize(JsonParser parser, DeserializationContext conte
138138
if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) {
139139
_throwNoNumericTimestampNeedTimeZone(parser, context);
140140
}
141-
throw context.wrongTokenException(parser, handledType(), JsonToken.VALUE_STRING,
142-
"Expected array or string.");
141+
return _handleUnexpectedToken(context, parser, "Expected array or string.");
143142
}
144143
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalTimeDeserializer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ public LocalTime deserialize(JsonParser parser, DeserializationContext context)
127127
if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) {
128128
_throwNoNumericTimestampNeedTimeZone(parser, context);
129129
}
130-
throw context.wrongTokenException(parser, handledType(), JsonToken.START_ARRAY,
131-
"Expected array or string.");
130+
return _handleUnexpectedToken(context, parser, "Expected array or string.");
132131
}
133132
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/MonthDayDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,6 @@ public MonthDay deserialize(JsonParser parser, DeserializationContext context) t
4848
if (parser.hasToken(JsonToken.START_ARRAY)){
4949
return _deserializeFromArray(parser, context);
5050
}
51-
return _reportWrongToken(parser, context, JsonToken.VALUE_STRING, JsonToken.VALUE_NUMBER_INT);
51+
return _handleUnexpectedToken(context, parser, JsonToken.VALUE_STRING, JsonToken.VALUE_NUMBER_INT);
5252
}
5353
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,6 @@ public Year deserialize(JsonParser parser, DeserializationContext context) throw
7373
if (parser.hasToken(JsonToken.START_ARRAY)){
7474
return _deserializeFromArray(parser, context);
7575
}
76-
return _reportWrongToken(parser, context, JsonToken.VALUE_STRING, JsonToken.VALUE_NUMBER_INT);
76+
return _handleUnexpectedToken(context, parser, JsonToken.VALUE_STRING, JsonToken.VALUE_NUMBER_INT);
7777
}
7878
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/YearMonthDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,6 @@ public YearMonth deserialize(JsonParser parser, DeserializationContext context)
102102
if (parser.hasToken(JsonToken.VALUE_EMBEDDED_OBJECT)) {
103103
return (YearMonth) parser.getEmbeddedObject();
104104
}
105-
return _reportWrongToken(parser, context, JsonToken.VALUE_STRING, JsonToken.START_ARRAY);
105+
return _handleUnexpectedToken(context, parser, JsonToken.VALUE_STRING, JsonToken.START_ARRAY);
106106
}
107107
}

datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeDeserialization.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
package com.fasterxml.jackson.datatype.jsr310;
22

3+
import com.fasterxml.jackson.core.JsonParser;
34
import com.fasterxml.jackson.core.JsonProcessingException;
5+
import com.fasterxml.jackson.core.JsonToken;
6+
import com.fasterxml.jackson.databind.DeserializationContext;
47
import com.fasterxml.jackson.databind.DeserializationFeature;
8+
import com.fasterxml.jackson.databind.ObjectMapper;
59
import com.fasterxml.jackson.databind.ObjectReader;
10+
import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
611
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
712

813
import org.junit.Test;
914

1015
import java.io.IOException;
16+
import java.time.LocalDate;
1117
import java.time.LocalDateTime;
1218
import java.time.Month;
1319
import java.time.format.DateTimeParseException;
@@ -72,6 +78,46 @@ public void testDeserializationAsEmptyArrayEnabled() throws Throwable
7278
assertNull(value);
7379
}
7480

81+
@Test
82+
public void testDateTimeExceptionIsHandled() throws Throwable
83+
{
84+
LocalDateTime now = LocalDateTime.now();
85+
DeserializationProblemHandler handler = new DeserializationProblemHandler() {
86+
@Override
87+
public Object handleWeirdStringValue(DeserializationContext ctxt, Class<?> targetType,
88+
String valueToConvert, String failureMsg) throws IOException {
89+
if (LocalDateTime.class == targetType) {
90+
if ("now".equals(valueToConvert)) {
91+
return now;
92+
}
93+
}
94+
return NOT_HANDLED;
95+
}
96+
};
97+
ObjectMapper mapper = newMapper().addHandler(handler);
98+
assertEquals(now, mapper.readValue(quote("now"), LocalDateTime.class));
99+
}
100+
101+
@Test
102+
public void testUnexpectedTokenIsHandled() throws Throwable
103+
{
104+
LocalDateTime now = LocalDateTime.now();
105+
DeserializationProblemHandler handler = new DeserializationProblemHandler() {
106+
@Override
107+
public Object handleUnexpectedToken(DeserializationContext ctxt, Class<?> targetType,
108+
JsonToken t, JsonParser p, String failureMsg) throws IOException {
109+
if (LocalDateTime.class == targetType) {
110+
if (t.isBoolean()) {
111+
return now;
112+
}
113+
}
114+
return NOT_HANDLED;
115+
}
116+
};
117+
ObjectMapper mapper = newMapper().addHandler(handler);
118+
assertEquals(now, mapper.readValue("true", LocalDateTime.class));
119+
}
120+
75121
private void expectFailure(String json) throws Throwable {
76122
try {
77123
read(json);

datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestLocalDateTimeKeySerialization.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
import static org.junit.Assert.assertEquals;
44

5+
import java.io.IOException;
56
import java.time.LocalDateTime;
67
import java.time.ZoneOffset;
78
import java.util.HashMap;
89
import java.util.Map;
910

1011
import com.fasterxml.jackson.core.type.TypeReference;
12+
import com.fasterxml.jackson.databind.DeserializationContext;
1113
import com.fasterxml.jackson.databind.ObjectMapper;
14+
import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
1215
import org.junit.Before;
1316
import org.junit.Test;
1417

@@ -76,6 +79,29 @@ public void testDeserialization1() throws Exception {
7679
assertEquals("Value is incorrect", map, value);
7780
}
7881

82+
@Test
83+
public void testDateTimeExceptionIsHandled() throws Throwable
84+
{
85+
LocalDateTime now = LocalDateTime.now();
86+
DeserializationProblemHandler handler = new DeserializationProblemHandler() {
87+
@Override
88+
public Object handleWeirdStringValue(DeserializationContext ctxt, Class<?> targetType,
89+
String valueToConvert, String failureMsg) throws IOException {
90+
if (LocalDateTime.class == targetType) {
91+
if ("now".equals(valueToConvert)) {
92+
return now;
93+
}
94+
}
95+
return NOT_HANDLED;
96+
}
97+
};
98+
Map<LocalDateTime, String> value = om.addHandler(handler).readValue(
99+
map("now", "test"),
100+
TYPE_REF);
101+
map.put(now, "test");
102+
assertEquals(map, value);
103+
}
104+
79105
private String map(String key, String value) {
80106
return String.format("{\"%s\":\"%s\"}", key, value);
81107
}

0 commit comments

Comments
 (0)