package Ġcom . so yle . stories . use case . scene Ċ Ċ import Ġcom . so yle . stories . domain . must Equal Ċ import Ġcom . so yle . stories . use case . repositories . Theme Repository Double Ċ import Ġcom . so yle . stories . domain . scene . make Scene Ċ import Ġcom . so yle . stories . use case . scene . symbol . track Symbol In Scene . List Available Symbols To Track In Scene Ċ import Ġcom . so yle . stories . use case . scene . symbol . track Symbol In Scene . List Available Symbols To Track In Scene UseCase Ċ import Ġcom . so yle . stories . domain . theme . make Symbol Ċ import Ġcom . so yle . stories . domain . theme . make Theme Ċ import Ġcom . so yle . stories . use case . theme . list Symbols By Theme . Symbols By Theme Ċ import Ġcom . so yle . stories . use case . theme . list Symbols By Theme . theme Ċ import Ġcom . so yle . stories . use case . repositories . Scene Repository Double Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . assert Throws Ċ Ċ class Ġ` List ĠAvailable ĠS ymbols Ġto ĠTrack Ġin ĠScene ĠUnit ĠTest ` Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġscene Ġ= Ġmake Scene () ĊĊĠĠĠ Ġprivate Ġval Ġscene Repository Ġ= ĠScene Repository Double () ĊĠĠĠ Ġprivate Ġval Ġtheme Repository Ġ= ĠTheme Repository Double () ĊĊĠĠĠ Ġprivate Ġvar Ġresult : ĠS ymbols By Theme ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` scene Ġdoesn 't Ġexist `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠassertThrows < Scene DoesNotExist > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Available Symbols To Track In Scene () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġerror . scene Id . must Equal ( scene . id . uuid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` Given ĠScene ĠEx ists ` Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene Repository . given Scene ( scene ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` should Ġoutput Ġempty Ġresponse `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Available Symbols To Track In Scene () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` Given Ġsymbols Ġin Ġproject ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġtheme Without Symbol Ġ= Ġmake Theme ( projectId Ġ= Ġscene . projectId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġtheme sWith Symbols Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList ( 4 ) Ġ{ Ġmake Theme ( projectId Ġ= Ġscene . projectId , Ġsymbols Ġ= ĠList ( it Ġ+ Ġ 1 ) Ġ{ Ġmake Symbol () Ġ}) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( theme sWith Symbols Ġ+ Ġtheme Without Symbol ). on Each ( theme Repository :: given Theme ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġoutput Ġavailable Ġsymbols Ġby Ġtheme `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Available Symbols To Track In Scene () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult !!. themes . map Ġ{ Ġit . theme . theme Id Ġ}. toSet (). must Equal ( theme sWith Symbols . map Ġ{ Ġit . id . uuid Ġ}. toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult !!. themes . forEach Ġ{ Ġ( theme Item , Ġsymbol Items ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbacking Theme Ġ= Ġtheme sWith Symbols . find Ġ{ Ġit . id . uuid Ġ== Ġtheme Item . theme Id Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtheme Item . theme Name . must Equal ( back ing Theme . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Items . map Ġ{ Ġit . symbol Id Ġ}. toSet (). must Equal ( back ing Theme . symbols . map Ġ{ Ġit . id . uuid Ġ}. toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Items . forEach Ġ{ Ġsymbol Item Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Item . symbol Name . must Equal ( back ing Theme . symbols . find Ġ{ Ġit . id . uuid Ġ== Ġsymbol Item . symbol Id Ġ} !!. name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` Given Ġscene Ġcontains Ġsymbols ` Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtheme sWith Symbols . fold ( scene ) Ġ{ Ġnext Scene , Ġtheme Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Scene . with Symbol Tracked ( theme , Ġtheme . symbols . first ()). scene ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let ( scene Repository :: given Scene ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġfilter Ġout Ġsymbols Ġalready Ġtracked `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Available Symbols To Track In Scene () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult !!. themes . size . must Equal ( theme sWith Symbols . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlist Available Symbols To Track In Scene () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuse Case : ĠList Available Symbols To Track In Scene Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList Available Symbols To Track In Scene UseCase ( scene Repository , Ġtheme Repository ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġobject Ġ: ĠList Available Symbols To Track In Scene . Output Port Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġreceive Available Symbols To Track In Scene ( response : ĠS ymbols By Theme ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Case . invoke ( scene . id , Ġoutput ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }