Skip to content

Commit

Permalink
Merge branch 'fix/enum-decoding'
Browse files Browse the repository at this point in the history
  • Loading branch information
janseeger committed Nov 22, 2024
2 parents c5eefe5 + 0a9d91a commit f3ebe10
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,5 @@ fun decodeEnum(
}
}

throw SerializationException("Couldn't find matching value for enum $enumNamespace")
throw SerializationException("Couldn't find matching $enumNamespace enum for value $decodedValue")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package de.sipgate.federmappe.common.decoder

import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.serializer
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFails
import kotlin.test.assertIs

/*
* This `@Serializable` annotation needs to be present for the `@SerialName` annotation to be
* processed and attached to the generated SerialDescriptor. This seems to be a side-effect of
* Kotlin JS deserialization. See https://github.com/Kotlin/kotlinx.serialization/issues/31#issuecomment-1446310243
* for details
*/
@Serializable
enum class CustomTestEnum {
@SerialName("avalue") A,
}

private val expectedError = "Couldn't find matching de.sipgate.federmappe.common.decoder.CustomTestEnum enum for value A"

@OptIn(ExperimentalSerializationApi::class)
class ComplexEnumTests {
@Test
fun deserializeDataClassWithEnum() {
// Arrange
@Serializable
data class TestClassA(val a: CustomTestEnum)

val serializer = serializer<TestClassA>()
val data = mapOf<String, Any?>("a" to CustomTestEnum.A)

// Act
val result = assertFails { serializer.deserialize(StringMapToObjectDecoder(data)) }

// Assert
assertIs<SerializationException>(result)
assertEquals(expectedError, result.message)
}

@Test
fun deserializeDataClassWithEnumValue() {
// Arrange
@Serializable
data class TestClassA(val a: CustomTestEnum)

val serializer = serializer<TestClassA>()
val data = mapOf<String, Any?>("a" to "A")

// Act
val result = assertFails { serializer.deserialize(StringMapToObjectDecoder(data)) }

// Assert
assertIs<SerializationException>(result)
assertEquals(expectedError, result.message)
}

@Test
fun deserializeEnumWithCustomSerialName() {
// Arrange
@Serializable
data class TestClassA(val a: CustomTestEnum)

val serializer = serializer<TestClassA>()
val data = mapOf<String, Any?>("a" to "avalue")

// Act
val result = serializer.deserialize(StringMapToObjectDecoder(data))

// Assert
assertIs<TestClassA>(result)
assertEquals(CustomTestEnum.A, result.a)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -103,4 +103,21 @@ class EnumTests {
assertIs<TestClass>(result)
assertEquals(TestEnum.A, result.a.values.first())
}

@Test
fun deserializeDataClassWithDefaultEnumValue() {
// Arrange
@Serializable
data class TestClass(val a: TestEnum = TestEnum.B)

val serializer = serializer<TestClass>()
val data = emptyMap<String, Any?>()

// Act
val result = serializer.deserialize(StringMapToObjectDecoder(data))

// Assert
assertIs<TestClass>(result)
assertEquals(TestEnum.B, result.a)
}
}

0 comments on commit f3ebe10

Please sign in to comment.