package Ġcom . d md irc . kt irc . io čĊč Ċ import Ġcom . d md irc . kt irc . I rc Client č Ċ import Ġcom . d md irc . kt irc . Test Constants č Ċ import Ġcom . d md irc . kt irc . events .* č Ċ import Ġcom . d md irc . kt irc . events . handlers . EventHandler č Ċ import Ġcom . d md irc . kt irc . events . mut ators . Event Mut ator č Ċ import Ġcom . d md irc . kt irc . messages . processors . Message Processor č Ċ import Ġcom . d md irc . kt irc . model . I rc Message č Ċ import Ġio . mock k .* č Ċ import Ġkotlinx . coroutines . channels . Channel č Ċ import Ġkotlinx . coroutines . run Blocking č Ċ import Ġorg . junit . jupiter . api . Test čĊč Ċ internal Ġclass ĠMessage Handler Test Ġ{ čĊčĊĠĠĠ Ġprivate Ġval Ġ irc Client Ġ= Ġmock k < I rc Client >() čĊčĊĠĠĠ Ġprivate Ġval Ġnick Processor Ġ= Ġmock k < Message Processor > Ġ{ čĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcommands Ġ} Ġreturns ĠarrayOf (" FOO ", Ġ" N ICK ") čĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġprocess ( any ()) Ġ} Ġreturns Ġempty List () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġjoin Processor Ġ= Ġmock k < Message Processor > Ġ{ čĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcommands Ġ} Ġreturns ĠarrayOf (" BAR ", Ġ" JOIN ") čĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġprocess ( any ()) Ġ} Ġreturns Ġempty List () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġevent Handler 1 Ġ= Ġmock k < EventHandler >() čĊĠĠĠ Ġprivate Ġval Ġevent Handler 2 Ġ= Ġmock k < EventHandler >() čĊčĊĠĠĠ Ġ@ Test čĊĠĠĠ Ġfun Ġ` passes Ġmessage Ġon Ġto Ġcorrect Ġprocessor `() Ġ= Ġrun Blocking Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠMessage Handler ( listOf ( join Processor , Ġnick Processor ), Ġempty List (), Ġmutable ListOf ()) čĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠI rc Message ( empty Map (), Ġnull , Ġ" JOIN ", Ġempty List ()) čĊčĊĠĠĠĠĠĠĠ Ġwith ( Channel < I rc Message >( 1 )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( message ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . process Messages ( irc Client , Ġthis ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġverify Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġjoin Processor . process ( message ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Test čĊĠĠĠ Ġfun Ġ` reads Ġmultiple Ġmessages `() Ġ= Ġrun Blocking Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠMessage Handler ( listOf ( join Processor , Ġnick Processor ), Ġempty List (), Ġmutable ListOf ()) čĊĠĠĠĠĠĠĠ Ġval Ġjoin Message Ġ= ĠI rc Message ( empty Map (), Ġnull , Ġ" JOIN ", Ġempty List ()) čĊĠĠĠĠĠĠĠ Ġval Ġnick Message Ġ= ĠI rc Message ( empty Map (), Ġnull , Ġ" N ICK ", Ġempty List ()) čĊĠĠĠĠĠĠĠ Ġval Ġother Message Ġ= ĠI rc Message ( empty Map (), Ġnull , Ġ" OTHER ", Ġempty List ()) čĊčĊĠĠĠĠĠĠĠ Ġwith ( Channel < I rc Message >( 3 )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( join Message ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( nick Message ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( other Message ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . process Messages ( irc Client , Ġthis ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġverify Order Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġjoin Processor . process ( join Message ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġnick Processor . process ( nick Message ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Test čĊĠĠĠ Ġfun Ġ` inv okes Ġall Ġevent Ġhandler Ġwith Ġall Ġreturned Ġevents `() Ġ= Ġrun Blocking Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠMessage Handler ( listOf ( join Processor , Ġnick Processor ), Ġempty List (), Ġmutable ListOf ( event Handler 1 , Ġevent Handler 2 )) čĊĠĠĠĠĠĠĠ Ġval Ġjoin Message Ġ= ĠI rc Message ( empty Map (), Ġnull , Ġ" JOIN ", Ġempty List ()) čĊčĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġjoin Processor . process ( any ()) Ġ} Ġreturns ĠlistOf ( Server Connected ( Event Metadata ( Test Constants . time )), ĠServer Welcome ( Event Metadata ( Test Constants . time ), Ġ" the . g ib son ", Ġ" ac id Burn ")) čĊčĊĠĠĠĠĠĠĠ Ġwith ( Channel < I rc Message >( 1 )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( join Message ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . process Messages ( irc Client , Ġthis ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġverify Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler 1 . process Event ( ref Eq ( irc Client ), Ġof Type < Server Connected >()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler 1 . process Event ( ref Eq ( irc Client ), Ġof Type < Server Welcome >()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler 2 . process Event ( ref Eq ( irc Client ), Ġof Type < Server Connected >()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler 2 . process Event ( ref Eq ( irc Client ), Ġof Type < Server Welcome >()) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Test čĊĠĠĠ Ġfun Ġ` s ends Ġcustom Ġevents Ġto Ġall Ġhandlers `() Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠMessage Handler ( emptyList (), Ġempty List (), Ġmutable ListOf ( event Handler 1 , Ġevent Handler 2 )) čĊĠĠĠĠĠĠĠ Ġhandler . handle Event ( irc Client , ĠServer Welcome ( Event Metadata ( Test Constants . time ), Ġ" the . g ib son ", Ġ" ac id Burn ")) čĊčĊĠĠĠĠĠĠĠ Ġverify Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler 1 . process Event ( ref Eq ( irc Client ), Ġof Type < Server Welcome >()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler 2 . process Event ( ref Eq ( irc Client ), Ġof Type < Server Welcome >()) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Test čĊĠĠĠ Ġfun Ġ` s ends Ġcustom Ġevents Ġto Ġall Ġemitter s `() Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠMessage Handler ( emptyList (), Ġempty List (), Ġempty List ()) čĊĠĠĠĠĠĠĠ Ġval Ġemitter 1 Ġ= Ġmock k <( I rc Event ) Ġ-> ĠUnit > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġthis @ mock k ( any < I rc Event >()) Ġ} Ġjust ĠRuns čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġemitter 2 Ġ= Ġmock k <( I rc Event ) Ġ-> ĠUnit > Ġ Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġthis @ mock k ( any < I rc Event >()) Ġ} Ġjust ĠRuns čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġhandler . add Emitter ( emitter 1 ) čĊĠĠĠĠĠĠĠ Ġhandler . add Emitter ( emitter 2 ) čĊĠĠĠĠĠĠĠ Ġhandler . handle Event ( irc Client , ĠServer Welcome ( Event Metadata ( Test Constants . time ), Ġ" the . g ib son ", Ġ" ac id Burn ")) čĊčĊĠĠĠĠĠĠĠ Ġverify Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitter 1 ( of Type < Server Welcome >()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitter 2 ( of Type < Server Welcome >()) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Test čĊĠĠĠ Ġfun Ġ` s ends Ġevents Ġto Ġhandlers Ġbut Ġnot Ġmut ators Ġor Ġemitter s Ġif Ġprocess Ġonly Ġis Ġtrue `() Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġmut ator Ġ= Ġmock k < Event Mut ator >() čĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠMessage Handler ( emptyList (), ĠlistOf ( mut ator ), ĠlistOf ( event Handler 1 , Ġevent Handler 2 )) čĊĠĠĠĠĠĠĠ Ġval Ġemitter Ġ= Ġmock k <( I rc Event ) Ġ-> ĠUnit >() čĊĠĠĠĠĠĠĠ Ġhandler . add Emitter ( emitter ) čĊčĊĠĠĠĠĠĠĠ Ġhandler . handle Event ( irc Client , ĠServer Welcome ( Event Metadata ( Test Constants . time ), Ġ" the . g ib son ", Ġ" ac id Burn "), Ġtrue ) čĊčĊĠĠĠĠĠĠĠ Ġverify Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler 1 . process Event ( ref Eq ( irc Client ), Ġof Type < Server Welcome >()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler 2 . process Event ( ref Eq ( irc Client ), Ġof Type < Server Welcome >()) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġverify ( inverse Ġ= Ġtrue ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . invoke ( any ()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmut ator . mutate Event ( any (), Ġany (), Ġany ()) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Test čĊĠĠĠ Ġfun Ġ` mut ates Ġevents Ġin Ġorder `() Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġevent Mut ator 1 Ġ= Ġmock k < Event Mut ator > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmutate Event ( any (), Ġany (), Ġof Type < Server Welcome >()) Ġ} Ġreturns ĠlistOf ( Server Ready ( Event Metadata ( Test Constants . time ))) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġevent Mut ator 2 Ġ= Ġmock k < Event Mut ator > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmutate Event ( any (), Ġany (), Ġof Type < Server Ready >()) Ġ} Ġreturns Ġ ĠlistOf ( Server Connected ( Event Metadata ( Test Constants . time ))) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġevent Handler Ġ= Ġmock k < EventHandler >() čĊčĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠMessage Handler ( emptyList (), ĠlistOf ( event Mut ator 1 , Ġevent Mut ator 2 ), Ġmutable ListOf ( event Handler )) čĊĠĠĠĠĠĠĠ Ġhandler . handle Event ( irc Client , ĠServer Welcome ( Event Metadata ( Test Constants . time ), Ġ" the . g ib son ", Ġ" ac id Burn ")) čĊčĊĠĠĠĠĠĠĠ Ġverify All Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Mut ator 1 . mutate Event ( ref Eq ( irc Client ), Ġref Eq ( handler ), Ġof Type < Server Welcome >()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Mut ator 2 . mutate Event ( ref Eq ( irc Client ), Ġref Eq ( handler ), Ġof Type < Server Ready >()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler . process Event ( ref Eq ( irc Client ), Ġof Type < Server Connected >()) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Test čĊĠĠĠ Ġfun Ġ` allows Ġmut ators Ġto Ġfan Ġout Ġevents `() Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġevent Mut ator 1 Ġ= Ġmock k < Event Mut ator > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmutate Event ( any (), Ġany (), Ġof Type < Server Welcome >()) Ġ} Ġreturns ĠlistOf ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Ready ( Event Metadata ( Test Constants . time )), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer Connected ( Event Metadata ( Test Constants . time )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġevent Mut ator 2 Ġ= Ġmock k < Event Mut ator > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmutate Event ( any (), Ġany (), Ġof Type < Server Ready >()) Ġ} Ġreturns ĠlistOf ( Server Ready ( Event Metadata ( Test Constants . time ))) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmutate Event ( any (), Ġany (), Ġof Type < Server Connected >()) Ġ} Ġreturns ĠlistOf ( Server Connected ( Event Metadata ( Test Constants . time ))) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġevent Handler Ġ= Ġmock k < EventHandler >() čĊčĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠMessage Handler ( emptyList (), ĠlistOf ( event Mut ator 1 , Ġevent Mut ator 2 ), Ġmutable ListOf ( event Handler )) čĊĠĠĠĠĠĠĠ Ġhandler . handle Event ( irc Client , ĠServer Welcome ( Event Metadata ( Test Constants . time ), Ġ" the . g ib son ", Ġ" ac id Burn ")) čĊčĊĠĠĠĠĠĠĠ Ġverify Order Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Mut ator 2 . mutate Event ( ref Eq ( irc Client ), Ġref Eq ( handler ), Ġof Type < Server Ready >()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Mut ator 2 . mutate Event ( ref Eq ( irc Client ), Ġref Eq ( handler ), Ġof Type < Server Connected >()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler . process Event ( ref Eq ( irc Client ), Ġof Type < Server Ready >()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler . process Event ( ref Eq ( irc Client ), Ġof Type < Server Connected >()) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Test čĊĠĠĠ Ġfun Ġ` allows Ġmut ators Ġto Ġsuppress Ġevents `() Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġevent Mut ator 1 Ġ= Ġmock k < Event Mut ator > Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmutate Event ( any (), Ġany (), Ġof Type < Server Welcome >()) Ġ} Ġreturns Ġempty List () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġevent Mut ator 2 Ġ= Ġmock k < Event Mut ator >() čĊĠĠĠĠĠĠĠ Ġval Ġevent Handler Ġ= Ġmock k < EventHandler >() čĊčĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠMessage Handler ( emptyList (), ĠlistOf ( event Mut ator 1 , Ġevent Mut ator 2 ), Ġmutable ListOf ( event Handler )) čĊĠĠĠĠĠĠĠ Ġhandler . handle Event ( irc Client , ĠServer Welcome ( Event Metadata ( Test Constants . time ), Ġ" the . g ib son ", Ġ" ac id Burn ")) čĊčĊĠĠĠĠĠĠĠ Ġverify ( inverse Ġ= Ġtrue ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Mut ator 2 . mutate Event ( any (), Ġref Eq ( handler ), Ġany ()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler . process Event ( any (), Ġany ()) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊč Ċ } čĊ