package Ġpw . dot dash . configur ate . serialization Ċ Ċ import Ġkotlinx . serialization . Deserialization Strategy Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġn inja . le aping . configur ate . comment ed . Comment ed Configuration Node Ċ import Ġn inja . le aping . configur ate . ho con . Ho con Configuration Loader Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Test Ċ import Ġjava . io . BufferedReader Ċ Ċ internal Ġfun Ġ< T > Ġdeserialize Config ( source : ĠString , Ġde serializer : ĠDeserial ization Strategy < T >): ĠT Ġ{ ĊĠĠĠ Ġval Ġnode : ĠComment ed Configuration Node Ġ= Ġload Ho con Node ( source ) ĊĠĠĠ Ġreturn ĠConfiguration Node Parser (). parse ( node , Ġde serializer ) Ċ } Ċ Ċ private Ġfun Ġload Ho con Node ( source : ĠString ): ĠComment ed Configuration Node Ġ= ĊĠĠĠ ĠHo con Configuration Loader . builder (). set Source Ġ{ ĠBufferedReader ( source . reader ()) Ġ}. build (). load () Ċ Ċ class ĠObjects Test Ġ{ ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠSimple ( val Ġa : ĠInt ) ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠConfig Object Inner ( val Ġe : ĠString , Ġval Ġf : ĠFloat Ġ= Ġ 1 . 1 f ) ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠConfig Object ( val Ġa : ĠInt , Ġval Ġb : ĠConfig Object Inner ) ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠWith List ( val Ġa : ĠInt , Ġval Ġb : ĠList < Int >) ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠWith Map ( val Ġx : ĠMap < String , ĠInt >) ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠNested Object ( val Ġx : ĠList < Simple >) ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠComplex ( ĊĠĠĠĠĠĠĠ Ġval Ġi : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġs : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġi List : ĠList < Int >, ĊĠĠĠĠĠĠĠ Ġval Ġinner : ĠList < Simple >, ĊĠĠĠĠĠĠĠ Ġval Ġll : ĠList < List < String >>, ĊĠĠĠĠĠĠĠ Ġval Ġm : ĠMap < String , ĠConfig Object Inner > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠVery Complex ( ĊĠĠĠĠĠĠĠ Ġval Ġl : ĠList < Map < String , ĠList < Simple ? >> ? >, ĊĠĠĠĠĠĠĠ Ġval Ġm : ĠMap < String , ĠNested Object ?> ? ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġconfig String : ĠString Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġi Ġ= Ġ 4 2 ĊĠĠĠĠĠĠĠ Ġs Ġ= Ġ" foo " ĊĠĠĠĠĠĠĠ Ġi List Ġ= Ġ[ 1 , Ġ 2 , Ġ 3 ] ĊĠĠĠĠĠĠĠ Ġinner Ġ= Ġ[{ Ġa Ġ= Ġ 1 0 0 5 0 0 Ġ}] ĊĠĠĠĠĠĠĠ Ġll Ġ= Ġ[[ a , Ġb ], Ġ[ x , Ġz ]] ĊĠĠĠĠĠĠĠ Ġm Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġke k Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġfoo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf Ġ= Ġ 5 . 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbar Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġbaz ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġprivate Ġval Ġcomplex Config String : ĠString Ġ= Ġ""" ĊĠĠĠĠĠĠĠ Ġl Ġ= Ġ[ Ġ{ Ġx Ġ= Ġ[ Ġ{ Ġa Ġ= Ġ 4 2 Ġ}, Ġnull Ġ] Ġ}, Ġnull Ġ] ĊĠĠĠĠĠĠĠ Ġm Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġ[ Ġ{ Ġa Ġ= Ġ 4 3 Ġ} Ġ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ""" . trim Indent () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` complex Ġconfig `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobj : ĠComplex Ġ= Ġdeserialize Config ( config String , ĠComplex . serializer ()) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 2 , Ġobj . i ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" foo ", Ġobj . s ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( 1 , Ġ 2 , Ġ 3 ), Ġobj . i List ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( Simple ( 1 0 0 5 0 0 )), Ġobj . inner ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( listOf (" a ", Ġ" b "), ĠlistOf (" x ", Ġ" z ")), Ġobj . ll ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of (" ke k " Ġto ĠConfig Object Inner (" foo ", Ġ 5 . 6 f ), Ġ" bar " Ġto ĠConfig Object Inner (" baz ")), Ġobj . m ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` very Ġcomplex Ġconfig `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobj : ĠVery Complex Ġ= Ġdeserialize Config ( complex Config String , ĠVery Complex . serializer ()) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( map Of (" x " Ġto ĠlistOf ( Simple ( 4 2 )))), Ġobj . l ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of (" y " Ġto ĠNested Object ( listOf ( Simple ( 4 3 )))), Ġobj . m ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` simple Ġconfig `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobj : ĠSimple Ġ= Ġdeserialize Config (" a Ġ= Ġ 4 2 ", ĠSimple . serializer ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Simple ( 4 2 ), Ġobj ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` config Ġwith Ġobject `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobj : ĠConfig Object Ġ= Ġdeserialize Config (" a Ġ= Ġ 4 2 , Ġb Ġ{ Ġe Ġ= Ġfoo Ġ} ", ĠConfig Object . serializer ()) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 2 , Ġobj . a ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" foo ", Ġobj . b . e ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 . 1 f , Ġobj . b . f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` config Ġwith Ġlist `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobj : ĠWith List Ġ= Ġdeserialize Config (" a Ġ= Ġ 4 2 , Ġb Ġ= Ġ[ 1 , Ġ 2 , Ġ 3 , ]", ĠWith List . serializer ()) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 2 , Ġobj . a ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( 1 , Ġ 2 , Ġ 3 ), Ġobj . b ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` config Ġwith Ġnested Ġobject ` (){ ĊĠĠĠĠĠĠĠ Ġval Ġobj : ĠNested Object Ġ= Ġdeserialize Config (" x Ġ= Ġ[{ Ġa Ġ= Ġ 4 2 Ġ}, Ġ{ Ġa Ġ= Ġ 4 3 Ġ}, Ġ{ Ġa Ġ= Ġ 4 4 Ġ} ]", ĠNested Object . serializer ()) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( 4 2 , Ġ 4 3 , Ġ 4 4 ). map (:: Simple ), Ġobj . x ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` config Ġwith Ġmap `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobj : ĠWith Map Ġ= Ġdeserialize Config (" x Ġ= Ġ{ Ġa Ġ= Ġ 4 2 , Ġb Ġ= Ġ 4 3 , Ġc Ġ= Ġ 4 4 Ġ} ", ĠWith Map . serializer ()) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of (" a " Ġto Ġ 4 2 , Ġ" b " Ġto Ġ 4 3 , Ġ" c " Ġto Ġ 4 4 ), Ġobj . x ) ĊĠĠĠ Ġ} Ċ }