/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠIN O VA ĠIT Ġd . o . o . Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġsi . in ova . kotlin ova . rx . coroutines Ċ Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertFalse Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . rules . Timeout Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠSingle Cor outines Test Ġ{ ĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġrule Ġ= ĠTimeout ( 1 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġawait Single () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsingle Ġ= ĠSingle . just ( 3 2 ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 2 , Ġsingle . await ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalStateException :: class ) ĊĠĠĠ Ġfun Ġawait Single Throw Errors () Ġ= Ġrun Blocking < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsingle Ġ= ĠSingle . error < Int >( IllegalStateException ()) ĊĊĠĠĠĠĠĠĠ Ġsingle . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġawait Single Value Ar riving While Waiting () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubject Ġ= ĠPublish Subject . create < Int >() ĊĠĠĠĠĠĠĠ Ġval Ġsingle Ġ= Ġsubject . first Or Error () ĊĊĠĠĠĠĠĠĠ Ġ// ĠUN CON FIN ED Ġis Ġexperimental , Ġbut Ġit Ġis Ġstill Ġfine Ġto Ġuse Ġit Ġwith Ġtests ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" EXPERIMENT AL _ API _ USAGE ") ĊĠĠĠĠĠĠĠ Ġval Ġawait Task Ġ= Ġasync ( Dispatch ers . Un conf ined ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( await Task . is Completed ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( subject . has Observer s ()) ĊĠĠĠĠĠĠĠ Ġsubject . onNext ( 1 2 ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( await Task . is Completed ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 2 , Ġawait Task . await ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġawait Single Un subscribe When C ancell ing Task () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsubject Ġ= ĠPublish Subject . create < Int >() ĊĠĠĠĠĠĠĠ Ġval Ġsingle Ġ= Ġsubject . first Or Error () ĊĊĠĠĠĠĠĠĠ Ġ// ĠUN CON FIN ED Ġis Ġexperimental , Ġbut Ġit Ġis Ġstill Ġfine Ġto Ġuse Ġit Ġwith Ġtests ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" EXPERIMENT AL _ API _ USAGE ") ĊĠĠĠĠĠĠĠ Ġval Ġawait Task Ġ= Ġasync ( Dispatch ers . Un conf ined ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle . await () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( await Task . is Completed ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( subject . has Observer s ()) ĊĊĠĠĠĠĠĠĠ Ġawait Task . cancel () ĊĠĠĠĠĠĠĠ ĠassertFalse ( subject . has Observer s ()) ĊĠĠĠ Ġ} Ċ }