package Ġcom . so yle . stories . use case . scene . location Ċ Ċ import Ġcom . so yle . stories . domain . location . make Location Ċ import Ġcom . so yle . stories . domain . must Equal Ċ import Ġcom . so yle . stories . domain . scene . make Scene Ċ import Ġcom . so yle . stories . use case . repositories . Location Repository Double Ċ import Ġcom . so yle . stories . use case . repositories . Scene Repository Double Ċ import Ġcom . so yle . stories . use case . scene . Scene DoesNotExist Ċ import Ġcom . so yle . stories . use case . scene . in cons ist encies . Scene In cons ist encies Ċ import Ġcom . so yle . stories . use case . scene . in cons ist encies . Scene Setting Location In cons ist encies Ċ import Ġcom . so yle . stories . use case . scene . location . detect In cons ist encies . Detect In cons ist encies In Scene Settings Ċ import Ġcom . so yle . stories . use case . scene . location . detect In cons ist encies . Detect In cons ist encies In Scene Settings UseCase Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . Assertions . assertTrue Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . assert Throws Ċ Ċ class Ġ` Detect ĠIn cons ist encies Ġin ĠScene ĠSettings ĠUnit ĠTest ` Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġscene Ġ= Ġmake Scene () ĊĊĠĠĠ Ġprivate Ġval Ġscene Repository Ġ= ĠScene Repository Double () ĊĠĠĠ Ġprivate Ġval Ġlocation Repository Ġ= ĠLocation Repository Double () ĊĊĠĠĠ Ġprivate Ġvar Ġreport : ĠScene In cons ist encies ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġfun Ġoutput () Ġ= ĠDetect In cons ist encies In Scene Settings . Output Port Ġ{ ĊĠĠĠĠĠĠĠ Ġreport Ġ= Ġit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdetect In cons ist encies : ĠDetect In cons ist encies In Scene Settings Ġ= ĊĠĠĠĠĠĠĠ ĠDetect In cons ist encies In Scene Settings UseCase ( scene Repository , Ġlocation Repository ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġthrow Ġerror Ġgiven Ġscene Ġdoes Ġnot Ġexist `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠassertThrows < Scene DoesNotExist > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetect In cons ist encies ( scene . id , Ġoutput ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġerror . scene Id . must Equal ( scene . id . uuid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` Given ĠScene Ġhas Ġno ĠScene ĠSettings ` Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene Repository . given Scene ( scene ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` should Ġoutput Ġempty Ġscene Ġin consistency Ġreport Ġfor Ġscene Ġsetting `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetect In cons ist encies ( scene . id , Ġoutput ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport !!. scene Id . must Equal ( scene . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue (( report !!. single () Ġas ĠScene In cons ist encies . Scene In consistency . Scene Setting In consistency ). isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` Given ĠScene Ġhas ĠScene ĠSettings Ġwith Ġexisting ĠLoc ations ` Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbacking Locations Ġ= ĠList ( 6 ) Ġ{ Ġmake Location () Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbacking Locations . fold ( scene ) Ġ{ Ġa , Ġb Ġ-> Ġa . with Location Linked ( b ). scene Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let ( scene Repository :: given Scene ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbacking Locations . forEach ( location Repository :: given Location ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` should Ġoutput Ġno Ġin cons ist encies Ġfor Ġeach Ġlocation Ġin Ġscene `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetect In cons ist encies ( scene . id , Ġoutput ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport !!. scene Id . must Equal ( scene . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( report !!. single () Ġas ĠScene In cons ist encies . Scene In consistency . Scene Setting In consistency ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . must Equal ( 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Ġ{ Ġit . scene Id . must Equal ( scene . id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Ġ{ Ġit . location Id Ġ}. toSet (). must Equal ( back ing Locations . map Ġ{ Ġit . id Ġ}. toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Ġ{ ĠassertTrue ( it . isEmpty ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` Given ĠSome Ġof Ġthe ĠLoc ations Ġhave Ġbeen Ġremoved Ġfrom Ġthe ĠStory ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġremoved Locations Ġ= Ġbacking Locations . sh uffled (). take ( 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved Locations . forEach Ġ{ Ġlocation Repository . remove Location ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġoutput Ġremoved Ġfrom Ġstory Ġin consistency Ġfor Ġremoved Ġlocations `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Locations ById Ġ= Ġremoved Locations . associate By Ġ{ Ġit . id Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetect In cons ist encies ( scene . id , Ġoutput ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport !!. scene Id . must Equal ( scene . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( report !!. single () Ġas ĠScene In cons ist encies . Scene In consistency . Scene Setting In consistency ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize . must Equal ( 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Ġ{ Ġit . scene Id . must Equal ( scene . id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Ġ{ Ġit . location Id Ġ}. toSet (). must Equal ( back ing Locations . map Ġ{ Ġit . id Ġ}. toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Ġ{ Ġin cons ist encies Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwas Removed Ġ= Ġin cons ist encies . location Id Ġin Ġremoved Locations ById ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( was Removed ) Ġin cons ist encies . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. must Equal ( Scene Setting Location In cons ist encies . Scene Setting Location In consistency . Location Removed From Story ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠassertTrue ( in cons ist encies . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }