Skip to content

Commit 6f8a8c2

Browse files
committed
Add failing tests for #5165
1 parent 6f32617 commit 6f8a8c2

6 files changed

+464
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.fasterxml.jackson.databind.deser.jdk;
2+
3+
import java.util.EnumMap;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
import com.fasterxml.jackson.annotation.JsonSetter;
8+
import com.fasterxml.jackson.annotation.Nulls;
9+
import com.fasterxml.jackson.core.type.TypeReference;
10+
import com.fasterxml.jackson.databind.ObjectMapper;
11+
import com.fasterxml.jackson.databind.exc.InvalidNullException;
12+
import com.fasterxml.jackson.databind.json.JsonMapper;
13+
import org.opentest4j.AssertionFailedError;
14+
15+
import static org.junit.jupiter.api.Assertions.assertFalse;
16+
import static org.junit.jupiter.api.Assertions.assertThrows;
17+
18+
// For [databind#5165]
19+
public class EnumMapDeserializer5165Test
20+
{
21+
public enum MyEnum {
22+
FOO
23+
}
24+
25+
static class Dst {
26+
private EnumMap<MyEnum, Integer> map;
27+
28+
public EnumMap<MyEnum, Integer> getMap() {
29+
return map;
30+
}
31+
32+
public void setMap(EnumMap<MyEnum, Integer> map) {
33+
this.map = map;
34+
}
35+
}
36+
37+
@Test
38+
public void nullsFailTest() {
39+
ObjectMapper mapper = JsonMapper.builder()
40+
.defaultSetterInfo(JsonSetter.Value.forContentNulls(Nulls.FAIL))
41+
.build();
42+
43+
assertThrows(
44+
AssertionFailedError.class,
45+
() -> assertThrows(
46+
InvalidNullException.class,
47+
() -> mapper.readValue("{\"map\":{\"FOO\":\"\"}}", new TypeReference<Dst>(){})
48+
),
49+
"databind#5165 for EnumMapDeserializer is fixed"
50+
);
51+
}
52+
53+
@Test
54+
public void nullsSkipTest() throws Exception {
55+
ObjectMapper mapper = JsonMapper.builder()
56+
.defaultSetterInfo(JsonSetter.Value.forContentNulls(Nulls.SKIP))
57+
.build();
58+
59+
Dst dst = mapper.readValue("{\"map\":{\"FOO\":\"\"}}", new TypeReference<Dst>() {});
60+
61+
assertFalse(dst.getMap().isEmpty(), "databind#5165 for EnumMapDeserializer is fixed");
62+
}
63+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package com.fasterxml.jackson.databind.deser.jdk;
2+
3+
import java.io.IOException;
4+
import java.util.EnumSet;
5+
6+
import org.junit.jupiter.api.Test;
7+
8+
import com.fasterxml.jackson.annotation.JsonSetter;
9+
import com.fasterxml.jackson.annotation.Nulls;
10+
import com.fasterxml.jackson.core.JsonParser;
11+
import com.fasterxml.jackson.core.type.TypeReference;
12+
import com.fasterxml.jackson.databind.DeserializationContext;
13+
import com.fasterxml.jackson.databind.ObjectMapper;
14+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
15+
import com.fasterxml.jackson.databind.exc.InvalidNullException;
16+
import com.fasterxml.jackson.databind.json.JsonMapper;
17+
import com.fasterxml.jackson.databind.module.SimpleModule;
18+
import org.opentest4j.AssertionFailedError;
19+
20+
import static org.junit.jupiter.api.Assertions.assertFalse;
21+
import static org.junit.jupiter.api.Assertions.assertThrows;
22+
23+
// For [databind#5165]
24+
public class EnumSetDeserializer5165Test
25+
{
26+
public enum MyEnum {
27+
FOO
28+
}
29+
30+
static class Dst {
31+
private EnumSet<MyEnum> set;
32+
33+
public EnumSet<MyEnum> getSet() {
34+
return set;
35+
}
36+
37+
public void setSet(EnumSet<MyEnum> set) {
38+
this.set = set;
39+
}
40+
}
41+
42+
// Custom deserializer that converts empty strings to null
43+
static class EmptyStringToNullDeserializer extends StdDeserializer<MyEnum> {
44+
private static final long serialVersionUID = 1L;
45+
46+
public EmptyStringToNullDeserializer() {
47+
super(MyEnum.class);
48+
}
49+
50+
@Override
51+
public MyEnum deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
52+
String value = p.getValueAsString();
53+
if (value != null && value.isEmpty()) {
54+
return null;
55+
}
56+
return MyEnum.valueOf(value);
57+
}
58+
}
59+
60+
private ObjectMapper createMapperWithCustomDeserializer() {
61+
SimpleModule module = new SimpleModule();
62+
module.addDeserializer(MyEnum.class, new EmptyStringToNullDeserializer());
63+
64+
return JsonMapper.builder()
65+
.addModule(module)
66+
.defaultSetterInfo(JsonSetter.Value.forContentNulls(Nulls.FAIL))
67+
.build();
68+
}
69+
70+
@Test
71+
public void nullsFailTest() {
72+
ObjectMapper mapper = createMapperWithCustomDeserializer();
73+
74+
assertThrows(
75+
AssertionFailedError.class,
76+
() -> assertThrows(
77+
InvalidNullException.class,
78+
() -> mapper.readValue("{\"set\":[\"\"]}", new TypeReference<Dst>(){})
79+
),
80+
"databind#5165 for EnumSetDeserializer is fixed"
81+
);
82+
}
83+
84+
@Test
85+
public void nullsSkipTest() throws Exception {
86+
SimpleModule module = new SimpleModule();
87+
module.addDeserializer(MyEnum.class, new EmptyStringToNullDeserializer());
88+
89+
ObjectMapper mapper = JsonMapper.builder()
90+
.addModule(module)
91+
.defaultSetterInfo(JsonSetter.Value.forContentNulls(Nulls.SKIP))
92+
.build();
93+
94+
Dst dst = mapper.readValue("{\"set\":[\"FOO\",\"\"]}", new TypeReference<Dst>() {});
95+
96+
assertFalse(dst.getSet().isEmpty(), "databind#5165 for EnumSetDeserializer is fixed");
97+
}
98+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.fasterxml.jackson.databind.deser.jdk;
2+
3+
import java.util.Map;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
import com.fasterxml.jackson.annotation.JsonSetter;
8+
import com.fasterxml.jackson.annotation.Nulls;
9+
import com.fasterxml.jackson.core.type.TypeReference;
10+
import com.fasterxml.jackson.databind.ObjectMapper;
11+
import com.fasterxml.jackson.databind.exc.InvalidNullException;
12+
import com.fasterxml.jackson.databind.json.JsonMapper;
13+
import org.opentest4j.AssertionFailedError;
14+
15+
import static org.junit.jupiter.api.Assertions.assertFalse;
16+
import static org.junit.jupiter.api.Assertions.assertThrows;
17+
18+
// For [databind#5165]
19+
public class MapDeserializer5165Test
20+
{
21+
static class Dst {
22+
private Map<String, Integer> map;
23+
24+
public Map<String, Integer> getMap() {
25+
return map;
26+
}
27+
28+
public void setMap(Map<String, Integer> map) {
29+
this.map = map;
30+
}
31+
}
32+
33+
@Test
34+
public void nullsFailTest() {
35+
ObjectMapper mapper = JsonMapper.builder()
36+
.defaultSetterInfo(JsonSetter.Value.forContentNulls(Nulls.FAIL))
37+
.build();
38+
39+
assertThrows(
40+
AssertionFailedError.class,
41+
() -> assertThrows(
42+
InvalidNullException.class,
43+
() -> mapper.readValue("{\"map\":{\"key\":\"\"}}", new TypeReference<Dst>(){})
44+
),
45+
"databind#5165 for MapDeserializer is fixed"
46+
);
47+
}
48+
49+
@Test
50+
public void nullsSkipTest() throws Exception {
51+
ObjectMapper mapper = JsonMapper.builder()
52+
.defaultSetterInfo(JsonSetter.Value.forContentNulls(Nulls.SKIP))
53+
.build();
54+
55+
Dst dst = mapper.readValue("{\"map\":{\"key\":\"\"}}", new TypeReference<Dst>() {});
56+
57+
assertFalse(dst.getMap().isEmpty(), "databind#5165 for MapDeserializer is fixed");
58+
}
59+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.fasterxml.jackson.databind.deser.jdk;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import com.fasterxml.jackson.annotation.JsonSetter;
6+
import com.fasterxml.jackson.annotation.Nulls;
7+
import com.fasterxml.jackson.core.type.TypeReference;
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
import com.fasterxml.jackson.databind.exc.InvalidNullException;
10+
import com.fasterxml.jackson.databind.json.JsonMapper;
11+
import org.opentest4j.AssertionFailedError;
12+
13+
import static org.junit.jupiter.api.Assertions.assertFalse;
14+
import static org.junit.jupiter.api.Assertions.assertThrows;
15+
16+
// For [databind#5165]
17+
public class ObjectArrayDeserializer5165Test
18+
{
19+
static class Dst {
20+
private Integer[] array;
21+
22+
public Integer[] getArray() {
23+
return array;
24+
}
25+
26+
public void setArray(Integer[] array) {
27+
this.array = array;
28+
}
29+
}
30+
31+
@Test
32+
public void nullsFailTest() {
33+
ObjectMapper mapper = JsonMapper.builder()
34+
.defaultSetterInfo(JsonSetter.Value.forContentNulls(Nulls.FAIL))
35+
.build();
36+
37+
assertThrows(
38+
AssertionFailedError.class,
39+
() -> assertThrows(
40+
InvalidNullException.class,
41+
() -> mapper.readValue("{\"array\":[\"\"]}", new TypeReference<Dst>(){})
42+
),
43+
"databind#5165 for ObjectArrayDeserializer is fixed"
44+
);
45+
}
46+
47+
@Test
48+
public void nullsSkipTest() throws Exception {
49+
ObjectMapper mapper = JsonMapper.builder()
50+
.defaultSetterInfo(JsonSetter.Value.forContentNulls(Nulls.SKIP))
51+
.build();
52+
53+
Dst dst = mapper.readValue("{\"array\":[\"\"]}", new TypeReference<Dst>() {});
54+
55+
assertFalse(dst.getArray() == null || dst.getArray().length == 0, "databind#5165 for ObjectArrayDeserializer is fixed");
56+
}
57+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.fasterxml.jackson.databind.deser.jdk;
2+
3+
import java.io.IOException;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
import com.fasterxml.jackson.annotation.JsonSetter;
8+
import com.fasterxml.jackson.annotation.Nulls;
9+
import com.fasterxml.jackson.core.JsonParser;
10+
import com.fasterxml.jackson.core.type.TypeReference;
11+
import com.fasterxml.jackson.databind.DeserializationContext;
12+
import com.fasterxml.jackson.databind.ObjectMapper;
13+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
14+
import com.fasterxml.jackson.databind.exc.InvalidNullException;
15+
import com.fasterxml.jackson.databind.json.JsonMapper;
16+
import com.fasterxml.jackson.databind.module.SimpleModule;
17+
import org.opentest4j.AssertionFailedError;
18+
19+
import static org.junit.jupiter.api.Assertions.assertFalse;
20+
import static org.junit.jupiter.api.Assertions.assertThrows;
21+
22+
// For [databind#5165]
23+
public class StringArrayDeserializer5165Test
24+
{
25+
static class Dst {
26+
private String[] array;
27+
28+
public String[] getArray() {
29+
return array;
30+
}
31+
32+
public void setArray(String[] array) {
33+
this.array = array;
34+
}
35+
}
36+
37+
// Custom deserializer that converts empty strings to null
38+
static class EmptyStringToNullDeserializer extends StdDeserializer<String> {
39+
private static final long serialVersionUID = 1L;
40+
41+
public EmptyStringToNullDeserializer() {
42+
super(String.class);
43+
}
44+
45+
@Override
46+
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
47+
String value = p.getValueAsString();
48+
if (value != null && value.isEmpty()) {
49+
return null;
50+
}
51+
return value;
52+
}
53+
}
54+
55+
private ObjectMapper createMapperWithCustomDeserializer() {
56+
SimpleModule module = new SimpleModule();
57+
module.addDeserializer(String.class, new EmptyStringToNullDeserializer());
58+
59+
return JsonMapper.builder()
60+
.addModule(module)
61+
.defaultSetterInfo(JsonSetter.Value.forContentNulls(Nulls.FAIL))
62+
.build();
63+
}
64+
65+
@Test
66+
public void nullsFailTest() {
67+
ObjectMapper mapper = createMapperWithCustomDeserializer();
68+
69+
assertThrows(
70+
AssertionFailedError.class,
71+
() -> assertThrows(
72+
InvalidNullException.class,
73+
() -> mapper.readValue("{\"array\":[\"\"]}", new TypeReference<Dst>(){})
74+
),
75+
"databind#5165 for StringArrayDeserializer is fixed"
76+
);
77+
}
78+
79+
@Test
80+
public void nullsSkipTest() throws Exception {
81+
SimpleModule module = new SimpleModule();
82+
module.addDeserializer(String.class, new EmptyStringToNullDeserializer());
83+
84+
ObjectMapper mapper = JsonMapper.builder()
85+
.addModule(module)
86+
.defaultSetterInfo(JsonSetter.Value.forContentNulls(Nulls.SKIP))
87+
.build();
88+
89+
Dst dst = mapper.readValue("{\"array\":[\"\"]}", new TypeReference<Dst>() {});
90+
91+
assertFalse(dst.getArray() == null || dst.getArray().length == 0, "databind#5165 for StringArrayDeserializer is fixed");
92+
}
93+
}

0 commit comments

Comments
 (0)