package Ġorg . pro meth ist . core . type Ċ Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Test Instance Ċ import Ġorg . pro meth ist . common . Object Util Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertSame Ċ Ċ @ Test Instance ( Test Instance . Lifecycle . PER _ CLASS ) Ċ class ĠMemory Test Ġ{ ĊĊĠĠĠ Ġopen Ġclass ĠParent ( open Ġval Ġname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Parent ( name ='$ name ')" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġas ĠParent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġname Ġ== Ġother . name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠChild ( override Ġval Ġname : ĠString , Ġval Ġage : ĠInt ): ĠParent ( name ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Child ( name ='$ name ', Ġage =$ age )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠComp licated Child ( override Ġval Ġname : ĠString , Ġval Ġmap : ĠMap < String , ĠList < Child >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap 2 : ĠMap < Int , ĠString >, Ġval Ġparents : ĠList < Parent >): ĠParent ( name ) ĊĊĠĠĠ Ġval Ġe 1 Ġ= ĠParent (" bl a ") ĊĠĠĠ Ġval Ġe 2 Ġ= ĠChild (" bl ab la ", Ġ 1 2 ) ĊĠĠĠ Ġval Ġe 3 Ġ= ĠComp licated Child (" hm ", Ġmap Of (" a " Ġto ĠlistOf ( Child (" c 1 ", Ġ 1 2 ), ĠChild (" c 2 ", Ġ 1 3 ))), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( 1 Ġto Ġ" b ", Ġ 2 Ġto Ġ" c "), ĠlistOf ( Parent (" p apa "))) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġcustom Ġclass Ġin Ġa Ġlist `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( e 1 , Ġe 2 , Ġe 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġmem List Ġ= ĠMem orable . pack ( list ) ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠObject Util . default Mapper . writeValue AsString ( mem List ) ĊĠĠĠĠĠĠĠ Ġval Ġrestored Ġ= ĠObject Util . default Mapper . readValue ( s , ĠMemory :: class . java ) ĊĠĠĠĠĠĠĠ Ġ( restore d ._ value Ġas ĠList < *> ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( it Ġis ĠMap < *, Ġ* >) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġunpack ed Ġ= ĠMem orable . unpack ( restore d ) Ġas ĠList < Parent > ĊĠĠĠĠĠĠĠ Ġlist . zip ( unpack ed ). forEach Ġ{ Ġ( orig , Ġrestored ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( orig , Ġrestored ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġcustom Ġclass Ġin Ġa Ġmap `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorig Map Ġ= Ġmutable Map Of (" a " Ġto Ġe 1 , Ġ" b " Ġto Ġe 2 , Ġ" c " Ġto Ġe 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġmem Map Ġ= ĠMem orable . pack ( orig Map ) ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠObject Util . default Mapper . writeValue AsString ( mem Map ) ĊĠĠĠĠĠĠĠ Ġval Ġrestored Ġ= ĠObject Util . default Mapper . readValue ( s , ĠMemory :: class . java ) ĊĠĠĠĠĠĠĠ Ġ( restore d ._ value Ġas ĠMap < *, Ġ*> ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( it . value Ġis ĠMap < *, Ġ* >) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġunpack ed Ġ= ĠMem orable . unpack ( restore d ) Ġas ĠMap < String , ĠParent > ĊĠĠĠĠĠĠĠ Ġorig Map . entries . zip ( unpack ed . entries ). forEach Ġ{ Ġ( orig , Ġrestored ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( orig , Ġrestored ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġmultiple Ġclasses `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( e 1 , Ġe 2 , Ġe 3 , Ġ 1 , Ġ 1 . 5 , Ġ 5 L , Ġ 6 . 3 F , Ġ"", Ġtrue , Ġfalse , ĠString Mutable List (" 1 ", Ġ" 2 ", Ġ" 3 ")) ĊĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmem Ġ= ĠMem orable . pack ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠObject Util . default Mapper . writeValue AsString ( mem ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrestored Ġ= ĠObject Util . default Mapper . readValue ( s , ĠMemory :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( Memory . can Contain ( it ) Ġ|| Ġrestored ._ value Ġis ĠMap < *, Ġ* >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunpack ed Ġ= ĠMem orable . unpack ( restore d ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( it , Ġunpack ed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġprimitives Ġin Ġa Ġcollection `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( e 1 , Ġe 2 , Ġe 3 , Ġ 1 , Ġ 1 . 5 , Ġ 5 L , Ġ 6 . 3 F , Ġ"", Ġtrue , Ġfalse , ĠString Mutable List (" 1 ", Ġ" 2 ", Ġ" 3 ")) ĊĠĠĠĠĠĠĠ Ġval Ġmem List Ġ= ĠMem orable . pack ( list ) ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠObject Util . default Mapper . writeValue AsString ( mem List ) ĊĠĠĠĠĠĠĠ Ġval Ġrestored Ġ= ĠObject Util . default Mapper . readValue ( s , ĠMemory :: class . java ) ĊĠĠĠĠĠĠĠ Ġ( restore d ._ value Ġas ĠList < *> ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( Memory . can Contain ( it !! ) Ġ|| Ġrestored Ġis ĠMap < *, Ġ* >) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġunpack ed Ġ= ĠMem orable . unpack ( restore d ) Ġas ĠList < Any > ĊĠĠĠĠĠĠĠ Ġlist . zip ( unpack ed ). forEach Ġ{ Ġ( orig , Ġrestored ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( orig , Ġrestored ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġmem orable Ġcollection `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠMemory Mutable List ( listOf ( e 1 , Ġe 2 , Ġe 3 , Ġ" 1 ", Ġ" 2 ", Ġ" 3 "). map Ġ{ ĠMemory ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġmem List Ġ= ĠMem orable . pack ( list ) ĊĠĠĠĠĠĠĠ ĠassertSame ( list , Ġmem List ) ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠObject Util . default Mapper . writeValue AsString ( mem List ) ĊĠĠĠĠĠĠĠ Ġval Ġrestored List Ġ= ĠMem orable . unpack ( Object Util . default Mapper . readValue ( s , ĠMemory Mutable List :: class . java )) Ġas ĠMemory Mutable List < Any > ĊĠĠĠĠĠĠĠ Ġlist . zip ( restore d List ). forEach Ġ{ Ġ( orig , Ġrestored ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( restore d )._ value Ġ= ĠMem orable . unpack ( restore d ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( orig , Ġrestored ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }