Skip to content

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package com.fasterxml.jackson.module.kotlin.kogeraIntegration.deser
2+
3+
import com.fasterxml.jackson.annotation.JsonSetter
4+
import com.fasterxml.jackson.annotation.Nulls
5+
import com.fasterxml.jackson.databind.ObjectMapper
6+
import com.fasterxml.jackson.databind.exc.InvalidNullException
7+
import com.fasterxml.jackson.module.kotlin.KotlinFeature
8+
import com.fasterxml.jackson.module.kotlin.KotlinModule
9+
import com.fasterxml.jackson.module.kotlin.readValue
10+
import org.junit.jupiter.api.Assertions
11+
import org.junit.jupiter.api.Nested
12+
import org.junit.jupiter.api.Test
13+
import org.junit.jupiter.api.assertThrows
14+
15+
class StrictNullChecksTest {
16+
val mapper: ObjectMapper = ObjectMapper()
17+
.registerModule(
18+
KotlinModule.Builder()
19+
.enable(KotlinFeature.NewStrictNullChecks)
20+
.build()
21+
)
22+
23+
class ArrayWrapper(val value: Array<Int>)
24+
data class ListWrapper(val value: List<Int>)
25+
data class MapWrapper(val value: Map<String, Int>)
26+
27+
@Nested
28+
inner class NonNullInput {
29+
@Test
30+
fun array() {
31+
val expected = ArrayWrapper(arrayOf(1))
32+
val src = mapper.writeValueAsString(expected)
33+
val result = mapper.readValue<ArrayWrapper>(src)
34+
35+
Assertions.assertArrayEquals(expected.value, result.value)
36+
}
37+
38+
@Test
39+
fun list() {
40+
val expected = ListWrapper(listOf(1))
41+
val src = mapper.writeValueAsString(expected)
42+
val result = mapper.readValue<ListWrapper>(src)
43+
44+
Assertions.assertEquals(expected, result)
45+
}
46+
47+
@Test
48+
fun map() {
49+
val expected = MapWrapper(mapOf("foo" to 1))
50+
val src = mapper.writeValueAsString(expected)
51+
val result = mapper.readValue<MapWrapper>(src)
52+
53+
Assertions.assertEquals(expected, result)
54+
}
55+
}
56+
57+
data class AnyWrapper(val value: Any)
58+
59+
@Nested
60+
inner class NullInput {
61+
@Test
62+
fun array() {
63+
val src = mapper.writeValueAsString(AnyWrapper(arrayOf<Int?>(null)))
64+
assertThrows<InvalidNullException> { mapper.readValue<ArrayWrapper>(src) }
65+
}
66+
67+
@Test
68+
fun list() {
69+
val src = mapper.writeValueAsString(AnyWrapper(arrayOf<Int?>(null)))
70+
assertThrows<InvalidNullException> { mapper.readValue<ListWrapper>(src) }
71+
}
72+
73+
@Test
74+
fun map() {
75+
val src = mapper.writeValueAsString(AnyWrapper(mapOf("foo" to null)))
76+
assertThrows<InvalidNullException> { mapper.readValue<MapWrapper>(src) }
77+
}
78+
}
79+
80+
class ContentNullsSkipArrayWrapper(@JsonSetter(contentNulls = Nulls.SKIP) val value: Array<Int>)
81+
data class ContentNullsSkipListWrapper(@JsonSetter(contentNulls = Nulls.SKIP) val value: List<Int>)
82+
data class ContentNullsSkipMapWrapper(@JsonSetter(contentNulls = Nulls.SKIP) val value: Map<String, Int>)
83+
84+
@Nested
85+
inner class CustomByAnnotationTest {
86+
@Test
87+
fun array() {
88+
val expected = ContentNullsSkipArrayWrapper(emptyArray())
89+
val src = mapper.writeValueAsString(AnyWrapper(arrayOf<Int?>(null)))
90+
val result = mapper.readValue<ContentNullsSkipArrayWrapper>(src)
91+
92+
Assertions.assertArrayEquals(expected.value, result.value)
93+
}
94+
95+
@Test
96+
fun list() {
97+
val expected = ContentNullsSkipListWrapper(emptyList())
98+
val src = mapper.writeValueAsString(AnyWrapper(listOf<Int?>(null)))
99+
val result = mapper.readValue<ContentNullsSkipListWrapper>(src)
100+
101+
Assertions.assertEquals(expected, result)
102+
}
103+
104+
@Test
105+
fun map() {
106+
val expected = ContentNullsSkipMapWrapper(emptyMap())
107+
val src = mapper.writeValueAsString(AnyWrapper(mapOf("foo" to null)))
108+
val result = mapper.readValue<ContentNullsSkipMapWrapper>(src)
109+
110+
Assertions.assertEquals(expected, result)
111+
}
112+
}
113+
114+
class AnnotatedArrayWrapper(@JsonSetter(nulls = Nulls.SKIP) val value: Array<Int> = emptyArray())
115+
data class AnnotatedListWrapper(@JsonSetter(nulls = Nulls.SKIP) val value: List<Int> = emptyList())
116+
data class AnnotatedMapWrapper(@JsonSetter(nulls = Nulls.SKIP) val value: Map<String, Int> = emptyMap())
117+
118+
// If Default is specified by annotation, it is not overridden.
119+
@Nested
120+
inner class AnnotatedNullInput {
121+
@Test
122+
fun array() {
123+
val src = mapper.writeValueAsString(AnyWrapper(arrayOf<Int?>(null)))
124+
assertThrows<InvalidNullException> { mapper.readValue<AnnotatedArrayWrapper>(src) }
125+
}
126+
127+
@Test
128+
fun list() {
129+
val src = mapper.writeValueAsString(AnyWrapper(arrayOf<Int?>(null)))
130+
assertThrows<InvalidNullException> { mapper.readValue<AnnotatedListWrapper>(src) }
131+
}
132+
133+
@Test
134+
fun map() {
135+
val src = mapper.writeValueAsString(AnyWrapper(mapOf("foo" to null)))
136+
assertThrows<InvalidNullException> { mapper.readValue<AnnotatedMapWrapper>(src) }
137+
}
138+
}
139+
}

0 commit comments

Comments
 (0)