/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . serialization . json . pol ymorphic Ċ Ċ import Ġkotlinx . serialization .* Ċ import Ġkotlinx . serialization . json .* Ċ import Ġkotlinx . serialization . test .* Ċ import Ġkotlin . test .* Ċ Ċ class ĠJson Parame tric Serializer Test Ġ: ĠJson TestBase () Ġ{ ĊĠĠĠ Ġval Ġjson Ġ= ĠJson ( Json Configuration . Default ) ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġsealed Ġclass ĠCho ices Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Serializable ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠHas A ( val Ġa : ĠString ) Ġ: ĠCho ices () ĊĊĠĠĠĠĠĠĠ Ġ@ Serializable ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠHas B ( val Ġb : ĠInt ) Ġ: ĠCho ices () ĊĊĠĠĠĠĠĠĠ Ġ@ Serializable ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠHas C ( val Ġc : ĠBoolean ) Ġ: ĠCho ices () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġobject ĠCho ices Parame tric Serializer Ġ: ĠJson Parame tric Serializer < Choices >( Choices :: class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġselect Serializer ( element : ĠJson Element ): ĠK Serializer < out ĠCho ices > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " Ġin Ġelement Ġ-> ĠCho ices . Has A . serializer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" b " Ġin Ġelement Ġ-> ĠCho ices . Has B . serializer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" c " Ġin Ġelement Ġ-> ĠCho ices . Has C . serializer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠSerialization Exception (" Unknown Ġchoice ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠWith Choices (@ Serializable ( Choices Parame tric Serializer :: class ) Ġval Ġresponse : ĠCho ices ) ĊĊĠĠĠ Ġprivate Ġval ĠtestData Input Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġ""" {" response ":{" a ":" string "}} """, ĊĠĠĠĠĠĠĠ Ġ""" {" response ":{" b ": 4 2 }} """, ĊĠĠĠĠĠĠĠ Ġ""" {" response ":{" c ": true }} """ ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval ĠtestData Output Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠWith Choices ( Choices . Has A (" string ")), ĊĠĠĠĠĠĠĠ ĠWith Choices ( Choices . Has B ( 4 2 )), ĊĠĠĠĠĠĠĠ ĠWith Choices ( Choices . Has C ( true )) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Par ses Parame tric ally () Ġ= Ġparame tri zed Test Ġ{ Ġstreaming Ġ-> ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin ĠtestData Input . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtestData Output [ i ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson . parse ( With Choices . serializer (), ĠtestData Input [ i ], Ġstreaming ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" failed Ġtest Ġon Ġ${ testData Input [ i ]}, Ġuse Streaming Ġ= Ġ$ streaming " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Serial izes Parame tric ally () Ġ= Ġif Ġ( is Js Ir ()) ĠUnit Ġelse Ġparame tri zed Test Ġ{ Ġstreaming Ġ-> ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin ĠtestData Output . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtestData Input [ i ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson . stringify ( With Choices . serializer (), ĠtestData Output [ i ], Ġstreaming ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" failed Ġtest Ġon Ġ${ testData Output [ i ]}, Ġuse Streaming Ġ= Ġ$ streaming " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠPayment Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġamount : ĠString ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠSuccessful Payment ( override Ġval Ġamount : ĠString , Ġval Ġdate : ĠString ) Ġ: ĠPayment ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠRe fun ded Payment ( override Ġval Ġamount : ĠString , Ġval Ġdate : ĠString , Ġval Ġreason : ĠString ) Ġ: ĠPayment ĊĊĠĠĠ Ġobject ĠPayment Serializer Ġ: ĠJson Parame tric Serializer < Payment >( Payment :: class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġselect Serializer ( element : ĠJson Element ): ĠK Serializer < out ĠPayment > Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" reason " Ġin Ġelement Ġ-> ĠRe fun ded Payment . serializer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSuccessful Payment . serializer () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Documentation Sample () Ġ= Ġparame tri zed Test Ġ{ Ġstreaming Ġ-> ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSuccessful Payment (" 1 . 0 ", Ġ" 0 3 . 0 2 . 2 0 2 0 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson . parse ( Payment Serializer , Ġ""" {" amount ":" 1 . 0 "," date ":" 0 3 . 0 2 . 2 0 2 0 "} """, Ġstreaming ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRe fun ded Payment (" 2 . 0 ", Ġ" 0 3 . 0 2 . 2 0 2 0 ", Ġ" compl aint "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson . parse ( Payment Serializer , Ġ""" {" amount ":" 2 . 0 "," date ":" 0 3 . 0 2 . 2 0 2 0 "," reason ":" compl aint "} """, Ġstreaming ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ