<lambda>null1 package kotlinx.serialization.features
2
3 import kotlinx.serialization.*
4 import kotlinx.serialization.json.*
5 import kotlin.test.*
6
7 class JsonNamingStrategyExclusionTest : JsonTestBase() {
8 @SerialInfo
9 @Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY)
10 annotation class OriginalSerialName
11
12 private fun List<Annotation>.hasOriginal() = filterIsInstance<OriginalSerialName>().isNotEmpty()
13
14 private val myStrategy = JsonNamingStrategy { descriptor, index, serialName ->
15 if (descriptor.annotations.hasOriginal() || descriptor.getElementAnnotations(index).hasOriginal()) serialName
16 else JsonNamingStrategy.SnakeCase.serialNameForJson(descriptor, index, serialName)
17 }
18
19 @Serializable
20 @OriginalSerialName
21 data class Foo(val firstArg: String = "a", val secondArg: String = "b")
22
23 enum class E {
24 @OriginalSerialName
25 FIRST_E,
26 SECOND_E
27 }
28
29 @Serializable
30 data class Bar(
31 val firstBar: String = "a",
32 @OriginalSerialName val secondBar: String = "b",
33 val fooBar: Foo = Foo(),
34 val enumBarOne: E = E.FIRST_E,
35 val enumBarTwo: E = E.SECOND_E
36 )
37
38 private fun doTest(json: Json) {
39 val j = Json(json) {
40 namingStrategy = myStrategy
41 }
42 val bar = Bar()
43 assertJsonFormAndRestored(
44 Bar.serializer(),
45 bar,
46 """{"first_bar":"a","secondBar":"b","foo_bar":{"firstArg":"a","secondArg":"b"},"enum_bar_one":"FIRST_E","enum_bar_two":"SECOND_E"}""",
47 j
48 )
49 }
50
51 @Test
52 fun testJsonNamingStrategyWithAlternativeNames() = doTest(Json(default) {
53 useAlternativeNames = true
54 })
55
56 @Test
57 fun testJsonNamingStrategyWithoutAlternativeNames() = doTest(Json(default) {
58 useAlternativeNames = false
59 })
60 }
61