package Ġio . kot est . engine . listener Ċ Ċ import Ġio . kot est . core . spec . Spec Ċ import Ġio . kot est . core . test . TestCase Ċ import Ġio . kot est . core . test . TestResult Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠWrap s Ġa Ġ[ Test Engine Listener ] s Ġmethods Ġwith Ġa Ġmutex Ġto Ġensure Ġonly Ġone Ġmethod Ġis Ġcalled Ġat Ġa Ġtime . Ċ Ġ*/ Ċ class ĠThread Safe Test Engine Listener ( private Ġval Ġlistener : ĠTest Engine Listener ) Ġ: ĠTest Engine Listener Ġ{ ĊĊĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex () ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġengine Started ( classes : ĠList < K Class <* >>) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . engine Started ( classes ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġengine Finished ( t : ĠList < Throwable >) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . engine Finished ( t ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġspec Started ( k class : ĠK Class <* >) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . spec Started ( k class ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġspec Finished ( k class : ĠK Class <* >, Ġresults : ĠMap < TestCase , ĠTest Result >) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . spec Finished ( k class , Ġresults ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġtest Started ( testCase : ĠTestCase ) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . test Started ( testCase ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġtest Ignored ( testCase : ĠTestCase , Ġreason : ĠString ?) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . test Ignored ( testCase , Ġreason ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġtest Finished ( testCase : ĠTestCase , Ġresult : ĠTest Result ) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . test Finished ( testCase , Ġresult ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġspec Instanti ated ( spec : ĠSpec ) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . spec Instanti ated ( spec ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġspec Instantiation Error ( k class : ĠK Class <* >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . spec Instantiation Error ( k class , Ġt ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġengine Shutdown () Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . engine Shutdown () ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġengine Startup () Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . engine Startup () ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġspec Exit ( k class : ĠK Class < out ĠSpec >, Ġt : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . spec Exit ( k class , Ġt ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġspec Ignored ( k class : ĠK Class < out ĠSpec >) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . spec Ignored ( k class ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġspec Inactive ( k class : ĠK Class <* >, Ġresults : ĠMap < TestCase , ĠTest Result >) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . spec Inactive ( k class , Ġresults ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġoverride Ġsuspend Ġfun Ġspec Enter ( k class : ĠK Class < out ĠSpec >) Ġ{ ĊĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠ Ġlistener . spec Enter ( k class ) ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} Ċ } Ċ