package Ġorg . ne at utils . prom on . test . cases Ċ Ċ import Ġorg . junit . Test Ċ import Ġorg . ne at utils . prom on . api . Progress Ċ import Ġorg . ne at utils . prom on . api . Progress Monitor Ċ import Ġorg . ne at utils . prom on . api . Progress Monitor Listener Ċ import Ġorg . ne at utils . prom on . api . Task Status Ċ import Ġorg . ne at utils . prom on . api . exceptions . Monitor IsNot Cancel able Exception Ċ import Ġorg . ne at utils . prom on . api . exceptions . Progress Monitor Canceled Exception Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . test .* Ċ Ċ class ĠApi Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġbasic Example () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create () ĊĠĠĠĠĠĠĠ Ġmonitor . task (" Hello ĠWorld ", Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . work ed ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġmonitor . progress ĊĠĠĠĠĠĠĠ ĠassertNotNull ( progress ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . COMPLETED , Ġprogress . task Status ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Hello ĠWorld ", Ġprogress . task Name ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 . 0 , Ġprogress . work Percentage ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 , Ġprogress . work Done ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 , Ġprogress . total Work ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġbasic Example With Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create () ĊĊĠĠĠĠĠĠĠ Ġvar Ġreported Work Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġreceived Finish Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠProgress Monitor Listener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Task Finished ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceived Finish Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Work ed ( executed Workload : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreported Work Ġ+= Ġexecuted Workload ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmonitor . addListener ( listener ) ĊĊĠĠĠĠĠĠĠ Ġmonitor . task (" Hello ĠWorld ", Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . work ed ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 . 0 , Ġreported Work ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( received Finish ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġbasic Example With Concurrency () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create () ĊĊĠĠĠĠĠĠĠ Ġmonitor . task (" Hello ĠWorld ", Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Parallel ( 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . work ed ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( Random . next Long ( 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 0 , Ġmonitor . progress . work Done ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġeven Ġthough Ġprogress Ġis Ġat Ġ 1 0 0 %, Ġthe Ġtask ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġnot Ġcount Ġas Ġ" completed " Ġwhile Ġwe 're ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinside Ġthe Ġtask Ġrun Ġlambda ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . RUNNING , Ġmonitor . progress . task Status ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 0 , Ġmonitor . progress . work Done ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . COMPLETED , Ġmonitor . progress . task Status ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsub Progress Monitor Example () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create () ĊĠĠĠĠĠĠĠ Ġmonitor . task (" Parent ĠTask ", Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġallocate Ġ 1 0 Ġof Ġour Ġ 1 0 0 Ġwork Ġpoints Ġfor Ġsub Ġtask Ġ 1 . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . sub Task ( 1 0 ) Ġ{ Ġsub Monitor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġour Ġsub Ġtask Ġ 1 Ġitself Ġhas Ġ 1 0 0 0 Ġwork Ġpoints , Ġwhich ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġaccount Ġfor Ġ 1 0 Ġin Ġthe Ġroot Ġmonitor . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . task (" Sub Ġ 1 ", Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġreport Ġwork Ġto Ġthe Ġsub Ġmonitor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit Ġis Ġautomatically Ġreported Ġto Ġthe Ġparent . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 5 0 0 Ġof Ġ 1 0 0 0 Ġpoints Ġfor Ġthe Ġsub - task Ġmean Ġ 5 0 % ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġof Ġthe Ġsub Ġtask Ġwork Ġis Ġdone . ĠThe Ġparent Ġhad ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 0 Ġwork Ġpoints Ġallocated , Ġso Ġour Ġ 5 0 % Ġprogress ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġaccount Ġfor Ġ 5 Ġpoints Ġof Ġwork Ġin Ġthe Ġparent . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġmonitor . progress . work Done ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . RUNNING , Ġsub Monitor . progress . task Status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . RUNNING , Ġmonitor . progress . task Status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . COMPLETED , Ġsub Monitor . progress . task Status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . RUNNING , Ġmonitor . progress . task Status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġallocate Ġ 9 0 Ġof Ġour Ġ 1 0 0 Ġwork Ġpoints Ġfor Ġsub Ġtask Ġ 2 . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . sub Task ( 9 0 ) Ġ{ Ġsub Monitor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġour Ġsub Ġtask Ġ 2 Ġitself Ġhas Ġ 1 0 Ġwork Ġpoints , Ġwhich ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwill Ġaccount Ġfor Ġ 9 0 Ġin Ġthe Ġroot Ġmonitor . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . task (" Sub Ġ 2 ", Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 , Ġmonitor . progress . work Done ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (( 1 0 Ġ+ Ġ 0 . 2 Ġ* Ġ 9 0 ). toInt (), Ġmonitor . progress . work Done ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (( 1 0 Ġ+ Ġ 0 . 4 Ġ* Ġ 9 0 ). toInt (), Ġmonitor . progress . work Done ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (( 1 0 Ġ+ Ġ 0 . 6 Ġ* Ġ 9 0 ). toInt (), Ġmonitor . progress . work Done ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (( 1 0 Ġ+ Ġ 0 . 8 Ġ* Ġ 9 0 ). toInt (), Ġmonitor . progress . work Done ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 0 , Ġmonitor . progress . work Done ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠMonitor IsNot Cancel able Exception :: class ) ĊĠĠĠ Ġfun Ġprogress Monitor s Are Not Cancel able ByDefault () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create () ĊĠĠĠĠĠĠĠ Ġmonitor . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Cancel Monitor () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create ( allow Cancel ation Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . task (" Cancel Ġme ", Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . work ed ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 4 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Failed Ġto Ġcancel Ġprogress Ġmonitor !") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( expected : ĠProgress Monitor Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpass ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . C ANCE LED , Ġmonitor . progress . task Status ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Cancel Monitor Before Task Runs () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create ( allow Cancel ation Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġmonitor . cancel () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . task (" Will Ġnever Ġrun ", Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Managed Ġto Ġrun Ġa Ġtask Ġon Ġa Ġcanceled Ġmonitor !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Failed Ġto Ġcancel Ġprogress Ġmonitor !") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( expected : ĠProgress Monitor Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpass ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . C ANCE LED , Ġmonitor . progress . task Status ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcancell ing Sub Monitor Cancel s The Parent () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create ( allow Cancel ation Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . task (" Root ", Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . sub Task ( 5 ) Ġ{ Ġsub Monitor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . sub Task ( 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Cancellation Ġdid Ġnot Ġaffect Ġsecond Ġsub task !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( expected : ĠProgress Monitor Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpass ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . C ANCE LED , Ġmonitor . progress . task Status ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġonly The First Cancellation Request Has An Effect () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create ( allow Cancel ation Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġvar Ġreported Cancellation Requests Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġreported Task Cancel s Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġmonitor . addListener ( object Ġ: ĠProgress Monitor Listener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancel Requested () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreported Cancellation Requests ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Task Canceled ( progress : ĠProgress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreported Task Cancel s ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . task (" This Ġwill Ġnever Ġhappen ", Ġ 1 0 ) Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Failed Ġto Ġcancel Ġprogress Ġmonitor !") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( expected : ĠProgress Monitor Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpass ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . C ANCE LED , Ġmonitor . progress . task Status ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġreported Cancellation Requests ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġreported Task Cancel s ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsub Tasks Cannot Over shoot The ir Workload () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create () ĊĊĠĠĠĠĠĠĠ Ġmonitor . task (" Root ", Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . sub Task ( 4 ) Ġ{ Ġsub Monitor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . task (" Over shoot ing ", Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġone Ġover shoot s Ġthe Ġ 1 0 Ġwork Ġunits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġof Ġthe Ġsub Ġmonitor Ġby Ġ 2 . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġyet , Ġwe Ġonly Ġsee Ġthat Ġour Ġ 4 Ġwork Ġunits Ġallocated ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġthe Ġsub Ġtask Ġhave Ġbeen Ġassigned . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġmonitor . progress . work Done ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . work ed ( 6 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . COMPLETED , Ġmonitor . progress . task Status ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsub Tasks Which Under deliver The ir Workload Are Set To Completed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create () ĊĊĠĠĠĠĠĠĠ Ġmonitor . task (" Root ", Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . sub Task ( 4 ) Ġ{ Ġsub Monitor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . task (" Over shoot ing ", Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġsub task Ġunder - deli vers Ġthe Ġ 1 0 Ġwork Ġunits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġof Ġthe Ġsub Ġmonitor Ġby Ġ 1 . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Monitor . work ed ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsince Ġthe Ġsub task Ġhas Ġnot Ġreached Ġ 1 0 0 % Ġyet , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġparent Ġmonitor Ġdoes Ġnot Ġhave Ġthe Ġfull Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwork Ġpoints Ġassociated Ġwith Ġthe Ġsub task . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( monitor . progress . work Done Ġ< Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġyet , Ġwe Ġonly Ġsee Ġthat Ġour Ġ 4 Ġwork Ġunits Ġallocated ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġthe Ġsub Ġtask Ġhave Ġbeen Ġassigned Ġbecause Ġthe Ġtask ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlambda Ġcompleted . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġmonitor . progress . work Done ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . work ed ( 6 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . COMPLETED , Ġmonitor . progress . task Status ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalStateException :: class ) ĊĠĠĠ Ġfun Ġcannot Start Multiple Root Tasks () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create () ĊĊĠĠĠĠĠĠĠ Ġmonitor . task (" Root ", Ġ 1 ) Ġ{} ĊĠĠĠĠĠĠĠ Ġmonitor . task (" This Ġis Ġgonna Ġfail ", Ġ 1 ) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalStateException :: class ) ĊĠĠĠ Ġfun Ġcannot Start Sub task Without Root Task (){ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create () ĊĊĠĠĠĠĠĠĠ Ġmonitor . sub Task ( 1 0 0 ){ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Run Parallel Sub tasks () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create () ĊĊĠĠĠĠĠĠĠ Ġmonitor . task (" Parallel ĠSub tasks ", Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Parallel ( threads Ġ= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . sub Task ( 1 0 0 ) Ġ{ Ġsub Mon Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Mon . task ( Thread . currentThread (). name , Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Mon . work ed ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( Random . next Long ( 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġmonitor . progress ĊĠĠĠĠĠĠĠ ĠassertNotNull ( progress ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . COMPLETED , Ġprogress . task Status ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( progress . total Work , Ġprogress . work Done ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 , Ġprogress . completed Sub task Prog resses . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Nest Sub Tasks () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmonitor Ġ= ĠProgress Monitor . create () ĊĊĠĠĠĠĠĠĠ Ġval Ġroot Progress Percent ages Ġ= Ġmutable ListOf < Double >() ĊĊĠĠĠĠĠĠĠ Ġmonitor . task (" Nested ĠSub tasks ", Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . sub Task ( 4 0 ) Ġ{ Ġsub 1 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 1 . task (" Sub Ġ 1 ", Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 1 . sub Task ( 8 0 ) Ġ{ Ġsub 1 a Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 1 a . task (" Sub Ġ 1 a ", Ġ 4 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġunder - deliver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 1 a . work ed ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 1 a . work ed ( 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 1 . sub Task ( 2 0 ) Ġ{ Ġsub 1 b Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 1 b . task (" Sub Ġ 1 b ", Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġover - deliver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 1 b . work ed ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġover - deliver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmonitor . sub Task ( 8 0 ) Ġ{ Ġsub 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 2 . task (" Sub Ġ 2 ", Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 2 . sub Task ( 4 ) Ġ{ Ġsub 2 a Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 2 a . task (" Sub Ġ 2 a ", Ġ 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 2 a . work ed ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 2 . sub Task ( 6 ) Ġ{ Ġsub 2 b Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 2 b . task (" Sub Ġ 2 b ", Ġ 8 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 2 b . work ed ( 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub 2 b . work ed ( 3 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Progress Percent ages Ġ+= Ġmonitor . progress . work Percentage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġmonitor . progress ĊĠĠĠĠĠĠĠ ĠassertNotNull ( progress ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Task Status . COMPLETED , Ġprogress . task Status ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( progress . total Work , Ġprogress . work Done ) ĊĠĠĠĠĠĠĠ Ġprogress . completed Sub task Prog resses . forEach Ġ{ ĠassertEquals ( Task Status . COMPLETED , Ġit . task Status ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġroot Progress Percent ages . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( root Progress Percent ages [ i ] Ġ<= Ġroot Progress Percent ages [ i Ġ+ Ġ 1 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġ================================================================= ================================================ ĊĠĠĠ Ġ// ĠUT ILITY ĠMETHO DS ĊĠĠĠ Ġ// Ġ================================================================= ================================================ ĊĊĠĠĠ Ġprivate Ġfun Ġin Parallel ( threads : ĠInt , Ġtask : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġthreads ). as Sequence (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread ( task ) ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġit . start (); Ġit Ġ}. forEach Ġ{ Ġit . join () Ġ} ĊĠĠĠ Ġ} Ċ Ċ }