package Ġcom . so yle . stories . use case . scene Ċ Ċ import Ġcom . so yle . stories . domain . non Blank Str Ċ import Ġcom . so yle . stories . domain . project . Project Ċ import Ġcom . so yle . stories . domain . pro se . Pro se Ċ import Ġcom . so yle . stories . domain . scene . Scene Ċ import Ġcom . so yle . stories . domain . scene . Scene Locale Double Ċ import Ġcom . so yle . stories . domain . scene . make Scene Ċ import Ġcom . so yle . stories . domain . shouldBe Ċ import Ġcom . so yle . stories . domain . validation . Non Blank String Ċ import Ġcom . so yle . stories . use case . repositories . Scene Repository Double Ċ import Ġcom . so yle . stories . use case . scene . list All Sc enes . Scene Item Ċ import Ġcom . so yle . stories . use case . scene . reorder Scene . Re order Scene Ċ import Ġcom . so yle . stories . use case . scene . reorder Scene . Re order Scene UseCase Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . Assertions Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . params . Parameterized Test Ċ import Ġorg . junit . jupiter . params . provider . Value Source Ċ Ċ class ĠRe order Scene UnitTest Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġscene Id Ġ= ĠScene . Id () ĊĠĠĠ Ġprivate Ġval Ġother Scene Ids Ġ= ĠList ( 5 ) Ġ{ ĠScene . Id () Ġ} ĊĠĠĠ Ġprivate Ġval Ġscene Name Ġ= ĠNon Blank String . create (" Target ĠScene ") !! ĊĠĠĠ Ġprivate Ġval Ġscene Pro se Ġ= ĠPro se . Id () ĊĠĠĠ Ġprivate Ġval ĠprojectId Ġ= ĠProject . Id () ĊĊĠĠĠ Ġprivate Ġvar Ġsaved Scene Ids : ĠList < Scene . Id >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġresult : ĠAny ? Ġ= Ġnull ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` scene Ġdoes Ġnot Ġexist `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ` when Ġscene Ġis Ġreordered `( 0 ) ĊĠĠĠĠĠĠĠ Ġresult ĠshouldBe Ġscene DoesNotExist ( scene Id . uuid ) ĊĠĠĠĠĠĠĠ ĠAssertions . assertNull ( saved Scene Ids ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` index Ġless Ġthan Ġ 0 `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ` given Ġscene Ġexists `() ĊĠĠĠĠĠĠĠ Ġ` when Ġscene Ġis Ġreordered ` (- 1 ) ĊĠĠĠĠĠĠĠ Ġresult ĠshouldBe Ġ{ Ġit Ġas ĠIndex OutOfBoundsException Ġ} ĊĠĠĠĠĠĠĠ ĠAssertions . assertNull ( saved Scene Ids ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` index Ġgreater Ġthan Ġscene Ġcount `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ` given Ġscene Ġexists `() ĊĠĠĠĠĠĠĠ Ġ` when Ġscene Ġis Ġreordered `( 2 ) ĊĠĠĠĠĠĠĠ Ġresult ĠshouldBe Ġ{ Ġit Ġas ĠIndex OutOfBoundsException Ġ} ĊĠĠĠĠĠĠĠ ĠAssertions . assertNull ( saved Scene Ids ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Parameterized Test ĊĠĠĠ Ġ@ Value Source ( ints Ġ= Ġ[ 0 , Ġ 1 ]) ĊĠĠĠ Ġfun Ġ` scene Ġalready Ġat Ġindex `( insert Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ` given Ġscene Ġexists `() ĊĠĠĠĠĠĠĠ Ġ` when Ġscene Ġis Ġreordered `( insert Index ) ĊĠĠĠĠĠĠĠ Ġresult ĠshouldBe Ġresponse Model () ĊĠĠĠĠĠĠĠ ĠAssertions . assertNull ( saved Scene Ids ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` scene Ġat Ġdifferent Ġindex `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ` given Ġscene Ġexists `( existing Scene Count Ġ= Ġ 5 , Ġat Index Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ` when Ġscene Ġis Ġreordered `( 3 ) ĊĠĠĠĠĠĠĠ Ġresult ĠshouldBe Ġresponse Model ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Index Ġ= Ġ 1 , Ġnew Index Ġ= Ġ 2 , Ġupdates Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( other Scene Ids [ 2 ] Ġto Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( other Scene Ids [ 0 ], Ġother Scene Ids [ 2 ], Ġscene Id , Ġother Scene Ids [ 3 ], Ġother Scene Ids [ 4 ]), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Scene Ids ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` move Ġbackward `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ` given Ġscene Ġexists `( existing Scene Count Ġ= Ġ 5 , Ġat Index Ġ= Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġ` when Ġscene Ġis Ġreordered `( 0 ) ĊĠĠĠĠĠĠĠ Ġresult ĠshouldBe Ġresponse Model ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Index Ġ= Ġ 3 , Ġnew Index Ġ= Ġ 0 , Ġupdates Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( other Scene Ids [ 0 ] Ġto Ġ 1 , Ġother Scene Ids [ 1 ] Ġto Ġ 2 , Ġother Scene Ids [ 2 ] Ġto Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( scene Id , Ġother Scene Ids [ 0 ], Ġother Scene Ids [ 1 ], Ġother Scene Ids [ 2 ], Ġother Scene Ids [ 4 ]), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Scene Ids ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` move Ġto Ġend `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ` given Ġscene Ġexists `( existing Scene Count Ġ= Ġ 4 , Ġat Index Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ` when Ġscene Ġis Ġreordered `( 4 ) ĊĠĠĠĠĠĠĠ Ġresult ĠshouldBe Ġresponse Model ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Index Ġ= Ġ 1 , Ġnew Index Ġ= Ġ 3 , Ġupdates Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( other Scene Ids [ 2 ] Ġto Ġ 1 , Ġother Scene Ids [ 3 ] Ġto Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( other Scene Ids [ 0 ], Ġother Scene Ids [ 2 ], Ġother Scene Ids [ 3 ], Ġscene Id ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved Scene Ids ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġscene Repository Ġ= ĠScene Repository Double ( on Update Scene Order Ġ= Ġ{ Ġ_, Ġit Ġ-> Ġsaved Scene Ids Ġ= Ġit Ġ}) ĊĠĠĠ Ġprivate Ġvar Ġoriginal Scene Order : ĠList < Scene . Id > Ġ= ĠlistOf () ĊĊĠĠĠ Ġprivate Ġfun Ġ` given Ġscene Ġexists `( existing Scene Count : ĠInt Ġ= Ġ 1 , Ġat Index : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscene Repository . scene Order [ projectId ] Ġ= ĠList ( existing Scene Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscene Id Ġ= Ġif Ġ( it Ġ== Ġat Index ) Ġscene Id Ġelse Ġother Scene Ids [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscene Name Ġ= Ġif Ġ( it Ġ== Ġat Index ) Ġscene Name Ġelse Ġnon Blank Str () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Id Ġ= Ġif Ġ( it Ġ== Ġat Index ) Ġscene Pro se Ġelse ĠPro se . Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Scene ( scene Id , ĠprojectId , Ġscene Name , Ġpro se Id Ġ= Ġpro se Id ) ĊĠĠĠĠĠĠĠ Ġ}. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene Repository . scenes [ it . id ] Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠ Ġoriginal Scene Order Ġ= Ġscene Repository . scene Order [ projectId ] !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ` when Ġscene Ġis Ġreordered `( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuse Case : ĠRe order Scene Ġ= ĠRe order Scene UseCase ( scene Repository ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġobject Ġ: ĠRe order Scene . Output Port Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfailed To Re order Scene ( failure : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġfailure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġscene Re ordered ( response : ĠRe order Scene . Response Model ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Case . invoke ( Re order Scene . Request Model ( scene Id . uuid , Ġindex , ĠScene Locale Double ()), Ġoutput ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresponse Model ( ĊĠĠĠĠĠĠĠ Ġinitial Index : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġnew Index : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġupdates : ĠList < Pair < Scene . Id , ĠInt >> Ġ= ĠlistOf () ĊĠĠĠ Ġ): Ġ( Any ?) Ġ-> ĠUnit Ġ= Ġ{ Ġactual Ġ-> ĊĠĠĠĠĠĠĠ Ġactual Ġas ĠRe order Scene . Response Model ĊĠĠĠĠĠĠĠ ĠassertEquals ( Scene Item ( scene Id . uuid , Ġscene Pro se , Ġscene Name . value , Ġnew Index ), Ġactual . scene ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( initial Index , Ġactual . old Index ) Ġ{ Ġ" Original Ġindex Ġnot Ġcorrectly Ġoutput " Ġ} ĊĠĠĠĠĠĠĠ Ġassert Updated Items Output ( actual , Ġupdates . toMap ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Updated Items Output ( actual : ĠRe order Scene . Response Model , Ġupdates : ĠMap < Scene . Id , ĠInt >) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdates . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScene Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . key . uuid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene Repository . scenes . getValue ( it . key ). pro se Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene Repository . scenes . getValue ( it . key ). name . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual . updated Sc enes ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ" Not Ġall Ġexpected Ġscenes Ġin Ġoutput .\ n Target ed ĠScene : Ġ${ actual . scene }" Ġ} ĊĠĠĠ Ġ} Ċ Ċ }