diff --git a/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/JsonKeyTest.kt b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/JsonKeyTest.kt new file mode 100644 index 000000000..55ce3025e --- /dev/null +++ b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/JsonKeyTest.kt @@ -0,0 +1,54 @@ +package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass + +import com.fasterxml.jackson.annotation.JsonKey +import com.fasterxml.jackson.module.kotlin.jacksonMapperBuilder +import com.fasterxml.jackson.module.kotlin.testPrettyWriter +import kotlin.test.Test +import kotlin.test.assertEquals + +class JsonKeyTest { + @JvmInline + value class JsonKeyGetter(val value: Int) { + @get:JsonKey + val jsonKey: String + get() = this.toString() + } + + interface IJsonKeyGetter { + @get:JsonKey + val jsonKey: String + get() = this.toString() + } + + @JvmInline + value class JsonKeyGetterImplementation(val value: Int) : IJsonKeyGetter + + @JvmInline + value class JsonKeyGetterImplementationDisabled(val value: Int) : IJsonKeyGetter { + @get:JsonKey(false) + override val jsonKey: String + get() = super.jsonKey + } + + private val writer = jacksonMapperBuilder().build().testPrettyWriter() + + @Test + fun test() { + val src = mapOf( + JsonKeyGetter(0) to 0, + JsonKeyGetterImplementation(1) to 1, + JsonKeyGetterImplementationDisabled(2) to 2 + ) + + assertEquals( + """ + { + "JsonKeyGetter(value=0)" : 0, + "JsonKeyGetterImplementation(value=1)" : 1, + "2" : 2 + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } +} diff --git a/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/jsonInclude/JsonIncludeCustomTest.kt b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/jsonInclude/JsonIncludeCustomTest.kt new file mode 100644 index 000000000..a162e482f --- /dev/null +++ b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/jsonInclude/JsonIncludeCustomTest.kt @@ -0,0 +1,29 @@ +package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.jsonInclude + +import com.fasterxml.jackson.annotation.JsonInclude +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import kotlin.test.Test +import kotlin.test.assertEquals + +class JsonIncludeCustomTest { + class NullFilter { + override fun equals(other: Any?) = other == null + } + + @JsonInclude( + value = JsonInclude.Include.CUSTOM, + valueFilter = NullFilter::class + ) + data class NullFilterDto( + val pN: Primitive? = null, + val nnoN: NonNullObject? = null, + val noN1: NullableObject? = null + ) + + @Test + fun nullFilterTest() { + val mapper = jacksonObjectMapper() + val dto = NullFilterDto() + assertEquals("{}", mapper.writeValueAsString(dto)) + } +} diff --git a/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/jsonInclude/JsonIncludeNonNullTest.kt b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/jsonInclude/JsonIncludeNonNullTest.kt new file mode 100644 index 000000000..82de3fe62 --- /dev/null +++ b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/jsonInclude/JsonIncludeNonNullTest.kt @@ -0,0 +1,41 @@ +package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.jsonInclude + +import com.fasterxml.jackson.annotation.JsonInclude +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals + +class JsonIncludeNonNullTest { + @JsonInclude(value = JsonInclude.Include.NON_NULL) + data class Dto( + val pN: Primitive? = null, + val nnoN: NonNullObject? = null, + val noN1: NullableObject? = null + ) + + @Test + fun success() { + val mapper = jacksonObjectMapper() + val dto = Dto() + assertEquals("{}", mapper.writeValueAsString(dto)) + } + + // It is under consideration whether it should be serialized because it is non-null in Kotlin, + // but it is tentatively regarded as a failure. + @JsonInclude(value = JsonInclude.Include.NON_NULL, content = JsonInclude.Include.NON_NULL) + data class DtoFails( + val noNn: NullableObject = NullableObject(null), + val noN2: NullableObject? = NullableObject(null), + val map: Map = mapOf("noNn" to NullableObject(null)) + ) + + @Test + fun fails() { + val mapper = jacksonObjectMapper() + val dto = DtoFails() + val result = mapper.writeValueAsString(dto) + assertNotEquals("""{"map":{}}""", result) + assertEquals("""{"noNn":null,"noN2":null,"map":{"noNn":null}}""", result) + } +} diff --git a/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/jsonInclude/ValueClasses.kt b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/jsonInclude/ValueClasses.kt new file mode 100644 index 000000000..1a6804cd4 --- /dev/null +++ b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/jsonInclude/ValueClasses.kt @@ -0,0 +1,10 @@ +package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.jsonInclude + +@JvmInline +value class Primitive(val v: Int) + +@JvmInline +value class NonNullObject(val v: String) + +@JvmInline +value class NullableObject(val v: String?) diff --git a/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/ValueClasses.kt b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/ValueClasses.kt new file mode 100644 index 000000000..30ef5ddd8 --- /dev/null +++ b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/ValueClasses.kt @@ -0,0 +1,32 @@ +package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.SerializerProvider +import com.fasterxml.jackson.databind.ser.std.StdSerializer + +@JvmInline +value class Primitive(val v: Int) { + class Serializer : StdSerializer(Primitive::class.java) { + override fun serialize(value: Primitive, gen: JsonGenerator, provider: SerializerProvider) { + gen.writeNumber(value.v + 100) + } + } +} + +@JvmInline +value class NonNullObject(val v: String) { + class Serializer : StdSerializer(NonNullObject::class.java) { + override fun serialize(value: NonNullObject, gen: JsonGenerator, provider: SerializerProvider) { + gen.writeString("${value.v}-ser") + } + } +} + +@JvmInline +value class NullableObject(val v: String?) { + class Serializer : StdSerializer(NullableObject::class.java) { + override fun serialize(value: NullableObject, gen: JsonGenerator, provider: SerializerProvider) { + gen.writeString(value.v?.let { "$it-ser" } ?: "NULL") + } + } +} diff --git a/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/byAnnotation/nonNullObject/ByAnnotationTest.kt b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/byAnnotation/nonNullObject/ByAnnotationTest.kt new file mode 100644 index 000000000..648cdeb22 --- /dev/null +++ b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/byAnnotation/nonNullObject/ByAnnotationTest.kt @@ -0,0 +1,73 @@ +package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.byAnnotation.nonNullObject + +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.testPrettyWriter +import com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.NonNullObject +import kotlin.test.Test +import kotlin.test.assertEquals + +class ByAnnotationTest { + companion object { + val writer = jacksonObjectMapper().testPrettyWriter() + } + + data class NonNullSrc( + @get:JsonSerialize(using = NonNullObject.Serializer::class) + val getterAnn: NonNullObject, + @field:JsonSerialize(using = NonNullObject.Serializer::class) + val fieldAnn: NonNullObject + ) + + @Test + fun nonNull() { + val src = NonNullSrc(NonNullObject("foo"), NonNullObject("bar")) + + assertEquals( + """ + { + "getterAnn" : "foo-ser", + "fieldAnn" : "bar-ser" + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } + + data class NullableSrc( + @get:JsonSerialize(using = NonNullObject.Serializer::class) + val getterAnn: NonNullObject?, + @field:JsonSerialize(using = NonNullObject.Serializer::class) + val fieldAnn: NonNullObject? + ) + + @Test + fun nullableWithoutNull() { + val src = NullableSrc(NonNullObject("foo"), NonNullObject("bar")) + + assertEquals( + """ + { + "getterAnn" : "foo-ser", + "fieldAnn" : "bar-ser" + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } + + @Test + fun nullableWithNull() { + val src = NullableSrc(null, null) + + assertEquals( + """ + { + "getterAnn" : null, + "fieldAnn" : null + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } +} diff --git a/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/byAnnotation/nullableObject/byAnnotation/NonNullValueTest.kt b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/byAnnotation/nullableObject/byAnnotation/NonNullValueTest.kt new file mode 100644 index 000000000..caaa60465 --- /dev/null +++ b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/byAnnotation/nullableObject/byAnnotation/NonNullValueTest.kt @@ -0,0 +1,73 @@ +package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.byAnnotation.nullableObject.byAnnotation + +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.testPrettyWriter +import com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.NullableObject +import kotlin.test.Test +import kotlin.test.assertEquals + +class NonNullValueTest { + companion object { + val writer = jacksonObjectMapper().testPrettyWriter() + } + + data class NonNullSrc( + @get:JsonSerialize(using = NullableObject.Serializer::class) + val getterAnn: NullableObject, + @field:JsonSerialize(using = NullableObject.Serializer::class) + val fieldAnn: NullableObject + ) + + @Test + fun nonNull() { + val src = NonNullSrc(NullableObject("foo"), NullableObject("bar")) + + assertEquals( + """ + { + "getterAnn" : "foo-ser", + "fieldAnn" : "bar-ser" + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } + + data class NullableSrc( + @get:JsonSerialize(using = NullableObject.Serializer::class) + val getterAnn: NullableObject?, + @field:JsonSerialize(using = NullableObject.Serializer::class) + val fieldAnn: NullableObject? + ) + + @Test + fun nullableWithoutNull() { + val src = NullableSrc(NullableObject("foo"), NullableObject("bar")) + + assertEquals( + """ + { + "getterAnn" : "foo-ser", + "fieldAnn" : "bar-ser" + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } + + @Test + fun nullableWithNull() { + val src = NullableSrc(null, null) + + assertEquals( + """ + { + "getterAnn" : null, + "fieldAnn" : null + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } +} diff --git a/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/byAnnotation/nullableObject/byAnnotation/NullValueTest.kt b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/byAnnotation/nullableObject/byAnnotation/NullValueTest.kt new file mode 100644 index 000000000..61f4c1232 --- /dev/null +++ b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/byAnnotation/nullableObject/byAnnotation/NullValueTest.kt @@ -0,0 +1,74 @@ +package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.byAnnotation.nullableObject.byAnnotation + +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.testPrettyWriter +import com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.NullableObject +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals + +class NullValueTest { + companion object { + val writer = jacksonObjectMapper().testPrettyWriter() + } + + data class NonNullSrc( + @get:JsonSerialize(using = NullableObject.Serializer::class) + val getterAnn: NullableObject, + @field:JsonSerialize(using = NullableObject.Serializer::class) + val fieldAnn: NullableObject + ) + + @Test + fun failing() { + val src = NonNullSrc(NullableObject(null), NullableObject(null)) + + assertNotEquals( + """ + { + "getterAnn" : "NULL", + "fieldAnn" : "NULL" + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } + + data class NullableSrc( + @get:JsonSerialize(using = NullableObject.Serializer::class) + val getterAnn: NullableObject?, + @field:JsonSerialize(using = NullableObject.Serializer::class) + val fieldAnn: NullableObject? + ) + + @Test + fun nullableWithoutNull() { + val src = NullableSrc(NullableObject(null), NullableObject(null)) + + assertEquals( + """ + { + "getterAnn" : "NULL", + "fieldAnn" : "NULL" + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } + + @Test + fun nullableWithNull() { + val src = NullableSrc(null, null) + + assertEquals( + """ + { + "getterAnn" : null, + "fieldAnn" : null + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } +} diff --git a/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/byAnnotation/primitive/ByAnnotationTest.kt b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/byAnnotation/primitive/ByAnnotationTest.kt new file mode 100644 index 000000000..bac4c6b0f --- /dev/null +++ b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/kogeraIntegration/ser.valueClass/serializer/byAnnotation/primitive/ByAnnotationTest.kt @@ -0,0 +1,119 @@ +package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.byAnnotation.primitive + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import com.fasterxml.jackson.module.kotlin.KotlinModule +import com.fasterxml.jackson.module.kotlin.testPrettyWriter +import com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.Primitive +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals + +class ByAnnotationTest { + companion object { + val writer = KotlinModule.Builder() + .build() + .let { ObjectMapper().registerModule(it) } + .testPrettyWriter() + } + + data class NonNullFailingSrc( + @JsonSerialize(using = Primitive.Serializer::class) + val paramAnn: Primitive, + ) + + @Test + fun nonNullFailing() { + val src = NullableFailingSrc(Primitive(0)) + + assertNotEquals( + """ + { + "paramAnn" : 100 + } + """.trimIndent(), + writer.writeValueAsString(src), + "#651 fixed, it needs to be modified to match the original." + ) + } + + data class NonNullSrc( + @get:JsonSerialize(using = Primitive.Serializer::class) + val getterAnn: Primitive, + @field:JsonSerialize(using = Primitive.Serializer::class) + val fieldAnn: Primitive + ) + + @Test + fun nonNull() { + val src = NonNullSrc(Primitive(1), Primitive(2)) + + assertEquals( + """ + { + "getterAnn" : 101, + "fieldAnn" : 102 + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } + + data class NullableFailingSrc( + @JsonSerialize(using = Primitive.Serializer::class) + val paramAnn: Primitive?, + ) + + @Test + fun nullableFailing() { + val src = NullableFailingSrc(Primitive(0)) + + assertNotEquals( + """ + { + "paramAnn" : 100 + } + """.trimIndent(), + writer.writeValueAsString(src), + "#651 fixed, it needs to be modified to match the original." + ) + } + + + data class NullableSrc( + @get:JsonSerialize(using = Primitive.Serializer::class) + val getterAnn: Primitive?, + @field:JsonSerialize(using = Primitive.Serializer::class) + val fieldAnn: Primitive? + ) + + @Test + fun nullableWithoutNull() { + val src = NullableSrc(Primitive(1), Primitive(2)) + + assertEquals( + """ + { + "getterAnn" : 101, + "fieldAnn" : 102 + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } + + @Test + fun nullableWithNull() { + val src = NullableSrc(null, null) + + assertEquals( + """ + { + "getterAnn" : null, + "fieldAnn" : null + } + """.trimIndent(), + writer.writeValueAsString(src) + ) + } +}