/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 . Ġ ĠThe ĠRedis ĠOpen ĠSource ĠProject Ċ Ġ* ĠAuthor : ĠAlex ey ĠRo zh kov Ġhttps :// github . com / ar 2 code Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġru . ar 2 code . redis . clean . arch . cor out ins Ċ Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . Test Ċ import Ġru . ar 2 code . redis . clean . arch . cor out ins . pre pa res . Simple Delayed Sync UseCase Ċ import Ġru . ar 2 code . redis . clean . arch . cor out ins . pre pa res . Simple Exception UseCase Ċ import Ġru . ar 2 code . redis . clean . arch . cor out ins . pre pa res . Simple Custom Await Config UseCase Ċ import Ġru . ar 2 code . redis . clean . arch . coroutines . UseCase Cancelled Exception ĊĊ Ċ class ĠSynchron ized UseCase Tests Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Flows Ġthat Ġwas Ġrun Ġfrom Ġsame Ġsynchronized Ġuse Ġcase Ġexecute Ġse quent ially `() Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow 1 param Ġ= Ġ" flow 1 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow 2 param Ġ= Ġ" flow 2 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow 3 param Ġ= Ġ" flow 3 " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Case Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Delayed Sync UseCase () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow 1 Ġ= Ġuse Case . run ( flow 1 param ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow 2 Ġ= Ġuse Case . run ( flow 2 param ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow 3 Ġ= Ġuse Case . run ( flow 3 param ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Result Ġ= Ġ"$ flow 1 param $ flow 2 param $ flow 3 param " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . append ( flow 1 param ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . append ( flow 2 param ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . append ( flow 3 param ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( results . toString ()). isEqualTo ( expected Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Flow Ġthat Ġwas Ġrun Ġfrom Ġsame Ġsynchronized Ġuse Ġcase Ġawait s Ġprevious Ġflow Ġfinish ing `() Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow 1 param Ġ= Ġ" flow 1 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow 2 param Ġ= Ġ" flow 2 " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Case Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Delayed Sync UseCase () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow 1 Ġ= Ġuse Case . run ( flow 1 param ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow 2 Ġ= Ġuse Case . run ( flow 2 param ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// expected : Ġf 1 - 1 emit / f 1 - 2 emit / f 2 - 1 emit / f 2 - 2 emit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Result Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ flow 1 param $ flow 1 param $ flow 2 param $ flow 2 param " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow 1 . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . append ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( results . toString ()). isEqualTo ( expected Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults . append ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Flow Ġpropag ates Ġexception `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexception Msg Ġ= Ġ" test Ġexception " ĊĠĠĠĠĠĠĠ Ġval Ġuse Case Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Exception UseCase () ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġuse Case . run ( exception Msg ) ĊĠĠĠĠĠĠĠ Ġvar Ġis Exception Occurred Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġflow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġth Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Exception Occurred Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( th . message ). isEqualTo ( exception Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertThat ( is Exception Occurred ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Flow Ġthrows Ġcancellation Ġexception Ġafter Ġuse Ġcase Ġcancelled `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuse Case Ġ= ĠSimple Delayed Sync UseCase () ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġuse Case . run ("") ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Exception Occurred Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġflow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġth Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Exception Occurred Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( th ). isInstanceOf ( UseCase Cancelled Exception :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Case . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertThat ( is Exception Occurred ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Flow Ġis Ġcancelled Ġwith Ġexception Ġafter Ġtimeout `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow 1 param Ġ= Ġ" flow 1 " ĊĠĠĠĠĠĠĠ Ġval Ġflow 2 param Ġ= Ġ" flow 2 " ĊĊĠĠĠĠĠĠĠ Ġval Ġtimeout Ms Ġ= Ġ 5 0 0 L ĊĊĠĠĠĠĠĠĠ Ġval Ġuse Case Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Custom Await Config UseCase ( timeout Ms ) ĊĠĠĠĠĠĠĠ Ġval Ġflow 1 Ġ= Ġuse Case . run ( flow 1 param ) ĊĠĠĠĠĠĠĠ Ġval Ġflow 2 Ġ= Ġuse Case . run ( flow 2 param ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġflow 2 Collected Something Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflow 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Completion Ġ{ Ġth Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( flow 2 Collected Something ). isFalse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( th ). isNotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( th ). isInstanceOf ( Timeout Cancellation Exception :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow 2 Collected Something Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }