package Ġgames . game 2 0 4 8 Ċ Ċ import Ġboard . Cell Ċ import Ġboard . Direction Ċ import Ġboard . Direction .* Ċ import Ġboard . Game Board Ċ import Ġgames . game . Game Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Test Ċ Ċ class ĠTest Game 2 0 4 8 Ġ{ ĊĠĠĠ Ġprivate Ġfun ĠGame . asString () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 .. 4 ). join ToString ("\ n ") Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 .. 4 ). join ToString (" Ġ") Ġ{ Ġj Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ get ( i , Ġj ) Ġ?: Ġ"- "} " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠTest Game 2 0 4 8 Initializer ( moves : ĠList < Move >) Ġ: ĠGame 2 0 4 8 Initializer < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġmoves . iterator () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext Value ( board : ĠGame Board < Int ?> ): ĠPair < Cell , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġboard . getCell ( move . position . first , Ġmove . position . second ) Ġto Ġmove . value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Game ( moves : ĠList < Move >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgame Ġ= Ġnew Game 2 0 4 8 ( Test Game 2 0 4 8 Initializer ( moves )) ĊĠĠĠĠĠĠĠ Ġgame . initialize () ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchecking Ġthe Ġstate Ġafter Ġinitialization ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġmoves [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Ġ= Ġmoves [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" Wrong Ġresult Ġafter Ġboard Ġinitialization Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" by Ġ'${ first . value }' Ġat Ġ${ first . cell } Ġand Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"' ${ second . value }' Ġat Ġ${ second . cell }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond . board , Ġgame . asString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġmove ) Ġin Ġmoves . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( move . direction Ġ== Ġnull ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchecking Ġthe Ġstate Ġafter Ġeach Ġmove ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame . process Move ( move . direction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Ġ= Ġmoves [ index Ġ- Ġ 1 ]. board ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertEquals (" Wrong Ġresult Ġafter Ġmoving Ġ${ move . direction } Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" and Ġthen Ġadding Ġ'${ move . value }' Ġto Ġ${ move . cell } Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" for \ n $ prev \ n Expected :\ n ${ move . board }\ n Actual :\ n ${ game . asString () }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove . board , Ġgame . asString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠMove ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition : ĠPair < Int , ĠInt >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirection : ĠDirection ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Board : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcell : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" Cell (${ position . first }, Ġ${ position . second })" ĊĊĠĠĠĠĠĠĠ Ġval Ġboard : ĠString Ġ= Ġinitial Board . trim Margin () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Moves () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Game ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 1 , Ġ 1 ), Ġ 2 , Ġnull , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 2 Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 1 , Ġ 4 ), Ġ 2 , Ġnull , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 2 Ġ- Ġ- Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 3 , Ġ 2 ), Ġ 4 , ĠRIGHT , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ 4 Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 4 , Ġ 2 ), Ġ 2 , ĠUP , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ 4 Ġ- Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ 2 Ġ- Ġ- "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 2 , Ġ 2 ), Ġ 2 , ĠLEFT , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 8 Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ 2 Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 2 Ġ- Ġ- Ġ- "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 4 , Ġ 4 ), Ġ 2 , ĠDOWN , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 8 Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 2 Ġ 2 Ġ- Ġ 2 "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 3 , Ġ 3 ), Ġ 2 , ĠRIGHT , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ 2 Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ 2 Ġ 4 "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 1 , Ġ 2 ), Ġ 4 , ĠDOWN , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ 4 Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ 4 Ġ 4 "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 3 , Ġ 1 ), Ġ 2 , ĠRIGHT , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 2 Ġ- Ġ- Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ 8 "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 3 , Ġ 3 ), Ġ 2 , ĠDOWN , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ 2 Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 2 Ġ- Ġ- Ġ 1 6 "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 2 , Ġ 3 ), Ġ 2 , ĠDOWN , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ 2 Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 2 Ġ- Ġ 2 Ġ 1 6 "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 1 , Ġ 4 ), Ġ 2 , ĠRIGHT , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ 4 Ġ 1 6 "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 3 , Ġ 2 ), Ġ 2 , ĠLEFT , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 2 Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 2 Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 4 Ġ 2 Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 4 Ġ 1 6 Ġ- Ġ- "" "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( Pair ( 1 , Ġ 3 ), Ġ 2 , ĠDOWN , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ 2 Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ|- Ġ- Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 4 Ġ 2 Ġ- Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ| 8 Ġ 1 6 Ġ- Ġ- """) ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} Ċ } Ċ