// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġcom . intellij . openapi . progress . impl Ċ Ċ import Ġcom . intellij . openapi . progress .* Ċ import Ġcom . intellij . test Framework . Light Platform TestCase Ċ import Ġcom . intellij . util . concurrency . App Executor Util Ċ import Ġcom . intellij . util . concurrency . Semaphore Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . util . concurrent . Future Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠProgress Coroutine Test Ġ: ĠLight Platform TestCase () Ġ{ ĊĊĠ Ġprivate Ġfun Ġbackground Activity ( indicator : ĠProgress Indicator , Ġaction : Ġ() Ġ-> ĠUnit ): ĠFuture < *> Ġ{ ĊĠĠĠ Ġreturn ĠApp Executor Util . getApp ExecutorService (). submit Ġ{ ĊĠĠĠĠĠ ĠProgress Manager . getInstance (). run Process ( action , Ġindicator ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġ` test Ġindicator Ġcancellation Ġcancel s Ġjob `() Ġ{ ĊĠĠĠ Ġval Ġlock Ġ= ĠSem aphore ( 1 ) ĊĠĠĠ Ġval Ġindicator Ġ= ĠEmpty Progress Indicator () ĊĠĠĠ Ġval Ġfuture Ġ= Ġbackground Activity ( indicator ) Ġ{ Ġ Ġ// Ġsome Ġblocking Ġcode Ġunder Ġindicator ĊĠĠĠĠĠ ĠassertThrows ( Process Canceled Exception :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Sus pending Action Ġ{ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwant Ġto Ġswitch Ġto Ġcoroutine Ġworld Ġfrom Ġunder Ġthe Ġblocking Ġcode ĊĠĠĠĠĠĠĠĠĠ Ġensure Active () ĊĠĠĠĠĠĠĠĠĠ Ġlock . up () ĊĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĠĠĠ Ġ// Ġnever - ending Ġsus pending Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Active () Ġ Ġ// Ġnot Ġactually Ġneeded Ġsince Ġdelay () Ġchecks Ġfor Ġcancellation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠassertTrue ( lock . waitFor ( 2 0 0 0 )) ĊĠĠĠ Ġindicator . cancel () ĊĠĠĠ Ġfuture . get ( 2 0 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠ Ġ} ĊĊĠ Ġfun Ġ` test Ġjob Ġcancellation Ġcancel s Ġindicator ` (): ĠUnit Ġ= Ġrun Blocking Ġ{ ĊĠĠĠ Ġval Ġlock Ġ= ĠSem aphore ( 1 ) ĊĠĠĠ Ġval Ġjob Ġ= Ġlaunch ( Dispatch ers . Default ) Ġ{ ĠĠ Ġ// Ġsome Ġcoroutine ĊĠĠĠĠĠ Ġrun Under Indicator Ġ{ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwant Ġto Ġexecute Ġblocking ĠJava Ġcode Ġfrom Ġunder Ġcoroutine ĊĠĠĠĠĠĠĠ ĠProgress Manager . check Canceled () ĠĠĠĠĠĠ Ġ// Ġthis ĠJava Ġcode Ġdoesn 't Ġknow Ġabout ĠJob Ġinside , Ġso Ġrun Under Indicator Ġruns Ġit Ġunder Ġindicator ĊĠĠĠĠĠĠĠ Ġlock . up () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ Ġ// Ġnever - ending Ġblocking Ġaction ĊĠĠĠĠĠĠĠĠĠ ĠProgress Manager . check Canceled () ĊĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠassertTrue ( lock . waitFor ( 2 0 0 0 )) ĊĠĠĠ Ġwith Timeout ( 2 0 0 0 ) Ġ{ ĊĠĠĠĠĠ Ġjob . cancel And Join () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġ` test ĠP CE Ġfrom Ġrun Under Indicator Ġis Ġre throw n ` (): ĠUnit Ġ= Ġrun Blocking Ġ{ ĊĠĠĠ Ġval Ġlock Ġ= ĠSem aphore ( 1 ) ĊĠĠĠ Ġsupervisor Scope Ġ{ ĊĠĠĠĠĠ Ġval Ġdeferred : ĠDeferred < Unit > Ġ= Ġasync ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Under Indicator Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlock . up () ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠProcess Canceled Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠassertTrue ( lock . waitFor ( 2 0 0 0 )) ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġdeferred . await () ĊĠĠĠĠĠĠĠ Ġfail (" P CE Ġexpected ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcatch Ġ( e : ĠProcess Canceled Exception ) Ġ{ ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġ` test Ġindicator Ġtext Ġvia Ġprogress Ġsink `() Ġ{ ĊĠĠĠ Ġsuspend Ġfun Ġxx () Ġ= Ġprogress Sink ()?. fraction ( 0 . 4 2 ) ĊĠĠĠ Ġval Ġindicator Ġ= Ġobject Ġ: ĠEmpty Progress Indicator () Ġ{ ĊĠĠĠĠĠ Ġvar Ġmy Text : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠ Ġvar Ġmy Text 2 : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠ Ġvar Ġmy Fraction : ĠDouble ? Ġ= Ġnull ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġset Text ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Text Ġ= Ġtext ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġset Text 2 ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Text 2 Ġ= Ġtext ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġset Fraction ( fraction : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Fraction Ġ= Ġfraction ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġbackground Activity ( indicator ) Ġ{ ĊĠĠĠĠĠ Ġrun Sus pending Action Ġ{ ĊĠĠĠĠĠĠĠ Ġprogress Sink ?. text (" Hello ") ĊĠĠĠĠĠĠĠ Ġprogress Sink ?. details (" World ") ĊĠĠĠĠĠĠĠ Ġxx () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. get ( 2 0 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠ ĠassertEquals ( indicator . my Text , Ġ" Hello ") ĊĠĠĠ ĠassertEquals ( indicator . my Text 2 , Ġ" World ") ĊĠĠĠ ĠassertEquals ( indicator . my Fraction , Ġ 0 . 4 2 ) ĊĠ Ġ} ĊĊĠ Ġfun Ġ` test Ġsink Ġvia Ġprogress Ġindicator `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠ Ġval Ġsink Ġ= Ġobject Ġ: ĠProgress Sink Ġ{ ĊĠĠĠĠĠ Ġvar Ġtext : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠ Ġvar Ġdetails : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠ Ġvar Ġfraction : ĠDouble ? Ġ= Ġnull ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġtext ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . text Ġ= Ġtext ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġdetails ( details : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . details Ġ= Ġdetails ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġfraction ( fraction : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . fraction Ġ= Ġfraction ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġwith Context ( progress Sink Element ( sink )) Ġ{ ĊĠĠĠĠĠ Ġrun Under Indicator Ġ{ ĊĠĠĠĠĠĠĠ ĠProgress Manager . progress (" Hello ", Ġ" World ") ĊĠĠĠĠĠĠĠ ĠProgress Manager . getInstance (). progress Indicator . fraction Ġ= Ġ 0 . 4 2 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠassertEquals ( sink . text , Ġ" Hello ") ĊĠĠĠ ĠassertEquals ( sink . details , Ġ" World ") ĊĠĠĠ ĠassertEquals ( sink . fraction , Ġ 0 . 4 2 ) ĊĠ Ġ} Ċ } Ċ