package Ġcom . so yle . stories . domain . pro se Ċ Ċ import Ġcom . so yle . stories . domain . character . Character Ċ import Ġcom . so yle . stories . domain . character . make Character Ċ import Ġcom . so yle . stories . domain . must Equal Ċ import Ġcom . so yle . stories . domain . project . Project Ċ import Ġcom . so yle . stories . domain . single Line Ċ import Ġorg . junit . jupiter . api . Assertions .* Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . assert Throws Ċ Ċ class ĠPro se UnitTest Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġpro se Id Ġ= ĠPro se . Id () ĊĊĠĠĠ Ġfun Ġentity Id () Ġ= ĠCharacter . Id (). mention ed () ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` Create Ġnew ĠPro se ` Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` content Ġand Ġmentions Ġshould Ġbe Ġempty `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( new Pro se , Ġ_) Ġ= ĠPro se . create ( Project . Id ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( new Pro se . text . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( new Pro se . content . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( new Pro se . mentions . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pro se . revision . must Equal ( 0 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` Insert ĠText ` Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcharacter Id Ġ= ĠCharacter . Id (). mention ed () ĊĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( pro se Id , Ġcontent Ġ= ĠlistOf ( Pro se Content (" ban ana ", Ġnull ))) ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` should Ġupdate Ġversion Ġid `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se . with Text Inserted (" some Ġ", Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . revision . must Equal ( pro se . revision Ġ+ Ġ 1 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` cannot Ġb isect Ġa Ġmention `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se . with Entity Mention ed ( character Id , Ġ 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Pro se Mention Cannot Be B isect ed > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . with Text Inserted (" fail ", Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . with Text Inserted (" fail ", Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . with Text Inserted (" suc ceed ", Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . with Text Inserted (" suc ceed ", Ġ 5 ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` Append Ġto ĠEnd ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġupdate Ġparagraph Ġtext Ġwith Ġtext Ġat Ġend `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se . with Text Inserted (" s ", Ġ 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . text . must Equal (" ban an as ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġappend Ġto Ġend Ġtext Ġcontent `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se . with Text Inserted (" s ", Ġ 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . content . single (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . must Equal (" ban an as ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex . must Equal ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Index . must Equal ( 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` Prepend Ġto ĠBegin ning ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġupdate Ġparagraph Ġtext Ġwith Ġtext Ġat Ġbeginning `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se . with Text Inserted (" a Ġ", Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . text . must Equal (" a Ġban ana ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġprepend Ġto Ġbeginning Ġof Ġtext Ġcontent `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se . with Text Inserted (" a Ġ", Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . content . single (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . must Equal (" a Ġban ana ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex . must Equal ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Index . must Equal ( 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` Insert ĠBet ween ĠText ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġupdate Ġparagraph Ġtext Ġwith Ġtext Ġin Ġthe Ġmiddle `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se . with Text Inserted (" ned ĠM ", Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . text . must Equal (" b anned ĠMan a ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġinsert Ġinto Ġmiddle Ġof Ġtext Ġcontent `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se . with Text Inserted (" ned ĠM ", Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . content . single (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . must Equal (" b anned ĠMan a ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex . must Equal ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Index . must Equal ( 1 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` Insert ĠBefore ĠM ention ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġpro se With Mention : ĠPro se Ġ= Ġpro se . with Entity Mention ed ( character Id , Ġ 2 , Ġ 3 ). pro se ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġupdate Ġmention Ġposition `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se With Mention . with Text Inserted ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" one Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . mentions . single (). run { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Id . must Equal ( character Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex . must Equal ( 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Index . must Equal ( 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġinsert Ġtext Ġcontent Ġbefore Ġmention `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se With Mention . with Text Inserted ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" one Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . content . map Ġ{ Ġit . text . toString () Ġ}. must Equal ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" one Ġba ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" nan ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . mentions . single (). text . must Equal ( single Line (" nan ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` Mention ĠEntity ` Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcharacter Id Ġ= ĠCharacter . Id (). mention ed () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpro se Ġ= Ġmake Pro se ( pro se Id , Ġcontent Ġ= ĠlistOf ( Pro se Content (" ban ana ", Ġnull ))) ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` mentions Ġmust Ġbe Ġin Ġrange `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Index OutOfBoundsException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se . with Entity Mention ed ( character Id , Ġ- 1 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se . with Entity Mention ed ( character Id , Ġ- 1 , Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se . with Entity Mention ed ( character Id , Ġ- 1 , Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se . with Entity Mention ed ( character Id , Ġ 0 , Ġ 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se . with Entity Mention ed ( character Id , Ġ 6 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se . with Entity Mention ed ( character Id , Ġ 0 , Ġ 6 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` mentions Ġcannot Ġoverlap `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se . with Entity Mention ed ( character Id , Ġ 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Mention Overlap s Existing Mention > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . with Entity Mention ed ( character Id , Ġ 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . with Entity Mention ed ( character Id , Ġ 1 , Ġ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . with Entity Mention ed ( character Id , Ġ 3 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . with Entity Mention ed ( character Id , Ġ 4 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . with Entity Mention ed ( character Id , Ġ 0 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . with Entity Mention ed ( character Id , Ġ 5 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` should Ġupdate Ġpro se Ġversion `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se . with Entity Mention ed ( character Id , Ġ 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . revision . must Equal ( pro se . revision Ġ+ Ġ 1 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` mention Ġshould Ġbe Ġincluded Ġat Ġrequested Ġposition `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se . with Entity Mention ed ( character Id , Ġ 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . mentions . single (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Id . must Equal ( character Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex . must Equal ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Index . must Equal ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` content Ġshould Ġbe Ġsplit Ġto Ġseparate Ġtext Ġfrom Ġmention `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Update Ġ= Ġpro se . with Entity Mention ed ( character Id , Ġ 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . content . map Ġ{ Ġit . text . toString () Ġ}. must Equal ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ba ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" nan ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" a " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se Update . pro se . mentions . single (). text . must Equal ( single Line (" nan ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` With ĠM ention ĠText ĠRe placed ` Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġentity Id Ġ= ĠCharacter . Id (). mention ed () ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` When ĠNo ĠM ent ions ĠMatch ĠEntity ĠId ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġpro se Ġ= Ġmake Pro se () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` pro se Ġshould Ġnot Ġbe Ġmodified `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . with Mention Text Re placed ( entityId , Ġ"" Ġto Ġ" I Ġshould Ġnot Ġappear ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( pro se , Ġupdate . pro se ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` event Ġshould Ġnot Ġbe Ġproduced `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . with Mention Text Re placed ( entityId , Ġ"" Ġto Ġ" I Ġshould Ġnot Ġappear ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( update . event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` pro duced Ġevent Ġshould Ġcommunicate Ġtext Ġchanges `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" I Ġmention Ġ", Ġentity Id Ġto Ġsingle Line (" Bob ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . with Mention Text Re placed ( entityId , Ġ" Bob " Ġto Ġ" Fr ank ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . event !!. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . pro se Id . must Equal ( pro se . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . new Content . must Equal ( update . pro se . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . entityId . must Equal ( entityId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . deleted Text . must Equal (" Bob ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . inserted Text . must Equal (" Fr ank ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` When ĠSe ctions Ġin ĠContent ĠMatch ĠM ention ĠText Ġbut Ġdon 't ĠM ention ĠEntity ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" I Ġmention Ġ", Ġentity Id Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (", Ġthe Ġcharacter Ġand ĠI Ġjust Ġtalk Ġabout ĠBob , Ġthe Ġidea . Ġ ĠI Ġmention Ġa Ġdifferent Ġ", ĠCharacter . Id (). mention ed () Ġto Ġsingle Line (" Bob ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` pro se Ġcontent Ġshould Ġnot Ġmodify Ġthose Ġareas `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . with Mention Text Re placed ( entityId , Ġ" Bob " Ġto Ġ" Fr ank ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" I Ġmention ĠFrank , Ġthe Ġcharacter Ġand ĠI Ġjust Ġtalk Ġabout ĠBob , Ġthe Ġidea . Ġ ĠI Ġmention Ġa Ġdifferent ĠBob ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` When ĠMultiple ĠM ent ions ĠMatch ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" I Ġmention Ġ", Ġentity Id Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (", Ġthe Ġcharacter Ġand Ġthen ĠI Ġmention Ġ", Ġentity Id Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġagain . Ġ ĠLet 's Ġsay Ġ", Ġentity Id Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġa Ġthird Ġtime .", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġmodify Ġcontent Ġareas Ġwith Ġmatched Ġmentions `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . with Mention Text Re placed ( entityId , Ġ" Bob " Ġto Ġ" Fr ank ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . text . must Equal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" I Ġmention ĠFrank , Ġthe Ġcharacter Ġand Ġthen ĠI Ġmention ĠFrank Ġagain . Ġ ĠLet 's Ġsay ĠFrank Ġa Ġthird Ġtime ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġupdate Ġmention Ġpositions Ġand Ġlengths `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . with Mention Text Re placed ( entityId , Ġ" Bob " Ġto Ġ" Fr ank ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . forEach Ġ{ Ġit . entityId . must Equal ( entityId ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . forEach Ġ{ Ġit . text . toString (). must Equal (" Fr ank ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . map Ġ{ Ġit . startIndex Ġ}. must Equal ( listOf ( 1 0 , Ġ 5 0 , Ġ 7 4 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . map Ġ{ Ġit . end Index Ġ}. must Equal ( listOf ( 1 5 , Ġ 5 5 , Ġ 7 9 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` pro duced Ġevent Ġshould Ġcommunicate Ġmention Ġposition ing Ġchanges `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . with Mention Text Re placed ( entityId , Ġ" Bob " Ġto Ġ" Fr ank ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . event !!. new Ment ions . forEach Ġ{ Ġit . entityId . must Equal ( entityId ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . event !!. new Ment ions . forEach Ġ{ Ġit . text . toString (). must Equal (" Fr ank ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . event !!. new Ment ions . map Ġ{ Ġit . startIndex Ġ}. must Equal ( listOf ( 1 0 , Ġ 5 0 , Ġ 7 4 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . event !!. new Ment ions . map Ġ{ Ġit . end Index Ġ}. must Equal ( listOf ( 1 5 , Ġ 5 5 , Ġ 7 9 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` other Ġmentions Ġshould Ġbe Ġshifted , Ġbut Ġnot Ġmodified `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalice Id Ġ= ĠCharacter . Id (). mention ed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" I Ġmention Ġ", Ġentity Id Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (", Ġthe Ġcharacter Ġand Ġthen ĠI Ġmention Ġ", Ġalice Id Ġto Ġsingle Line (" Alice ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (". Ġ ĠLet 's Ġsay Ġ", Ġentity Id Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġand Ġ", Ġalice Id Ġto Ġsingle Line (" Alice ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġagain .", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . with Mention Text Re placed ( entityId , Ġ" Bob " Ġto Ġ" Fr ank ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . map Ġ{ Ġit . entityId Ġ}. must Equal ( listOf ( entityId , Ġalice Id , Ġentity Id , Ġalice Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . map Ġ{ Ġit . text . toString () Ġ}. must Equal ( listOf (" Fr ank ", Ġ" Alice ", Ġ" Fr ank ", Ġ" Alice ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . map Ġ{ Ġit . startIndex Ġ}. must Equal ( listOf ( 1 0 , Ġ 5 0 , Ġ 6 8 , Ġ 7 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . map Ġ{ Ġit . end Index Ġ}. must Equal ( listOf ( 1 5 , Ġ 5 5 , Ġ 7 3 , Ġ 8 3 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` When Ġmultiple Ġmentions Ġwith Ġdifferent Ġtext Ġmatch Ġentity ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" I Ġmention Ġ", Ġentity Id Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (", Ġthe Ġcharacter Ġand Ġthen ĠI Ġmention Ġhim Ġas Ġ", Ġentity Id Ġto Ġsingle Line (" Rob ert ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (". Ġ ĠAnother Ġname Ġfor Ġhim Ġis Ġ", Ġentity Id Ġto Ġsingle Line (" B obby ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (".", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` only Ġmentions Ġthat Ġmatch Ġentity Ġand Ġtext Ġshould Ġbe Ġreplaced `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . with Mention Text Re placed ( entityId , Ġ" Rob ert " Ġto Ġ" Fr ank ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . text . must Equal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" I Ġmention ĠBob , Ġthe Ġcharacter Ġand Ġthen ĠI Ġmention Ġhim Ġas ĠFrank . Ġ ĠAnother Ġname Ġfor Ġhim Ġis ĠB obby ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` With ĠText ĠRemoved ` Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` range Ġout Ġof Ġbounds Ġshould Ġthrow Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( content Ġ= ĠlistOf ( Pro se Content (" abc de ", Ġnull ))) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Index OutOfBoundsException > Ġ{ Ġpro se . with Text Removed (- 4 .. 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Index OutOfBoundsException > Ġ{ Ġpro se . with Text Removed (- 1 .. 2 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Index OutOfBoundsException > Ġ{ Ġpro se . with Text Removed ( 2 .. 6 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Index OutOfBoundsException > Ġ{ Ġpro se . with Text Removed (- 1 .. 6 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Index OutOfBoundsException > Ġ{ Ġpro se . with Text Removed ( 6 .. 9 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` cannot Ġb isect Ġa Ġmention `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Talk ing Ġabout Ġ", Ġentity Id () Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġcan Ġbe Ġfun .", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Pro se Mention Cannot Be B isect ed > Ġ{ Ġpro se . with Text Removed ( 1 2 .. 1 4 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Pro se Mention Cannot Be B isect ed > Ġ{ Ġpro se . with Text Removed ( 1 4 .. 1 5 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Pro se Mention Cannot Be B isect ed > Ġ{ Ġpro se . with Text Removed ( 1 5 .. 1 9 ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshould Ġbe Ġfine ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se . with Text Removed ( 1 2 Ġuntil Ġ 1 4 Ġ/* Ġ== Ġ 1 2 Ġ.. Ġ 1 3 Ġ*/) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se . with Text Removed ( 1 7 .. 1 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpro se . with Text Removed ( 1 4 Ġuntil Ġ 1 7 Ġ/* Ġ== Ġ 1 4 Ġ.. Ġ 1 6 Ġ*/) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass Ġ` When ĠRange Ġis ĠValid ` Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġremove Ġtext Ġin Ġrange `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( content Ġ= ĠlistOf ( Pro se Content (" I 'm Ġcontent Ġthat Ġwill Ġhave Ġa Ġportion Ġdeleted .", Ġnull ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . with Text Removed ( 1 .. 1 5 Ġ/* Ġ== Ġ 1 Ġuntil Ġ 1 6 Ġ*/) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . text . must Equal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" I Ġwill Ġhave Ġa Ġportion Ġdeleted ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . event . index . must Equal ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . event . deleted Text . must Equal ("' m Ġcontent Ġthat ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġadjust Ġmentions Ġafter Ġremoved Ġsection `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbob Id Ġ= Ġentity Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfr ank Id Ġ= Ġentity Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Mention Ġ", Ġbob Id Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (", Ġthen Ġremove Ġtext , Ġthen Ġmention Ġ", Ġfr ank Id Ġto Ġsingle Line (" Fr ank ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . with Text Removed ( 1 1 .. 2 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . map Ġ{ Ġit . entityId Ġ}. must Equal ( listOf ( bob Id , Ġfr ank Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . map Ġ{ Ġit . startIndex Ġ}. must Equal ( listOf ( 8 , Ġ 2 6 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . map Ġ{ Ġit . end Index Ġ}. must Equal ( listOf ( 1 1 , Ġ 3 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . event . new Ment ions . must Equal ( update . pro se . mentions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` should Ġremove Ġmentions Ġinside Ġrange `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbob Id Ġ= Ġentity Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfr ank Id Ġ= Ġentity Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Mention Ġ", Ġbob Id Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (", Ġthen Ġmention Ġ", Ġfr ank Id Ġto Ġsingle Line (" Fr ank ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġand Ġremove Ġtext , Ġthen Ġmention Ġ", Ġfr ank Id Ġto Ġsingle Line (" Fr ank ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . with Text Removed ( 1 1 Ġuntil Ġ 6 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . map Ġ{ Ġit . entityId Ġ}. must Equal ( listOf ( bob Id , Ġfr ank Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . map Ġ{ Ġit . startIndex Ġ}. must Equal ( listOf ( 8 , Ġ 1 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . mentions . map Ġ{ Ġit . end Index Ġ}. must Equal ( listOf ( 1 1 , Ġ 1 6 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . event . new Ment ions . must Equal ( update . pro se . mentions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` Without ĠM ention ` Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` when Ġmention Ġdoes Ġnot Ġexist , Ġshould Ġthrow Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Id Ġ= Ġentity Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( content Ġ= ĠlistOf ( Pro se Content (" I Ġmention ĠBob , Ġthe Ġcharacter ", Ġnull ))) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Mention DoesNotExist In Pro se > Ġ{ Ġpro se . without Mention ( entityId , Ġ 1 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` should Ġremove Ġmention `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Id Ġ= Ġentity Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( content Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" I Ġmention Ġ", Ġentity Id Ġto Ġsingle Line (" Bob ")), ĠPro se Content (", Ġthe Ġcharacter ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . without Mention ( entityId , Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( update . pro se . mentions . find Ġ{ Ġit . entityId Ġ== Ġentity Id Ġ&& Ġit . startIndex Ġ== Ġ 1 0 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . event . entityId . must Equal ( entityId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . event . position . index . must Equal ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . event . position . length . must Equal ( 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` should Ġnot Ġremove Ġtext `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Id Ġ= Ġentity Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro se Ġ= Ġmake Pro se ( content Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" I Ġmention Ġ", Ġentity Id Ġto Ġsingle Line (" Bob ")), ĠPro se Content (", Ġthe Ġcharacter ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġpro se . without Mention ( entityId , Ġ 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate . pro se . text . must Equal (" I Ġmention ĠBob , Ġthe Ġcharacter ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` Replace ĠContent ` Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpro se Ġ= Ġmake Pro se () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbob Ġ= Ġmake Character () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfr ank Ġ= Ġmake Character () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġa lex is Ġ= Ġmake Character () ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` content Ġshould Ġbe Ġjoined Ġtogether `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( new Pro se ) Ġ= Ġpro se . with Content Re placed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content ("", Ġbob . id . mention ed () Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġcan Ġbe Ġannoying . Ġ ĠBut Ġlisten Ġto Ġ", Ġfr ank . id . mention ed () Ġto Ġsingle Line (" Fr ank ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġand Ġhe 'll Ġtell Ġyou Ġthat Ġ", Ġa lex is . id . mention ed () Ġto Ġsingle Line (" Alex is ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġis Ġworse .", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pro se . text . must Equal (" Bob Ġcan Ġbe Ġannoying . Ġ ĠBut Ġlisten Ġto ĠFrank Ġand Ġhe 'll Ġtell Ġyou Ġthat ĠAlex is Ġis Ġworse .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` mentions Ġshould Ġbe Ġin Ġrelative Ġpositions `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( new Pro se ) Ġ= Ġpro se . with Content Re placed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content ("", Ġbob . id . mention ed () Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġcan Ġbe Ġannoying . Ġ ĠBut Ġlisten Ġto Ġ", Ġfr ank . id . mention ed () Ġto Ġsingle Line (" Fr ank ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġand Ġhe 'll Ġtell Ġyou Ġthat Ġ", Ġa lex is . id . mention ed () Ġto Ġsingle Line (" Alex is ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġis Ġworse .", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pro se . mentions . map Ġ{ Ġit . entityId Ġ}. must Equal ( listOf ( bob . id . mention ed (), Ġfr ank . id . mention ed (), Ġa lex is . id . mention ed ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pro se . mentions . map Ġ{ Ġit . text . toString () Ġ}. must Equal ( listOf (" Bob ", Ġ" Fr ank ", Ġ" Alex is ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pro se . mentions . map Ġ{ Ġit . startIndex Ġ}. must Equal ( listOf ( 0 , Ġ 3 6 , Ġ 6 6 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Pro se . mentions . map Ġ{ Ġit . end Index Ġ}. must Equal ( listOf ( 3 , Ġ 4 1 , Ġ 7 2 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` should Ġemit Ġevent `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( new Pro se , Ġevent ) Ġ= Ġpro se . with Content Re placed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content ("", Ġbob . id . mention ed () Ġto Ġsingle Line (" Bob ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġcan Ġbe Ġannoying . Ġ ĠBut Ġlisten Ġto Ġ", Ġfr ank . id . mention ed () Ġto Ġsingle Line (" Fr ank ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġand Ġhe 'll Ġtell Ġyou Ġthat Ġ", Ġa lex is . id . mention ed () Ġto Ġsingle Line (" Alex is ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro se Content (" Ġis Ġworse .", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . revision . must Equal ( pro se . revision Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . pro se Id . must Equal ( pro se . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . new Content . must Equal ( new Pro se . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . new Ment ions . must Equal ( new Pro se . mentions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ }