package Ġcom . m rt . box . sample Ċ Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġcom . m rt . box . android . Box Vm Ċ import Ġcom . m rt . box . core . Box Blueprint Ċ import Ġcom . m rt . box . core . Box Event Ċ import Ġcom . m rt . box . core . Box Output Ċ import Ġcom . m rt . box . core . Box Side Effect Ċ import Ġcom . m rt . box . core . Box State Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . new Single Thread Context Ċ import Ġkotlinx . coroutines . test . reset Main Ċ import Ġkotlinx . coroutines . test . set Main Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . mockito . Mockito Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġj ae ho cho e Ġon Ġ 2 0 2 0 - 0 4 - 2 4 . Ċ Ġ*/ Ċ abstract Ġclass ĠVm Test < S Ġ: ĠBox State , ĠE Ġ: ĠBox Event , ĠSE Ġ: ĠBox Side Effect > Ġ{ ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġinstant Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠĠĠ Ġprivate Ġval Ġmain Thread Sur rogate Ġ= Ġnew Single Thread Context (" UI Ġthread ") ĊĊĠĠĠ Ġabstract Ġval Ġvm : ĠBox Vm < S , ĠE , ĠSE > ĊĊĠĠĠ Ġabstract Ġfun Ġempty State (): ĠS ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ ĠDispatch ers . set Main ( main Thread Sur rogate ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ ĠDispatch ers . reset Main () ĊĠĠĠĠĠĠĠ Ġmain Thread Sur rogate . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠBox Vm < S , ĠE , ĠSE >. test Intent ( ĊĠĠĠĠĠĠĠ Ġevent : ĠE , ĊĠĠĠĠĠĠĠ Ġstate : ĠS Ġ= Ġempty State () ĊĠĠĠ Ġ): ĠBox Output < S , ĠE , ĠSE > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġmock Blueprint (). reduce ( state , Ġevent ) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( intent ( event )). thenReturn ( output ) ĊĠĠĠĠĠĠĠ Ġreturn Ġintent ( event ) Ġas ĠBox Output . Valid < S , ĠE , ĠSE > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġ< S Ġ: ĠBox State , ĠE Ġ: ĠBox Event , ĠSE Ġ: ĠBox Side Effect > ĠBox Output < S , ĠE , ĠSE >. valid (): ĠBox Output . Valid < S , ĠE , ĠSE > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġas ĠBox Output . Valid < S , ĠE , ĠSE > ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprotected Ġsuspend Ġfun Ġdo Io Side Effect ( output : ĠBox Output . Valid < S , ĠE , ĠSE >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Blueprint (). io Work OrNull ( output . side Effect ) !! ( output . valid ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġsuspend Ġfun Ġdo He avy Side Effect ( output : ĠBox Output . Valid < S , ĠE , ĠSE >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Blueprint (). heavy Work OrNull ( output . side Effect ) !! ( output . valid ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġdo Side Effect ( output : ĠBox Output . Valid < S , ĠE , ĠSE >) Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Blueprint (). work OrNull ( output . side Effect ) !! ( output . valid ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġmock Blueprint (): ĠBox Blueprint < S , ĠE , ĠSE > Ċ } ĊĊ