package Ġcom . kr ake . core . thread Ċ Ċ import Ġandroidx . test . filters . Small Test Ċ import Ġcom . kr ake . test . extension . lock Ċ import Ġkotlinx . coroutines . delay Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . Test Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠInstrument ed Ġtest Ġclass Ġfor Ġ[ AsyncTask ] Ġand Ġ[ AsyncTask . Builder ]. Ċ Ġ*/ Ċ @ Small Test Ċ class ĠAsync Task Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtask Completed Successfully () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġlock () ĊĊĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġa Ġsum . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber Ġ+ Ġnumber ĊĠĠĠĠĠĠĠ Ġ}. completed Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġthe Ġsum Ġwas Ġdone . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( number Ġ+ Ġnumber , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFinish Ġthe Ġtest Ġunlock ing Ġthe Ġlock . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠ Ġ}. load () ĊĊĠĠĠĠĠĠĠ Ġlock . lock () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtask Error Block Called On Generic Exception () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġlock () ĊĠĠĠĠĠĠĠ Ġvar Ġis Callback Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException () ĊĠĠĠĠĠĠĠ Ġ}. error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠ Ġ}. load () ĊĊĠĠĠĠĠĠĠ Ġlock . lock () ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( is Callback Called ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtask Completed Successfully Avoid Error Block () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġlock () ĊĊĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġexecute Ġanything . ĊĠĠĠĠĠĠĠ Ġ}. error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠ Ġ}. load () ĊĊĠĠĠĠĠĠĠ Ġ// ĠGive Ġ 1 0 ms Ġto Ġinvoke Ġthe Ġerror Ġblock , Ġotherwise , Ġit Ġwon 't Ġbe Ġexecuted . ĊĠĠĠĠĠĠĠ Ġval Ġerror Block Is Executed Ġ= Ġlock . lock WithTimeout ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( error Block Is Executed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtask Ca ught Exception () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġlock () ĊĊĠĠĠĠĠĠĠ Ġval Ġexc Ġ= ĠRuntimeException () ĊĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġexc ĊĠĠĠĠĠĠĠ Ġ}. error Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġthe Ġthrown Ġexception Ġis Ġthe Ġsame . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( exc , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFinish Ġthe Ġtest Ġunlock ing Ġthe Ġlock . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠ Ġ}. load () ĊĊĠĠĠĠĠĠĠ Ġlock . lock () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtask Ca ught Exception Avoid Completed Block () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlock Ġ= Ġlock () ĊĊĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException () ĊĠĠĠĠĠĠĠ Ġ}. completed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠ Ġ}. load () ĊĊĠĠĠĠĠĠĠ Ġ// ĠGive Ġ 1 0 ms Ġto Ġinvoke Ġthe Ġcompleted Ġblock , Ġotherwise , Ġit Ġwon 't Ġbe Ġexecuted . ĊĠĠĠĠĠĠĠ Ġval Ġcompleted Block Is Executed Ġ= Ġlock . lock WithTimeout ( 1 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( completed Block Is Executed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtask Manage Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Loading Lock Ġ= Ġlock () ĊĠĠĠĠĠĠĠ Ġval Ġfinish Loading Lock Ġ= Ġlock () ĊĠĠĠĠĠĠĠ Ġval Ġcompleted Lock Ġ= Ġlock () ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Loading Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWait Ġtill Ġthe Ġlock Ġwill Ġbe Ġun locked . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Loading Lock . lock () ĊĠĠĠĠĠĠĠ Ġ}. completed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ}. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAt Ġthe Ġstart , Ġthe Ġtask Ġmust n 't Ġload Ġanything . ĊĠĠĠĠĠĠĠ ĠassertFalse ( task . isLoading ) ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġthe Ġtask . ĊĠĠĠĠĠĠĠ Ġtask . load () ĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġtill Ġthe Ġloading Ġis Ġsent Ġto Ġa Ġbackground Ġthread . ĊĠĠĠĠĠĠĠ Ġstart Loading Lock . lock () ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġbackground Ġthread Ġis Ġprocessing Ġnow , Ġso Ġthe Ġtask Ġmust Ġbe Ġloading . ĊĠĠĠĠĠĠĠ ĠassertTrue ( task . isLoading ) ĊĠĠĠĠĠĠĠ Ġ// ĠUn lock Ġthe Ġwaiting Ġon Ġthe Ġbackground Ġthread . ĊĠĠĠĠĠĠĠ Ġfinish Loading Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġtill Ġthe Ġcompleted Ġlock Ġis Ġexecuted . ĊĠĠĠĠĠĠĠ Ġcompleted Lock . lock () ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġtask Ġisn 't Ġloading Ġanymore . ĊĠĠĠĠĠĠĠ ĠassertFalse ( task . isLoading ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtask Manage Loading On Cancellation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Loading Lock Ġ= Ġlock () ĊĠĠĠĠĠĠĠ Ġval Ġfinish Loading Lock Ġ= Ġlock () ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Callback Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġis Error Callback Called Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Loading Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWait Ġtill Ġthe Ġlock Ġwill Ġbe Ġun locked . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Loading Lock . lock () ĊĠĠĠĠĠĠĠ Ġ}. completed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ}. error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Error Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ}. load () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġtill Ġthe Ġloading Ġis Ġsent Ġto Ġa Ġbackground Ġthread . ĊĠĠĠĠĠĠĠ Ġstart Loading Lock . lock () ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġbackground Ġthread Ġis Ġprocessing Ġnow , Ġso Ġthe Ġtask Ġmust Ġbe Ġloading . ĊĠĠĠĠĠĠĠ ĠassertTrue ( task . isLoading ) ĊĠĠĠĠĠĠĠ Ġ// ĠCancel Ġthe Ġtask . ĊĠĠĠĠĠĠĠ Ġtask . cancel () ĊĠĠĠĠĠĠĠ Ġ// ĠUn lock Ġthe Ġwaiting Ġon Ġthe Ġbackground Ġthread Ġand Ġfinish Ġthe Ġtest . ĊĠĠĠĠĠĠĠ Ġfinish Loading Lock . unlock () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġtask Ġmust n 't Ġcall Ġthe Ġcallback . ĊĠĠĠĠĠĠĠ ĠassertFalse ( is Callback Called ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( isError Callback Called ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtask Test Suspend Cancellation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Loading Lock Ġ= Ġlock () ĊĠĠĠĠĠĠĠ Ġval Ġfinish Loading Lock Ġ= Ġlock () ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Completed Callback Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġis Error Callback Called Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Loading Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Loading Lock . lock () ĊĠĠĠĠĠĠĠ Ġ}. completed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Completed Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ}. error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Error Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ}. load () ĊĊĠĠĠĠĠĠĠ Ġstart Loading Lock . lock () ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġbackground Ġthread Ġis Ġprocessing Ġnow , Ġso Ġthe Ġtask Ġmust Ġbe Ġloading . ĊĠĠĠĠĠĠĠ ĠassertTrue ( task . isLoading ) ĊĠĠĠĠĠĠĠ Ġ// ĠCancel Ġthe Ġtask . ĊĠĠĠĠĠĠĠ Ġtask . cancel () ĊĊĠĠĠĠĠĠĠ Ġfinish Loading Lock . unlock () ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( is Completed Callback Called ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( isError Callback Called ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġtask Ġmust n 't Ġload Ġanything Ġanymore . ĊĠĠĠĠĠĠĠ ĠassertFalse ( task . isLoading ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtask Test Computation Cancellation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Loading Lock Ġ= Ġlock () ĊĠĠĠĠĠĠĠ Ġval Ġfinish Loading Lock Ġ= Ġlock () ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Completed Callback Called Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġis Error Callback Called Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Loading Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Loading Lock . lock () ĊĠĠĠĠĠĠĠ Ġ}. completed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Completed Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ}. error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Error Callback Called Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ}. load () ĊĊĠĠĠĠĠĠĠ Ġstart Loading Lock . lock () ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġbackground Ġthread Ġis Ġprocessing Ġnow , Ġso Ġthe Ġtask Ġmust Ġbe Ġloading . ĊĠĠĠĠĠĠĠ ĠassertTrue ( task . isLoading ) ĊĠĠĠĠĠĠĠ Ġ// ĠCancel Ġthe Ġtask . ĊĠĠĠĠĠĠĠ Ġtask . cancel () ĊĊĠĠĠĠĠĠĠ Ġfinish Loading Lock . unlock () ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( is Completed Callback Called ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( isError Callback Called ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġtask Ġmust n 't Ġload Ġanything Ġanymore . ĊĠĠĠĠĠĠĠ ĠassertFalse ( task . isLoading ) ĊĠĠĠ Ġ} Ċ }