/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 1 9 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* Ġhttp :// 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 Ġkotlinx . collections . immutable . contract Tests . immutable Map Ċ Ċ import Ġkotlinx . collections . immutable .* Ċ import Ġkotlinx . collections . immutable . contract Tests . collection Behavior Ċ import Ġkotlinx . collections . immutable . contract Tests . compare Ċ import Ġkotlinx . collections . immutable . contract Tests . map Behavior Ċ import Ġkotlinx . collections . immutable . contract Tests . set Behavior Ċ import Ġorg . junit . Test Ċ import Ġjava . util .* Ċ import Ġkotlin . test .* Ċ Ċ class ĠImmutable HashMap Test Ġ: ĠImmutableMap Test () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< K , ĠV > Ġimmutable Map Of ( var arg Ġpairs : ĠPair < K , ĠV >): ĠPersistent Map < K , ĠV > Ġ= Ġpersistent HashMap Of (* pairs ) Ċ } Ċ class ĠImmutable Ordered Map Test Ġ: ĠImmutableMap Test () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< K , ĠV > Ġimmutable Map Of ( var arg Ġpairs : ĠPair < K , ĠV >): ĠPersistent Map < K , ĠV > Ġ= Ġpersistent Map Of (* pairs ) ĊĠĠĠ Ġoverride Ġfun Ġ< K , ĠV > Ġcompare Maps ( expected : ĠMap < K , ĠV >, Ġactual : ĠMap < K , ĠV >) Ġ= Ġcompare ( expected , Ġactual ) Ġ{ Ġmap Behavior ( ordered Ġ= Ġtrue ) Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġiteration Order () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmap Ġ= Ġimmutable Map Of (" x " Ġto Ġnull , Ġ" y " Ġto Ġ 1 ). to Persistent Map () ĊĠĠĠĠĠĠĠ Ġcompare ( set Of (" x ", Ġ" y "), Ġmap . keys ) Ġ{ Ġset Behavior ( ordered Ġ= Ġtrue ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġmap Ġ+= Ġ" x " Ġto Ġ 1 ĊĠĠĠĠĠĠĠ Ġcompare ( set Of (" x ", Ġ" y "), Ġmap . keys ) Ġ{ Ġset Behavior ( ordered Ġ= Ġtrue ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġmap Ġ= Ġmap . remove (" x ") ĊĠĠĠĠĠĠĠ Ġmap Ġ+= Ġ" x " Ġto Ġ 2 ĊĠĠĠĠĠĠĠ Ġcompare ( set Of (" y ", Ġ" x "), Ġmap . keys ) Ġ{ Ġset Behavior ( ordered Ġ= Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠ Ġcompare ( listOf ( 1 , Ġ 2 ), Ġmap . values ) Ġ{ Ġcollection Behavior ( ordered Ġ= Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠ Ġcompare ( map Of (" y " Ġto Ġ 1 , Ġ" x " Ġto Ġ 2 ). entries , Ġmap . entries ) Ġ{ Ġset Behavior ( ordered Ġ= Ġtrue ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠImmutableMap Test Ġ{ ĊĊĠĠĠ Ġabstract Ġfun Ġ< K , ĠV > Ġimmutable Map Of ( var arg Ġpairs : ĠPair < K , ĠV >): ĠPersistent Map < K , ĠV > ĊĊĠĠĠ Ġopen Ġfun Ġ< K , ĠV > Ġcompare Maps ( expected : ĠMap < K , ĠV >, Ġactual : ĠMap < K , ĠV >) Ġ= Ġcompare Maps Un ordered ( expected , Ġactual ) ĊĠĠĠ Ġfun Ġ< K , ĠV > Ġcompare Maps Un ordered ( expected : ĠMap < K , ĠV >, Ġactual : ĠMap < K , ĠV >) Ġ= Ġcompare ( expected , Ġactual ) Ġ{ Ġmap Behavior ( ordered Ġ= Ġfalse ) Ġ} ĊĊĊĠĠĠ Ġ@ Test Ġfun Ġempty () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġempty 1 Ġ= Ġimmutable Map Of < Int , ĠString >() ĊĠĠĠĠĠĠĠ Ġval Ġempty 2 Ġ= Ġimmutable Map Of < String , ĠInt >() ĊĠĠĠĠĠĠĠ ĠassertEquals < Immutable Map < *, Ġ* >>( empty 1 , Ġempty 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of < Int , ĠString >(), Ġempty 1 ) ĊĠĠĠĠĠĠĠ ĠassertSame < Immutable Map < *, Ġ* >>( empty 1 , Ġempty 2 ) ĊĊĠĠĠĠĠĠĠ Ġcompare Maps ( empty Map (), Ġempty 1 ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test Ġfun Ġof Pairs () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap 0 Ġ= Ġmap Of (" x " Ġto Ġ 1 , Ġ" y " Ġto Ġnull , Ġnull Ġto Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġmap 1 Ġ= Ġimmutable Map Of (" x " Ġto Ġ 1 , Ġ" y " Ġto Ġnull , Ġnull Ġto Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġmap 2 Ġ= Ġimmutable Map Of (" x " Ġto Ġ 1 , Ġ" y " Ġto Ġnull , Ġnull Ġto Ġ 2 ) ĊĊĠĠĠĠĠĠĠ Ġcompare Maps ( map 0 , Ġmap 1 ) ĊĠĠĠĠĠĠĠ Ġcompare Maps ( map 1 , Ġmap 2 ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test Ġfun Ġto Immutable () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġmap Of (" x " Ġto Ġ 1 , Ġ" y " Ġto Ġnull , Ġnull Ġto Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġimm Original Ġ= Ġoriginal . to Immutable Map () ĊĠĠĠĠĠĠĠ Ġcompare Maps ( original , Ġimm Original ) ĊĊĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap ( original ) Ġ// Ġcopy ĊĠĠĠĠĠĠĠ Ġvar Ġimm Map Ġ= Ġmap . to Persistent Map () ĊĠĠĠĠĠĠĠ Ġval Ġimm Map 2 Ġ= Ġimm Map . to Immutable Map () ĊĠĠĠĠĠĠĠ ĠassertSame ( imm Map 2 , Ġimm Map ) ĊĊĠĠĠĠĠĠĠ Ġcompare Maps Un ordered ( original , Ġimm Map ) ĊĠĠĠĠĠĠĠ Ġcompare Maps Un ordered ( map , Ġimm Map ) ĊĊĠĠĠĠĠĠĠ Ġmap . remove ( null ) ĊĠĠĠĠĠĠĠ Ġassert Not Equals < Map < *, Ġ* >>( map , Ġimm Map ) ĊĊĠĠĠĠĠĠĠ Ġimm Map Ġ= Ġimm Map . remove ( null ) ĊĠĠĠĠĠĠĠ ĠassertEquals < Map < *, Ġ* >>( map , Ġimm Map ) Ġ// Ġproblem ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test Ġfun Ġput Elements () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmap Ġ= Ġimmutable Map Of < String , ĠInt ?> (). to Persistent Map () ĊĠĠĠĠĠĠĠ Ġmap Ġ= Ġmap . put (" x ", Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġmap Ġ= Ġmap . put (" x ", Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġmap Ġ= Ġmap . put All ( array Of (" x " Ġto Ġnull )) ĊĠĠĠĠĠĠĠ Ġmap Ġ= Ġmap Ġ+ Ġ(" y " Ġto Ġnull ) ĊĠĠĠĠĠĠĠ Ġmap Ġ+= Ġ" y " Ġto Ġ 1 ĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of (" x " Ġto Ġnull , Ġ" y " Ġto Ġ 1 ), Ġmap ) ĊĊĠĠĠĠĠĠĠ Ġmap Ġ+= Ġmap ĊĠĠĠĠĠĠĠ Ġmap Ġ+= Ġmap . map Ġ{ Ġit . key Ġ+ Ġ" !" Ġto Ġit . value Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( map . size , Ġmap . entries . size ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of (" x " Ġto Ġnull , Ġ" y " Ġto Ġ 1 , Ġ" x !" Ġto Ġnull , Ġ" y !" Ġto Ġ 1 ), Ġmap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġput Equal But Not Same Value () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠValue < T >( val Ġvalue : ĠT ) ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġimmutable Map Of (" x " Ġto ĠValue ( 1 )) ĊĊĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= ĠValue ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Map Ġ= Ġmap . put (" x ", ĠnewValue ) ĊĠĠĠĠĠĠĠ Ġassert Not Same ( map , Ġnew Map ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( map , Ġnew Map ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsame Map Ġ= Ġnew Map . put (" x ", ĠnewValue ) ĊĠĠĠĠĠĠĠ ĠassertSame ( new Map , Ġsame Map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġremove Elements () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġimmutable Map Of (" x " Ġto Ġ 1 , Ġnull Ġto Ġ" x "). to Persistent Map () ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< K , ĠV > ĠassertEquals ( expected : ĠMap < out ĠK , ĠV >, Ġactual : ĠMap < out ĠK , ĠV >) Ġ= Ġkotlin . test . assertEquals ( expected , Ġactual ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of (" x " Ġto Ġ 1 ), Ġmap . remove ( null )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of (" x " Ġto Ġ 1 ), Ġmap . remove ( null , Ġ" x ")) ĊĠĠĠĠĠĠĠ ĠassertEquals ( map , Ġmap . remove (" x ", Ġ 2 )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( empty Map (), Ġmap . clear ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( empty Map (), Ġmap . remove (" x "). remove ( null )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġremove Collection () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġimmutable Map Of ( 0 Ġto Ġ" a ", Ġ 1 Ġto Ġ" B ", Ġ 2 Ġto Ġ" c ") ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Map Ġ= Ġmap Ġ- Ġset Of ( 2 ) Ġ- Ġsequence Of ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of ( 0 Ġto Ġ" a "), Ġnew Map ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġremove Matching () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġimmutable Map Of ( 0 Ġto Ġ" a ", Ġ 1 Ġto Ġ" B ", Ġ 2 Ġto Ġ" c ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Map Ġ= Ġmap . mutate Ġ{ Ġit . entries . removeAll Ġ{ Ġit . key Ġ% Ġ 2 Ġ== Ġ 0 Ġ} Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of ( 1 Ġto Ġ" B "), Ġnew Map ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test Ġfun Ġbuilder () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġimmutable Map Of < Char , ĠInt ?> (). builder () ĊĠĠĠĠĠĠĠ Ġ" abc x ax yz 1 2 ". associate To ( builder ) Ġ{ Ġit Ġto Ġit . toInt () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġbuilder . build () ĊĠĠĠĠĠĠĠ ĠassertEquals < Map < *, Ġ* >>( map , Ġbuilder ) ĊĠĠĠĠĠĠĠ ĠassertSame ( map , Ġbuilder . build (), Ġ" Building Ġthe Ġsame Ġlist Ġwithout Ġmodifications ") ĊĊĠĠĠĠĠĠĠ Ġval Ġmap 2 Ġ= Ġbuilder . to Immutable Map () ĊĠĠĠĠĠĠĠ ĠassertSame ( map 2 , Ġmap , Ġ" to Immutable Ġcalls Ġbuild () ") ĊĊĠĠĠĠĠĠĠ Ġwith ( map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Mutation Ġ{ Ġput (' K ', Ġnull ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Mutation Ġ{ Ġput All (" kotlin ". associate Ġ{ Ġit Ġto Ġ 0 Ġ}) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Mutation Ġ{ Ġthis [' a '] Ġ= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Mutation Ġ{ Ġremove (' x ') Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Mutation Ġ{ Ġclear () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< K , ĠV > ĠPersistent Map < K , ĠV >. test Mutation ( operation : ĠMutable Map < K , ĠV >. () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmutable Ġ= ĠHashMap ( this ) Ġas ĠMutable Map < K , ĠV > ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġthis . builder () ĊĊĠĠĠĠĠĠĠ Ġoperation ( mutable ) ĊĠĠĠĠĠĠĠ Ġoperation ( builder ) ĊĊĠĠĠĠĠĠĠ Ġcompare Maps Un ordered ( mutable , Ġbuilder ) ĊĠĠĠĠĠĠĠ Ġcompare Maps Un ordered ( mutable , Ġbuilder . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġno Operation () Ġ{ ĊĠĠĠĠĠĠĠ Ġimmutable Map Of < Int , ĠString >(). to Persistent Map (). test No Operation ({ Ġclear () Ġ}, Ġ{ Ġclear () Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġimmutable Map Of (" x " Ġto Ġ 1 , Ġnull Ġto Ġ" x "). to Persistent Map () ĊĠĠĠĠĠĠĠ Ġwith ( map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest No Operation ({ Ġremove (" y ") Ġ}, Ġ{ Ġremove (" y ") Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest No Operation ({ Ġremove (" x ", Ġ 2 ) Ġ}, Ġ{ Ġremove (" x ", Ġ 2 ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest No Operation ({ Ġput (" x ", Ġ 1 ) Ġ}, Ġ{ Ġput (" x ", Ġ 1 ) Ġ}) ĠĠĠĠ Ġ// Ġdoes Ġnot Ġhold ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest No Operation ({ Ġput All ( this ) Ġ}, Ġ{ Ġput All ( this ) Ġ}) ĠĠ Ġ// Ġdoes Ġnot Ġhold ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest No Operation ({ Ġput All ( empty Map ()) Ġ}, Ġ{ Ġput All ( empty Map ()) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< K , ĠV > ĠPersistent Map < K , ĠV >. test No Operation ( persistent : ĠPersistent Map < K , ĠV >. () Ġ-> ĠPersistent Map < K , ĠV >, Ġmut ating : ĠMutable Map < K , ĠV >. () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġthis . persistent () ĊĠĠĠĠĠĠĠ Ġval Ġbuild Result Ġ= Ġthis . mutate ( mut ating ) ĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġnon - mut ating Ġoperations Ġreturn Ġthe Ġsame Ġinstance ĊĠĠĠĠĠĠĠ ĠassertSame ( this , Ġresult ) ĊĠĠĠĠĠĠĠ ĠassertSame ( this , Ġbuild Result ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġco variant Typing () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Nothing Ġ= Ġimmutable Map Of < Nothing , ĠNothing >() ĊĠĠĠĠĠĠĠ Ġval Ġmap SI : ĠPersistent Map < String , ĠInt > Ġ= Ġmap Nothing Ġ+ Ġ(" x " Ġto Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġmap S NI : ĠPersistent Map < String , ĠInt ?> Ġ= Ġmap SI Ġ+ Ġmap Of (" y " Ġto Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġmap ANA : ĠPersistent Map < Any , ĠAny ?> Ġ= Ġmap S NI Ġ+ ĠlistOf ( 1 Ġto Ġ" x ") ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of ( 1 Ġto Ġ" x ", Ġ" x " Ġto Ġ 1 , Ġ" y " Ġto Ġnull ), Ġmap ANA ) ĊĠĠĠ Ġ} Ċ }