/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠR ick ĠBus ar ow Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġdispatch . android . lifecycle . internal Ċ Ċ import Ġandroidx . lifecycle .* Ċ import Ġdispatch . android . lifecycle .* Ċ import Ġdispatch . core .* Ċ import Ġdispatch . internal . test . android .* Ċ import Ġdispatch . test .* Ċ import Ġher mit . test . junit .* Ċ import Ġio . kot est . matchers .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġorg . junit . jupiter . api .* Ċ import Ġorg . junit . jupiter . api . extension .* Ċ import Ġjava . util . concurrent .* Ċ Ċ @ Extend With ( Instant Task Executor Extension :: class ) Ċ @ Obsolete Cor outines Api Ċ @ Experimental Cor outines Api Ċ internal Ġclass ĠAtomic Get Or Put Test Ġ: ĠHer mit JUnit 5 () Ġ{ ĊĊĠ Ġ@ Nested ĊĠ Ġinner Ġclass Ġ` API Ġlevel Ġ 2 3 ` Ġ{ ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass Ġ` multiple Ġthreads Ġaccess Ġlifecycle Scope Ġat Ġonce ` Ġ{ ĊĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠ Ġfun Ġ` all Ġthreads Ġshould Ġget Ġthe Ġsame Ġinstance `() Ġ= Ġrun Blocking Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmain Ġ= Ġnew Single Thread Context (" main ") ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Map Ġ= ĠConcurrent HashMap < Lifecycle , ĠDispatch Lifecycle Scope >() ĊĊĠĠĠĠĠĠĠ Ġval Ġlifecycle Owner Ġ= ĠFake Lifecycle Owner ( Lifecycle . State . INITIAL IZED ) ĊĊĠĠĠĠĠĠĠ Ġval Ġandroid Lifecycle Ġ= Ġlifecycle Owner . lifecycle ĊĊĠĠĠĠĠĠĠ Ġval Ġhuge Executor Ġ= ĠThreadPool Executor ( ĊĠĠĠĠĠĠĠĠĠĠ 2 0 0 , Ġ 2 0 0 , Ġ 5 0 0 0 , ĠTimeUnit . MILLISECONDS , ĠLinked BlockingQueue () ĊĠĠĠĠĠĠĠ Ġ). as Coroutine Dispatcher () ĊĊĠĠĠĠĠĠĠ Ġval Ġlock Ġ= ĠComp letable Deferred < Unit >() ĊĊĠĠĠĠĠĠĠ Ġval Ġall Ġ= ĠList ( 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġasync ( huge Executor ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . await () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore Map . atomic Get Or Put ( android Lifecycle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= ĠDispatch Lifecycle Scope ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Ġ= Ġandroid Lifecycle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ= ĠMain Immediate Coroutine Scope ( Job (), ĠTest Dispatcher Provider ( main )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( main ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Lifecycle . add Observer ( Dispatch Lifecycle Scope Store ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠ Ġlock . complete ( Unit ) ĊĊĠĠĠĠĠĠĠ Ġall . await All (). distinct (). size ĠshouldBe Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĊĠĠĠĠĠĠĠ Ġandroid Lifecycle . observer Count ĠshouldBe Ġ 2 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ