/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 1 8 Ġ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 . stress Tests . immutable Map Ċ Ċ import Ġkotlinx . collections . immutable . stress Tests . Object Wrapper Ċ import Ġkotlinx . collections . immutable . stress Tests . Wrapper Generator Ċ import Ġkotlinx . collections . immutable . persistent HashMap Of Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . Assert .* Ċ import Ġjava . util .* Ċ Ċ class ĠPersistent HashMap Builder Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠisEmpty Tests () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġpersistent HashMap Of < Int , ĠString >(). builder () ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( builder . isEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġelements ToAdd Ġ= Ġ 1 0 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder [ index ] Ġ= Ġindex . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( builder . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . remove ( builder . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( builder . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . remove ( builder . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( builder . isEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsize Tests () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġpersistent HashMap Of < Int , ĠInt >(). builder () ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( builder . size Ġ== Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġelements ToAdd Ġ= Ġ 1 0 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( builder . put ( index , Ġindex )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( index Ġ+ Ġ 1 , Ġbuilder . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( index , Ġbuilder . put ( index , Ġ 7 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( index Ġ+ Ġ 1 , Ġbuilder . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 7 , Ġbuilder . put ( index , Ġindex )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( index Ġ+ Ġ 1 , Ġbuilder . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( index , Ġbuilder . remove ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( elements ToAdd Ġ- Ġindex Ġ- Ġ 1 , Ġbuilder . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( builder . remove ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( elements ToAdd Ġ- Ġindex Ġ- Ġ 1 , Ġbuilder . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġkeys Values Entries Tests () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġpersistent HashMap Of < Int , ĠInt >(). builder () ĊĠĠĠĠĠĠĠ ĠassertTrue ( builder . keys . isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( builder . values . isEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġmutable Set Of < Int >() ĊĠĠĠĠĠĠĠ Ġval Ġrandom Ġ= ĠRandom () ĊĊĠĠĠĠĠĠĠ Ġval Ġelements ToAdd Ġ= Ġ 2 0 0 0 ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġrandom . nextInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset . add ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder [ key ] Ġ= Ġkey ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( set . sorted (), Ġbuilder . keys . sorted ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( set . sorted (), Ġbuilder . values . sorted ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . entries . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( entry . key , Ġentry . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( set . contains ( entry . key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset . to Mutable Set (). forEach Ġ{ Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . remove ( key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( set . sorted (), Ġbuilder . keys . sorted ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( set . sorted (), Ġbuilder . values . sorted ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . entries . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( entry . key , Ġentry . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( set . contains ( entry . key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġremove Tests () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġpersistent HashMap Of < Int , ĠString >(). builder () ĊĊĠĠĠĠĠĠĠ Ġval Ġelements ToAdd Ġ= Ġ 1 0 0 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder [ index ] Ġ= Ġindex . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( elements ToAdd Ġ- Ġindex , Ġbuilder . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( index . toString (), Ġbuilder [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( index . toString (), Ġbuilder . remove ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( builder [ index ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġremove Entry Tests () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġpersistent HashMap Of < Int , ĠString >(). builder () ĊĊĠĠĠĠĠĠĠ Ġval Ġelements ToAdd Ġ= Ġ 1 0 0 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder [ index ] Ġ= Ġindex . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( elements ToAdd Ġ- Ġindex , Ġbuilder . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( index . toString (), Ġbuilder [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( builder . remove ( index , Ġ( index Ġ+ Ġ 1 ). toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( index . toString (), Ġbuilder [ index ]) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( builder . remove ( index , Ġindex . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( builder [ index ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Tests () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġpersistent HashMap Of < Int , ĠString >(). builder () ĊĊĠĠĠĠĠĠĠ Ġval Ġelements ToAdd Ġ= Ġ 1 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder [ index ] Ġ= Ġindex . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( i . toString (), Ġbuilder [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġelements ToAdd Ġ- Ġ 1 Ġdown To Ġindex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( i . toString (), Ġbuilder [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . remove ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġput Tests () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġpersistent HashMap Of < Int , ĠString >(). builder () ĊĊĠĠĠĠĠĠĠ Ġval Ġelements ToAdd Ġ= Ġ 5 0 0 0 ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( builder . put ( index , Ġ( index Ġ* Ġ 2 ). toString ())) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (( i Ġ+ Ġindex ). toString (), Ġbuilder [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (( i Ġ+ Ġindex ). toString (), Ġbuilder . put ( i , Ġ( i Ġ+ Ġindex Ġ+ Ġ 1 ). toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (( i Ġ+ Ġindex Ġ+ Ġ 1 ). toString (), Ġbuilder [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindex Ġuntil Ġelements ToAdd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġelements ToAdd Ġ- Ġindex Ġ+ Ġi ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected . toString (), Ġbuilder [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected . toString (), Ġbuilder . put ( i , Ġ( expected Ġ- Ġ 1 ). toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (( expected Ġ- Ġ 1 ). toString (), Ġbuilder [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . remove ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcollision Tests () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġpersistent HashMap Of < Object Wrapper < Int >, ĠInt >(). builder () ĊĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġ 2 ) Ġ{ Ġremove Entry Predicate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Gen Ġ= ĠWrapper Generator < Int >( 2 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġkey ( key : ĠInt ): ĠObject Wrapper < Int > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkey Gen . wrapper ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelements ToAdd Ġ= Ġ 1 0 0 0 0 0 ĠĠ Ġ/// Ġshould Ġbe Ġmore Ġthan Ġkey Gen . hashCode Upper Bound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( builder . put ( key ( index ), ĠInt . MIN _ VALUE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Int . MIN _ VALUE , Ġbuilder [ key ( index )]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( index Ġ+ Ġ 1 , Ġbuilder . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Int . MIN _ VALUE , Ġbuilder . put ( key ( index ), Ġindex )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( index Ġ+ Ġ 1 , Ġbuilder . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollisions Ġ= Ġkey Gen . wrapper sBy HashCode ( key ( index ). hashCode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( coll isions . contains ( key ( index ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġcollisions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( key . obj , Ġbuilder [ key ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġelements ToAdd ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcollisions Ġ= Ġkey Gen . wrapper sBy HashCode ( key ( index ). hashCode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( coll isions . contains ( key ( index ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( builder [ key ( index )] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġcollisions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( builder [ key ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġcollisions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( key . obj , Ġbuilder [ key ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remove Entry Predicate Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( builder . remove ( Object Wrapper ( Int . MIN _ VALUE , Ġkey . hashCode ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( key . obj , Ġbuilder [ key ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( true , Ġbuilder . remove ( key , Ġkey . obj )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( builder [ key ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( builder . remove ( Object Wrapper ( Int . MIN _ VALUE , Ġkey . hashCode ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( key . obj , Ġbuilder [ key ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( key . obj , Ġbuilder . remove ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( builder [ key ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( builder . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrandom Operations Tests () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Gen Ġ= Ġmutable ListOf ( List ( 2 0 ) Ġ{ Ġpersistent HashMap Of < Object Wrapper < Int >, ĠInt >() Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġmutable ListOf ( List ( 2 0 ) Ġ{ Ġmap Of < Object Wrapper < Int >, ĠInt >() Ġ}) ĊĊĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġ 1 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Ġ= ĠRandom () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild ers Ġ= Ġmap Gen . last (). map Ġ{ Ġit . builder () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaps Ġ= Ġbuild ers . map Ġ{ Ġit . to Mutable Map () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Count Ġ= Ġ 2 0 0 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Codes Ġ= ĠList ( operation Count Ġ/ Ġ 2 ) Ġ{ Ġrandom . nextInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( times Ġ= Ġoperation Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġrandom . nextInt ( maps . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmaps [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġbuild ers [ index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Type Ġ= Ġrandom . next Double () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠhashCode Index Ġ= Ġrandom . nextInt ( hash Codes . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠObject Wrapper ( random . nextInt (), Ġhash Codes [ hashCode Index ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Remove Ġ= Ġoperation Type Ġ< Ġ 0 . 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Remove Entry Ġ= Ġ! should Remove Ġ&& Ġoperation Type Ġ< Ġ 0 . 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Remove Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( map . remove ( key ), Ġbuilder . remove ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Remove Entry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġrandom . nextInt ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( map . remove ( key , Ġvalue ), Ġbuilder . remove ( key , Ġvalue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġrandom . nextInt ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( map . put ( key , Ġvalue ), Ġbuilder . put ( key , Ġvalue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( map . size , Ġbuilder . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( map [ key ], Ġbuilder [ key ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( map . containsKey ( key ), Ġbuilder . containsKey ( key )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( mutable Map . contains Value ( key ), Ġnew Immutable Map . contains Value ( key )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( mutable Map . keys . sorted (), Ġnew Immutable Map . keys . sorted ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( mutable Map . values . sorted (), Ġnew Immutable Map . values . sorted ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Gen . add ( Ġbuild ers . map Ġ{ Ġit . build () Ġ} Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected . add ( Ġmap Gen . last (). map Ġ{ Ġit . to Mutable Map () Ġ} Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( maps . max By Ġ{ Ġit . size Ġ} ?. size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmap Gen . forEach Indexed Ġ{ Ġindex , Ġmaps Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected [ index ]. map Ġ{ Ġit . to Sorted Map () Ġ}, Ġmaps . map Ġ{ Ġit . to Sorted Map () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }