added opt tool

This commit is contained in:
Sergey Chernov 2022-12-19 04:33:36 +01:00
parent 967558aed3
commit bc726eada9
3 changed files with 74 additions and 1 deletions

View File

@ -10,7 +10,7 @@ plugins {
}
group = "net.sergeych"
version = "0.4.0-SNAPSHOT"
version = "0.4.1-SNAPSHOT"
repositories {
mavenCentral()

View File

@ -0,0 +1,25 @@
package net.sergeych.tools
import kotlinx.serialization.Serializable
@Serializable
class Opt<T>(val value: T?) {
override fun hashCode(): Int {
return value.hashCode()
}
override fun equals(other: Any?): Boolean {
if (other !is Opt<*>) return false
if (value == null && other.value == null) return true
if( value == null || other.value == null) return false
return value == other.value
}
val isNull by lazy { value == null }
val isNotNull by lazy { value != null }
fun orElse(f: ()->T) = value ?: f()
override fun toString(): String = "Opt[$value]"
}

View File

@ -4,17 +4,25 @@ import assertThrows
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import kotlinx.coroutines.runBlocking
import kotlinx.serialization.Serializable
import net.sergeych.mp_logger.Log
import net.sergeych.tools.Opt
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue
internal class WsServerKtTest {
data class TestSession(var buzz: String = "BuZZ"): WithAdapter()
@Serializable
data class TestStruct(val foobar: String)
object TestApiServer: CommandHost<TestSession>() {
val foo by command<String,String>()
val ping by command<Unit,String>()
val nullable1 by command<Boolean, Opt<TestStruct>>()
val nullable2 by command<Boolean,String?>()
}
object TestApiClient: CommandHost<WithAdapter>() {
val bar by command<String,String>()
@ -45,6 +53,46 @@ internal class WsServerKtTest {
client.close()
}
}
@Test
fun testWsServerNullables() {
embeddedServer(Netty, port = 8081) {
parsec3TransportServer(
TestApiServer,
) {
newSession { TestSession() }
on(api.foo) {
it + buzz + "-foo"
}
on(api.nullable2) {
if( it ) null else "not null"
}
on(api.nullable1) {
if( it ) Opt(null) else Opt(TestStruct("not null"))
}
}
}.start(wait = false)
val client = Parsec3WSClient("ws://localhost:8081/api/p3", TestApiClient) {}
runBlocking {
val x = TestApiServer.foo.invoke(client.adapter(), "*great*")
assertEquals("*great*BuZZ-foo", x)
assertEquals(TestApiServer.nullable2.invoke(client.adapter(), true),null)
assertEquals(TestApiServer.nullable2.invoke(client.adapter(), false),"not null")
assertEquals(TestApiServer.nullable1.invoke(client.adapter(), true),Opt<TestStruct>(null))
assertTrue { TestApiServer.nullable1.invoke(client.adapter(), true).isNull }
assertTrue { TestApiServer.nullable1.invoke(client.adapter(), false).isNotNull }
assertEquals(TestApiServer.nullable1.invoke(client.adapter(), false),Opt(TestStruct("not null")))
assertTrue { TestApiServer.nullable1.invoke(client.adapter(), false).value == TestStruct("not null") }
client.close()
assertEquals("bar", Opt<String>("bar").orElse { "foobar" } )
assertEquals("foobar", Opt<String>(null).orElse { "foobar" } )
}
}
@Test
fun testWsServerReconnect() {