package Ġcom . e ag les ak ura . fire arm . experimental . coroutines Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġcom . e ag les ak ura . ar my knife . android . junit 4 . extensions . compatible Blocking Test Ċ import Ġkotlinx . coroutines . Cancellation Exception Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . isActive Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġkotlinx . coroutines . yield Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertFalse Ċ import Ġorg . junit . Assert . assertNull Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Assert . fail Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ class ĠSingle Task Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcancel () Ġ= Ġcompatible Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠSingle Task () ĊĠĠĠĠĠĠĠ Ġvar Ġstarted Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstarted Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( isActive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" D ON ' T ĠRUN ĠTHIS , ĠisActive ='$ isActive '") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtask . cancel And Join () ĊĠĠĠĠĠĠĠ ĠassertNull ( task . job ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrun _ foreground () Ġ= Ġcompatible Blocking Test ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠSingle Task () ĊĠĠĠĠĠĠĠ ĠassertFalse ( task . running . value !! ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrun _ background () Ġ= Ġcompatible Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠSingle Task () ĊĠĠĠĠĠĠĠ ĠassertFalse ( task . running . value !! ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( task . isRunning ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrun _ parallel () Ġ= Ġcompatible Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠSingle Task () ĊĊĠĠĠĠĠĠĠ Ġvar Ġstart First Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġstart Second Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . run (" first ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart First Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( isActive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" D ON ' T ĠRUN ĠTHIS , ĠisActive ='$ isActive '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" first " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsecond Ġ= Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! start First ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . run (" second ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Second Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" second " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! start Second ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Single Task Test ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" spin Ġlock ... Ġstart First :$ start First Ġstart Second :$ start Second " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( task . running . value !! ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( task . isRunning , Ġtask . running . value ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst . await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( task . running . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( task . isRunning , Ġtask . running . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" second ", Ġsecond . await ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( task . running . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( task . isRunning , Ġtask . running . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġjoin () Ġ= Ġcompatible Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġwith Context ( Dispatch ers . Main ) Ġ{ ĠSingle Task () Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( task . isRunning , Ġtask . running . value ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( task . run Ġ{ Ġtrue Ġ}) ĊĠĠĠĠĠĠĠ Ġtask . join () ĊĠĠĠĠĠĠĠ ĠassertTrue ( task . run Ġ{ Ġtrue Ġ}) ĊĠĠĠĠĠĠĠ Ġtask . join () ĊĠĠĠĠĠĠĠ ĠassertFalse ( task . running . value !! ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( task . isRunning , Ġtask . running . value ) ĊĠĠĠ Ġ} Ċ } Ċ