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