/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . coroutines . rx 2 Ċ Ċ import Ġio . reactivex .* Ċ import Ġio . reactivex . dis pos ables .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġorg . hamcrest . core .* Ċ import Ġorg . junit .* Ċ import Ġorg . junit . Assert .* Ċ Ċ class ĠComp letable Test Ġ: ĠTest Base () Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Basic Success () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġcomplet able Ġ= Ġrx Comp letable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠ Ġcomplet able . subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠ Ġyield () Ġ// Ġto Ġcomplet able Ġcoroutine ĊĠĠĠĠĠĠĠ Ġfinish ( 6 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Basic Failure () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġcomplet able Ġ= Ġrx Comp letable ( Non C ancellable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" OK ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠ Ġcomplet able . subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Un re ached () ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( error , ĠIs InstanceOf ( RuntimeException :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( error . message , ĠIs Equal (" OK ")) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠ Ġyield () Ġ// Ġto Ġcomplet able Ġcoroutine ĊĠĠĠĠĠĠĠ Ġfinish ( 6 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Basic Un subscribe () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġcomplet able Ġ= Ġrx Comp letable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield () Ġ// Ġback Ġto Ġmain , Ġwill Ġget Ġcancelled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Un re ached () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠ Ġ// Ġnothing Ġis Ġcalled Ġon Ġa Ġdisposed Ġrx 2 Ġcomplet able ĊĠĠĠĠĠĠĠ Ġval Ġsub Ġ= Ġcomplet able . subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Un re ached () ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Un re ached () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠ Ġyield () Ġ// Ġto Ġstarted Ġcoroutine ĊĠĠĠĠĠĠĠ Ġexpect ( 5 ) ĊĠĠĠĠĠĠĠ Ġsub . dispose () Ġ// Ġwill Ġcancel Ġcoroutine ĊĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠ Ġfinish ( 6 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Await Success () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġcomplet able Ġ= Ġrx Comp letable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠ Ġcomplet able . await () Ġ// Ġshall Ġlaunch Ġcoroutine ĊĠĠĠĠĠĠĠ Ġfinish ( 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Await Failure () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġcomplet able Ġ= Ġrx Comp letable ( Non C ancellable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" OK ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomplet able . await () Ġ// Ġshall Ġlaunch Ġcoroutine Ġand Ġthrow Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Un re ached () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( e . message , ĠIs Equal (" OK ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cancel s Parent On Failure () Ġ= Ġrun Test ( ĊĠĠĠĠĠĠĠ Ġexpected Ġ= Ġ{ Ġit Ġis ĠRuntimeException Ġ&& Ġit . message Ġ== Ġ" OK " Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġhas Ġparent , Ġso Ġshould Ġcancel Ġit Ġon Ġfailure ĊĠĠĠĠĠĠĠ Ġrx Comp letable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" OK ") ĊĠĠĠĠĠĠĠ Ġ}. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġexpect Un re ached () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġassert ( it Ġis ĠRuntimeException ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Sup pressed Exception () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomplet able Ġ= Ġrx Comp letable ( Non C ancellable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( start Ġ= ĠCor outine Start . ATOMIC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTest Exception () Ġ// Ġchild Ġcoroutine Ġfails ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( Long . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTest Exception 2 () Ġ// Ġbut Ġparent Ġthrows Ġanother Ġexception Ġwhile Ġcleaning Ġup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomplet able . await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect Un re ached () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠTest Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( e . sup pressed [ 0 ] Ġis ĠTest Exception 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Unhandled Exception () Ġ= Ġrun Test ( ĊĠĠĠĠĠĠĠ Ġunhandled Ġ= ĠlistOf Ġ{ Ġit Ġ-> Ġit Ġis ĠTest Exception Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpect ( 1 ) ĊĠĠĠĠĠĠĠ Ġvar Ġdis posable : ĠDis posable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcomplet able Ġ= Ġrx Comp letable ( Non C ancellable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdis posable !!. dispose () Ġ// Ġcancel Ġour Ġown Ġsubscription , Ġso Ġthat Ġdelay Ġwill Ġget Ġcancelled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( Long . MAX _ VALUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTest Exception () Ġ// Ġwould Ġnot Ġbe Ġable Ġto Ġhandle Ġit Ġsince Ġmono Ġis Ġdisposed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcomplet able . subscribe ( object Ġ: ĠComp letable Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Subscribe ( d : ĠDis posable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpect ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis posable Ġ= Ġd ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ Ġexpect Un re ached () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( t : ĠThrowable ) Ġ{ Ġexpect Un re ached () Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġexpect ( 3 ) ĊĠĠĠĠĠĠĠ Ġyield () Ġ// Ġrun Ġcoroutine ĊĠĠĠĠĠĠĠ Ġfinish ( 5 ) ĊĠĠĠ Ġ} Ċ } Ċ