package Ġcom . inst ac art . formula Ċ Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . inst ac art . formula . internal . Try Ċ import Ġcom . inst ac art . formula . rx java 3 . Rx Stream Ċ import Ġcom . inst ac art . formula . streams . Empty Stream Ċ import Ġcom . inst ac art . formula . test . Test Callback Ċ import Ġcom . inst ac art . formula . test . Test Event Callback Ċ import Ġcom . inst ac art . formula . test . test Ċ import Ġcom . inst ac art . formula . tests . Emit Error Test Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġorg . junit . Ignore Ċ import Ġorg . junit . Test Ċ Ċ class ĠFormula Runtime Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` multiple Ġevent Ġupdates `() Ġ{ ĊĠĠĠĠĠĠĠ ĠStart Stop Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġstart Listening () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġformula . increment Events . trigger Increment () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġformula . increment Events . trigger Increment () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġformula . increment Events . trigger Increment () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( 0 , Ġ 0 , Ġ 1 , Ġ 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( values (). map Ġ{ Ġit . state Ġ}). isEqualTo ( expected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` no Ġstate Ġchanges Ġafter Ġevent Ġstream Ġis Ġremoved `() Ġ{ ĊĠĠĠĠĠĠĠ ĠStart Stop Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġstart Listening () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġformula . increment Events . trigger Increment () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġstop Listening () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġformula . increment Events . trigger Increment () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġformula . increment Events . trigger Increment () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( 0 , Ġ 0 , Ġ 1 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( values (). map Ġ{ Ġit . state Ġ}). isEqualTo ( expected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` each Ġchild Ġevent Ġhandler Ġshould Ġbe Ġscoped Ġto Ġlatest Ġstate `() Ġ{ ĊĠĠĠĠĠĠĠ ĠMultiple Child Events ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġchild . increment And Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġchild . increment And Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġchild . increment And Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĠassertThat ( state ). isEqualTo ( 3 ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` multiple Ġchild Ġworker Ġupdates `() Ġ{ ĊĠĠĠĠĠĠĠ ĠChild Stream Events () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. start Listening () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. increment By ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Current Value ( 3 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` child Ġworker Ġis Ġremoved `() Ġ{ ĊĠĠĠĠĠĠĠ ĠChild Stream Events () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. start Listening () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. increment By ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. stop Listening () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. increment By ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Current Value ( 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` parent Ġremoves Ġchild Ġwhen Ġchild Ġemits Ġa Ġmessage `() Ġ{ ĊĠĠĠĠĠĠĠ ĠChild Removed On Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Child Is Visible ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. close By Child Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Child Is Visible ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` transition Ġafter Ġno Ġre - evaluation Ġpass `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġside Effect Callback Ġ= ĠTest Callback () ĊĠĠĠĠĠĠĠ ĠTransition After No Evaluation Pass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. formula ( side Effect Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġtrigger Side Effect () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġtrigger Side Effect () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġside Effect Callback . assert Times Called ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` child Ġtransition Ġafter Ġno Ġre - evaluation Ġpass `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġside Effect Callback Ġ= ĠTest Callback () ĊĠĠĠĠĠĠĠ ĠChild Transition After No Evaluation Pass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. formula ( side Effect Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġchild . trigger Side Effect () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġchild . trigger Side Effect () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġside Effect Callback . assert Times Called ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` nested Ġchild Ġtransition Ġafter Ġno Ġre - evaluation Ġpass `() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġside Effect Callback Ġ= ĠTest Callback () ĊĠĠĠĠĠĠĠ ĠNested Child Transition After No Evaluation Pass ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. formula ( side Effect Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġchild . child . trigger Side Effect () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġchild . child . trigger Side Effect () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġside Effect Callback . assert Times Called ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` runtime Ġemits Ġmessages `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Handler Ġ= ĠTest Event Callback < Int >() ĊĠĠĠĠĠĠĠ ĠMessage Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Message Formula . Input ( message Handler Ġ= Ġmessage Handler )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġtrigger Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 1 ) Ġ// Ġno Ġstate Ġchange , Ġso Ġno Ġre - evaluation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( message Handler . values ()). has Size ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` message Ġafter Ġno Ġre - evaluation Ġpass `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Handler Ġ= ĠTest Event Callback < Int >() ĊĠĠĠĠĠĠĠ ĠMessage Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Message Formula . Input ( message Handler Ġ= Ġmessage Handler )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġtrigger Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġtrigger Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( message Handler . values ()). has Size ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` child Ġmessage Ġwith Ġno Ġparent Ġstate Ġchange `() Ġ{ ĊĠĠĠĠĠĠĠ ĠChild Message No Parent StateChange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġchild . trigger Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 1 ) Ġ Ġ// Ġno Ġstate Ġchange , Ġso Ġno Ġre - evaluation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` child Ġmessage Ġwith Ġparent Ġstate Ġchange `() Ġ{ ĊĠĠĠĠĠĠĠ ĠChild Message With Parent StateChange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġchild . trigger Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĠassertThat ( state ). isEqualTo ( 1 ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` side Ġeffect Ġtriggers Ġparent Ġstate Ġtransition `() Ġ{ ĊĠĠĠĠĠĠĠ ĠChild Message Triggers Event Transition In Parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġchild . trigger Side Effect () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( count ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` child Ġstate Ġis Ġreset Ġafter Ġtoggle `() Ġ{ ĊĠĠĠĠĠĠĠ ĠChild State Reset After Toggle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġchild !!. increment And Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġchild !!. increment And Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĠassertThat ( child !!. state ). isEqualTo ( 2 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġtoggle Child () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĠassertThat ( child ). isNull () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġtoggle Child () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĠassertThat ( child !!. state ). isEqualTo ( 0 ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` multiple Ġcallbacks Ġusing Ġthe Ġsame Ġrender Ġmodel `() Ġ{ ĊĠĠĠĠĠĠĠ ĠMessage Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Message Formula . Input ( message Handler Ġ= Ġ{} )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrement And Message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrement And Message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrement And Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( state ). isEqualTo ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` multiple Ġevent Ġcallbacks Ġusing Ġthe Ġsame Ġrender Ġmodel `() Ġ{ ĊĠĠĠĠĠĠĠ ĠEvent Callback Formula (). test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange State (" one ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange State (" two ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange State (" three ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĠassertThat ( state ). isEqualTo (" three ") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` using Ġa Ġremoved Ġchild Ġcallback Ġshould Ġdo Ġnothing `() Ġ{ ĊĠĠĠĠĠĠĠ ĠOptional Child Formula ( Message Formula ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Formula . Input ( message Handler Ġ= Ġevent Callback Ġ{ Ġnone () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Child Ġ= Ġchild !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Child () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Child . increment And Message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Child . increment And Message () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Child . increment And Message () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĠassertThat ( child ). isNull () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` callbacks Ġare Ġequal Ġacross Ġrender Ġmodel Ġchanges `() Ġ{ ĊĠĠĠĠĠĠĠ ĠMessage Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Message Formula . Input ( message Handler Ġ= Ġ{} )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġincrement And Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġincrement And Message () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( values (). map Ġ{ Ġit . increment And Message Ġ}. toSet ()). has Size ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` event Ġcallbacks Ġare Ġequal Ġacross Ġrender Ġmodel Ġchanges `() Ġ{ ĊĠĠĠĠĠĠĠ ĠEvent Callback Formula (). test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange State (" one ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange State (" two ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( values (). map Ġ{ Ġit . change State Ġ}. toSet ()). has Size ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` removed Ġcallback Ġis Ġdisabled `() Ġ{ ĊĠĠĠĠĠĠĠ ĠOptional Callback Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Callback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( values (). map Ġ{ Ġit . state Ġ}). contains Exactly ( 0 , Ġ 1 , Ġ 1 ). in Order () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` callbacks Ġare Ġnot Ġthe Ġsame Ġafter Ġremoving Ġthen Ġadding Ġit Ġagain `() Ġ{ ĊĠĠĠĠĠĠĠ ĠOptional Callback Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Callback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Callback () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( values (). map Ġ{ Ġit . callback Ġ}. toSet ()). has Size ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` removed Ġevent Ġcallback Ġis Ġdisabled `() Ġ{ ĊĠĠĠĠĠĠĠ ĠOptional Event Callback Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. invoke ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Callback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. invoke ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( values (). map Ġ{ Ġit . state Ġ}). contains Exactly ( 0 , Ġ 1 , Ġ 1 ). in Order () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` event Ġcallbacks Ġare Ġnot Ġthe Ġsame Ġafter Ġremoving Ġthen Ġadding Ġit Ġagain `() Ġ{ ĊĠĠĠĠĠĠĠ ĠOptional Event Callback Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Callback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Callback () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( values (). map Ġ{ Ġit . callback Ġ}. toSet ()). has Size ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` using Ġcallbacks Ġwithin Ġanother Ġfunction Ġcrashes `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠTry Ġ{ ĠUsing Callback sWith in Another Function . test () Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( result . error OrNull ()?. cause ). isInstanceOf ( IllegalStateException :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` using Ġkey Ġto Ġscope Ġcallbacks Ġwithin Ġanother Ġfunction `() Ġ{ ĊĠĠĠĠĠĠĠ ĠUsing Key To Scope Callback sWith in Another Function . Test Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` remove Ġitem Ġfrom Ġa Ġlist Ġusing Ġa Ġkey Ġblock Ġfor Ġeach Ġitem `() Ġ{ ĊĠĠĠĠĠĠĠ ĠKey Using List Formula ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( items Ġ= ĠlistOf (" one ", Ġ" two ", Ġ" three ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ 1 ]. onDelete Selected () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĠassertThat ( items ). has Size ( 2 ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` sub scri bes Ġto Ġupdates Ġbefore Ġdeliver ing Ġmessages `() Ġ{ ĊĠĠĠĠĠĠĠ ĠSub scri bes To All Updates Before Deliver ing Messages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( this ). isEqualTo ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` init Ġmessage Ġexecuted Ġonce `() Ġ{ ĊĠĠĠĠĠĠĠ ĠStream Init Message Deliver ed Once . test (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( formula . times Initialized Called ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` input Ġchanged Ġmessage `() Ġ{ ĊĠĠĠĠĠĠĠ ĠStream Input Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( formula . messages ). contains Exactly ( 0 , Ġ 1 , Ġ 2 ). in Order () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` events Ġapi Ġignores Ġduplicate Ġinputs `() Ġ{ ĊĠĠĠĠĠĠĠ ĠStream Input Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( formula . messages ). contains Exactly ( 0 ). in Order () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` remove Ġall Ġstreams `() Ġ{ ĊĠĠĠĠĠĠĠ ĠDynamic Stream Subject () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. update Streams (" one ", Ġ" two ", Ġ" three ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. removeAll () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` switch Ġone Ġstream `() Ġ{ ĊĠĠĠĠĠĠĠ ĠDynamic Stream Subject () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. update Streams (" one ", Ġ" two ", Ġ" three ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. update Streams (" one ", Ġ" three ", Ġ" four ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` same Ġstream Ġdeclarations Ġare Ġokay `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġformula Ġ= ĠOnly Update Formula < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents ( Empty Stream . init ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents ( Empty Stream . init ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġformula ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` same Ġobservable Ġdeclarations Ġare Ġokay `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġformula Ġ= ĠOnly Update Formula < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents ( Rx Stream . from Observable (" same ") Ġ{ ĠObservable . just ( 1 ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents ( Rx Stream . from Observable (" same ") Ġ{ ĠObservable . just ( 1 ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġformula ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` key Ġis Ġrequired Ġwhen Ġstream Ġis Ġdeclared Ġin Ġa Ġloop `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġformula Ġ= ĠOnly Update Formula < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠlistOf ( 1 , Ġ 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents ( Empty Stream . init ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnone () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠTry Ġ{ Ġformula . test ( Unit ) Ġ}. error OrNull ()?. cause ĊĠĠĠĠĠĠĠ ĠassertThat ( error ). isInstanceOf ( IllegalStateException :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` using Ġkey Ġfor Ġstream Ġdeclared Ġin Ġa Ġloop `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġformula Ġ= ĠOnly Update Formula < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠlistOf ( 1 , Ġ 2 , Ġ 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents ( Empty Stream . init ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnone () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġformula . test ( Unit ). assert Output Count ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` multiple Ġevent Ġstreams Ġwithout Ġkey `() Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexecuted Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġformula Ġ= ĠOnly Update Formula < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents ( Stream . on Init ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecuted Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents ( Stream . on Init ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecuted Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġformula . test ( Unit ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( executed ). isEqualTo ( 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` multiple Ġevents Ġwith Ġinput Ġand Ġwithout Ġkey `() Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexecuted Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġformula Ġ= ĠOnly Update Formula < Int > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents ( Stream . on Data ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ{ Ġexecuted Ġ+= Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents ( Stream . on Data ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ{ Ġexecuted Ġ+= Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġformula . test ( 1 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( executed ). isEqualTo ( 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` key Ġis Ġrequired Ġfor Ġevents Ġin Ġa Ġloop `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġformula Ġ= ĠOnly Update Formula < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠlistOf ( 0 , Ġ 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents ( Stream . on Init ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnone () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠTry Ġ{ Ġformula . test ( Unit ) Ġ}. error OrNull ()?. cause ĊĠĠĠĠĠĠĠ ĠassertThat ( error ). isInstanceOf ( IllegalStateException :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` disposing Ġformula Ġtriggers Ġterminate Ġmessage `() Ġ{ ĊĠĠĠĠĠĠĠ ĠTermin ate Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( formula . times Terminate Called ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( formula . times Terminate Called ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` re moving Ġchild Ġformula Ġtriggers Ġterminate Ġmessage `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġterminate Formula Ġ= ĠTermin ate Formula () ĊĠĠĠĠĠĠĠ ĠOptional Child Formula ( terminate Formula ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( terminate Formula . times Terminate Called ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Ġ{ Ġtoggle Child () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( terminate Formula . times Terminate Called ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` terminate Ġmessage Ġis Ġscoped Ġto Ġlatest Ġinput `() Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġemission s Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġterminate Callback Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġval Ġformula Ġ= ĠOnly Update Formula < Int > Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevents ( Stream . on Terminate ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemission s Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterminate Callback Ġ= Ġinput ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġformula ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( em ission s ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( terminate Callback ). isEqualTo ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` parent Ġremoval Ġtriggers Ġchild s Ġterminate Ġmessage `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġterminate Formula Ġ= ĠTermin ate Formula () ĊĠĠĠĠĠĠĠ Ġval Ġformula Ġ= ĠOptional Child Formula ( Has Child Formula ( terminate Formula )) ĊĊĠĠĠĠĠĠĠ Ġformula . test ( Unit ). output Ġ{ Ġtoggle Child () Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( terminate Formula . times Terminate Called ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` multiple Ġtermination Ġside - effects `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġterminate Formula Ġ= ĠTermin ate Formula () ĊĠĠĠĠĠĠĠ Ġval Ġformula Ġ= Ġobject Ġ: ĠStateless Formula < Unit , ĠUnit >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġevaluate ( input : ĠUnit , Ġcontext : ĠFormula Context < Unit >): ĠEvaluation < Unit > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġ 1 0 ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . child ( terminate Formula . id ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEvaluation ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġformula . test ( Unit ). dispose () ĊĠĠĠĠĠĠĠ ĠassertThat ( terminate Formula . times Terminate Called ). isEqualTo ( 1 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` nested Ġtermination Ġwith Ġinput Ġchanged `() Ġ{ ĊĠĠĠĠĠĠĠ ĠNested Termination With Input Changed (). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( formula . terminate Formula . times Terminate Called ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` cancel ing Ġterminate Ġstream Ġdoes Ġnot Ġemit Ġterminate Ġmessage `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġterminate Callback Ġ= ĠTest Callback () ĊĠĠĠĠĠĠĠ ĠRemoving Terminate Stream S ends No Messages Formula (). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( Removing Terminate Stream S ends No Messages Formula . Input ( on Terminate Ġ= Ġterminate Callback )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( Removing Terminate Stream S ends No Messages Formula . Input ( on Terminate Ġ= Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterminate Callback . assert Times Called ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` using Ġfrom Ġobservable Ġwith Ġinput `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġon Item Ġ= ĠTest Event Callback < From Observable With Input Formula . Item >() ĊĠĠĠĠĠĠĠ ĠFrom Observable With Input Formula (). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( From Observable With Input Formula . Input (" 1 ", Ġon Item Ġ= Ġon Item )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input ( From Observable With Input Formula . Input (" 2 ", Ġon Item Ġ= Ġon Item )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( on Item . values ()). contains Exactly ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrom Observable With Input Formula . Item (" 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrom Observable With Input Formula . Item (" 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). in Order () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` emit Ġerror `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠTry Ġ{ ĠEmit Error Test . test () Ġ}. error OrNull ()?. cause ĊĠĠĠĠĠĠĠ ĠassertThat ( error ?. message ). isEqualTo (" cr ashed ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` initialize Ġ 1 0 0 Ġlevels Ġnested Ġformula `() Ġ{ ĊĠĠĠĠĠĠĠ ĠEx tre me ly Nested Formula . nested ( 1 0 0 ). test ( Unit ). output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( this ). isEqualTo ( 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` initialize Ġ 2 5 0 Ġlevels Ġnested Ġformula `() Ġ{ ĊĠĠĠĠĠĠĠ ĠEx tre me ly Nested Formula . nested ( 2 5 0 ). test ( Unit ). output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( this ). isEqualTo ( 2 5 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ignore (" stack Ġoverflow s Ġwhen Ġthere Ġare Ġ 5 0 0 Ġnested Ġchild Ġform ulas ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` initialize Ġ 5 0 0 Ġlevels Ġnested Ġformula `() Ġ{ ĊĠĠĠĠĠĠĠ ĠEx tre me ly Nested Formula . nested ( 5 0 0 ). test ( Unit ). output Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( this ). isEqualTo ( 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` mix ing Ġcallback Ġuse Ġwith Ġkey Ġuse `() Ġ{ ĊĠĠĠĠĠĠĠ ĠMix ing Callback Use With Key Use . Parent Formula () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. test ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Output Count ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġmaybe Ġworth Ġadding Ġsupport Ġeventually . ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` nested Ġkeys Ġare Ġnot Ġallowed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠTry Ġ{ ĠNested Key Formula (). test ( Unit ) Ġ}. error OrNull ()?. cause ĊĠĠĠĠĠĠĠ ĠassertThat ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġis InstanceOf ( IllegalStateException :: class . java ) Ġ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. has Message That (). startsWith (" Nested Ġscopes Ġare Ġnot Ġsupported Ġcurrently .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` formula Ġkey Ġis Ġused Ġto Ġreset Ġroot Ġformula Ġstate `() Ġ{ ĊĠĠĠĠĠĠĠ ĠRoot Formula Key Test Subject () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. increment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. increment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. reset Key () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value ( 0 ) ĊĠĠĠ Ġ} Ċ } Ċ