package Ġcom . so yle . stories . use case . pro se Ċ Ċ import Ġcom . so yle . stories . domain . character . Character Ċ import Ġcom . so yle . stories . domain . character . character Name Ċ import Ġcom . so yle . stories . domain . character . make Character Ċ import Ġcom . so yle . stories . domain . must Equal Ċ import Ġcom . so yle . stories . domain . location . Location Ċ import Ġcom . so yle . stories . domain . theme . Theme Ċ import Ġcom . so yle . stories . domain . theme . Symbol Ċ import Ġcom . so yle . stories . use case . repositories . Character Repository Double Ċ import Ġcom . so yle . stories . use case . repositories . Pro se Repository Double Ċ import Ġcom . so yle . stories . use case . repositories . Theme Repository Double Ċ import Ġcom . so yle . stories . domain . location . make Location Ċ import Ġcom . so yle . stories . domain . non Blank Str Ċ import Ġcom . so yle . stories . domain . pro se .* Ċ import Ġcom . so yle . stories . use case . pro se . detect Invalid Ment ions . Detect Invalid ated Ment ions Ċ import Ġcom . so yle . stories . use case . pro se . detect Invalid Ment ions . Detect Invalid ated Ment ions UseCase Ċ import Ġcom . so yle . stories . domain . theme . make Symbol Ċ import Ġcom . so yle . stories . domain . theme . make Theme Ċ import Ġcom . so yle . stories . domain . validation . Non Blank String Ċ import Ġcom . so yle . stories . use case . repositories . Location Repository Double Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . Dynamic Test . dynamic Test Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Test Factory Ċ import Ġorg . junit . jupiter . api . assert Throws Ċ Ċ class Ġ` Detect ĠInvalid ated ĠM ent ions ĠUnit ĠTest ` Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpro se Ġ= Ġmake Pro se () ĊĊĠĠĠ Ġprivate Ġvar Ġresult : ĠDetect Invalid ated Ment ions . Response Model ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġcharacter Repository Ġ= ĠCharacter Repository Double () ĊĠĠĠ Ġprivate Ġval Ġlocation Repository Ġ= ĠLocation Repository Double () ĊĠĠĠ Ġprivate Ġval Ġtheme Repository Ġ= ĠTheme Repository Double () ĊĠĠĠ Ġprivate Ġval Ġpro se Repository Ġ= ĠPro se Repository Double () ĊĊĠĠĠ Ġprivate Ġfun Ġreset Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` when Ġpro se Ġdoesn 't Ġexist , Ġshould Ġthrow Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThrows < Pro se DoesNotExist > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetect Invalid ated Ment ions () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` When ĠPro se ĠEx ists ` Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` should Ġoutput Ġpro se Ġid `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Repository . given Pro se ( pro se ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetect Invalid ated Ment ions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult !!. pro se Id . must Equal ( pro se . id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` When ĠM ention ed ĠEntity ĠEx ists ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgiven Mention ed Character ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdisplayName : ĠNon Blank String Ġ= Ġcharacter Name (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Variants : ĠList < Non Blank String > Ġ= ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠM ention ed Character Id Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacter Ġ= Ġmake Character ( name Ġ= ĠdisplayName , Ġother Names Ġ= Ġname Variants . toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacter Repository . given Character ( character ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcharacter . id . mention ed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgiven Mention ed Location ( name : ĠNon Blank String ): ĠM ention ed Location Id Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġmake Location () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Repository . given Location ( location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlocation . id . mention ed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgiven Mention ed Symbol ( name : ĠNon Blank String ): ĠM ention ed Symbol Id Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= Ġmake Symbol () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme Ġ= Ġmake Theme ( symbols Ġ= ĠlistOf ( symbol )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtheme Repository . given Theme ( theme ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsymbol . id . mention ed ( theme . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġnot Ġoutput Ġentity Ġid `() Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġgiven Mention ed Character ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: given Mention ed Location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: given Mention ed Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdisplayName Ġ= Ġnon Blank Str (" Entity ĠName ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmentioned EntityId Ġ= Ġit ( displayName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdynamic Test (" should Ġnot Ġoutput Ġ${ mention ed EntityId . id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Repository . given Pro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se . with Text Inserted ("$ displayName ĠM ention ed "). pro se ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Entity Mention ed ( mention ed EntityId , Ġ 0 , ĠdisplayName . length ). pro se ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetect Invalid ated Ment ions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult !!. invalid Entity Ids . isEmpty (). must Equal ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` When ĠM ention ed ĠCharacter ĠNo ĠLong er Ġhas ĠUsed ĠName ĠVariant ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġoutput Ġcharacter Ġid `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmentioned Character Id Ġ= Ġgiven Mention ed Character ( displayName Ġ= Ġnon Blank Str (" Bob ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Repository . given Pro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se . with Text Inserted (" Rob ert "). pro se . with Entity Mention ed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmentioned Character Id , Ġ 0 , Ġ 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). pro se ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetect Invalid ated Ment ions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult !!. invalid Entity Ids . single (). must Equal ( mention ed Character Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` When ĠM ention ed ĠEntity ĠNo ĠLong er ĠEx ists ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġpast Entity Generator Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠCharacter . Id (). mention ed () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠLocation . Id (). mention ed () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠSymbol . Id (). mention ed ( Theme . Id ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġoutput Ġentity Ġid `() Ġ= Ġpast Entity Generator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmentioned EntityId Ġ= Ġit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdynamic Test (" should Ġoutput Ġ${ mention ed EntityId . id }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Repository . given Pro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se . with Text Inserted (" Bob "). pro se . with Entity Mention ed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmentioned EntityId , Ġ 0 , Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). pro se ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetect Invalid ated Ment ions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult !!. invalid Entity Ids . single (). must Equal ( mention ed EntityId ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` When ĠEntity Ġis ĠM ention ed ĠMultiple ĠTimes ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test Factory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġonly Ġoutput Ġthe Ġentity Ġid Ġonce `() Ġ= Ġpast Entity Generator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmentioned EntityId Ġ= Ġit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdynamic Test (" should Ġonly Ġoutput Ġ${ mention ed EntityId . id } Ġonce ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Name Ġ= Ġ" Entity " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Text Ġ= ĠList ( 5 ) Ġ{ Ġentity Name Ġ}. join ToString (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Repository . given Pro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. 4 ). fold ( pro se . with Text Inserted ( pro se Text ). pro se ) Ġ{ Ġnext Pro se , Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Pro se . with Entity Mention ed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmentioned EntityId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ* Ġ( entityName . length Ġ+ Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Name . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). pro se ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetect Invalid ated Ment ions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult !!. invalid Entity Ids . single (). must Equal ( mention ed EntityId ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdetect Invalid ated Ment ions () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuse Case : ĠDetect Invalid ated Ment ions Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDetect Invalid ated Ment ions UseCase ( pro se Repository , Ġcharacter Repository , Ġlocation Repository , Ġtheme Repository ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġobject Ġ: ĠDetect Invalid ated Ment ions . Output Port Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun Ġreceive Detected Invalid ated Ment ions ( response : ĠDetect Invalid ated Ment ions . Response Model ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Case . invoke ( pro se . id , Ġoutput ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }