package Ġme . tim new . architecture . inter actor Ċ Ċ import Ġio . mock k . Ordering Ċ import Ġio . mock k . spy k Ċ import Ġio . mock k . un mock k All Ċ import Ġio . mock k . verify Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ class ĠTest Presenter Ġ{ ĊĠ Ġfun Ġrender Data ( value : ĠInt ) Ġ{ ĊĠĠĠ Ġprintln (" Render : Ġ$ value ") ĊĠ Ġ} Ċ } Ċ Ċ class ĠUse Subscription As Test Ġ{ ĊĠ Ġclass ĠTest Interactor ( ĊĠĠĠ Ġprivate Ġval ĠdataSource : ĠObservable < Int >, ĊĠĠĠ Ġprivate Ġval Ġpresenter : ĠTest Presenter ĊĠ Ġ) Ġ: ĠInter actor () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġsubscription (): ĠIterable < Disposable > Ġ= ĊĠĠĠĠĠ Ġsubscription As Ġ{ Ġsubscription Ġ-> ĊĠĠĠĠĠĠĠ Ġsubscription Ġhas ĊĠĠĠĠĠĠĠĠĠ ĠdataSource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ> Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġ* Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( presenter :: render Data ) ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġlateinit Ġvar Ġpresenter : ĠTest Presenter ĊĠ Ġprivate Ġlateinit Ġvar Ġinter actor : ĠInter actor ĊĊĠ Ġ@ Before ĊĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠ Ġpresenter Ġ= Ġspy k () ĊĠ Ġ} ĊĊĠ Ġ@ After ĊĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠ Ġinter actor . dispose () ĊĠĠĠ Ġun mock k All () ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` should Ġrun `() Ġ{ ĊĠĠĠ Ġinter actor Ġ= ĠTest Interactor ( ĊĠĠĠĠĠ ĠdataSource Ġ= ĠObservable . from Array (- 2 , Ġ- 1 , Ġ 0 , Ġ 1 , Ġ 2 , Ġ 3 ), ĊĠĠĠĠĠ Ġpresenter Ġ= Ġpresenter ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinter actor . start () ĊĊĠĠĠ Ġverify ( Ordering . SEQUENCE ) Ġ{ ĊĠĠĠĠĠ Ġpresenter . render Data ( 1 ) ĊĠĠĠĠĠ Ġpresenter . render Data ( 4 ) ĊĠĠĠĠĠ Ġpresenter . render Data ( 9 ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` should Ġstop `() Ġ{ ĊĠĠĠ Ġinter actor Ġ= ĠTest Interactor ( ĊĠĠĠĠĠ ĠdataSource Ġ= ĠObservable . interval Range ( 1 , Ġ 5 , Ġ 0 , Ġ 2 0 , ĠTimeUnit . MILLISECONDS ). map ( Long :: toInt ), ĊĠĠĠĠĠ Ġpresenter Ġ= Ġpresenter ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinter actor . start () ĊĊĠĠĠ ĠThread . sleep ( 1 0 ) ĊĊĠĠĠ Ġinter actor . stop () ĊĊĠĠĠ Ġverify ( Ordering . SEQUENCE ) Ġ{ ĊĠĠĠĠĠ Ġpresenter . render Data ( 1 ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ class ĠUse Iterator Test Ġ{ ĊĠ Ġclass ĠTest Interactor ( ĊĠĠĠ Ġprivate Ġval ĠdataSource : ĠObservable < Int >, ĊĠĠĠ Ġprivate Ġval Ġpresenter : ĠTest Presenter ĊĠ Ġ) Ġ: ĠInter actor () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġsubscription (): ĠIterable < Disposable > Ġ= ĊĠĠĠĠĠ Ġiterator Ġ{ ĊĠĠĠĠĠĠĠ Ġyield ( ĊĠĠĠĠĠĠĠĠĠ ĠdataSource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ> Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġ* Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( presenter :: render Data ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. as Sequence (). toList () Ġ// ĠConvert ĠIterator Ġto ĠIterable ĊĠ Ġ} ĊĊĠ Ġprivate Ġlateinit Ġvar Ġpresenter : ĠTest Presenter ĊĠ Ġprivate Ġlateinit Ġvar Ġinter actor : ĠInter actor ĊĊĠ Ġ@ Before ĊĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠ Ġpresenter Ġ= Ġspy k () ĊĠ Ġ} ĊĊĠ Ġ@ After ĊĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠ Ġinter actor . dispose () ĊĠĠĠ Ġun mock k All () ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` should Ġrun `() Ġ{ ĊĠĠĠ Ġinter actor Ġ= ĠTest Interactor ( ĊĠĠĠĠĠ ĠdataSource Ġ= ĠObservable . from Array (- 2 , Ġ- 1 , Ġ 0 , Ġ 1 , Ġ 2 , Ġ 3 ), ĊĠĠĠĠĠ Ġpresenter Ġ= Ġpresenter ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinter actor . start () ĊĊĠĠĠ Ġverify ( Ordering . SEQUENCE ) Ġ{ ĊĠĠĠĠĠ Ġpresenter . render Data ( 1 ) ĊĠĠĠĠĠ Ġpresenter . render Data ( 4 ) ĊĠĠĠĠĠ Ġpresenter . render Data ( 9 ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` should Ġstop `() Ġ{ ĊĠĠĠ Ġinter actor Ġ= ĠTest Interactor ( ĊĠĠĠĠĠ ĠdataSource Ġ= ĠObservable . interval Range ( 1 , Ġ 5 , Ġ 0 , Ġ 2 0 , ĠTimeUnit . MILLISECONDS ). map ( Long :: toInt ), ĊĠĠĠĠĠ Ġpresenter Ġ= Ġpresenter ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinter actor . start () ĊĊĠĠĠ ĠThread . sleep ( 1 8 ) ĊĊĠĠĠ Ġinter actor . stop () ĊĊĠĠĠ Ġverify ( Ordering . SEQUENCE ) Ġ{ ĊĠĠĠĠĠ Ġpresenter . render Data ( 1 ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ