/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠMax im ĠSm oly ak ov Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . max im code . demo app Ċ Ċ import Ġcom . max im code . demo app . main . Counter State Ċ import Ġcom . max im code . demo app . main . Counter ViewModel Ċ import Ġcom . max im code . demo app . main . Main Effect Ċ import Ġcom . max im code . demo app . models . Counter Reducer Ċ import Ġcom . max im code . rx m vi . core . Middleware Ċ import Ġcom . max im code . rx m vi . core . Middleware . Companion . middle wares Ċ import Ġcom . max im code . rx m vi . core . store . create Store Ċ import Ġio . mock k .* Ċ import Ġio . mock k . impl . annotations . Mock K Ċ import Ġio . reactivex . rx java 3 . android . plugins . Rx Android Plugins . set Init MainThread Scheduler Handler Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġio . reactivex . rx java 3 . ob servers . Test Observer Ċ import Ġio . reactivex . rx java 3 . schedul ers . Schedulers Ċ import Ġorg . hamcrest . Core Matchers .` is ` Ċ import Ġorg . hamcrest . Matcher Assert . assertThat Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ Ċ class ĠCounter ViewModel Test Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠCounter ViewModel ĊĠĠĠ Ġprivate Ġ Ġval Ġtest Observer Ġ= ĠTest Observer < Counter State >() ĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġlateinit Ġvar Ġinc : ĠMiddleware < Counter State > ĊĊĠĠĠ Ġprivate Ġfun Ġmock Middleware () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠMain Effect . Increment Success ( 1 ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinc . bind ( any (), Ġany ()) Ġ} Ġanswers Ġ{ ĠObservable . just ( action ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Init MainThread Scheduler Handler Ġ{ ĠS chedulers . tr amp oline () Ġ} ĊĠĠĠĠĠĠĠ ĠMock K Annotations . init ( this , Ġrelax Unit Fun Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġmock Middleware () ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġcreate Store ( Counter Reducer (), ĠCounter State (), Ġmiddle wares ( inc )) ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠCounter ViewModel ( store ) ĊĠĠĠĠĠĠĠ Ġstore . state . subscribe ( test Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` when Ġincrement Ġcounter Ġtriggered , Ġshould Ġhide Ġhint Ġand Ġchange Ġresult Ġto Ġ 1 `() Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . increment Counter ( Observable . just ( Unit )) ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġtest Observer . values ()[ 0 ] Ġas ĠCounter State ĊĠĠĠĠĠĠĠ ĠassertThat ( state . is Hint Displayed , Ġ` is `( false )) ĊĠĠĠĠĠĠĠ ĠassertThat ( state . result , Ġ` is `( 1 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` when Ġdecrement Ġcounter Ġtriggered , Ġshould Ġhide Ġhint Ġand Ġchange Ġresult Ġto Ġ 0 `() Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . decrement Counter ( Observable . just ( Unit )) ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġtest Observer . values ()[ 1 ] Ġas ĠCounter State ĊĠĠĠĠĠĠĠ ĠassertThat ( state . is Hint Displayed , Ġ` is `( false )) ĊĠĠĠĠĠĠĠ ĠassertThat ( state . result , Ġ` is `( 0 )) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` when Ġshow Ġhint Ġtriggered , Ġshould Ġchange Ġis Hint Displayed Ġto Ġtrue `() Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . show Hint ( Observable . just ( Unit )) ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġtest Observer . values ()[ 1 ] Ġas ĠCounter State ĊĠĠĠĠĠĠĠ ĠassertThat ( state . is Hint Displayed , Ġ` is `( true )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` when Ġshow Ġhint Ġtriggered Ġtwice , Ġshould Ġchange Ġis Hint Displayed Ġto Ġfalse `() Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . show Hint ( Observable . just ( Unit )) ĊĠĠĠĠĠĠĠ ĠviewModel . show Hint ( Observable . just ( Unit )) ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġtest Observer . values ()[ 2 ] Ġas ĠCounter State ĊĠĠĠĠĠĠĠ ĠassertThat ( state . is Hint Displayed , Ġ` is `( false )) ĊĠĠĠ Ġ} Ċ }