package Ġio . kom mon s . junit . jupiter . output Ċ Ċ import Ġio . kom mon s . logging . K Logging Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . io . Print Stream Ċ Ċ /** Ċ Ġ* Ġíħ Į ìĬ¤íĬ¸ Ġìĭľ ìĹĲ ĠConsole ìĹĲ Ġì¶ľëł¥ ëĲĺëĬĶ Ġìłķë³´ ë¥¼ Ġë³´ ê´Ģ íķľëĭ¤ Ċ Ġ* Ċ Ġ* Ġ@ author Ġdeb op Ċ Ġ*/ Ċ class ĠOutput Capture Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject : ĠK Logging () ĊĊĠĠĠ Ġprivate Ġvar Ġcopy : ĠByteArrayOutputStream ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcapture Out : ĠCapture OutputStream ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcapture Err : ĠCapture OutputStream ? Ġ= Ġnull ĊĊĠĠĠ Ġinline Ġfun Ġexpect ( body : Ġ( String ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbody ( capture ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcapture (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ?. toString ( Charsets . UTF _ 8 . name ()) Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġstart Capture () Ġ{ ĊĠĠĠĠĠĠĠ Ġcopy Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġcapture Out Ġ= ĠCapture OutputStream ( System . out , Ġcopy !! ) ĊĠĠĠĠĠĠĠ Ġcapture Err Ġ= ĠCapture OutputStream ( System . err , Ġcopy !! ) ĊĊĠĠĠĠĠĠĠ ĠSystem . set Out ( Print Stream ( capture Out !! )) ĊĠĠĠĠĠĠĠ ĠSystem . set Err ( Print Stream ( capture Err !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġfinish Capture () Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . set Out ( this . capture Out ?. original ) ĊĠĠĠĠĠĠĠ ĠSystem . set Err ( this . capture Err ?. original ) ĊĠĠĠĠĠĠĠ Ġthis . copy ?. close () ĊĠĠĠĠĠĠĠ Ġthis . capture Out ?. close () ĊĠĠĠĠĠĠĠ Ġthis . capture Err ?. close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflush () Ġ{ ĊĠĠĠĠĠĠĠ Ġcapture Out ?. run Ġ{ Ġrun Catch ing Ġ{ Ġthis . flush () Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġcapture Err ?. run Ġ{ Ġrun Catch ing Ġ{ Ġthis . flush () Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠ Ġreturn Ġcapture () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠCapture OutputStream ( val Ġoriginal : ĠPrint Stream , Ġval Ġcopy : ĠOutputStream ): ĠOutputStream () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwrite ( b : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . write ( b ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal . write ( b ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal . flush () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwrite ( bytes : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( bytes , Ġ 0 , Ġbytes . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwrite ( bytes : ĠByteArray , Ġoff : ĠInt , Ġlen : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . write ( bytes , Ġoff , Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal . write ( bytes , Ġoff , Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal . flush () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġflush () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal . flush () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }