package Ġun bo ks . pas sthrough Ċ Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ import Ġun bo ks . util . Ints Ċ import Ġun bo ks . util . Pas sthrough Assert Extension Ċ import Ġun bo ks . util . Pas sthrough Assert Extension . Companion . trace Ċ import Ġun bo ks . util . Per mutation Test Ċ Ċ /* Ċ An Ġasynchronous Ġexception , Ġby Ġcontrast , Ġcan Ġpotentially Ġoccur Ġat Ġany Ġpoint Ġin Ġthe Ġexecution Ġof Ġa Ġprogram . Ċ --- Ċ An Ġasynchronous Ġexception Ġoccurred Ġbecause : ĊĊĠĠĠ ĠThe Ġstop Ġmethod Ġof Ġclass ĠThread Ġor ĠThread Group Ġwas Ġinvoked , Ġor ĊĊĠĠĠ ĠAn Ġinternal Ġerror Ġoccurred Ġin Ġthe ĠJava ĠVirtual ĠMachine Ġimplementation . Ċ Ċ The Ġstop Ġmethods Ġmay Ġbe Ġinvoked Ġby Ġone Ġthread Ġto Ġaffect Ġanother Ġthread Ġor Ġall Ġthe Ġthreads Ġin Ġa Ġspecified Ġthread Ġgroup . Ċ They Ġare Ġasynchronous Ġbecause Ġthey Ġmay Ġoccur Ġat Ġany Ġpoint Ġin Ġthe Ġexecution Ġof Ġthe Ġother Ġthread Ġor Ġthreads . ĠAn Ġinternal Ċ error Ġis Ġconsidered Ġasynchronous Ċ --- Ċ A Ġsimple Ġimplementation Ġmight Ġpoll Ġfor Ġasynchronous Ġexceptions Ġat Ġthe Ġpoint Ġof Ġeach Ġcontrol Ġtransfer Ġinstruction . Ċ Since Ġa Ġprogram Ġhas Ġa Ġfinite Ġsize , Ġthis Ġprovides Ġa Ġbound Ġon Ġthe Ġtotal Ġdelay Ġin Ġdetect ing Ġan Ġasynchronous Ġexception . Ċ Since Ġno Ġasynchronous Ġexception Ġwill Ġoccur Ġbetween Ġcontrol Ġtransfers , Ġthe Ġcode Ġgenerator Ġhas Ġsome Ġflexibility Ġto Ċ reorder Ġcomputation Ġbetween Ġcontrol Ġtransfers Ġfor Ġgreater Ġperformance . ĠThe Ġpaper ĠPol ling ĠE fficient ly Ġon ĠStock Ċ Hardware Ġby ĠMar c ĠF ee ley , ĠProc . Ġ 1 9 9 3 ĠConference Ġon ĠFunctional ĠProgramming Ġand ĠComputer ĠArchitecture , ĠC open h agen , Ċ Den mark , Ġpp . Ġ 1 7 9 âĢĵ 1 8 7 , Ġis Ġrecommended Ġas Ġfurther Ġreading . Ċ Ċ http :// www . iro . um ont real . ca /~ fee ley / papers / Fee ley F PCA 9 3 . pdf Ċ Ċ --- Ċ Ċ Normal Ġasync Ġexceptions Ġdoes Ġnot Ġtrigger Ġexception Ġhandlers Ġ-- Ġonly ĠThread . stop () Ġdoes Ġwith Ġits ĠThread Death . Ċ Can Ġthis Ġactually Ġoccur Ġinside Ġa Ġbasic Ġblock ? ĠThe Ġabove Ġnotes Ġseem Ġto Ġimp ly Ġthat Ġsuch Ġexceptions Ġare Ġcaught Ċ in Ġthe Ġedges Ġbetween Ġblocks Ġ( which Ġmakes Ġour Ġapproach Ġsafe Ġ-- Ġeven Ġif Ġthe Ġverifier Ġdoes Ġnot Ġtotally Ġagree ). ĊĊĠĠ Ġ^ ĠTODO ĠOut dated Ġcomment . ĠWe Ġfully Ġhandle Ġthis Ġwith Ġ" implicit Ġpre decess ors ". Ċ */ Ċ Ċ @ Extend With ( Pas sthrough Assert Extension :: class ) Ċ class ĠException Tests Ġ{ ĊĊ ĉ @ Test Ċ ĉ fun Ġtest Simple Throw Catch () Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ throw ĠRuntimeException (" test ") Ċĉ ĉ } Ġcatch Ġ( e : ĠException ) Ġ{ Ċĉĉ ĉ trace ( e . message ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ @ Per mutation Test Ċ ĉ fun Ġtest Finally (@ Ints ( 0 , Ġ 1 ) Ġinput : ĠInt ) Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ if Ġ( input Ġ== Ġ 1 ) Ċĉĉĉ ĉ throw ĠRuntimeException () Ċĉĉ ĉ trace (" no Ġexception ") Ċĉ ĉ } Ġcatch Ġ( e : ĠThrowable ) Ġ{ Ċĉĉ ĉ trace (" caught ") Ċĉ ĉ } Ġfinally Ġ{ Ċĉĉ ĉ trace (" finally ") Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ @ Per mutation Test Ċ ĉ fun Ġtest Multi Handlers (@ Ints ( 0 , Ġ 1 , Ġ 2 ) Ġinput : ĠInt ) Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ when Ġ( input ) Ġ{ Ċĉĉĉĉ 0 Ġ-> Ġthrow ĠRuntimeException (" runtime ") Ċĉĉĉĉ 1 Ġ-> Ġthrow ĠIllegalStateException (" ise ") Ċĉĉ ĉ } Ċĉĉ ĉ trace (" no Ġexception ") Ċĉ ĉ } Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ Ċĉĉ ĉ trace (" caught Ġi se ") Ċĉĉ ĉ trace ( e . message ) Ċĉ ĉ } Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ Ċĉĉ ĉ trace (" caught Ġruntime ") Ċĉĉ ĉ trace ( e . message ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ @ Per mutation Test Ċ ĉ fun Ġtest Exception (@ Ints ( 0 , Ġ 1 , Ġ 2 , Ġ 3 ) Ġa : ĠInt ) Ġ{ Ċĉ ĉ var Ġflags Ġ= Ġ 0 Ċĉ ĉ try Ġ{ Ċĉĉ ĉ flags Ġ= Ġflags Ġor Ġ 1 Ċĉĉ ĉ if Ġ( a Ġ== Ġ 0 ) Ċĉĉĉ ĉ throw ĠRuntimeException () Ċĉĉ ĉ if Ġ( a Ġ== Ġ 1 ) Ċĉĉĉ ĉ throw ĠError () Ċĉĉ ĉ flags Ġ= Ġflags Ġor Ġ 2 Ċĉĉ ĉ if Ġ( a Ġ== Ġ 2 ) Ċĉĉĉ ĉ throw ĠRuntimeException () Ċĉĉ ĉ if Ġ( a Ġ== Ġ 3 ) Ċĉĉĉ ĉ throw ĠError () Ċĉĉ ĉ flags Ġ= Ġflags Ġor Ġ 4 Ċĉ ĉ } Ġcatch Ġ( e : ĠException ) Ġ{ Ċĉĉ ĉ flags Ġ= Ġflags Ġor Ġ 8 Ċĉ ĉ } Ġcatch Ġ( e : ĠError ) Ġ{ Ċĉĉ ĉ flags Ġ= Ġflags Ġor Ġ 1 6 Ċĉ ĉ } Ġfinally Ġ{ Ċĉĉ ĉ flags Ġ= Ġflags Ġor Ġ 3 2 Ċĉ ĉ } Ċĉ ĉ trace ( flags ) Ċ ĉ } ĊĊ ĉ @ Test Ċ ĉ fun Ġtest Exception () Ġ{ Ċĉ ĉ var Ġflags Ġ= Ġ 0 Ċĉ ĉ try Ġ{ ĊĊĉ ĉ } Ġcatch Ġ( e : ĠException ) Ġ{ Ċĉĉ ĉ flags Ġ= Ġflags Ġ+ Ġ 1 Ċĉĉ ĉ trace ( flags ) Ċĉ ĉ } Ċĉ ĉ trace ( flags ) Ċ ĉ } ĊĊ ĉ fun Ġwill Throw () Ġ{ Ċĉ ĉ throw ĠRuntimeException () Ċ ĉ } ĊĊ ĉ @ Per mutation Test Ċ ĉ fun Ġtest Mut CodeGen Problem (@ Ints ( 0 , Ġ 1 ) Ġinput : ĠInt ) Ġ{ Ċĉ ĉ var Ġvalue Ġ= Ġ 1 0 Ċĉ ĉ try Ġ{ Ċĉĉ ĉ value Ġ= Ġ 2 0 Ċĉĉ ĉ will Throw () Ċĉĉ ĉ if Ġ( input Ġ== Ġ 1 ) Ċĉĉĉ ĉ value Ġ= Ġ 9 9 9 Ġ// ĠJust Ġto Ġforce Ġthe Ġhandler Ġhaving Ġa Ġphi Ġjoin Ġon Ġthe Ġmutable Ġvalue . Ċĉ ĉ } Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ Ċĉĉ ĉ trace ( value ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ @ Per mutation Test Ċ ĉ fun Ġtest We ird Thing (@ Ints ( 0 , Ġ 1 , Ġ 2 , Ġ 3 ) Ġinput : ĠInt ) Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ throw When Equal ( 1 , Ġinput ) Ċĉĉ ĉ throw When Equal ( 3 , Ġinput ) Ċĉ ĉ } Ġcatch Ġ( e : ĠThrowable ) Ġ{ Ċĉĉ ĉ trace (" ex 1 ") Ċĉĉ ĉ trace ( input ) Ċĉ ĉ } Ċĉ ĉ try Ġ{ Ċĉĉ ĉ throw When Equal ( 2 , Ġinput ) Ċĉĉ ĉ throw When Equal ( 3 , Ġinput ) Ċĉ ĉ } Ġcatch Ġ( e : ĠThrowable ) Ġ{ Ċĉĉ ĉ trace (" ex 2 ") Ċĉĉ ĉ trace ( input ) Ċĉ ĉ } Ċĉ ĉ trace ( input ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġthrow When Equal ( a : ĠInt , Ġb : ĠInt ) Ġ{ Ċĉ ĉ if Ġ( a Ġ== Ġb ) Ċĉĉ ĉ throw ĠRuntimeException () Ċ ĉ } ĊĊ ĉ @ Per mutation Test Ċ ĉ fun Ġtest Re define 1 (@ Ints ( 0 , Ġ 1 , Ġ 2 ) Ġinput : ĠInt ) Ġ{ Ċĉ ĉ var Ġx Ġ= Ġ 1 Ċĉ ĉ try Ġ{ Ċĉĉ ĉ x Ġ= Ġ 2 Ċĉĉ ĉ throw When Equal ( 0 , Ġinput ) Ċĉĉ ĉ x Ġ= Ġ 3 Ċĉĉ ĉ throw When Equal ( 1 , Ġinput ) Ċĉĉ ĉ x Ġ= Ġ 4 Ċĉĉ ĉ throw When Equal ( 2 , Ġinput ) Ċĉĉ ĉ x Ġ= Ġ 5 Ċĉ ĉ } Ġcatch Ġ( e : ĠThrowable ) Ġ{ Ċĉĉ ĉ trace (" exception ") Ċĉĉ ĉ trace ( x ) Ċĉ ĉ } Ġfinally Ġ{ Ċĉĉ ĉ trace (" finally ") Ċĉĉ ĉ trace ( x ) Ċĉ ĉ } Ċĉ ĉ trace (" after )") Ċĉ ĉ trace ( x ) Ċ ĉ } ĊĊ ĉ @ Per mutation Test Ċ ĉ fun Ġtest Re define 2 (@ Ints ( 0 , Ġ 1 , Ġ 2 ) Ġinput : ĠInt ) Ġ{ Ċĉ ĉ var Ġx Ġ= Ġ 1 Ċĉ ĉ try Ġ{ Ċĉĉ ĉ throw When Equal ( 0 , Ġinput ) Ċĉĉ ĉ x Ġ= Ġ 2 Ċĉĉ ĉ throw When Equal ( 1 , Ġinput ) Ċĉĉ ĉ x Ġ= Ġ 3 Ċĉĉ ĉ throw When Equal ( 2 , Ġinput ) Ċĉ ĉ } Ġcatch Ġ( e : ĠThrowable ) Ġ{ Ċĉĉ ĉ trace (" exception ") Ċĉĉ ĉ trace ( x ) Ċĉ ĉ } Ġfinally Ġ{ Ċĉĉ ĉ trace (" finally ") Ċĉĉ ĉ trace ( x ) Ċĉ ĉ } Ċĉ ĉ trace (" after )") Ċĉ ĉ trace ( x ) Ċ ĉ } Ċ } Ċ