package Ġcom . bad oo . reak t ive . comp letable Ċ Ċ import Ġcom . bad oo . reak t ive . dis posable . Disposable Ċ import Ġcom . bad oo . reak t ive . test . base . assert Disposed Ċ import Ġcom . bad oo . reak t ive . test . base . assert Error Ċ import Ġcom . bad oo . reak t ive . test . base . assertNot Error Ċ import Ġcom . bad oo . reak t ive . test . base . assert Sub scribed Ċ import Ġcom . bad oo . reak t ive . test . comp letable . assert Complete Ċ import Ġcom . bad oo . reak t ive . test . comp letable . assertNot Complete Ċ import Ġcom . bad oo . reak t ive . test . comp letable . test Ċ import Ġcom . bad oo . reak t ive . utils . atomic . Atomic Boolean Ċ import Ġcom . bad oo . reak t ive . utils . atomic . Atomic Reference Ċ import Ġcom . bad oo . reak t ive . utils . atomic . atomic List Ċ import Ġcom . bad oo . reak t ive . utils . atomic . plus Assign Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertFalse Ċ import Ġkotlin . test . assertTrue Ċ Ċ class ĠComp letable By Emitter Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġemitter Ref Ġ= ĠAtomic Reference < Comp letable Emitter ? >( null ) ĊĠĠĠ Ġprivate Ġval Ġemitter : ĠComp letable Emitter Ġget () Ġ= Ġrequire NotNull ( emitter Ref . value ) ĊĠĠĠ Ġprivate Ġval Ġcomplet able Ġ= Ġcreate Comp letable ( emitter Ref ) ĊĠĠĠ Ġprivate Ġval Ġobserver Ġ= Ġcomplet able . test () ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Comp letable ( emitter Reference : ĠAtomic Reference < Comp letable Emitter ?> ): ĠComp letable Ġ= ĊĠĠĠĠĠĠĠ Ġcomplet able Ġ{ Ġemitter Reference . value Ġ= Ġit Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġon Subscribe _ called _ WHEN _ subscribe () Ġ{ ĊĠĠĠĠĠĠĠ Ġobserver . assert Sub scribed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcompleted _ WHEN _ onComplete _ sign alled () Ġ{ ĊĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĊĠĠĠĠĠĠĠ Ġobserver . assert Complete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġproduces _ same _ error () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠThrowable () ĊĊĠĠĠĠĠĠĠ Ġemitter . onError ( error ) ĊĊĠĠĠĠĠĠĠ Ġobserver . assert Error ( error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsecond _ onComplete _ ignored _ AFTER _ first _ onComplete _ is _ sign alled () Ġ{ ĊĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠ Ġobserver . reset () ĊĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĊĠĠĠĠĠĠĠ Ġobserver . assertNot Complete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠonComplete _ ignored _ AFTER _ onError _ sign alled () Ġ{ ĊĠĠĠĠĠĠĠ Ġemitter . onError ( Throwable ()) ĊĠĠĠĠĠĠĠ Ġobserver . reset () ĊĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĊĠĠĠĠĠĠĠ Ġobserver . assertNot Complete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠonError _ ignored _ AFTER _ onComplete _ is _ sign alled () Ġ{ ĊĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠ Ġobserver . reset () ĊĠĠĠĠĠĠĠ Ġemitter . onError ( Throwable ()) ĊĊĠĠĠĠĠĠĠ Ġobserver . assertNot Error () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsecond _ onError _ ignored _ AFTER _ first _ onError _ is _ sign alled () Ġ{ ĊĠĠĠĠĠĠĠ Ġemitter . onError ( Throwable ()) ĊĠĠĠĠĠĠĠ Ġobserver . reset () ĊĠĠĠĠĠĠĠ Ġemitter . onError ( Throwable ()) ĊĊĠĠĠĠĠĠĠ Ġobserver . assertNot Error () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠonComplete _ ignored _ AFTER _ dispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġobserver . dispose () ĊĊĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĊĠĠĠĠĠĠĠ Ġobserver . assertNot Complete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdis posable _ dis posed _ WHEN _ onComplete _ is _ sign alled () Ġ{ ĊĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĊĠĠĠĠĠĠĠ Ġobserver . assert Disposed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdis posable _ dis posed _ WHEN _ onError _ sign alled () Ġ{ ĊĠĠĠĠĠĠĠ Ġemitter . onError ( Throwable ()) ĊĊĠĠĠĠĠĠĠ Ġobserver . assert Disposed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcompleted _ with _ error _ WHEN _ exception _ during _ subscribe () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠRuntimeException () ĊĊĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġcomplet able Ġ{ Ġthrow Ġerror Ġ}. test () ĊĊĠĠĠĠĠĠĠ Ġobserver . assert Error ( error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdis posable _ is _ not _ dis posed _ WHEN _ assigned () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= ĠDis posable () ĊĊĠĠĠĠĠĠĠ Ġemitter . set Disposable ( dis posable ) ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( dis posable . is Disposed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġassigned _ dis posable _ is _ dis posed _ WHEN _ dis posed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= ĠDis posable () ĊĠĠĠĠĠĠĠ Ġemitter . set Disposable ( dis posable ) ĊĊĠĠĠĠĠĠĠ Ġobserver . dispose () ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( dis posable . is Disposed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġre assigned _ dis posable _ is _ dis posed _ WHEN _ dis posed () Ġ{ ĊĠĠĠĠĠĠĠ Ġemitter . set Disposable ( Disposable ()) ĊĠĠĠĠĠĠĠ Ġobserver . dispose () ĊĊĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= ĠDis posable () ĊĠĠĠĠĠĠĠ Ġemitter . set Disposable ( dis posable ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( dis posable . is Disposed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġassigned _ dis posable _ is _ dis posed _ WHEN _ onComplete _ is _ sign alled () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġatomic List < String >() ĊĠĠĠĠĠĠĠ Ġcomplet able . subscribe ( observer ( onComplete Ġ= Ġ{ Ġevents Ġ+= Ġ" onComplete " Ġ})) ĊĠĠĠĠĠĠĠ Ġemitter . set Disposable ( Disposable Ġ{ Ġevents Ġ+= Ġ" dispose " Ġ}) ĊĊĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf (" onComplete ", Ġ" dispose "), Ġevents . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġassigned _ dis posable _ is _ dis posed _ WHEN _ onError _ is _ sign alled () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevents Ġ= Ġatomic List < String >() ĊĠĠĠĠĠĠĠ Ġcomplet able . subscribe ( observer ( onError Ġ= Ġ{ Ġevents Ġ+= Ġ" onError " Ġ})) ĊĠĠĠĠĠĠĠ Ġemitter . set Disposable ( Disposable Ġ{ Ġevents Ġ+= Ġ" dispose " Ġ}) ĊĊĠĠĠĠĠĠĠ Ġemitter . onError ( Throwable ()) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf (" onError ", Ġ" dispose "), Ġevents . value ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġis Disposed _ is _ false _ WHEN _ created () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertFalse ( emitter . is Disposed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġis Disposed _ is _ true _ WHEN _ dis posed () Ġ{ ĊĠĠĠĠĠĠĠ Ġobserver . dispose () ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( emitter . is Disposed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġis Disposed _ is _ dis posed _ WHEN _ onError _ is _ sign alled () Ġ{ ĊĠĠĠĠĠĠĠ Ġemitter . onError ( Throwable ()) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( emitter . is Disposed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdoes _ not _ complete _ re cursively _ WHEN _ comp leting () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Completed Re cursively Ġ= ĠAtomic Boolean () ĊĠĠĠĠĠĠĠ Ġval Ġis Completed Ġ= ĠAtomic Boolean () ĊĊĠĠĠĠĠĠĠ Ġcomplet able . subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Completed . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Completed . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Completed Re cursively . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( is Completed Re cursively . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdoes _ not _ complete _ re cursively _ WHEN _ pro ducing _ error () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Completed Re cursively Ġ= ĠAtomic Boolean () ĊĊĠĠĠĠĠĠĠ Ġcomplet able . subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete Ġ= Ġ{ Ġis Completed Re cursively . value Ġ= Ġtrue Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ Ġemitter . onComplete () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġemitter . onError ( Exception ()) ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( is Completed Re cursively . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdoes _ not _ produce _ error _ re cursively _ WHEN _ comp leting () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Error Re cursively Ġ= ĠAtomic Boolean () ĊĊĠĠĠĠĠĠĠ Ġcomplet able . subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete Ġ= Ġ{ Ġemitter . onError ( Exception ()) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ Ġis Error Re cursively . value Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( isError Re cursively . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdoes _ not _ produce _ error _ re cursively _ WHEN _ pro ducing _ error () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Error Re cursively Ġ= ĠAtomic Boolean () ĊĠĠĠĠĠĠĠ Ġval ĠhasError Ġ= ĠAtomic Boolean () ĊĊĠĠĠĠĠĠĠ Ġcomplet able . subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Error . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠhasError . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Error Re cursively . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġemitter . onError ( Exception ()) ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( isError Re cursively . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserver ( ĊĠĠĠĠĠĠĠ ĠonComplete : Ġ() Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ ĠonError : Ġ( Throwable ) Ġ-> ĠUnit Ġ= Ġ{} ĊĠĠĠ Ġ): ĠComp letable Observer Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠComp letable Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Subscribe ( dis posable : ĠDis posable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError . invoke ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ