Skip to content

Commit

Permalink
Add a few more tests for the int-based enums serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
azabost committed Jun 27, 2023
1 parent 2eb18ef commit 22be2f8
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,18 @@ class CodifiedJacksonModuleTest {
output.knownOrNull().shouldEqual(input)
}

@Test
fun `can deserialize known value to codified enum with int from json`() {
// given
val input = 400

// when
val output = serdeCodifiedEnum(input)

// then
output.knownOrNull().shouldEqual(Weight.Medium)
}

@Test
fun `can serialize and deserialize not known value to codified enum`() {
// given
Expand Down Expand Up @@ -130,6 +142,11 @@ class CodifiedJacksonModuleTest {
return objectMapper.readValue(json, object : TypeReference<CodifiedEnum<Colour, String>>() {})
}

private fun serdeCodifiedEnum(input: Int): CodifiedEnum<Weight, Int> {
val json = objectMapper.writer().writeValueAsString(input)
return objectMapper.readValue(json, object : TypeReference<CodifiedEnum<Weight, Int>>() {})
}

private inline fun <reified T> serde(input: T): T {
val json = objectMapper.writer().writeValueAsString(input)
return objectMapper.readValue(json, T::class.java)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,4 +152,18 @@ class CodifiedEnumSerializerTest {
val basket = json.decodeFromString(FoodBasket.serializer(), stringifiedBasket)
basket.shouldEqual(expectedBasket)
}

@Test
fun `mixed enum wrapper should be serialized`() {
val wrapper = MixedEnumWrapper(StringEnum.FOO.codifiedEnum(), IntEnum.QUX.codifiedEnum())
val string = json.encodeToString(MixedEnumWrapper.serializer(), wrapper)
string.shouldEqual("{\"stringEnum\":\"${StringEnum.FOO.code}\",\"intEnum\":${IntEnum.QUX.code}}")
}

@Test
fun `mixed enum wrapper should be deserialized`() {
val string = "{\"stringEnum\":\"${StringEnum.FOO.code}\",\"intEnum\":${IntEnum.QUX.code}}"
val wrapper = json.decodeFromString(MixedEnumWrapper.serializer(), string)
wrapper.shouldEqual(MixedEnumWrapper(StringEnum.FOO.codifiedEnum(), IntEnum.QUX.codifiedEnum()))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package pl.brightinventions.codified.enums.serializer

import kotlinx.serialization.KSerializer
import kotlinx.serialization.builtins.serializer
import pl.brightinventions.codified.Codified
import pl.brightinventions.codified.enums.CodifiedEnum

const val BAZ_CODE = 100
const val QUX_CODE = 999

enum class IntEnum(override val code: Int) : Codified<Int> {
BAZ(BAZ_CODE), QUX(QUX_CODE);

object CodifiedSerializer : KSerializer<CodifiedEnum<IntEnum, Int>> by codifiedEnumSerializer(Int.serializer())
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package pl.brightinventions.codified.enums.serializer

import kotlinx.serialization.Serializable
import pl.brightinventions.codified.enums.CodifiedEnum

@Serializable
data class MixedEnumWrapper(
@Serializable(with = StringEnum.CodifiedSerializer::class)
val stringEnum: CodifiedEnum<StringEnum, String>,
@Serializable(with = IntEnum.CodifiedSerializer::class)
val intEnum: CodifiedEnum<IntEnum, Int>,
)

0 comments on commit 22be2f8

Please sign in to comment.