package Ġdev . f rit z 2 . core Ċ Ċ import Ġdev . f rit z 2 . run Test Ċ import Ġkotlin . js . Date Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . time . Duration Unit Ċ import Ġkotlin . time . Experimental Time Ċ import Ġkotlin . time . measure Time Ċ Ċ @ Experimental Time Ċ class ĠMy er Tests Ġ{ ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > ĠMutable List < T >. apply Patch ( patch : ĠPatch < T >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( patch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPatch . Insert < T > Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( patch . index , Ġpatch . element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPatch . Insert Many < T > Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġpatch . elements . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( patch . index , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPatch . Delete < T > Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ( patch . start Ġ+ Ġpatch . count Ġ- Ġ 1 ) Ġdown To Ġpatch . start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPatch . Move < T > Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġget ( patch . from ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove At ( patch . from ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( patch . from Ġ> Ġpatch . to ) Ġadd ( patch . to , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġadd ( patch . to Ġ- Ġ 1 , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcreate TestCase (): ĠPair < Mutable List < String >, ĠMutable List < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġletters Ġ= ĠlistOf (" a ", Ġ" b ", Ġ" c ", Ġ" d ", Ġ" e ", Ġ" f ", Ġ" g ") ĊĠĠĠĠĠĠĠ Ġval Ġmax Start Length Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġval Ġmax Operations Ġ= Ġ 1 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġrand Ġ= ĠRandom ( Date . now (). to Long ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġrand . nextInt ( max Start Length ) Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold . add ( letters [ rand . nextInt ( letters . size )]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( e Ġin Ġold ) Ġnew . add ( e ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 0 Ġuntil Ġrand . nextInt ( max Operations ) Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( rand . nextInt ( 2 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// insert ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġrand . nextInt ( new . size Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġletters [ rand . nextInt ( letters . size )] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew . add ( index , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// delete ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġrand . nextInt ( new . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew . remove At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( old , Ġnew ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġrun TestCase ( old : ĠMutable List < String >, Ġnew : ĠMutable List < String >) Ġ{ Ċ Ċ // ĠĠĠĠĠĠĠ Ġconsole . log (" old : Ġ$ old Ġ\ n ") Ċ // ĠĠĠĠĠĠĠ Ġconsole . log (" new : Ġ$ new Ġ\ n ") ĊĊĠĠĠĠĠĠĠ Ġwith ( measure Time Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpatches Ġ= ĠMy er . diff < String , ĠNothing >( old , Ġnew , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatches . forEach Ġ{ Ġpatch Ġ-> ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (" apply ing Ġpatch : Ġ$ patch Ġ\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold . apply Patch ( patch ) ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (" ... Ġresult : Ġ$ old Ġ\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch ElementException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġthere Ġis Ġnothing Ġto Ġdo Ġthis Ġis Ġok ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( new , Ġold ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toDouble ( Duration Unit . MILLISECONDS )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (" to ok Ġ$ this Ġms Ġ\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrandom Tests () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( old , Ġnew ) Ġ= Ġcreate TestCase () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun TestCase ( old , Ġnew ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Move Right () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ", Ġ" c ", Ġ" d ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġmutable ListOf < String >(" a ", Ġ" c ", Ġ" b ", Ġ" d ") ĊĊĠĠĠĠĠĠĠ Ġrun TestCase ( old , Ġnew ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Move Left () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ", Ġ" c ", Ġ" d ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġmutable ListOf < String >(" d ", Ġ" b ", Ġ" c ", Ġ" a ") ĊĊĠĠĠĠĠĠĠ Ġrun TestCase ( old , Ġnew ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Delete Many End () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ", Ġ" c ", Ġ" d ", Ġ" e ", Ġ" f ", Ġ" g ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ", Ġ" c ", Ġ" d ") ĊĊĠĠĠĠĠĠĠ Ġrun TestCase ( old , Ġnew ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Delete Many Start () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ", Ġ" c ", Ġ" d ", Ġ" e ", Ġ" f ", Ġ" g ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġmutable ListOf < String >(" c ", Ġ" d ", Ġ" e ", Ġ" f ", Ġ" g ") ĊĊĠĠĠĠĠĠĠ Ġrun TestCase ( old , Ġnew ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Delete Many Middle () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ", Ġ" c ", Ġ" d ", Ġ" e ", Ġ" f ", Ġ" g ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ", Ġ" f ", Ġ" g ") ĊĊĠĠĠĠĠĠĠ Ġrun TestCase ( old , Ġnew ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Nothing ToDo () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ") ĊĊĠĠĠĠĠĠĠ Ġrun TestCase ( old , Ġnew ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Insert Many End () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ", Ġ" c ", Ġ" d ", Ġ" e ") ĊĊĠĠĠĠĠĠĠ Ġrun TestCase ( old , Ġnew ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Insert Many Start () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġmutable ListOf < String >(" d ", Ġ" e ", Ġ" f ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ", Ġ" c ", Ġ" d ", Ġ" e ", Ġ" f ") ĊĊĠĠĠĠĠĠĠ Ġrun TestCase ( old , Ġnew ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Insert Many Middle () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġmutable ListOf < String >(" a ", Ġ" d ") ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= Ġmutable ListOf < String >(" a ", Ġ" b ", Ġ" c ", Ġ" d ") ĊĊĠĠĠĠĠĠĠ Ġrun TestCase ( old , Ġnew ) ĊĠĠĠ Ġ} Ċ }