/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ @ file : Suppress (" EXPERIMENT AL _ API _ USAGE ") Ċ Ċ package Ġcom . squareup . workflow Ċ Ċ import Ġcom . squareup . workflow . testing . test Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . buffer Ċ import Ġkotlinx . coroutines . flow . conf late Ċ import Ġkotlinx . coroutines . flow . empty Flow Ċ import Ġkotlinx . coroutines . flow . flow Of Ċ import Ġkotlinx . coroutines . flow . flow On Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . toList Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . test . Test Coroutine Dispatcher Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertFalse Ċ import Ġkotlin . test . assertNot Same Ċ import Ġkotlin . test . assertTrue Ċ Ċ class ĠWorker Test Ġ{ ĊĊĠ Ġprivate Ġclass ĠExpected Exception Ġ: ĠRuntimeException () ĊĊĠ Ġ@ Test Ġfun Ġ` create Ġreturns Ġequivalent Ġworkers `() Ġ{ ĊĠĠĠ Ġval Ġworker 1 Ġ= ĠWorker . create < Unit > Ġ{} ĊĠĠĠ Ġval Ġworker 2 Ġ= ĠWorker . create < Unit > Ġ{} ĊĊĠĠĠ Ġassert Not Same ( worker 1 , Ġworker 2 ) ĊĠĠĠ ĠassertTrue ( worker 1 . does Same Work As ( worker 2 )) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` create Ġreturns Ġnon - e quivalent Ġworkers Ġbased Ġon Ġtype `() Ġ{ ĊĠĠĠ Ġval Ġworker 1 Ġ= ĠWorker . create < Unit > Ġ{} ĊĠĠĠ Ġval Ġworker 2 Ġ= ĠWorker . create < Int > Ġ{} ĊĊĠĠĠ ĠassertFalse ( worker 1 . does Same Work As ( worker 2 )) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` create Ġemits Ġand Ġfinishes `() Ġ{ ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . create Ġ{ ĊĠĠĠĠĠ Ġemit (" hello ") ĊĠĠĠĠĠ Ġemit (" world ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ ĠassertEquals (" hello ", Ġnext Output ()) ĊĠĠĠĠĠ ĠassertEquals (" world ", Ġnext Output ()) ĊĠĠĠĠĠ Ġassert Finished () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` create Ġfinishes Ġwithout Ġemit ting `() Ġ{ ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . create < String > Ġ{} ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ Ġassert Finished () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` create Ġpropag ates Ġexceptions `() Ġ{ ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . create < Unit > Ġ{ Ġthrow ĠExpected Exception () Ġ} ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ ĠassertTrue ( get Exception () Ġis ĠExpected Exception ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` create Side Effect Ġreturns Ġequivalent Ġworkers `() Ġ{ ĊĠĠĠ Ġval Ġworker 1 Ġ= ĠWorker . create Side Effect Ġ{} ĊĠĠĠ Ġval Ġworker 2 Ġ= ĠWorker . create Side Effect Ġ{} ĊĊĠĠĠ Ġassert Not Same ( worker 1 , Ġworker 2 ) ĊĠĠĠ ĠassertTrue ( worker 1 . does Same Work As ( worker 2 )) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` create Side Effect Ġruns `() Ġ{ ĊĠĠĠ Ġvar Ġran Ġ= Ġfalse ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . create Side Effect Ġ{ ĊĠĠĠĠĠ Ġran Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ ĠassertTrue ( ran ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` create Side Effect Ġfinishes `() Ġ{ ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . create Side Effect Ġ{} ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ Ġassert Finished () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` create Side Effect Ġpropag ates Ġexceptions `() Ġ{ ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . create Side Effect Ġ{ Ġthrow ĠExpected Exception () Ġ} ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ ĠassertTrue ( get Exception () Ġis ĠExpected Exception ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` from Ġemits Ġand Ġfinishes `() Ġ{ ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . from Ġ{ Ġ" foo " Ġ} ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ ĠassertEquals (" foo ", Ġnext Output ()) ĊĠĠĠĠĠ Ġassert Finished () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` from Ġemits Ġnull `() Ġ{ ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . from < String ?> Ġ{ Ġnull Ġ} ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ ĠassertEquals ( null , Ġnext Output ()) ĊĠĠĠĠĠ Ġassert Finished () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` from Nullable Ġemits Ġand Ġfinishes `() Ġ{ ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . from Nullable Ġ{ Ġ" foo " Ġ} ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ ĠassertEquals (" foo ", Ġnext Output ()) ĊĠĠĠĠĠ Ġassert Finished () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` from Nullable Ġdoesn 't Ġemit Ġnull `() Ġ{ ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . from Nullable < String > Ġ{ Ġnull Ġ} ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ Ġassert Finished () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` Receive Channel Ġas Worker Ġemits `() Ġ{ ĊĠĠĠ Ġval Ġchannel Ġ= ĠChannel < String >( capacity Ġ= Ġ 1 ) ĊĠĠĠ Ġval Ġworker Ġ= Ġchannel . as Worker () ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ Ġchannel . send (" hello ") ĊĠĠĠĠĠ ĠassertEquals (" hello ", Ġnext Output ()) ĊĊĠĠĠĠĠ Ġchannel . send (" world ") ĊĠĠĠĠĠ ĠassertEquals (" world ", Ġnext Output ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` Receive Channel Ġas Worker Ġfinishes `() Ġ{ ĊĠĠĠ Ġval Ġchannel Ġ= ĠChannel < String >() ĊĠĠĠ Ġval Ġworker Ġ= Ġchannel . as Worker () ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ Ġchannel . close () ĊĠĠĠĠĠ Ġassert Finished () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` Receive Channel Ġas Worker Ġdoes Ġclose Ġchannel Ġwhen Ġcancelled `() Ġ{ ĊĠĠĠ Ġval Ġchannel Ġ= ĠChannel < Unit >( capacity Ġ= Ġ 1 ) ĊĠĠĠ Ġval Ġworker Ġ= Ġchannel . as Worker () ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ Ġcancel Worker () ĊĠĠĠĠĠ ĠassertTrue ( channel . is Closed For Receive ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġ` Receive Channel Ġas Worker Ġdoesn 't Ġclose Ġchannel Ġwhen Ġcancelled Ġwhen Ġclose On Cancel Ġfalse `() Ġ{ ĊĠĠĠ Ġval Ġchannel Ġ= ĠChannel < Unit >( capacity Ġ= Ġ 1 ) ĊĠĠĠ Ġval Ġworker Ġ= Ġchannel . as Worker ( close On Cancel Ġ= Ġfalse ) ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ Ġcancel Worker () ĊĠĠĠĠĠ Ġchannel . send ( Unit ) ĊĠĠĠĠĠ ĠassertEquals ( Unit , Ġchannel . receive ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` timer Ġreturns Ġequivalent Ġworkers Ġkey ed `() Ġ{ ĊĠĠĠ Ġval Ġworker 1 Ġ= ĠWorker . timer ( 1 , Ġ" key ") ĊĠĠĠ Ġval Ġworker 2 Ġ= ĠWorker . timer ( 1 , Ġ" key ") ĊĊĠĠĠ Ġassert Not Same ( worker 1 , Ġworker 2 ) ĊĠĠĠ ĠassertTrue ( worker 1 . does Same Work As ( worker 2 )) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` timer Ġreturns Ġnon - e quivalent Ġworkers Ġbased Ġon Ġkey `() Ġ{ ĊĠĠĠ Ġval Ġworker 1 Ġ= ĠWorker . timer ( 1 , Ġ" key 1 ") ĊĠĠĠ Ġval Ġworker 2 Ġ= ĠWorker . timer ( 1 , Ġ" key 2 ") ĊĊĠĠĠ ĠassertFalse ( worker 1 . does Same Work As ( worker 2 )) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` timer Ġemits Ġand Ġfinishes Ġafter Ġdelay `() Ġ{ ĊĠĠĠ Ġval Ġtest Dispatcher Ġ= ĠTest Coroutine Dispatcher () ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . timer ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġthe Ġtimer Ġon Ġthe Ġtest Ġdispatcher Ġso Ġwe Ġcan Ġcontrol Ġtime . ĊĠĠĠĠĠĠĠ Ġ. transform Ġ{ Ġit . flow On ( test Dispatcher ) Ġ} ĊĊĠĠĠ Ġworker . test Ġ{ ĊĠĠĠĠĠ Ġassert No Output () ĊĠĠĠĠĠ Ġassert Not Finished () ĊĊĠĠĠĠĠ Ġtest Dispatcher . advance Time By ( 9 9 9 ) ĊĠĠĠĠĠ Ġassert No Output () ĊĠĠĠĠĠ Ġassert Not Finished () ĊĊĠĠĠĠĠ Ġtest Dispatcher . advance Time By ( 1 ) ĊĠĠĠĠĠ ĠassertEquals ( Unit , Ġnext Output ()) ĊĠĠĠĠĠ Ġassert Finished () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` finished Ġworker Ġis Ġequivalent Ġto Ġself `() Ġ{ ĊĠĠĠ ĠassertTrue ( Worker . finished (). does Same Work As ( Worker . finished ())) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` transformed Ġworkers Ġare Ġequivalent Ġwith Ġequivalent Ġsource `() Ġ{ ĊĠĠĠ Ġval Ġsource Ġ= ĠWorker . create < Unit > Ġ{} ĊĠĠĠ Ġval Ġtransformed 1 Ġ= Ġsource . transform Ġ{ Ġflow Ġ-> Ġflow . buffer ( 1 ) Ġ} ĊĠĠĠ Ġval Ġtransformed 2 Ġ= Ġsource . transform Ġ{ Ġflow Ġ-> Ġflow . conf late () Ġ} ĊĊĠĠĠ ĠassertTrue ( transformed 1 . does Same Work As ( transformed 2 )) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` transformed Ġworkers Ġare Ġnot Ġequivalent Ġwith Ġnone quivalent Ġsource `() Ġ{ ĊĠĠĠ Ġval Ġsource 1 Ġ= Ġobject Ġ: ĠWorker < Unit > Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġdoes Same Work As ( other Worker : ĠWorker < *> ): ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠ Ġoverride Ġfun Ġrun (): ĠFlow < Unit > Ġ= Ġempty Flow () ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġsource 2 Ġ= Ġobject Ġ: ĠWorker < Unit > Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġdoes Same Work As ( other Worker : ĠWorker < *> ): ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠ Ġoverride Ġfun Ġrun (): ĠFlow < Unit > Ġ= Ġempty Flow () ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtransformed 1 Ġ= Ġsource 1 . transform Ġ{ Ġflow Ġ-> Ġflow . conf late () Ġ} ĊĠĠĠ Ġval Ġtransformed 2 Ġ= Ġsource 2 . transform Ġ{ Ġflow Ġ-> Ġflow . conf late () Ġ} ĊĊĠĠĠ ĠassertFalse ( transformed 1 . does Same Work As ( transformed 2 )) ĊĠ Ġ} ĊĊĠ Ġ@ Test Ġfun Ġ` transformed Ġworkers Ġtransform Ġflows `() Ġ{ ĊĠĠĠ Ġval Ġsource Ġ= Ġflow Of ( 1 , Ġ 2 , Ġ 3 ). as Worker () ĊĠĠĠ Ġval Ġtransformed Ġ= Ġsource . transform Ġ{ Ġflow Ġ-> Ġflow . map Ġ{ Ġit . toString () Ġ} Ġ} ĊĊĠĠĠ Ġval Ġtransformed Values Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠ Ġtransformed . run () ĊĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠassertEquals ( listOf (" 1 ", Ġ" 2 ", Ġ" 3 "), Ġtransformed Values ) ĊĠ Ġ} Ċ } Ċ