1
+ /*
2
+ * Copyright 2019-2021 JetBrains s.r.o.
3
+ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4
+ */
5
+
6
+ package kotlinx.datetime.serialization.test
7
+
8
+ import kotlinx.datetime.*
9
+ import kotlinx.datetime.serializers.*
10
+ import kotlinx.serialization.Contextual
11
+ import kotlinx.serialization.Serializable
12
+ import kotlinx.serialization.decodeFromString
13
+ import kotlinx.serialization.encodeToString
14
+ import kotlinx.serialization.json.Json
15
+ import kotlinx.serialization.modules.SerializersModule
16
+ import kotlinx.serialization.modules.contextual
17
+ import kotlin.test.Test
18
+ import kotlin.test.assertEquals
19
+
20
+ class ContextualSerializationTest {
21
+
22
+ @Serializable
23
+ data class Dummy (
24
+ @Contextual val instant : Instant ,
25
+ @Contextual val date : LocalDate ,
26
+ @Contextual val dateTime : LocalDateTime ,
27
+ @Contextual val datePeriod : DatePeriod ,
28
+ @Contextual val dateTimePeriod : DateTimePeriod ,
29
+ )
30
+
31
+ private val module = SerializersModule {
32
+ contextual(InstantComponentSerializer )
33
+ contextual(LocalDateComponentSerializer )
34
+ contextual(LocalDateTimeComponentSerializer )
35
+ contextual(DatePeriodComponentSerializer )
36
+ contextual(DateTimePeriodComponentSerializer )
37
+ }
38
+
39
+ private val format = Json { serializersModule = module }
40
+
41
+ @Test
42
+ fun testContextualSerialization () {
43
+ val dummyValue = Dummy (
44
+ Instant .parse(" 2021-03-24T01:29:30.123456789Z" ),
45
+ LocalDate .parse(" 2020-01-02" ),
46
+ LocalDateTime .parse(" 2020-01-03T12:59:58.010203045" ),
47
+ DatePeriod .parse(" P20Y-2M-3D" ),
48
+ DateTimePeriod .parse(" -P50Y-1M-2DT3H4M5.0123S" ),
49
+ )
50
+ val json = """ {"instant":{"epochSeconds":1616549370,"nanosecondsOfSecond":123456789},""" +
51
+ """ "date":{"year":2020,"month":1,"day":2},""" +
52
+ """ "dateTime":{"year":2020,"month":1,"day":3,"hour":12,"minute":59,"second":58,"nanosecond":10203045},""" +
53
+ """ "datePeriod":{"years":19,"months":10,"days":-3},"dateTimePeriod":"P-49Y-11M2DT-3H-4M-5.012300000S"}"""
54
+ assertEquals(json, format.encodeToString(dummyValue))
55
+ assertEquals(dummyValue, format.decodeFromString(json))
56
+ }
57
+ }
0 commit comments