Skip to content

Commit 8e1bcc8

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

File tree

5 files changed

+366
-0
lines changed

5 files changed

+366
-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: 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+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.fasterxml.jackson.databind.deser.jdk;
2+
3+
import java.io.IOException;
4+
import java.util.List;
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 StringCollectionDeserializer5165Test
25+
{
26+
static class Dst {
27+
private List<String> list;
28+
29+
public List<String> getList() {
30+
return list;
31+
}
32+
33+
public void setList(List<String> list) {
34+
this.list = list;
35+
}
36+
}
37+
38+
// Custom deserializer that converts empty strings to null
39+
static class EmptyStringToNullDeserializer extends StdDeserializer<String> {
40+
private static final long serialVersionUID = 1L;
41+
42+
public EmptyStringToNullDeserializer() {
43+
super(String.class);
44+
}
45+
46+
@Override
47+
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
48+
String value = p.getValueAsString();
49+
if (value != null && value.isEmpty()) {
50+
return null;
51+
}
52+
return value;
53+
}
54+
}
55+
56+
private ObjectMapper createMapperWithCustomDeserializer() {
57+
SimpleModule module = new SimpleModule();
58+
module.addDeserializer(String.class, new EmptyStringToNullDeserializer());
59+
60+
return JsonMapper.builder()
61+
.addModule(module)
62+
.defaultSetterInfo(JsonSetter.Value.forContentNulls(Nulls.FAIL))
63+
.build();
64+
}
65+
66+
@Test
67+
public void nullsFailTest() {
68+
ObjectMapper mapper = createMapperWithCustomDeserializer();
69+
70+
assertThrows(
71+
AssertionFailedError.class,
72+
() -> assertThrows(
73+
InvalidNullException.class,
74+
() -> mapper.readValue("{\"list\":[\"\"]}", new TypeReference<Dst>(){})
75+
),
76+
"databind#5165 for StringCollectionDeserializer is fixed"
77+
);
78+
}
79+
80+
@Test
81+
public void nullsSkipTest() throws Exception {
82+
SimpleModule module = new SimpleModule();
83+
module.addDeserializer(String.class, new EmptyStringToNullDeserializer());
84+
85+
ObjectMapper mapper = JsonMapper.builder()
86+
.addModule(module)
87+
.defaultSetterInfo(JsonSetter.Value.forContentNulls(Nulls.SKIP))
88+
.build();
89+
90+
Dst dst = mapper.readValue("{\"list\":[\"\"]}", new TypeReference<Dst>() {});
91+
92+
assertFalse(dst.getList().isEmpty(), "databind#5165 for StringCollectionDeserializer is fixed");
93+
}
94+
}

0 commit comments

Comments
 (0)