package Ġw ang . lifecycle . test . base Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . test . core . app . Activity Scenario Ċ import Ġjava . util . concurrent . S ynchronous Queue Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . concurrent . thread Ċ import Ġkotlin . test . assertEquals Ċ Ċ class ĠOb serve TestRunner < A Ġ: ĠActivity , ĠT >( ĊĠĠĠ Ġprivate Ġval Ġscenario : ĠActivity Scenario < A >, ĊĠĠĠ Ġprivate Ġval Ġtest ClassName : ĠString , ĊĠĠĠ Ġprivate Ġval Ġtest MethodName : ĠString , ĊĠĠĠ Ġprivate Ġval Ġdesc : ĠString ? Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" TestRunner " ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< A Ġ: ĠActivity , ĠT > Ġnew Runner ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscenario : ĠActivity Scenario < A >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest ClassName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest MethodName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdesc : ĠString ? ĊĠĠĠĠĠĠĠ Ġ) Ġ= ĠOb serve TestRunner < A , ĠT >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscenario , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest ClassName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest MethodName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdesc ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġ_ on Launch Activity : Ġ( activity : ĠA , ĠObserver < T >) Ġ-> ĠUnit ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġon Activity Stopped : Ġ( activity : ĠA ) Ġ-> ĠUnit ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġon Activity Res umed : Ġ( activity : ĠA ) Ġ-> ĠUnit ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġon Activity Destroy : Ġ( activity : ĠA ) Ġ-> ĠUnit ĊĠĠĠ Ġprivate Ġvar Ġ_ on Before : Ġ( activity : ĠA ) Ġ-> ĠUnit Ġ= Ġ{} ĊĊĠĠĠ Ġfun Ġlaunch Activity Then ( block : Ġ( activity : ĠA , ĠObserver < T >) Ġ-> ĠUnit ): ĠOb serve TestRunner < A , ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis ._ on Launch Activity Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Activity Then ( block : Ġ( activity : ĠA ) Ġ-> ĠUnit ): ĠOb serve TestRunner < A , ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . on Activity Stopped Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresume Activity Then ( block : Ġ( activity : ĠA ) Ġ-> ĠUnit ): ĠOb serve TestRunner < A , ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . on Activity Res umed Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdestroy Activity Then ( block : Ġ( activity : ĠA ) Ġ-> ĠUnit ): ĠOb serve TestRunner < A , ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . on Activity Destroy Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassert In Turn Ob served ( var arg Ġvalue : ĠT , Ġon Failed Message : Ġ(( seq : ĠInt , Ġexpected : ĠT , Ġactual : ĠT ) Ġ-> ĠString )? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġprintln ("${ TAG } ï¼ļ TestRunner . assertIn Turn Ob served () Ġ Ġthread Ġ-> Ġ${ Thread . currentThread (). name }") ĊĊĠĠĠĠĠĠĠ Ġval Ġrecord Changed Ġ= ĠS ynchronous Queue < T >() ĊĠĠĠĠĠĠĠ Ġval Ġrecord Count Ġ= Ġvalue . size ĊĠĠĠĠĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġseq Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( seq Ġ< Ġrecord Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġrecord Changed . poll ( 3 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġvalue [ seq ++] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprintln ("${ TAG } ï¼ļ ${ test ClassName }.${ test MethodName }() Ġæµ ĭ è¯ķ Ġ-> Ġ[ ${ seq }] Ġ$ expected ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġon Failed Message ?. invoke ( seq , Ġexpected , Ġactual ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ċ """ Ċ Ċ ================ $ TAG ================ Ċ æµĭè¯ķ ç±» ï¼ļ $ test ClassName Ċ æµĭè¯ķ æĸ¹æ³ķ ï¼ļ ${ test MethodName }() Ċ $ desc Ċ æµĭè¯ķ å¤±è´¥ ï¼ļ ç¬¬ ${ seq } ä¸ª ï¼Į é¢Ħ æľŁ åĢ¼ä¸º [ ${ expected }] ï¼Į ä½Ĩæĺ¯ å®ŀéĻħ ä¸º [ ${ actual }] Ċ ================================ ===== Ċ Ċ """. trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual , Ġmessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( this ::_ on Launch Activity . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscenario . on Activity Ġ{ Ġactivity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ on Before ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ on Launch Activity . invoke ( activity , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprintln ("${ TAG } ï¼ļ ${ test ClassName }.${ test MethodName }() ĠonChanged Ġ-> Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Changed . put ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(:: on Activity Stopped . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . CREATED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscenario . on Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Activity Stopped . invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(:: on Activity Res umed . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscenario . moveTo State ( Lifecycle . State . RE SU MED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscenario . on Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Activity Res umed . invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ