Skip to content

Commit 9ff7e03

Browse files
committed
Test which serializers are the default ones
1 parent c5c8ad2 commit 9ff7e03

8 files changed

+221
-101
lines changed

serialization/common/test/DateTimePeriodSerializationTest.kt

Lines changed: 53 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ import kotlin.test.*
1313

1414
class DateTimePeriodSerializationTest {
1515

16-
@Test
17-
fun datePeriodISO8601Serialization() {
16+
private fun datePeriodISO8601Serialization(
17+
datePeriodSerializer: KSerializer<DatePeriod>,
18+
dateTimePeriodSerializer: KSerializer<DateTimePeriod>
19+
) {
1820
for ((period, json) in listOf(
1921
Pair(DatePeriod(1, 2, 3), "\"P1Y2M3D\""),
2022
Pair(DatePeriod(years = 1), "\"P1Y\""),
@@ -24,21 +26,23 @@ class DateTimePeriodSerializationTest {
2426
Pair(DatePeriod(months = 10, days = 5), "\"P10M5D\""),
2527
Pair(DatePeriod(years = 1, days = 40), "\"P1Y40D\""),
2628
)) {
27-
assertEquals(json, Json.encodeToString(DatePeriodISO8601Serializer, period))
28-
assertEquals(period, Json.decodeFromString(DatePeriodISO8601Serializer, json))
29-
assertEquals(json, Json.encodeToString(DateTimePeriodISO8601Serializer, period))
30-
assertEquals(period, Json.decodeFromString(DateTimePeriodISO8601Serializer, json) as DatePeriod)
29+
assertEquals(json, Json.encodeToString(datePeriodSerializer, period))
30+
assertEquals(period, Json.decodeFromString(datePeriodSerializer, json))
31+
assertEquals(json, Json.encodeToString(dateTimePeriodSerializer, period))
32+
assertEquals(period, Json.decodeFromString(dateTimePeriodSerializer, json) as DatePeriod)
3133
}
3234
// time-based keys should not be considered unknown here
3335
assertFailsWith<IllegalArgumentException> {
34-
Json { ignoreUnknownKeys = true }.decodeFromString(DatePeriodISO8601Serializer, "\"P3DT1H\"")
36+
Json { ignoreUnknownKeys = true }.decodeFromString(datePeriodSerializer, "\"P3DT1H\"")
3537
}
3638
// presence of time-based keys should not be a problem if the values are 0
37-
Json.decodeFromString(DatePeriodISO8601Serializer, "\"P3DT0H\"")
39+
Json.decodeFromString(datePeriodSerializer, "\"P3DT0H\"")
3840
}
3941

40-
@Test
41-
fun datePeriodComponentSerialization() {
42+
private fun datePeriodComponentSerialization(
43+
datePeriodSerializer: KSerializer<DatePeriod>,
44+
dateTimePeriodSerializer: KSerializer<DateTimePeriod>
45+
) {
4246
for ((period, json) in listOf(
4347
Pair(DatePeriod(1, 2, 3), "{\"years\":1,\"months\":2,\"days\":3}"),
4448
Pair(DatePeriod(years = 1), "{\"years\":1}"),
@@ -48,21 +52,20 @@ class DateTimePeriodSerializationTest {
4852
Pair(DatePeriod(months = 10, days = 5), "{\"months\":10,\"days\":5}"),
4953
Pair(DatePeriod(years = 1, days = 40), "{\"years\":1,\"days\":40}"),
5054
)) {
51-
assertEquals(json, Json.encodeToString(DatePeriodComponentSerializer, period))
52-
assertEquals(period, Json.decodeFromString(DatePeriodComponentSerializer, json))
53-
assertEquals(json, Json.encodeToString(DateTimePeriodComponentSerializer, period))
54-
assertEquals(period, Json.decodeFromString(DateTimePeriodComponentSerializer, json) as DatePeriod)
55+
assertEquals(json, Json.encodeToString(datePeriodSerializer, period))
56+
assertEquals(period, Json.decodeFromString(datePeriodSerializer, json))
57+
assertEquals(json, Json.encodeToString(dateTimePeriodSerializer, period))
58+
assertEquals(period, Json.decodeFromString(dateTimePeriodSerializer, json) as DatePeriod)
5559
}
5660
// time-based keys should not be considered unknown here
5761
assertFailsWith<SerializationException> {
58-
Json { ignoreUnknownKeys = true }.decodeFromString(DatePeriodComponentSerializer, "{\"hours\":3}")
62+
Json { ignoreUnknownKeys = true }.decodeFromString(datePeriodSerializer, "{\"hours\":3}")
5963
}
6064
// presence of time-based keys should not be a problem if the values are 0
61-
Json.decodeFromString(DatePeriodComponentSerializer, "{\"hours\":0}")
65+
Json.decodeFromString(datePeriodSerializer, "{\"hours\":0}")
6266
}
6367

64-
@Test
65-
fun dateTimePeriodISO8601Serialization() {
68+
private fun dateTimePeriodISO8601Serialization(dateTimePeriodSerializer: KSerializer<DateTimePeriod>) {
6669
for ((period, json) in listOf(
6770
Pair(DateTimePeriod(), "\"P0D\""),
6871
Pair(DateTimePeriod(hours = 1), "\"PT1H\""),
@@ -72,13 +75,12 @@ class DateTimePeriodSerializationTest {
7275
Pair(DateTimePeriod(years = -1, months = -2, days = -3, hours = -4, minutes = -5, seconds = 0, nanoseconds = 500_000_000),
7376
"\"-P1Y2M3DT4H4M59.500000000S\""),
7477
)) {
75-
assertEquals(json, Json.encodeToString(DateTimePeriodISO8601Serializer, period))
76-
assertEquals(period, Json.decodeFromString(DateTimePeriodISO8601Serializer, json))
78+
assertEquals(json, Json.encodeToString(dateTimePeriodSerializer, period))
79+
assertEquals(period, Json.decodeFromString(dateTimePeriodSerializer, json))
7780
}
7881
}
7982

80-
@Test
81-
fun dateTimePeriodComponentSerialization() {
83+
private fun dateTimePeriodComponentSerialization(dateTimePeriodSerializer: KSerializer<DateTimePeriod>) {
8284
for ((period, json) in listOf(
8385
Pair(DateTimePeriod(), "{}"),
8486
Pair(DateTimePeriod(hours = 1), "{\"hours\":1}"),
@@ -88,9 +90,36 @@ class DateTimePeriodSerializationTest {
8890
Pair(DateTimePeriod(years = -1, months = -2, days = -3, hours = -4, minutes = -5, seconds = 0, nanoseconds = 500_000_000),
8991
"{\"years\":-1,\"months\":-2,\"days\":-3,\"hours\":-4,\"minutes\":-4,\"seconds\":-59,\"nanoseconds\":-500000000}"),
9092
)) {
91-
assertEquals(json, Json.encodeToString(DateTimePeriodComponentSerializer, period))
92-
assertEquals(period, Json.decodeFromString(DateTimePeriodComponentSerializer, json))
93+
assertEquals(json, Json.encodeToString(dateTimePeriodSerializer, period))
94+
assertEquals(period, Json.decodeFromString(dateTimePeriodSerializer, json))
9395
}
9496
}
9597

98+
@Test
99+
fun testDatePeriodISO8601Serialization() {
100+
datePeriodISO8601Serialization(DatePeriodISO8601Serializer, DateTimePeriodISO8601Serializer)
101+
}
102+
103+
@Test
104+
fun testDatePeriodComponentSerialization() {
105+
datePeriodComponentSerialization(DatePeriodComponentSerializer, DateTimePeriodComponentSerializer)
106+
}
107+
108+
@Test
109+
fun testDateTimePeriodISO8601Serialization() {
110+
dateTimePeriodISO8601Serialization(DateTimePeriodISO8601Serializer)
111+
}
112+
113+
@Test
114+
fun testDateTimePeriodComponentSerialization() {
115+
dateTimePeriodComponentSerialization(DateTimePeriodComponentSerializer)
116+
}
117+
118+
@Test
119+
fun testDefaultSerializers() {
120+
// Check that they behave the same as the ISO-8601 serializers
121+
dateTimePeriodISO8601Serialization(Json.serializersModule.serializer())
122+
datePeriodISO8601Serialization(Json.serializersModule.serializer(), Json.serializersModule.serializer())
123+
}
124+
96125
}

serialization/common/test/DateTimeUnitSerializationTest.kt

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,85 +7,116 @@ package kotlinx.datetime.serialization.test
77

88
import kotlinx.datetime.*
99
import kotlinx.datetime.serializers.*
10+
import kotlinx.serialization.KSerializer
1011
import kotlinx.serialization.json.*
12+
import kotlinx.serialization.serializer
1113
import kotlin.random.*
1214
import kotlin.test.*
1315

1416
class DateTimeUnitSerializationTest {
15-
@Test
16-
fun timeBasedSerialization() {
17+
private fun timeBasedSerialization(serializer: KSerializer<DateTimeUnit.TimeBased>) {
1718
repeat(100) {
1819
val nanoseconds = Random.nextLong(1, Long.MAX_VALUE)
1920
val unit = DateTimeUnit.TimeBased(nanoseconds)
2021
val json = "{\"nanoseconds\":${nanoseconds.toString()}}" // https://youtrack.jetbrains.com/issue/KT-39891
21-
assertEquals(json, Json.encodeToString(TimeBasedDateTimeUnitSerializer, unit))
22-
assertEquals(unit, Json.decodeFromString(TimeBasedDateTimeUnitSerializer, json))
22+
assertEquals(json, Json.encodeToString(serializer, unit))
23+
assertEquals(unit, Json.decodeFromString(serializer, json))
2324
}
2425
}
2526

26-
@Test
27-
fun dayBasedSerialization() {
27+
private fun dayBasedSerialization(serializer: KSerializer<DateTimeUnit.DateBased.DayBased>) {
2828
repeat(100) {
2929
val days = Random.nextInt(1, Int.MAX_VALUE)
3030
val unit = DateTimeUnit.DateBased.DayBased(days)
3131
val json = "{\"days\":$days}"
32-
assertEquals(json, Json.encodeToString(DayBasedDateTimeUnitSerializer, unit))
33-
assertEquals(unit, Json.decodeFromString(DayBasedDateTimeUnitSerializer, json))
32+
assertEquals(json, Json.encodeToString(serializer, unit))
33+
assertEquals(unit, Json.decodeFromString(serializer, json))
3434
}
3535
}
3636

37-
@Test
38-
fun monthBasedSerialization() {
37+
private fun monthBasedSerialization(serializer: KSerializer<DateTimeUnit.DateBased.MonthBased>) {
3938
repeat(100) {
4039
val months = Random.nextInt(1, Int.MAX_VALUE)
4140
val unit = DateTimeUnit.DateBased.MonthBased(months)
4241
val json = "{\"months\":$months}"
43-
assertEquals(json, Json.encodeToString(MonthBasedDateTimeUnitSerializer, unit))
44-
assertEquals(unit, Json.decodeFromString(MonthBasedDateTimeUnitSerializer, json))
42+
assertEquals(json, Json.encodeToString(serializer, unit))
43+
assertEquals(unit, Json.decodeFromString(serializer, json))
4544
}
4645
}
4746

48-
@Test
49-
fun dateBasedSerialization() {
47+
private fun dateBasedSerialization(serializer: KSerializer<DateTimeUnit.DateBased>) {
5048
repeat(100) {
5149
val days = Random.nextInt(1, Int.MAX_VALUE)
5250
val unit = DateTimeUnit.DateBased.DayBased(days)
5351
val json = "{\"type\":\"DayBased\",\"days\":$days}"
54-
assertEquals(json, Json.encodeToString(DateBasedDateTimeUnitSerializer, unit))
55-
assertEquals(unit, Json.decodeFromString(DateBasedDateTimeUnitSerializer, json))
52+
assertEquals(json, Json.encodeToString(serializer, unit))
53+
assertEquals(unit, Json.decodeFromString(serializer, json))
5654
}
5755
repeat(100) {
5856
val months = Random.nextInt(1, Int.MAX_VALUE)
5957
val unit = DateTimeUnit.DateBased.MonthBased(months)
6058
val json = "{\"type\":\"MonthBased\",\"months\":$months}"
61-
assertEquals(json, Json.encodeToString(DateBasedDateTimeUnitSerializer, unit))
62-
assertEquals(unit, Json.decodeFromString(DateBasedDateTimeUnitSerializer, json))
59+
assertEquals(json, Json.encodeToString(serializer, unit))
60+
assertEquals(unit, Json.decodeFromString(serializer, json))
6361
}
6462
}
6563

66-
@Test
67-
fun serialization() {
64+
private fun serialization(serializer: KSerializer<DateTimeUnit>) {
6865
repeat(100) {
6966
val nanoseconds = Random.nextLong(1, Long.MAX_VALUE)
7067
val unit = DateTimeUnit.TimeBased(nanoseconds)
7168
val json = "{\"type\":\"TimeBased\",\"nanoseconds\":${nanoseconds.toString()}}" // https://youtrack.jetbrains.com/issue/KT-39891
72-
assertEquals(json, Json.encodeToString(DateTimeUnitSerializer, unit))
73-
assertEquals(unit, Json.decodeFromString(DateTimeUnitSerializer, json))
69+
assertEquals(json, Json.encodeToString(serializer, unit))
70+
assertEquals(unit, Json.decodeFromString(serializer, json))
7471
}
7572
repeat(100) {
7673
val days = Random.nextInt(1, Int.MAX_VALUE)
7774
val unit = DateTimeUnit.DateBased.DayBased(days)
7875
val json = "{\"type\":\"DayBased\",\"days\":$days}"
79-
assertEquals(json, Json.encodeToString(DateTimeUnitSerializer, unit))
80-
assertEquals(unit, Json.decodeFromString(DateTimeUnitSerializer, json))
76+
assertEquals(json, Json.encodeToString(serializer, unit))
77+
assertEquals(unit, Json.decodeFromString(serializer, json))
8178
}
8279
repeat(100) {
8380
val months = Random.nextInt(1, Int.MAX_VALUE)
8481
val unit = DateTimeUnit.DateBased.MonthBased(months)
8582
val json = "{\"type\":\"MonthBased\",\"months\":$months}"
86-
assertEquals(json, Json.encodeToString(DateTimeUnitSerializer, unit))
87-
assertEquals(unit, Json.decodeFromString(DateTimeUnitSerializer, json))
83+
assertEquals(json, Json.encodeToString(serializer, unit))
84+
assertEquals(unit, Json.decodeFromString(serializer, json))
8885
}
8986
}
9087

88+
@Test
89+
fun testTimeBasedUnitSerialization() {
90+
timeBasedSerialization(TimeBasedDateTimeUnitSerializer)
91+
}
92+
93+
@Test
94+
fun testDayBasedSerialization() {
95+
dayBasedSerialization(DayBasedDateTimeUnitSerializer)
96+
}
97+
98+
@Test
99+
fun testMonthBasedSerialization() {
100+
monthBasedSerialization(MonthBasedDateTimeUnitSerializer)
101+
}
102+
103+
@Test
104+
fun testDateBasedSerialization() {
105+
dateBasedSerialization(DateBasedDateTimeUnitSerializer)
106+
}
107+
108+
@Test
109+
fun testSerialization() {
110+
serialization(DateTimeUnitSerializer)
111+
}
112+
113+
@Test
114+
fun testDefaultSerializers() {
115+
monthBasedSerialization(Json.serializersModule.serializer())
116+
timeBasedSerialization(Json.serializersModule.serializer())
117+
dayBasedSerialization(Json.serializersModule.serializer())
118+
dateBasedSerialization(Json.serializersModule.serializer())
119+
serialization(Json.serializersModule.serializer())
120+
}
121+
91122
}

serialization/common/test/DayOfWeekSerializationTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import kotlin.test.*
1212

1313
class DayOfWeekSerializationTest {
1414
@Test
15-
fun serialization() {
15+
fun testSerialization() {
1616
for (dayOfWeek in DayOfWeek.values()) {
1717
val json = "\"${dayOfWeek.name}\""
1818
assertEquals(json, Json.encodeToString(DayOfWeekSerializer, dayOfWeek))

serialization/common/test/InstantSerializationTest.kt

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import kotlin.test.*
1212

1313
class InstantSerializationTest {
1414

15-
@Test
16-
fun iso8601Serialization() {
15+
private fun iso8601Serialization(serializer: KSerializer<Instant>) {
1716
for ((instant, json) in listOf(
1817
Pair(Instant.fromEpochSeconds(1607505416, 124000),
1918
"\"2020-12-09T09:16:56.000124Z\""),
@@ -24,13 +23,12 @@ class InstantSerializationTest {
2423
Pair(Instant.fromEpochSeconds(987654321, 0),
2524
"\"2001-04-19T04:25:21Z\""),
2625
)) {
27-
assertEquals(json, Json.encodeToString(InstantISO8601Serializer, instant))
28-
assertEquals(instant, Json.decodeFromString(InstantISO8601Serializer, json))
26+
assertEquals(json, Json.encodeToString(serializer, instant))
27+
assertEquals(instant, Json.decodeFromString(serializer, json))
2928
}
3029
}
3130

32-
@Test
33-
fun componentSerialization() {
31+
private fun componentSerialization(serializer: KSerializer<Instant>) {
3432
for ((instant, json) in listOf(
3533
Pair(Instant.fromEpochSeconds(1607505416, 124000),
3634
"{\"epochSeconds\":1607505416,\"nanosecondsOfSecond\":124000}"),
@@ -41,15 +39,31 @@ class InstantSerializationTest {
4139
Pair(Instant.fromEpochSeconds(987654321, 0),
4240
"{\"epochSeconds\":987654321}"),
4341
)) {
44-
assertEquals(json, Json.encodeToString(InstantComponentSerializer, instant))
45-
assertEquals(instant, Json.decodeFromString(InstantComponentSerializer, json))
42+
assertEquals(json, Json.encodeToString(serializer, instant))
43+
assertEquals(instant, Json.decodeFromString(serializer, json))
4644
}
4745
// check that having a `"nanosecondsOfSecond": 0` field doesn't break deserialization
4846
assertEquals(Instant.fromEpochSeconds(987654321, 0),
49-
Json.decodeFromString(InstantComponentSerializer,
47+
Json.decodeFromString(serializer,
5048
"{\"epochSeconds\":987654321,\"nanosecondsOfSecond\":0}"))
5149
// "epochSeconds" should always be present
52-
assertFailsWith<SerializationException> { Json.decodeFromString(InstantComponentSerializer, "{}") }
53-
assertFailsWith<SerializationException> { Json.decodeFromString(InstantComponentSerializer, "{\"nanosecondsOfSecond\":3}") }
50+
assertFailsWith<SerializationException> { Json.decodeFromString(serializer, "{}") }
51+
assertFailsWith<SerializationException> { Json.decodeFromString(serializer, "{\"nanosecondsOfSecond\":3}") }
52+
}
53+
54+
@Test
55+
fun testIso8601Serialization() {
56+
iso8601Serialization(InstantISO8601Serializer)
57+
}
58+
59+
@Test
60+
fun testComponentSerialization() {
61+
componentSerialization(InstantComponentSerializer)
62+
}
63+
64+
@Test
65+
fun testDefaultSerializers() {
66+
// should be the same as the ISO-8601
67+
iso8601Serialization(Json.serializersModule.serializer())
5468
}
5569
}

0 commit comments

Comments
 (0)