Skip to content

Commit 0626100

Browse files
committed
Merge remote-tracking branch 'FasterXML/2.x' into 3.x
1 parent 7a971c5 commit 0626100

19 files changed

+4282
-10
lines changed

src/test/kotlin/tools/jackson/module/kotlin/kogeraIntegration/deser/valueClass/JacksonInjectTest.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ class JacksonInjectTest {
2929
val noNNn: NullableObject?,
3030
@get:JacksonInject("noNN")
3131
val noNN: NullableObject?,
32+
@get:JacksonInject("npNnNn")
33+
val npNnNn: NullablePrimitive,
34+
@get:JacksonInject("npNnN")
35+
val npNnN: NullablePrimitive,
36+
@get:JacksonInject("npNNn")
37+
val npNNn: NullablePrimitive?,
38+
@get:JacksonInject("npNN")
39+
val npNN: NullablePrimitive?,
3240
@get:JacksonInject("tupNn")
3341
val tupNn: TwoUnitPrimitive,
3442
@get:JacksonInject("tupN")
@@ -46,6 +54,10 @@ class JacksonInjectTest {
4654
"noNnN" to NullableObject(null),
4755
"noNNn" to NullableObject("noNNn"),
4856
"noNN" to NullableObject(null),
57+
"npNnNn" to NullablePrimitive(0),
58+
"npNnN" to NullablePrimitive(null),
59+
"npNNn" to NullablePrimitive(1),
60+
"npNN" to NullablePrimitive(null),
4961
"tupNn" to TwoUnitPrimitive(3),
5062
"tupN" to TwoUnitPrimitive(4)
5163
)

src/test/kotlin/tools/jackson/module/kotlin/kogeraIntegration/deser/valueClass/ValueClasses.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,21 @@ value class NullableObject(val v: String?) {
4343
}
4444
}
4545

46+
@JvmInline
47+
value class NullablePrimitive(val v: Int?) {
48+
class DeserializerWrapsNullable : WrapsNullableValueClassDeserializer<NullablePrimitive>(NullablePrimitive::class) {
49+
override fun deserialize(p: JsonParser, ctxt: DeserializationContext) = NullablePrimitive(
50+
p.intValue + 100
51+
)
52+
53+
override fun getBoxedNullValue(): NullablePrimitive = NullablePrimitive(null)
54+
}
55+
56+
class KeyDeserializer : JacksonKeyDeserializer() {
57+
override fun deserializeKey(key: String, ctxt: DeserializationContext) = NullablePrimitive(key.toInt() + 100)
58+
}
59+
}
60+
4661
@JvmInline
4762
value class TwoUnitPrimitive(val v: Long) {
4863
class Deserializer : StdDeserializer<TwoUnitPrimitive>(TwoUnitPrimitive::class.java) {

src/test/kotlin/tools/jackson/module/kotlin/kogeraIntegration/deser/valueClass/WithoutCustomDeserializeMethodTest.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,23 @@ class WithoutCustomDeserializeMethodTest {
4646
}
4747
}
4848

49+
@Suppress("ClassName")
50+
@Nested
51+
inner class NullablePrimitive_ {
52+
@Test
53+
fun value() {
54+
val result = defaultMapper.readValue<NullablePrimitive>("1")
55+
assertEquals(NullablePrimitive(1), result)
56+
}
57+
58+
// failing
59+
@Test
60+
fun nullString() {
61+
val result = defaultMapper.readValue<NullablePrimitive?>("null")
62+
assertNotEquals(NullablePrimitive(null), result, "#209 has been fixed.")
63+
}
64+
}
65+
4966
@Test
5067
fun twoUnitPrimitive() {
5168
val result = defaultMapper.readValue<TwoUnitPrimitive>("1")
@@ -60,6 +77,8 @@ class WithoutCustomDeserializeMethodTest {
6077
val nnoN: NonNullObject?,
6178
val noNn: NullableObject,
6279
val noN: NullableObject?,
80+
val npNn: NullablePrimitive,
81+
val npN: NullablePrimitive?,
6382
val tupNn: TwoUnitPrimitive,
6483
val tupN: TwoUnitPrimitive?
6584
)
@@ -73,6 +92,8 @@ class WithoutCustomDeserializeMethodTest {
7392
NonNullObject("bar"),
7493
NullableObject("baz"),
7594
NullableObject("qux"),
95+
NullablePrimitive(1),
96+
NullablePrimitive(2),
7697
TwoUnitPrimitive(3),
7798
TwoUnitPrimitive(4)
7899
)
@@ -91,6 +112,8 @@ class WithoutCustomDeserializeMethodTest {
91112
null,
92113
NullableObject(null),
93114
null,
115+
NullablePrimitive(null),
116+
null,
94117
TwoUnitPrimitive(3),
95118
null
96119
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.defaultArgument
2+
3+
import com.fasterxml.jackson.annotation.JsonCreator
4+
import org.junit.jupiter.api.Assertions
5+
import org.junit.jupiter.api.Assertions.assertEquals
6+
import org.junit.jupiter.api.Test
7+
import tools.jackson.module.kotlin.defaultMapper
8+
import tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.NullablePrimitive
9+
import tools.jackson.module.kotlin.readValue
10+
11+
class NullablePrimitiveTest {
12+
data class ByConstructor(
13+
val nnNn: NullablePrimitive = NullablePrimitive(1),
14+
val nnN: NullablePrimitive = NullablePrimitive(null),
15+
val nNn: NullablePrimitive? = NullablePrimitive(2),
16+
val nN: NullablePrimitive? = null
17+
)
18+
19+
@Test
20+
fun byConstructorTestFailing() {
21+
// #761(KT-57357) fixed
22+
Assertions.assertThrows(Error::class.java) {
23+
assertEquals(ByConstructor(), defaultMapper.readValue<ByConstructor>("{}"))
24+
}
25+
}
26+
27+
data class ByFactory(
28+
val nnNn: NullablePrimitive = NullablePrimitive(1),
29+
val nnN: NullablePrimitive = NullablePrimitive(null),
30+
val nNn: NullablePrimitive? = NullablePrimitive(2),
31+
val nN: NullablePrimitive? = null
32+
) {
33+
companion object {
34+
@JvmStatic
35+
@JsonCreator
36+
fun creator(
37+
nnNn: NullablePrimitive = NullablePrimitive(1),
38+
nnN: NullablePrimitive = NullablePrimitive(null),
39+
nNn: NullablePrimitive? = NullablePrimitive(2),
40+
nN: NullablePrimitive? = null
41+
) = ByFactory(nnNn, nnN, nNn, nN)
42+
}
43+
}
44+
45+
@Test
46+
fun byFactoryTest() {
47+
// #761(KT-57357) fixed
48+
Assertions.assertThrows(Error::class.java) {
49+
assertEquals(ByFactory.creator(), defaultMapper.readValue<ByFactory>("{}"))
50+
}
51+
}
52+
}

src/test/kotlin/tools/jackson/module/kotlin/kogeraIntegration/deser/valueClass/deserializer/SpecifiedForObjectMapperTest.kt

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import tools.jackson.databind.module.SimpleModule
77
import tools.jackson.module.kotlin.jacksonMapperBuilder
88
import tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.NonNullObject
99
import tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.NullableObject
10+
import tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.NullablePrimitive
1011
import tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.Primitive
1112
import tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.TwoUnitPrimitive
1213
import tools.jackson.module.kotlin.readValue
@@ -19,6 +20,7 @@ class SpecifiedForObjectMapperTest {
1920
this.addDeserializer(Primitive::class.java, Primitive.Deserializer())
2021
this.addDeserializer(NonNullObject::class.java, NonNullObject.Deserializer())
2122
this.addDeserializer(NullableObject::class.java, NullableObject.DeserializerWrapsNullable())
23+
this.addDeserializer(NullablePrimitive::class.java, NullablePrimitive.DeserializerWrapsNullable())
2224
this.addDeserializer(TwoUnitPrimitive::class.java, TwoUnitPrimitive.Deserializer())
2325
}
2426
this.addModule(module)
@@ -56,6 +58,23 @@ class SpecifiedForObjectMapperTest {
5658
}
5759
}
5860

61+
@Suppress("ClassName")
62+
@Nested
63+
inner class NullablePrimitive_ {
64+
@Test
65+
fun value() {
66+
val result = mapper.readValue<NullablePrimitive>("1")
67+
assertEquals(NullablePrimitive(101), result)
68+
}
69+
70+
// failing
71+
@Test
72+
fun nullString() {
73+
val result = mapper.readValue<NullablePrimitive?>("null")
74+
assertNotEquals(NullablePrimitive(null), result, "#209 has been fixed.")
75+
}
76+
}
77+
5978
@Test
6079
fun twoUnitPrimitive() {
6180
val result = mapper.readValue<TwoUnitPrimitive>("1")
@@ -70,6 +89,8 @@ class SpecifiedForObjectMapperTest {
7089
val nnoN: NonNullObject?,
7190
val noNn: NullableObject,
7291
val noN: NullableObject?,
92+
val npNn: NullablePrimitive,
93+
val npN: NullablePrimitive?,
7394
val tupNn: TwoUnitPrimitive,
7495
val tupN: TwoUnitPrimitive?
7596
)
@@ -83,8 +104,10 @@ class SpecifiedForObjectMapperTest {
83104
NonNullObject("bar"),
84105
NullableObject("baz"),
85106
NullableObject("qux"),
86-
TwoUnitPrimitive(3),
87-
TwoUnitPrimitive(4)
107+
NullablePrimitive(3),
108+
NullablePrimitive(4),
109+
TwoUnitPrimitive(5),
110+
TwoUnitPrimitive(6)
88111
)
89112
val src = mapper.writeValueAsString(base)
90113
val result = mapper.readValue<Dst>(src)
@@ -96,8 +119,10 @@ class SpecifiedForObjectMapperTest {
96119
NonNullObject("bar-deser"),
97120
NullableObject("baz-deser"),
98121
NullableObject("qux-deser"),
99-
TwoUnitPrimitive(103),
100-
TwoUnitPrimitive(104)
122+
NullablePrimitive(103),
123+
NullablePrimitive(104),
124+
TwoUnitPrimitive(105),
125+
TwoUnitPrimitive(106)
101126
)
102127
assertEquals(expected, result)
103128
}
@@ -111,7 +136,9 @@ class SpecifiedForObjectMapperTest {
111136
null,
112137
NullableObject(null),
113138
null,
114-
TwoUnitPrimitive(3),
139+
NullablePrimitive(3),
140+
null,
141+
TwoUnitPrimitive(5),
115142
null
116143
)
117144
val src = mapper.writeValueAsString(base)
@@ -124,7 +151,9 @@ class SpecifiedForObjectMapperTest {
124151
null,
125152
NullableObject("null-value-deser"),
126153
null,
127-
TwoUnitPrimitive(103),
154+
NullablePrimitive(103),
155+
null,
156+
TwoUnitPrimitive(105),
128157
null
129158
)
130159
assertEquals(expected, result)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.deserializer.byAnnotation.specifiedForProperty
2+
3+
import tools.jackson.module.kotlin.defaultMapper
4+
import tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.NullablePrimitive
5+
import tools.jackson.module.kotlin.readValue
6+
import org.junit.jupiter.api.Assertions.assertEquals
7+
import org.junit.jupiter.api.Nested
8+
import org.junit.jupiter.api.Test
9+
import tools.jackson.databind.annotation.JsonDeserialize
10+
11+
class NullablePrimitiveTest {
12+
data class NonNull(
13+
@get:JsonDeserialize(using = NullablePrimitive.DeserializerWrapsNullable::class)
14+
val getterAnn: NullablePrimitive,
15+
@field:JsonDeserialize(using = NullablePrimitive.DeserializerWrapsNullable::class)
16+
val fieldAnn: NullablePrimitive
17+
)
18+
19+
@Test
20+
fun nonNull() {
21+
val result = defaultMapper.readValue<NonNull>(
22+
"""
23+
{
24+
"getterAnn" : 1,
25+
"fieldAnn" : 2
26+
}
27+
""".trimIndent()
28+
)
29+
assertEquals(NonNull(NullablePrimitive(101), NullablePrimitive(102)), result)
30+
}
31+
32+
data class Nullable(
33+
@get:JsonDeserialize(using = NullablePrimitive.DeserializerWrapsNullable::class)
34+
val getterAnn: NullablePrimitive?,
35+
@field:JsonDeserialize(using = NullablePrimitive.DeserializerWrapsNullable::class)
36+
val fieldAnn: NullablePrimitive?
37+
)
38+
39+
@Nested
40+
inner class NullableTest {
41+
@Test
42+
fun nonNullInput() {
43+
val result = defaultMapper.readValue<Nullable>(
44+
"""
45+
{
46+
"getterAnn" : 1,
47+
"fieldAnn" : 2
48+
}
49+
""".trimIndent()
50+
)
51+
assertEquals(Nullable(NullablePrimitive(101), NullablePrimitive(102)), result)
52+
}
53+
54+
@Test
55+
fun nullInput() {
56+
val result = defaultMapper.readValue<Nullable>(
57+
"""
58+
{
59+
"getterAnn" : null,
60+
"fieldAnn" : null
61+
}
62+
""".trimIndent()
63+
)
64+
assertEquals(Nullable(null, null), result)
65+
}
66+
}
67+
}

src/test/kotlin/tools/jackson/module/kotlin/kogeraIntegration/deser/valueClass/jsonCreator/InCreatorArgumentTest.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import org.junit.jupiter.api.Test
66
import tools.jackson.module.kotlin.defaultMapper
77
import tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.NonNullObject
88
import tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.NullableObject
9+
import tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.NullablePrimitive
910
import tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.Primitive
1011
import tools.jackson.module.kotlin.kogeraIntegration.deser.valueClass.TwoUnitPrimitive
1112
import tools.jackson.module.kotlin.readValue
1213

1314
private fun Primitive.modify(): Primitive = Primitive(v + 100)
1415
private fun NonNullObject.modify(): NonNullObject = NonNullObject("$v-creator")
1516
private fun NullableObject.modify(): NullableObject = NullableObject(v!! + "-creator")
17+
private fun NullablePrimitive.modify(): NullablePrimitive = NullablePrimitive(v!! + 100)
1618
private fun TwoUnitPrimitive.modify(): TwoUnitPrimitive = TwoUnitPrimitive(v + 100)
1719

1820
class InCreatorArgumentTest {
@@ -23,6 +25,8 @@ class InCreatorArgumentTest {
2325
val nnoN: NonNullObject?,
2426
val noNn: NullableObject,
2527
val noN: NullableObject?,
28+
val npNn: NullablePrimitive,
29+
val npN: NullablePrimitive?,
2630
val tupNn: TwoUnitPrimitive,
2731
val tupN: TwoUnitPrimitive?
2832
) {
@@ -36,6 +40,8 @@ class InCreatorArgumentTest {
3640
nnoN: NonNullObject?,
3741
noNn: NullableObject,
3842
noN: NullableObject?,
43+
npNn: NullablePrimitive,
44+
npN: NullablePrimitive?,
3945
tupNn: TwoUnitPrimitive,
4046
tupN: TwoUnitPrimitive?
4147
) = Dst(
@@ -45,6 +51,8 @@ class InCreatorArgumentTest {
4551
nnoN?.modify(),
4652
noNn.modify(),
4753
noN?.modify(),
54+
npNn.modify(),
55+
npN?.modify(),
4856
tupNn.modify(),
4957
tupN?.modify()
5058
)
@@ -60,8 +68,10 @@ class InCreatorArgumentTest {
6068
NonNullObject("nnoN"),
6169
NullableObject("noNn"),
6270
NullableObject("noN"),
63-
TwoUnitPrimitive(3),
64-
TwoUnitPrimitive(4)
71+
NullablePrimitive(3),
72+
NullablePrimitive(4),
73+
TwoUnitPrimitive(5),
74+
TwoUnitPrimitive(6)
6575
)
6676
val result = defaultMapper.readValue<Dst>(defaultMapper.writeValueAsString(base))
6777

@@ -73,6 +83,8 @@ class InCreatorArgumentTest {
7383
nnoN = base.nnoN?.modify(),
7484
noNn = base.noNn.modify(),
7585
noN = base.noN?.modify(),
86+
npNn = base.npNn.modify(),
87+
npN = base.npN?.modify(),
7688
tupNn = base.tupNn.modify(),
7789
tupN = base.tupN?.modify()
7890
),

0 commit comments

Comments
 (0)