Skip to content

Add serialization test cases for value classes #1005

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 31, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass

import com.fasterxml.jackson.module.kotlin.defaultMapper
import com.fasterxml.jackson.module.kotlin.testPrettyWriter
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test

class WithoutCustomSerializeMethodTest {
@JvmInline
value class Primitive(val v: Int)

@JvmInline
value class NonNullObject(val v: String)

@JvmInline
value class NullableObject(val v: String?)

@JvmInline
value class NullablePrimitive(val v: Int?)

@JvmInline
value class TwoUnitPrimitive(val v: Long)

private val writer = defaultMapper.testPrettyWriter()

@Nested
inner class DirectSerializeTest {
@Test
fun primitive() {
val result = writer.writeValueAsString(Primitive(1))
assertEquals("1", result)
}

@Test
fun nonNullObject() {
val result = writer.writeValueAsString(NonNullObject("foo"))
assertEquals("\"foo\"", result)
}

@Suppress("ClassName")
@Nested
inner class NullableObject_ {
@Test
fun value() {
val result = writer.writeValueAsString(NullableObject("foo"))
assertEquals("\"foo\"", result)
}

@Test
fun nullValue() {
val result = writer.writeValueAsString(NullableObject(null))
assertEquals("null", result)
}
}

@Suppress("ClassName")
@Nested
inner class NullablePrimitive_ {
@Test
fun value() {
val result = writer.writeValueAsString(NullablePrimitive(1))
assertEquals("1", result)
}

@Test
fun nullValue() {
val result = writer.writeValueAsString(NullablePrimitive(null))
assertEquals("null", result)
}
}

@Test
fun twoUnitPrimitive() {
val result = writer.writeValueAsString(TwoUnitPrimitive(1))
assertEquals("1", result)
}
}

data class Src(
val pNn: Primitive,
val pN: Primitive?,
val nnoNn: NonNullObject,
val nnoN: NonNullObject?,
val noNn: NullableObject,
val noN: NullableObject?,
val npNn: NullablePrimitive,
val npN: NullablePrimitive?,
val tupNn: TwoUnitPrimitive,
val tupN: TwoUnitPrimitive?,
)

@Test
fun withoutNull() {
val src = Src(
Primitive(1),
Primitive(2),
NonNullObject("foo"),
NonNullObject("bar"),
NullableObject("baz"),
NullableObject("qux"),
NullablePrimitive(1),
NullablePrimitive(2),
TwoUnitPrimitive(3),
TwoUnitPrimitive(4),
)
val result = writer.writeValueAsString(src)

assertEquals(
"""
{
"pNn" : 1,
"pN" : 2,
"nnoNn" : "foo",
"nnoN" : "bar",
"noNn" : "baz",
"noN" : "qux",
"npNn" : 1,
"npN" : 2,
"tupNn" : 3,
"tupN" : 4
}
""".trimIndent(),
result,
)
}

@Test
fun withNull() {
val src = Src(
Primitive(1),
null,
NonNullObject("foo"),
null,
NullableObject(null),
null,
NullablePrimitive(null),
null,
TwoUnitPrimitive(3),
null,
)
val result = writer.writeValueAsString(src)

assertEquals(
"""
{
"pNn" : 1,
"pN" : null,
"nnoNn" : "foo",
"nnoN" : null,
"noNn" : null,
"noN" : null,
"npNn" : null,
"npN" : null,
"tupNn" : 3,
"tupN" : null
}
""".trimIndent(),
result,
)
}

@JvmInline
value class HasToString(val value: Int) {
override fun toString(): String = "Custom($value)"
}

@Test
fun toStringTest() {
val result = writer.writeValueAsString(HasToString(42))
assertEquals("42", result)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer

import com.fasterxml.jackson.databind.module.SimpleModule
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.testPrettyWriter
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test

class SpecifiedForObjectMapperTest {
companion object {
val mapper = jacksonObjectMapper().apply {
val module = SimpleModule().apply {
this.addSerializer(Primitive::class.java, Primitive.Serializer())
this.addSerializer(NonNullObject::class.java, NonNullObject.Serializer())
this.addSerializer(NullableObject::class.java, NullableObject.Serializer())
this.addSerializer(NullablePrimitive::class.java, NullablePrimitive.Serializer())
this.addSerializer(TwoUnitPrimitive::class.java, TwoUnitPrimitive.Serializer())
}
this.registerModule(module)
}
val writer = mapper.testPrettyWriter()
}

@Nested
inner class DirectSerialize {
@Test
fun primitive() {
val result = writer.writeValueAsString(Primitive(1))
assertEquals("101", result)
}

@Test
fun nonNullObject() {
val result = writer.writeValueAsString(NonNullObject("foo"))
assertEquals("\"foo-ser\"", result)
}

@Suppress("ClassName")
@Nested
inner class NullableObject_ {
@Test
fun value() {
val result = writer.writeValueAsString(NullableObject("foo"))
assertEquals("\"foo-ser\"", result)
}

@Test
fun nullValue() {
val result = writer.writeValueAsString(NullableObject(null))
assertEquals("\"NULL\"", result)
}
}

@Suppress("ClassName")
@Nested
inner class NullablePrimitive_ {
@Test
fun value() {
val result = writer.writeValueAsString(NullablePrimitive(1))
assertEquals("101", result)
}

@Test
fun nullValue() {
val result = writer.writeValueAsString(NullablePrimitive(null))
assertEquals("\"NULL\"", result)
}
}

@Test
fun twoUnitPrimitive() {
val result = writer.writeValueAsString(TwoUnitPrimitive(1))
assertEquals("101", result)
}
}

data class Src(
val pNn: Primitive,
val pN: Primitive?,
val nnoNn: NonNullObject,
val nnoN: NonNullObject?,
val noNn: NullableObject,
val noN: NullableObject?,
val npNn: NullablePrimitive,
val npN: NullablePrimitive?,
val tupNn: TwoUnitPrimitive,
val tupN: TwoUnitPrimitive?,
)

@Test
fun nonNull() {
val src = Src(
Primitive(1),
Primitive(2),
NonNullObject("foo"),
NonNullObject("bar"),
NullableObject("baz"),
NullableObject("qux"),
NullablePrimitive(3),
NullablePrimitive(4),
TwoUnitPrimitive(5),
TwoUnitPrimitive(6),
)
val result = writer.writeValueAsString(src)

assertEquals(
"""
{
"pNn" : 101,
"pN" : 102,
"nnoNn" : "foo-ser",
"nnoN" : "bar-ser",
"noNn" : "baz-ser",
"noN" : "qux-ser",
"npNn" : 103,
"npN" : 104,
"tupNn" : 105,
"tupN" : 106
}
""".trimIndent(),
result,
)
}

@Test
fun withNull() {
val src = Src(
Primitive(1),
null,
NonNullObject("foo"),
null,
NullableObject(null),
null,
NullablePrimitive(null),
null,
TwoUnitPrimitive(5),
null,
)
val result = writer.writeValueAsString(src)

assertEquals(
"""
{
"pNn" : 101,
"pN" : null,
"nnoNn" : "foo-ser",
"nnoN" : null,
"noNn" : "NULL",
"noN" : null,
"npNn" : "NULL",
"npN" : null,
"tupNn" : 105,
"tupN" : null
}
""".trimIndent(),
result,
)
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.byAnnotation.nullableObject.byAnnotation
package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.byAnnotation.nullableObject

import com.fasterxml.jackson.databind.annotation.JsonSerialize
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.byAnnotation.nullableObject.byAnnotation
package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.byAnnotation.nullableObject

import com.fasterxml.jackson.databind.annotation.JsonSerialize
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.byAnnotation.nullablePrimitive.byAnnotation
package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.byAnnotation.nullablePrimitive

import com.fasterxml.jackson.databind.annotation.JsonSerialize
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.byAnnotation.nullablePrimitive.byAnnotation
package com.fasterxml.jackson.module.kotlin.kogeraIntegration.ser.valueClass.serializer.byAnnotation.nullablePrimitive

import com.fasterxml.jackson.databind.annotation.JsonSerialize
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
Expand Down