package Ġcom . example . city search . accept ance Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . widget . Search View Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . fragment . app . Fragment Transaction Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . platform . app . Instrumentation Registry Ċ import Ġcom . example . city search . entities . City SearchResult Ċ import Ġcom . example . city search . fragments . City Details Fragment Ċ import Ġcom . example . city search . factories . City Details Fragment Factory Ċ import Ġcom . example . city search . factories . Open Details Command Factory Imp Ċ import Ġcom . example . city search . commands . Open Details Command Imp Ċ import Ġcom . example . city search . stub . City SearchResults Stub Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any OrNull Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ class ĠOpen Details Command Tests Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġsteps : ĠOpen Details Command Steps ĊĊĠĠĠ Ġval ĠGiven : ĠOpen Details Command Steps Ġget () Ġ= Ġsteps ĊĠĠĠ Ġval ĠWhen : ĠOpen Details Command Steps Ġget () Ġ= Ġsteps ĊĠĠĠ Ġval ĠThen : ĠOpen Details Command Steps Ġget () Ġ= Ġsteps ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġsteps Ġ= ĠOpen Details Command Steps ( Instrumentation Registry . get Instrumentation (). target Context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Open Details Command () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġsearch Result Ġ= ĠGiven . search Result () ĊĠĠĠĠĠĠĠ Ġval Ġsearch Screen Ġ= ĠGiven . search Screen () ĊĠĠĠĠĠĠĠ Ġval Ġnavigation Stack Ġ= ĠGiven . navigation Stack ( search Screen ) ĊĠĠĠĠĠĠĠ Ġval Ġopen Details Command Ġ= ĠGiven . open Details Command ( search Result , Ġsearch Screen ) ĊĠĠĠĠĠĠĠ Ġval Ġdetails Screen Ġ= ĠGiven . details Screen ( search Result ) ĊĊĠĠĠĠĠĠĠ ĠWhen . invoke ( open Details Command ) ĊĊĠĠĠĠĠĠĠ ĠThen . details Screen Is P ushed On to Stack ( details Screen , Ġnavigation Stack ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠOpen Details Command Steps ( private Ġval Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdetails Fragment Factory Ġ= Ġmock < City Details Fragment Factory > Ġ{ Ġ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsearch View Ġ= Ġmock < Search View > Ġ{ Ġ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpushed Fragments Ġ= ĠArrayList < Fragment >() ĊĊĠĠĠ Ġprivate Ġval Ġfragment Manager Ġ= Ġmock < FragmentManager > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġbegin Transaction () Ġ}. then Ġ{ Ġinvocation Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġmock < Fragment Transaction > Ġ{ Ġ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfragment : ĠFragment ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpushed Fragment : ĠFragment ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( transaction . replace ( any (), Ġany ())). then Ġ{ Ġinvocation Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Id Ġ= Ġinvocation . get Argument < Int >( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( view Id Ġ== Ġandroid . R . id . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Ġ= Ġinvocation . get Argument < Fragment >( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( transaction . addTo Back Stack ( any OrNull ())). then Ġ{ Ġinvocation Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġfragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( fragment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpushed Fragment Ġ= Ġfragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( transaction . commit ()). then Ġ{ Ġinvocation Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġpushed Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( fragment Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpushed Fragments . add ( fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch Result (): ĠCity SearchResult Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCity SearchResults Stub . stub Results (). results [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch Screen (): ĠSearch View Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsearch View ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnavigation Stack ( search Screen : ĠSearch View ): ĠFragment Manager Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfragment Manager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen Details Command ( search Result : ĠCity SearchResult , Ġsearch Screen : ĠSearch View ): ĠOpen Details Command Imp Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOpen Details Command Factory Imp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetails Fragment Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfactory . open Details Command ( search Result ) Ġas ĠOpen Details Command Imp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdetails Screen ( search Result : ĠCity SearchResult ): ĠCity Details Fragment Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġdetails Screen Ġ= Ġmock < City Details Fragment >() ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġwhenever ( details Fragment Factory . details Fragment ( search Result )). thenReturn ( details Screen ) ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġreturn Ġdetails Screen ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinvoke ( details Command : ĠOpen Details Command Imp ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġdetails Command . invoke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdetails Screen Is P ushed On to Stack ( details Screen : ĠCity Details Fragment , Ġnavigation Stack : ĠFragment Manager ) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠAssert . assertEquals (" Details Ġscreen Ġwas Ġnot Ġpushed Ġonto Ġnavigation Ġstack ", Ġarray ListOf ( details Screen ), Ġpushed Fragments ) ĊĠĠĠ Ġ} Ċ }