summaryrefslogtreecommitdiff
path: root/formats/hocon/src/test/kotlin/kotlinx/serialization/hocon/HoconDurationTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'formats/hocon/src/test/kotlin/kotlinx/serialization/hocon/HoconDurationTest.kt')
-rw-r--r--formats/hocon/src/test/kotlin/kotlinx/serialization/hocon/HoconDurationTest.kt196
1 files changed, 196 insertions, 0 deletions
diff --git a/formats/hocon/src/test/kotlin/kotlinx/serialization/hocon/HoconDurationTest.kt b/formats/hocon/src/test/kotlin/kotlinx/serialization/hocon/HoconDurationTest.kt
new file mode 100644
index 00000000..32fc1858
--- /dev/null
+++ b/formats/hocon/src/test/kotlin/kotlinx/serialization/hocon/HoconDurationTest.kt
@@ -0,0 +1,196 @@
+package kotlinx.serialization.hocon
+
+import kotlin.test.*
+import kotlin.time.*
+import kotlin.time.Duration.Companion.INFINITE
+import kotlin.time.Duration.Companion.days
+import kotlin.time.Duration.Companion.hours
+import kotlin.time.Duration.Companion.milliseconds
+import kotlin.time.Duration.Companion.minutes
+import kotlin.time.Duration.Companion.nanoseconds
+import kotlin.time.Duration.Companion.seconds
+import kotlinx.serialization.*
+import org.junit.Assert.*
+import org.junit.Test
+
+class HoconDurationTest {
+
+ @Serializable
+ data class Simple(val d: Duration)
+
+ @Serializable
+ data class Nullable(val d: Duration?)
+
+ @Serializable
+ data class ConfigList(val ld: List<Duration>)
+
+ @Serializable
+ data class ConfigMap(val mp: Map<String, Duration>)
+
+ @Serializable
+ data class ConfigMapDurationKey(val mp: Map<Duration, Duration>)
+
+ @Serializable
+ data class Complex(
+ val i: Int,
+ val s: Simple,
+ val n: Nullable,
+ val l: List<Simple>,
+ val ln: List<Nullable>,
+ val f: Boolean,
+ val ld: List<Duration>,
+ val mp: Map<String, Duration>,
+ val mpp: Map<Duration, Duration>
+ )
+
+ @Test
+ fun testSerializeDuration() {
+ Hocon.encodeToConfig(Simple(10.minutes)).assertContains("d = 10 m")
+ Hocon.encodeToConfig(Simple(120.seconds)).assertContains("d = 2 m")
+
+ Hocon.encodeToConfig(Simple(1.hours)).assertContains("d = 1 h")
+ Hocon.encodeToConfig(Simple(120.minutes)).assertContains("d = 2 h")
+ Hocon.encodeToConfig(Simple((3600 * 3).seconds)).assertContains("d = 3 h")
+
+ Hocon.encodeToConfig(Simple(3.days)).assertContains("d = 3 d")
+ Hocon.encodeToConfig(Simple(24.hours)).assertContains("d = 1 d")
+ Hocon.encodeToConfig(Simple((1440 * 2).minutes)).assertContains("d = 2 d")
+ Hocon.encodeToConfig(Simple((86400 * 4).seconds)).assertContains("d = 4 d")
+
+ Hocon.encodeToConfig(Simple(1.seconds)).assertContains("d = 1 s")
+ Hocon.encodeToConfig(Simple(2.minutes + 1.seconds)).assertContains("d = 121 s")
+ Hocon.encodeToConfig(Simple(1.hours + 1.seconds)).assertContains("d = 3601 s")
+ Hocon.encodeToConfig(Simple(1.days + 5.seconds)).assertContains("d = 86405 s")
+
+ Hocon.encodeToConfig(Simple(9.nanoseconds)).assertContains("d = 9 ns")
+ Hocon.encodeToConfig(Simple(1_000_000.nanoseconds + 5.seconds)).assertContains("d = 5001 ms")
+ Hocon.encodeToConfig(Simple(1_000.nanoseconds + 9.seconds)).assertContains("d = 9000001 us")
+ Hocon.encodeToConfig(Simple(1_000_005.nanoseconds + 5.seconds)).assertContains("d = 5001000005 ns")
+ Hocon.encodeToConfig(Simple(1_002.nanoseconds + 9.seconds)).assertContains("d = 9000001002 ns")
+ Hocon.encodeToConfig(Simple(1_000_000_001.nanoseconds)).assertContains("d = 1000000001 ns")
+
+ // for INFINITE nanoseconds=0
+ Hocon.encodeToConfig(Simple(INFINITE)).assertContains("d = ${Long.MAX_VALUE} s")
+ Hocon.encodeToConfig(Simple(Long.MAX_VALUE.days)).assertContains("d = ${Long.MAX_VALUE} s")
+
+ Hocon.encodeToConfig(Simple((-10).days)).assertContains("d = -10 d")
+ }
+
+ @Test
+ fun testSerializeNullableDuration() {
+ Hocon.encodeToConfig(Nullable(null)).assertContains("d = null")
+ Hocon.encodeToConfig(Nullable(6.seconds)).assertContains("d = 6 s")
+ }
+
+ @Test
+ fun testSerializeListOfDuration() {
+ Hocon.encodeToConfig(ConfigList(listOf(1.days, 1.minutes, 5.nanoseconds))).assertContains("ld: [ 1 d, 1 m, 5 ns ]")
+ }
+
+ @Test
+ fun testSerializeMapOfDuration() {
+ Hocon.encodeToConfig(ConfigMap(mapOf("day" to 2.days, "hour" to 5.hours, "minute" to 3.minutes)))
+ .assertContains("mp: { day = 2 d, hour = 5 h, minute = 3 m }")
+ Hocon.encodeToConfig(ConfigMapDurationKey(mapOf(1.hours to 3600.seconds)))
+ .assertContains("mp: { 1 h = 1 h }")
+ }
+
+ @Test
+ fun testSerializeComplexDuration() {
+ val obj = Complex(
+ i = 6,
+ s = Simple(5.minutes),
+ n = Nullable(null),
+ l = listOf(Simple(1.minutes), Simple(2.seconds)),
+ ln = listOf(Nullable(null), Nullable(6.hours)),
+ f = true,
+ ld = listOf(1.days, 1.minutes, 5.nanoseconds),
+ mp = mapOf("day" to 2.days, "hour" to 5.hours, "minute" to 3.minutes),
+ mpp = mapOf(1.hours to 3600.seconds)
+ )
+ Hocon.encodeToConfig(obj)
+ .assertContains("""
+ i = 6
+ s: { d = 5 m }
+ n: { d = null }
+ l: [ { d = 1 m }, { d = 2 s } ]
+ ln: [ { d = null }, { d = 6 h } ]
+ f = true
+ ld: [ 1 d, 1 m, 5 ns ]
+ mp: { day = 2 d, hour = 5 h, minute = 3 m }
+ mpp: { 1 h = 1 h }
+ """.trimIndent())
+ }
+
+ @Test
+ fun testDeserializeDuration() {
+ var obj = deserializeConfig("d = 10s", Simple.serializer())
+ assertEquals(10.seconds, obj.d)
+ obj = deserializeConfig("d = 10 hours", Simple.serializer())
+ assertEquals(10.hours, obj.d)
+ obj = deserializeConfig("d = 5 ms", Simple.serializer())
+ assertEquals(5.milliseconds, obj.d)
+ obj = deserializeConfig("d = -5 days", Simple.serializer())
+ assertEquals((-5).days, obj.d)
+ }
+
+ @Test
+ fun testDeserializeNullableDuration() {
+ var obj = deserializeConfig("d = null", Nullable.serializer())
+ assertNull(obj.d)
+
+ obj = deserializeConfig("d = 5 days", Nullable.serializer())
+ assertEquals(5.days, obj.d!!)
+ }
+
+ @Test
+ fun testDeserializeListOfDuration() {
+ val obj = deserializeConfig("ld: [ 1d, 1m, 5ns ]", ConfigList.serializer())
+ assertEquals(listOf(1.days, 1.minutes, 5.nanoseconds), obj.ld)
+ }
+
+ @Test
+ fun testDeserializeMapOfDuration() {
+ val obj = deserializeConfig("""
+ mp: { day = 2d, hour = 5 hours, minute = 3 minutes }
+ """.trimIndent(), ConfigMap.serializer())
+ assertEquals(mapOf("day" to 2.days, "hour" to 5.hours, "minute" to 3.minutes), obj.mp)
+
+ val objDurationKey = deserializeConfig("""
+ mp: { 1 hour = 3600s }
+ """.trimIndent(), ConfigMapDurationKey.serializer())
+ assertEquals(mapOf(1.hours to 3600.seconds), objDurationKey.mp)
+ }
+
+ @Test
+ fun testDeserializeComplexDuration() {
+ val obj = deserializeConfig("""
+ i = 6
+ s: { d = 5m }
+ n: { d = null }
+ l: [ { d = 1m }, { d = 2s } ]
+ ln: [ { d = null }, { d = 6h } ]
+ f = true
+ ld: [ 1d, 1m, 5ns ]
+ mp: { day = 2d, hour = 5 hours, minute = 3 minutes }
+ mpp: { 1 hour = 3600s }
+ """.trimIndent(), Complex.serializer())
+ assertEquals(5.minutes, obj.s.d)
+ assertNull(obj.n.d)
+ assertEquals(listOf(Simple(1.minutes), Simple(2.seconds)), obj.l)
+ assertEquals(listOf(Nullable(null), Nullable(6.hours)), obj.ln)
+ assertEquals(6, obj.i)
+ assertTrue(obj.f)
+ assertEquals(listOf(1.days, 1.minutes, 5.nanoseconds), obj.ld)
+ assertEquals(mapOf("day" to 2.days, "hour" to 5.hours, "minute" to 3.minutes), obj.mp)
+ assertEquals(mapOf(1.hours to 3600.seconds), obj.mpp)
+ }
+
+ @Test
+ fun testThrowsWhenNotTimeUnitHocon() {
+ val message = "Value at d cannot be read as Duration because it is not a valid HOCON duration value"
+ assertFailsWith<SerializationException>(message) {
+ deserializeConfig("d = 10 unknown", Simple.serializer())
+ }
+ }
+}