package Ġcom . val er ii . coin app . ui . main Ċ Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġcom . val er ii . coin app . mapper . Response Mapper . ClientResponse . Error Ċ import Ġcom . val er ii . coin app . mapper . Response Mapper . ClientResponse . Success Ċ import Ġcom . val er ii . coin app . model . Currency Ċ import Ġcom . val er ii . coin app . model . Currency Rate Ċ import Ġcom . val er ii . coin app . model . Quote Ċ import Ġcom . val er ii . coin app . model . use case . Base Calculate Rates UseCase Ċ import Ġcom . val er ii . coin app . model . use case . Calculate Rates UseCase Ċ import Ġcom . val er ii . coin app . network . Mock Currency Client Ċ import Ġcom . val er ii . coin app . persistence . Mock Currency Dao Ċ import Ġcom . val er ii . coin app . persistence . Mock Currency Rate Dao Ċ import Ġcom . val er ii . coin app . repository . Base Fake Currency Rate Generator Ċ import Ġcom . val er ii . coin app . repository . Main Repository Ċ import Ġcom . val er ii . coin app . utils . BigDecimal Value Converter Ċ import Ġcom . val er ii . coin app . utils . BigDecimal Value Formatter Ċ import Ġcom . val er ii . coin app . utils . Value Converter Ċ import Ġcom . val er ii . coin app . utils . Value Formatter Ċ import Ġio . reactivex . rx java 3 . android . plugins . Rx Android Plugins Ċ import Ġio . reactivex . rx java 3 . core . Single Ċ import Ġio . reactivex . rx java 3 . schedul ers . Schedulers Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . TimeoutException ĊĊ Ċ class ĠMain ViewModel Test Ġ{ ĊĠĠĠ Ġprivate Ġval Ġvalue Formatter : ĠValue Formatter < BigDecimal > Ġ= ĠBigDecimal Value Formatter () ĊĠĠĠ Ġprivate Ġval Ġvalue Converter : ĠValue Converter < BigDecimal > Ġ= ĠBigDecimal Value Converter () ĊĠĠĠ Ġprivate Ġval Ġcalculate Rates UseCase : ĠCalculate Rates UseCase Ġ= ĠBase Calculate Rates UseCase ( ĊĠĠĠĠĠĠĠ Ġvalue Converter , ĊĠĠĠĠĠĠĠ Ġvalue Formatter ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġinstant Task Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ ĠRx Android Plugins . set Init MainThread Scheduler Handler Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS chedulers . from Ġ{ Ġit . run () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġ- Ġstate , Ġsuccess Ġresponse Ġfrom Ġrepository `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrency ListResponse Ġ= ĠSuccess ( listOf ( Currency (" USD ", Ġ" "))) ĊĠĠĠĠĠĠĠ Ġval Ġcurrency Rates Response Ġ= ĠSuccess ( Currency Rate (" USD ", Ġ 1 0 , ĠlistOf ( Quote (" US DE UR ", Ġ" 1 0 ")) )) ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠMain Repository ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Currency Client ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency List Ġ= ĠSingle . just ( currency ListResponse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Rates Ġ= ĠSingle . just ( currency Rates Response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase Fake Currency Rate Generator (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Currency Dao Ġ{}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Currency Rate Dao Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= ĠMain ViewModel ( repository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Rates UseCase , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Formatter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Converter , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSaved State Handle () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠInitial Ġstate Ġshould Ġbe Ġloading ĊĠĠĠĠĠĠĠ ĠassertTrue ( viewModel . isLoading . value !! ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOn Start ĊĠĠĠĠĠĠĠ ĠviewModel . onStart () ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 3 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġc urrencies Ġobserver ĊĠĠĠĠĠĠĠ Ġval Ġc urrencies Observer Ġ= Ġobject Ġ: ĠObserver < List < String >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( o : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . currencies . remove Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . currencies . observe Fore ver ( currencies Observer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġquotes Ġobserver ĊĠĠĠĠĠĠĠ Ġval Ġquotes Observer Ġ= Ġobject Ġ: ĠObserver < List < Quote >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( o : ĠList < Quote >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . quotes . remove Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . quotes . observe Fore ver ( quotes Observer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġloading Ġobserver ĊĠĠĠĠĠĠĠ Ġval Ġloading Observer Ġ= Ġobject Ġ: ĠObserver < Boolean > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( o : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . isLoading . remove Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . isLoading . observe Fore ver ( loading Observer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġwait Ġin def initely Ġif Ġthe ĠLive Data Ġis Ġnot Ġset . ĊĠĠĠĠĠĠĠ Ġif Ġ(! latch . await ( 5 , ĠTimeUnit . SECONDS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTimeout Exception (" Invalid Ġstate ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTest Ġview Ġmodel Ġstate ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf (" USD "), ĠviewModel . currencies . value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( Quote (" US DE UR ", Ġ" 1 0 . 0 0 ")), ĠviewModel . quotes . value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( false , ĠviewModel . isLoading . value ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOn Stop ĊĠĠĠĠĠĠĠ ĠviewModel . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġ- Ġstate , Ġerror Ġresponse Ġfrom Ġrepository `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrency ListResponse Ġ= ĠError < List < Currency >> (" Server Ġerror Ġcode : Ġ 1 0 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġcurrency Rates Response Ġ= ĠError < Currency Rate >(" Server Ġerror Ġcode : Ġ 1 0 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠMain Repository ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Currency Client ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency List Ġ= ĠSingle . just ( currency ListResponse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Rates Ġ= ĠSingle . just ( currency Rates Response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase Fake Currency Rate Generator (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Currency Dao Ġ{}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Currency Rate Dao Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= ĠMain ViewModel ( repository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Rates UseCase , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Formatter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Converter , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSaved State Handle () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠInitial Ġstate Ġshould Ġbe Ġloading ĊĠĠĠĠĠĠĠ ĠassertTrue ( viewModel . isLoading . value !! ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOn Start ĊĠĠĠĠĠĠĠ ĠviewModel . onStart () ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġerror Ġobserver ĊĠĠĠĠĠĠĠ Ġval Ġerror Observer Ġ= Ġobject Ġ: ĠObserver < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( o : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . error . remove Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . error . observe Fore ver ( error Observer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġwait Ġin def initely Ġif Ġthe ĠLive Data Ġis Ġnot Ġset . ĊĠĠĠĠĠĠĠ Ġif Ġ(! latch . await ( 2 , ĠTimeUnit . SECONDS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTimeout Exception (" Invalid Ġstate ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTest Ġview Ġmodel Ġstate ĊĠĠĠĠĠĠĠ ĠassertEquals ( null , ĠviewModel . currencies . value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( null , ĠviewModel . quotes . value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( true , ĠviewModel . isLoading . value ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Server Ġerror Ġcode : Ġ 1 0 1 ", ĠviewModel . error . value ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOn Stop ĊĠĠĠĠĠĠĠ ĠviewModel . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġ- Ġselect Ġcurrency , Ġsuccess Ġresponse Ġfrom Ġrepository `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrency ListResponse Ġ= ĠSuccess ( listOf ( Currency (" USD ", Ġ""), ĠCurrency (" EUR ", Ġ" "))) ĊĠĠĠĠĠĠĠ Ġval Ġcurrency Rates Response Ġ= ĠSuccess ( Currency Rate (" USD ", Ġ 1 0 , ĠlistOf ( Quote (" US DE UR ", Ġ" 1 0 ")) )) ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠMain Repository ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Currency Client ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency List Ġ= ĠSingle . just ( currency ListResponse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Rates Ġ= ĠSingle . just ( currency Rates Response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase Fake Currency Rate Generator (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Currency Dao Ġ{}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Currency Rate Dao Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= ĠMain ViewModel ( repository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Rates UseCase , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Formatter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Converter , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSaved State Handle () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠInitial Ġstate Ġshould Ġbe Ġloading ĊĠĠĠĠĠĠĠ ĠassertTrue ( viewModel . isLoading . value !! ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOn Start ĊĠĠĠĠĠĠĠ ĠviewModel . onStart () ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġquotes Ġobserver ĊĠĠĠĠĠĠĠ Ġval Ġquotes Observer Ġ= Ġobject Ġ: ĠObserver < List < Quote >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfirst Update Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( o : ĠList < Quote >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . quotes . remove Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Update Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . quotes . observe Fore ver ( quotes Observer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSelect Ġcurrency ĊĠĠĠĠĠĠĠ ĠviewModel . select Currency (" EUR ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġwait Ġin def initely Ġif Ġthe ĠLive Data Ġis Ġnot Ġset . ĊĠĠĠĠĠĠĠ Ġif Ġ(! latch . await ( 2 , ĠTimeUnit . SECONDS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTimeout Exception (" Invalid Ġstate ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTest Ġview Ġmodel Ġstate ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf (" USD ", Ġ" EUR "), ĠviewModel . currencies . value ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" EUR ", ĠviewModel . selected . value ) ĊĠĠĠĠĠĠĠ ĠviewModel . quotes . value !!. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . quote . contains (" EUR ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( false , ĠviewModel . isLoading . value ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOn Stop ĊĠĠĠĠĠĠĠ ĠviewModel . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġ- Ġupdate Ġcurrency Ġvalue , Ġsuccess Ġresponse Ġfrom Ġrepository `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrency ListResponse Ġ= ĠSuccess ( listOf ( Currency (" USD ", Ġ""), ĠCurrency (" EUR ", Ġ" "))) ĊĠĠĠĠĠĠĠ Ġval Ġcurrency Rates Response Ġ= ĠSuccess ( Currency Rate (" USD ", Ġ 1 0 , ĠlistOf ( Quote (" US DE UR ", Ġ" 1 0 ")) )) ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠMain Repository ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Currency Client ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency List Ġ= ĠSingle . just ( currency ListResponse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Rates Ġ= ĠSingle . just ( currency Rates Response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase Fake Currency Rate Generator (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Currency Dao Ġ{}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Currency Rate Dao Ġ{}) ĊĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= ĠMain ViewModel ( repository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Rates UseCase , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Formatter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Converter , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSaved State Handle () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠInitial Ġstate Ġshould Ġbe Ġloading ĊĠĠĠĠĠĠĠ ĠassertTrue ( viewModel . isLoading . value !! ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOn Start ĊĠĠĠĠĠĠĠ ĠviewModel . onStart () ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġquotes Ġobserver ĊĠĠĠĠĠĠĠ Ġval Ġquotes Observer Ġ= Ġobject Ġ: ĠObserver < List < Quote >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfirst Update Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( o : ĠList < Quote >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . quotes . remove Observer ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Update Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . quotes . observe Fore ver ( quotes Observer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSelect Ġcurrency ĊĠĠĠĠĠĠĠ ĠviewModel . update Currency Value (" 1 0 ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġwait Ġin def initely Ġif Ġthe ĠLive Data Ġis Ġnot Ġset . ĊĠĠĠĠĠĠĠ Ġif Ġ(! latch . await ( 2 , ĠTimeUnit . SECONDS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTimeout Exception (" Invalid Ġstate ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTest Ġview Ġmodel Ġstate ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf (" USD ", Ġ" EUR "), ĠviewModel . currencies . value ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" USD ", ĠviewModel . selected . value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( Quote (" US DE UR ", Ġ" 1 0 0 . 0 0 ")), ĠviewModel . quotes . value ) Ġ// ĠCalcul ated ĊĠĠĠĠĠĠĠ ĠassertEquals ( false , ĠviewModel . isLoading . value ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOn Stop ĊĠĠĠĠĠĠĠ ĠviewModel . on Stop () ĊĠĠĠ Ġ} Ċ }