package Ġcom . tester um . report _ generators . reports . utils . console _ output _ capture Ċ Ċ import Ġcom . tester um . report _ generators . reports . utils . string _ writer . Text Printer Ċ import Ġcom . tester um . report _ generators . reports . utils . string _ writer . impl . Print Stream Text Printer Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . Print Stream Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġkotlin . concurrent . with Lock Ċ Ċ object ĠConsole Output Capt urer Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠRe entrant Lock () ĊĊĠĠĠ Ġprivate Ġvar Ġcapturing Data : ĠConsole Output Capt uring Data ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġstart Capture ( owner : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcapturing Data Ġ= Ġthis . capt uring Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( capt uring Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" [$ owner ] Ġcannot Ġcapture Ġthe Ġoutput Ġbecause Ġit 's Ġalready Ġcaptured Ġby Ġ[ ${ capt uring Data . owner }] ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . capt uring Data Ġ= ĠConsole Output Capt uring Data . start Capture ( owner ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime . get Runtime (). add Shutdown Hook ( Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcleanup () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Original Text Writer (): ĠText Printer Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcapturing Data Ġ= Ġthis . capt uring Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" output Ġnot Ġyet Ġcaptured ; Ġdid Ġyou Ġforget Ġto Ġcall Ġstart Capture () ?") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcapturing Data . get Original Text Writer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdrain Capt ured Text (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcapturing Data Ġ= Ġthis . capt uring Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" output Ġnot Ġyet Ġcaptured ; Ġdid Ġyou Ġforget Ġto Ġcall Ġstart Capture () ?") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcapturing Data . drain Capt ured Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Capture () Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapturing Data ?. restore Original Output () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapturing Data Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcleanup () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremaining Console Capt ured Text : ĠString Ġ= Ġdrain Capt ured Text () ĊĠĠĠĠĠĠĠ Ġstop Capture () ĊĠĠĠĠĠĠĠ Ġprintln ( remaining Console Capt ured Text ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠConsole Output Capt uring Data ( val Ġowner : ĠString ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCHARSET Ġ= ĠStandard Charsets . UTF _ 8 ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart Capture ( owner : ĠString ): ĠConsole Output Capt uring Data Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Capt uring Data Ġ= ĠConsole Output Capt uring Data ( owner ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . set Out ( new Capt uring Data . capt uring Print Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . set Err ( new Capt uring Data . capt uring Print Stream ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Capt uring Data ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġoriginal Stdout : ĠPrint Stream Ġ= ĠSystem . out ĊĠĠĠ Ġprivate Ġval Ġoriginal Stderr : ĠPrint Stream Ġ= ĠSystem . err ĊĠĠĠ Ġprivate Ġval Ġoriginal Text Writer Ġ= ĠPrint Stream Text Printer ( original Stdout ) ĊĊĠĠĠ Ġprivate Ġval Ġcapturing OutputStream Ġ= ĠByteArrayOutputStream () ĊĠĠĠ Ġprivate Ġval Ġcapturing Print Stream : ĠPrint Stream Ġ= ĠPrint Stream ( capt uring OutputStream , Ġfalse , ĠCHARSET . name ()) ĊĊĠĠĠ Ġfun Ġget Original Text Writer () Ġ= Ġoriginal Text Writer ĊĊĠĠĠ Ġfun Ġdrain Capt ured Text (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġcapturing Print Stream . flush () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcapturing OutputStream . toString ( CHARSET . name ()) ĊĊĠĠĠĠĠĠĠ Ġcapturing OutputStream . reset () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrestore Original Output () Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . set Out ( original Stdout ) ĊĠĠĠĠĠĠĠ ĠSystem . set Err ( original Stderr ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ