package Ġcs ense . kotlin . ds . cache Ċ Ċ import Ġcs ense . kotlin . tests . assertions .* Ċ import Ġkotlin . test .* Ċ Ċ class ĠSimple LR U Cache Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġput () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsmall Cache Ġ= ĠSimple LR U Cache < String , ĠString >( 1 ) ĊĠĠĠĠĠĠĠ Ġsmall Cache . put (" 1 2 3 4 ", Ġ" 1 2 3 4 "). assertNull (" should Ġnot Ġev ict Ġany Ġkey ") ĊĠĠĠĠĠĠĠ Ġsmall Cache . put (" abc ", Ġ" abc "). assertNotNull And Equals (" 1 2 3 4 ", Ġ" should Ġev ict Ġthe Ġfirst Ġkey ") ĊĊĠĠĠĠĠĠĠ Ġval Ġlarge Cache Ġ= ĠSimple LR U Cache < String , ĠString >( 5 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlarge Cache . put ( i . toString (), Ġi . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// now Ġlets Ġsee Ġthat Ġwe Ġalso Ġget Ġthe Ġorder Ġand Ġthe Ġcount Ġstill Ġmatches . ĊĠĠĠĠĠĠĠ Ġlarge Cache . put (" a 1 ", Ġ" a 1 "). assertNotNull And Equals (" 0 ") ĊĠĠĠĠĠĠĠ Ġlarge Cache . put (" a 2 ", Ġ" a 2 "). assertNotNull And Equals (" 1 ") ĊĠĠĠĠĠĠĠ Ġlarge Cache . put (" a 3 ", Ġ" a 3 "). assertNotNull And Equals (" 2 ") ĊĠĠĠĠĠĠĠ Ġlarge Cache . put (" a 4 ", Ġ" a 4 "). assertNotNull And Equals (" 3 ") ĊĠĠĠĠĠĠĠ Ġlarge Cache . put (" a 5 ", Ġ" a 5 "). assertNotNull And Equals (" 4 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcontains Key () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsmall Cache Ġ= ĠSimple LR U Cache < String , ĠString >( 2 ) ĊĠĠĠĠĠĠĠ Ġsmall Cache . put (" 1 2 3 4 ", Ġ" 1 2 3 4 ") ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey (" 1 2 3 4 "). assertTrue () ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey (" 1 2 3 "). assertFalse () ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey (" abc "). assertFalse () ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey (" 1 "). assertFalse () ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey ("_ "). assertFalse () ĊĠĠĠĠĠĠĠ Ġsmall Cache . put (" random ", Ġ" omg ") ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey (" 1 2 3 4 "). assertTrue () ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey (" random "). assertTrue () ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey (" 1 2 3 "). assertFalse () ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey (" r ando "). assertFalse () ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey (" random 2 "). assertFalse () ĊĠĠĠĠĠĠĠ Ġsmall Cache . put (" 1 2 3 4 5 ", Ġ" 2 ") ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey (" 1 2 3 4 "). assertFalse () ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey (" random "). assertTrue () ĊĠĠĠĠĠĠĠ Ġsmall Cache . containsKey (" 1 2 3 4 5 "). assertTrue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnot ContainsKey () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsmall Cache Ġ= ĠSimple LR U Cache < String , ĠString >( 2 ) ĊĠĠĠĠĠĠĠ Ġsmall Cache . put (" 1 2 3 4 ", Ġ" 1 2 3 4 ") ĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey (" 1 2 3 4 "). assertFalse () ĊĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey (" 1 2 3 "). assertTrue () ĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey (" abc "). assertTrue () ĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey (" 1 "). assertTrue () ĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey ("_ "). assertTrue () ĊĠĠĠĠĠĠĠ Ġsmall Cache . put (" random ", Ġ" omg ") ĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey (" 1 2 3 4 "). assertFalse () ĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey (" random "). assertFalse () ĊĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey (" 1 2 3 "). assertTrue () ĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey (" r ando "). assertTrue () ĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey (" random 2 "). assertTrue () ĊĠĠĠĠĠĠĠ Ġsmall Cache . put (" 1 2 3 4 5 ", Ġ" 2 ") ĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey (" 1 2 3 4 "). assertTrue () ĊĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey (" random "). assertFalse () ĊĠĠĠĠĠĠĠ Ġsmall Cache . not ContainsKey (" 1 2 3 4 5 "). assertFalse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠSimple LR U Cache < String , ĠString >( 2 ) ĊĠĠĠĠĠĠĠ Ġ// empty Ġcase ĊĠĠĠĠĠĠĠ Ġcache [ "" ]. assertNull () ĊĠĠĠĠĠĠĠ Ġcache [" test "]. assertNull () ĊĠĠĠĠĠĠĠ Ġ// Ġsingle Ġcase ĊĠĠĠĠĠĠĠ Ġcache [" abc "] Ġ= Ġ" abc " ĊĠĠĠĠĠĠĠ Ġcache [ "" ]. assertNull () ĊĠĠĠĠĠĠĠ Ġcache [" test "]. assertNull () ĊĠĠĠĠĠĠĠ Ġcache [" abc "]. assertNotNull And Equals (" abc ") ĊĠĠĠĠĠĠĠ Ġ// Ġmultiple Ġcase ĊĠĠĠĠĠĠĠ Ġcache [" 1 2 3 "] Ġ= Ġ" 4 " ĊĠĠĠĠĠĠĠ Ġcache [ "" ]. assertNull () ĊĠĠĠĠĠĠĠ Ġcache [" test "]. assertNull () ĊĠĠĠĠĠĠĠ Ġcache [" abc "]. assertNotNull And Equals (" abc ") ĊĠĠĠĠĠĠĠ Ġcache [" 1 2 3 "]. assertNotNull And Equals (" 4 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Or Remove () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠSimple LR U Cache < String , ĠString >( 2 ) ĊĠĠĠĠĠĠĠ Ġcache [" a "]. assertNull () ĊĠĠĠĠĠĠĠ Ġcache . get Or Remove (" a ") Ġ{ Ġ_: ĠString , Ġvalue : ĠString Ġ-> Ġvalue Ġ== Ġ" 1 " Ġ}. assertNull () Ġ// there Ġis Ġnone ĊĠĠĠĠĠĠĠ Ġcache [" a "] Ġ= Ġ" 1 " ĊĠĠĠĠĠĠĠ Ġcache . get Or Remove (" a ") Ġ{ Ġkey : ĠString , Ġ_: ĠString Ġ-> Ġkey Ġ== Ġ" 1 " Ġ}. assertNull (" condition Ġnot Ġok , Ġso Ġshould Ġremove Ġentry ") ĊĠĠĠĠĠĠĠ Ġcache [" a "]. assertNull () ĊĠĠĠĠĠĠĠ Ġcache [" a "] Ġ= Ġ" 2 " ĊĠĠĠĠĠĠĠ Ġcache . get Or Remove (" a ") Ġ{ Ġ_: ĠString , Ġvalue : ĠString Ġ-> Ġvalue Ġ== Ġ" 2 " Ġ}. assertNotNull And Equals (" 2 ") ĊĠĠĠĠĠĠĠ Ġcache [" a "]. assertNotNull And Equals (" 2 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠSimple LR U Cache < String , ĠString >( 2 ) ĊĠĠĠĠĠĠĠ Ġcache [" abc "] Ġ= Ġ" 1 2 3 " ĊĠĠĠĠĠĠĠ Ġcache [" abc "]. assertNotNull () ĊĠĠĠĠĠĠĠ Ġcache . remove (" abc "). assertNotNull () ĊĠĠĠĠĠĠĠ Ġcache [" abc "]. assertNull () ĊĊĠĠĠĠĠĠĠ Ġcache [" 1 "] Ġ= Ġ" a " ĊĠĠĠĠĠĠĠ Ġcache [" 2 "] Ġ= Ġ" b " ĊĊĠĠĠĠĠĠĠ Ġcache . remove (" 2 ") ĊĊĠĠĠĠĠĠĠ Ġcache [" 1 "]. assertNotNull () ĊĠĠĠĠĠĠĠ Ġcache [" 2 "]. assertNull () ĊĠĠĠĠĠĠĠ Ġcache . remove (" 1 ") ĊĠĠĠĠĠĠĠ Ġcache [" 1 "]. assertNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset Cache Size () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// test Ġbroken Ġvalues ĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠSimple LR U Cache < String , ĠString >( 1 ) ĊĠĠĠĠĠĠĠ Ġcache . set Cache Size ( 0 ) ĊĠĠĠĠĠĠĠ Ġcache . set (" 1 2 3 4 ", Ġ" 1 2 3 4 "). assertNull () ĊĠĠĠĠĠĠĠ Ġcache . set (" 2 2 2 2 ", Ġ" 2 2 2 2 "). assertNotNull (" Should Ġnot Ġallow Ġcache Ġsize Ġof Ġ 0 , Ġthus Ġthere Ġshould Ġalways Ġbe Ġat Ġleast Ġ 1 Ġsize ") ĊĠĠĠĠĠĠĠ Ġcache . clear () ĊĠĠĠĠĠĠĠ Ġcache . set Cache Size (- 2 0 ) ĊĠĠĠĠĠĠĠ Ġcache . set (" 1 2 3 4 ", Ġ" 1 2 3 4 "). assertNull () ĊĠĠĠĠĠĠĠ Ġcache . set (" 2 2 2 2 ", Ġ" 2 2 2 2 "). assertNotNull (" Should Ġnot Ġallow Ġcache Ġsize Ġof Ġ- 2 0 , Ġthus Ġthere Ġshould Ġalways Ġbe Ġat Ġleast Ġ 1 Ġsize ") ĊĠĠĠĠĠĠĠ Ġ// well Ġlets Ġtry Ġvalid Ġones ĊĊĠĠĠĠĠĠĠ Ġcache . set Cache Size ( 2 ) ĊĠĠĠĠĠĠĠ Ġcache . set (" 1 1 1 1 ", Ġ""). assertNull (" now Ġwe Ġshould Ġhave Ġspace Ġfor Ġ 2 Ġelements ") ĊĠĠĠĠĠĠĠ Ġcache . set (" 1 1 1 2 ", Ġ""). assertNotNull (" should Ġonly Ġhold Ġ 2 Ġitems ") ĊĊĠĠĠĠĠĠĠ Ġcache . set Cache Size ( 1 0 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 2 Ġuntil Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . set (" 0 1 1 $ i ", Ġ""). assertNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcache . set (" 8 8 8 ", Ġ""). assertNotNull (" should Ġonly Ġhold Ġ 1 0 Ġitems .. ") ĊĊĠĠĠĠĠĠĠ Ġcache . set Cache Size ( 2 ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Or Put () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠSimple LR U Cache < String , ĠString >( 2 ) ĊĠĠĠĠĠĠĠ Ġcache [" a "]. assertNull () ĊĠĠĠĠĠĠĠ Ġcache . get Or Put (" a ") Ġ{ Ġ" 1 " Ġ} ĊĠĠĠĠĠĠĠ Ġcache [" a "]. assertNotNull And Equals (" 1 ") ĊĠĠĠĠĠĠĠ Ġcache . get Or Put (" a ") Ġ{ Ġ" 2 " Ġ} ĊĠĠĠĠĠĠĠ Ġcache [" a "]. assertNotNull And Equals (" 1 ", Ġ" should Ġnot Ġupdate Ġvalue Ġif Ġthere .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsmall Cache Ġ= ĠSimple LR U Cache < String , ĠString >( 1 ) ĊĠĠĠĠĠĠĠ Ġsmall Cache . set (" 1 2 3 4 ", Ġ" 1 2 3 4 "). assertNull (" should Ġnot Ġev ict Ġany Ġkey ") ĊĠĠĠĠĠĠĠ Ġsmall Cache . set (" abc ", Ġ" abc "). assertNotNull And Equals (" 1 2 3 4 ", Ġ" should Ġev ict Ġthe Ġfirst Ġkey ") ĊĊĠĠĠĠĠĠĠ Ġval Ġlarge Cache Ġ= ĠSimple LR U Cache < String , ĠString >( 5 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlarge Cache [ i . toString ()] Ġ= Ġi . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// now Ġlets Ġsee Ġthat Ġwe Ġalso Ġget Ġthe Ġorder Ġand Ġthe Ġcount Ġstill Ġmatches . ĊĠĠĠĠĠĠĠ Ġlarge Cache . set (" a 1 ", Ġ" a 1 "). assertNotNull And Equals (" 0 ") ĊĠĠĠĠĠĠĠ Ġlarge Cache . set (" a 2 ", Ġ" a 2 "). assertNotNull And Equals (" 1 ") ĊĠĠĠĠĠĠĠ Ġlarge Cache . set (" a 3 ", Ġ" a 3 "). assertNotNull And Equals (" 2 ") ĊĠĠĠĠĠĠĠ Ġlarge Cache . set (" a 4 ", Ġ" a 4 "). assertNotNull And Equals (" 3 ") ĊĠĠĠĠĠĠĠ Ġlarge Cache . containsKey (" 4 "). assertTrue () ĊĠĠĠĠĠĠĠ Ġlarge Cache [" a 5 "] Ġ= Ġ" a 5 " ĊĠĠĠĠĠĠĠ Ġlarge Cache . containsKey (" 4 "). assertFalse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġbad Size For Init () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbroken Ġ= ĠSimple LR U Cache < String , ĠString >( 0 ) ĊĠĠĠĠĠĠĠ Ġbroken . set (" 1 2 3 4 ", Ġ" 1 2 3 4 "). assertNull () ĊĠĠĠĠĠĠĠ Ġbroken . set (" 2 2 2 2 ", Ġ" 2 2 2 2 "). assertNotNull (" Should Ġnot Ġallow Ġcache Ġsize Ġof Ġ 0 , Ġthus Ġthere Ġshould Ġalways Ġbe Ġat Ġleast Ġ 1 Ġsize ") ĊĊĠĠĠĠĠĠĠ Ġval Ġnegative Ġ= ĠSimple LR U Cache < String , ĠString >( - 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġnegative . set (" 1 2 3 4 ", Ġ" 1 2 3 4 "). assertNull () ĊĠĠĠĠĠĠĠ Ġnegative . set (" 2 2 2 2 ", Ġ" 2 2 2 2 "). assertNotNull (" Should Ġnot Ġallow Ġcache Ġsize Ġof Ġ- 1 0 0 , Ġthus Ġthere Ġshould Ġalways Ġbe Ġat Ġleast Ġ 1 Ġsize ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠSimple LR U Cache < String , ĠString >( 2 ) ĊĠĠĠĠĠĠĠ Ġ// make Ġsure Ġnothing Ġweird Ġhappens ĊĠĠĠĠĠĠĠ Ġcache . clear () ĊĠĠĠĠĠĠĠ Ġ// then Ġtry Ġset Ġsome Ġdata Ġand Ġclear Ġthat . ĊĠĠĠĠĠĠĠ Ġcache . set (" 1 ", Ġ""). assertNull () ĊĠĠĠĠĠĠĠ Ġcache . set (" 2 ", Ġ""). assertNull () ĊĠĠĠĠĠĠĠ Ġcache . clear () ĊĠĠĠĠĠĠĠ Ġcache . set (" a ", Ġ""). assertNull (" should Ġnot Ġhave Ġany Ġdata ") ĊĠĠĠĠĠĠĠ Ġcache . set (" b ", Ġ""). assertNull (" should Ġnot Ġhave Ġany Ġdata ") ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġremove Ol dest () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠSimple LR U Cache < String , ĠString >( 2 ) ĊĠĠĠĠĠĠĠ Ġcache [" 1 "] Ġ= Ġ" 1 " ĊĠĠĠĠĠĠĠ Ġcache [" 2 "] Ġ= Ġ" 2 " ĊĊĠĠĠĠĠĠĠ Ġ// try Ġweird Ġ/ Ġbad Ġvalues ĊĠĠĠĠĠĠĠ Ġcache . remove Ol dest (- 1 0 ) ĊĠĠĠĠĠĠĠ Ġcache . remove Ol dest ( 0 ) ĊĠĠĠĠĠĠĠ Ġ// and ĊĠĠĠĠĠĠĠ Ġcache . remove Ol dest ( 1 ) ĊĠĠĠĠĠĠĠ Ġcache [" 1 "]. assertNull (" 1 Ġis Ġthe Ġoldest ") ĊĠĠĠĠĠĠĠ Ġcache [" 2 "]. assertNotNull () ĊĠĠĠĠĠĠĠ Ġcache . remove Ol dest ( 1 ) ĊĠĠĠĠĠĠĠ Ġcache [" 1 "]. assertNull () ĊĠĠĠĠĠĠĠ Ġcache [" 2 "]. assertNull () ĊĊĠĠĠĠĠĠĠ Ġcache [" a "] Ġ= Ġ" a " ĊĠĠĠĠĠĠĠ Ġcache [" b "] Ġ= Ġ" b " ĊĊĠĠĠĠĠĠĠ Ġcache . remove Ol dest ( 2 ) ĊĠĠĠĠĠĠĠ Ġcache [" a "]. assertNull () ĊĠĠĠĠĠĠĠ Ġcache [" b "]. assertNull () ĊĠĠĠ Ġ} Ċ }