/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠJ ason ĠMon k Ċ Ġ* ĠĊ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* ĠĊ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* ĠĊ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . mon kop edia . ks rpc Ċ Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlinx . atomic fu . Atomic Ref Ċ import Ġkotlinx . atomic fu . atomic Ċ import Ġkotlinx . serialization . Serializable Ċ Ċ @ Serializable Ċ data Ġclass ĠMy Json ( ĊĠĠĠ Ġval Ġstr : ĠString , ĊĠĠĠ Ġval Ġint : ĠInt , ĊĠĠĠ Ġval Ġn Float : ĠFloat ? Ċ ) Ċ Ċ @ Ks Service Ċ interface ĠTest Types Interface Ġ: ĠRpc Service Ġ{ ĊĠĠĠ Ġ@ Ks Method ("/ rpc ") ĊĠĠĠ Ġsuspend Ġfun Ġrpc ( u : ĠPair < String , ĠString >): ĠString ĊĊĠĠĠ Ġ@ Ks Method ("/ map ") ĊĠĠĠ Ġsuspend Ġfun Ġmap Rpc ( u : ĠMap < String , ĠMy Json >) ĊĊĠĠĠ Ġ@ Ks Method ("/ return ") ĊĠĠĠ Ġsuspend Ġfun ĠreturnType ( u : ĠUnit ): ĠMy Json ĊĊĠĠĠ Ġ@ Ks Method ("/ input Int ") ĊĠĠĠ Ġsuspend Ġfun Ġinput Int ( i : ĠInt ) ĊĊĠĠĠ Ġ@ Ks Method ("/ input Int List ") ĊĠĠĠ Ġsuspend Ġfun Ġinput Int List ( i : ĠList < Int >) ĊĊĠĠĠ Ġ@ Ks Method ("/ output Int ") ĊĠĠĠ Ġsuspend Ġfun Ġoutput Int ( u : ĠUnit ): ĠInt ĊĊĠĠĠ Ġ@ Ks Method ("/ input Int Nullable ") ĊĠĠĠ Ġsuspend Ġfun Ġinput Int Nullable ( i : ĠInt ?) ĊĊĠĠĠ Ġ@ Ks Method ("/ output Int Nullable ") ĊĠĠĠ Ġsuspend Ġfun Ġoutput Int Nullable ( u : ĠUnit ): ĠInt ? Ċ } Ċ Ċ class ĠFake Test Types Ġ: ĠTest Types Interface Ġ{ ĊĠĠĠ Ġvar Ġlast Input : ĠAtomic Ref < Any ?> Ġ= Ġatomic ( null ) ĊĠĠĠ Ġvar Ġnext Return : ĠAtomic Ref < Any ?> Ġ= Ġatomic ( null ) ĊĠĠĠ Ġvar Ġlast Call : ĠAtomic Ref < String ?> Ġ= Ġatomic ( null ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġrpc ( u : ĠPair < String , ĠString >): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Input . value Ġ= Ġu ĊĠĠĠĠĠĠĠ Ġlast Call . value Ġ= Ġ" rpc " ĊĠĠĠĠĠĠĠ Ġreturn Ġnext Return . value Ġas ĠString ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġmap Rpc ( u : ĠMap < String , ĠMy Json >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Input . value Ġ= Ġu ĊĠĠĠĠĠĠĠ Ġlast Call . value Ġ= Ġ" map Rpc " ĊĠĠĠĠĠĠĠ Ġreturn Ġnext Return . value Ġas ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠreturnType ( u : ĠUnit ): ĠMy Json Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Input . value Ġ= Ġu ĊĠĠĠĠĠĠĠ Ġlast Call . value Ġ= Ġ" returnType " ĊĠĠĠĠĠĠĠ Ġreturn Ġnext Return . value Ġas ĠMy Json ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinput Int ( i : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Input . value Ġ= Ġi ĊĠĠĠĠĠĠĠ Ġlast Call . value Ġ= Ġ" input Int " ĊĠĠĠĠĠĠĠ Ġreturn Ġnext Return . value Ġas ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinput Int List ( i : ĠList < Int >) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Input . value Ġ= Ġi ĊĠĠĠĠĠĠĠ Ġlast Call . value Ġ= Ġ" input Int List " ĊĠĠĠĠĠĠĠ Ġreturn Ġnext Return . value Ġas ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġoutput Int ( u : ĠUnit ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Input . value Ġ= Ġu ĊĠĠĠĠĠĠĠ Ġlast Call . value Ġ= Ġ" output Int " ĊĠĠĠĠĠĠĠ Ġreturn Ġnext Return . value Ġas ĠInt ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinput Int Nullable ( i : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Input . value Ġ= Ġi ĊĠĠĠĠĠĠĠ Ġlast Call . value Ġ= Ġ" input Int Nullable " ĊĠĠĠĠĠĠĠ Ġreturn Ġnext Return . value Ġas ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġoutput Int Nullable ( u : ĠUnit ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Input . value Ġ= Ġu ĊĠĠĠĠĠĠĠ Ġlast Call . value Ġ= Ġ" output Int Nullable " ĊĠĠĠĠĠĠĠ Ġreturn Ġnext Return . value Ġas ĠInt ? ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠRpc Type Test Ġ{ ĊĊĠĠĠ Ġabstract Ġclass ĠRpc Type Function ality Test ( ĊĠĠĠĠĠĠĠ Ġverify On Channel : Ġsuspend Ġ( Serialized Channel , ĠFake Test Types ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġservice : ĠFake Test Types Ġ= ĠFake Test Types () ĊĠĠĠ Ġ) Ġ: ĠRpc Function ality Test ( ĊĠĠĠĠĠĠĠ Ġserialized Channel Ġ= Ġ{ Ġservice . serialized < Test Types Interface >() Ġ}, ĊĠĠĠĠĠĠĠ Ġverify On Channel Ġ= Ġ{ Ġchannel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify On Channel ( channel , Ġservice ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġclass ĠPair Str Test Ġ: ĠRpc Type Function ality Test ( ĊĠĠĠĠĠĠĠ Ġverify On Channel Ġ= Ġ{ Ġchannel , Ġservice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġchannel . to Stub < Test Types Interface >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . next Return . value Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstub . rpc (" Hello " Ġto Ġ" world ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" rpc ", Ġservice . last Call . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Hello " Ġto Ġ" world ", Ġservice . last Input . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġclass ĠMap Test Ġ: ĠRpc Type Function ality Test ( ĊĠĠĠĠĠĠĠ Ġverify On Channel Ġ= Ġ{ Ġchannel , Ġservice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġchannel . to Stub < Test Types Interface >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . next Return . value Ġ= ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstub . map Rpc ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" First " Ġto ĠMy Json (" first ", Ġ 1 , Ġnull ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Second " Ġto ĠMy Json (" second ", Ġ 2 , Ġ 1 . 2 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" map Rpc ", Ġservice . last Call . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" First " Ġto ĠMy Json (" first ", Ġ 1 , Ġnull ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Second " Ġto ĠMy Json (" second ", Ġ 2 , Ġ 1 . 2 f ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice . last Input . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġclass ĠInput Int Test Ġ: ĠRpc Type Function ality Test ( ĊĠĠĠĠĠĠĠ Ġverify On Channel Ġ= Ġ{ Ġchannel , Ġservice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġchannel . to Stub < Test Types Interface >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . next Return . value Ġ= ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstub . input Int ( 4 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" input Int ", Ġservice . last Call . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 4 2 , Ġservice . last Input . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġclass ĠInput Int List Test Ġ: ĠRpc Type Function ality Test ( ĊĠĠĠĠĠĠĠ Ġverify On Channel Ġ= Ġ{ Ġchannel , Ġservice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġchannel . to Stub < Test Types Interface >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . next Return . value Ġ= ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . input Int List ( listOf ( 4 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" input Int List ", Ġservice . last Call . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( 4 2 ), Ġservice . last Input . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġclass ĠInput Int Nullable Test Ġ: ĠRpc Type Function ality Test ( ĊĠĠĠĠĠĠĠ Ġverify On Channel Ġ= Ġ{ Ġchannel , Ġservice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġchannel . to Stub < Test Types Interface >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . next Return . value Ġ= ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . input Int Nullable ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" input Int Nullable ", Ġservice . last Call . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( null , Ġservice . last Input . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġclass ĠOutput Int Test Ġ: ĠRpc Type Function ality Test ( ĊĠĠĠĠĠĠĠ Ġverify On Channel Ġ= Ġ{ Ġchannel , Ġservice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġchannel . to Stub < Test Types Interface >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . next Return . value Ġ= Ġ 4 2 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 4 2 , Ġstub . output Int ( Unit )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" output Int ", Ġservice . last Call . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Unit , Ġservice . last Input . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġclass ĠOutput Int Nullable Test Ġ: ĠRpc Type Function ality Test ( ĊĠĠĠĠĠĠĠ Ġverify On Channel Ġ= Ġ{ Ġchannel , Ġservice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġchannel . to Stub < Test Types Interface >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . next Return . value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( null , Ġstub . output Int Nullable ( Unit )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" output Int Nullable ", Ġservice . last Call . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Unit , Ġservice . last Input . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġclass ĠReturn Type Test Ġ: ĠRpc Type Function ality Test ( ĊĠĠĠĠĠĠĠ Ġverify On Channel Ġ= Ġ{ Ġchannel , Ġservice Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Ġ= Ġchannel . to Stub < Test Types Interface >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . next Return . value Ġ= ĠMy Json (" second ", Ġ 2 , Ġ 1 . 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( My Json (" second ", Ġ 2 , Ġ 1 . 2 f ), Ġstub . returnType ( Unit )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" returnType ", Ġservice . last Call . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Unit , Ġservice . last Input . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ