package Ġcom . work day . tor que Ċ Ċ import Ġio . mock k . Runs Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Ċ import Ġio . mock k . co Verify Order Ċ import Ġio . mock k . every Ċ import Ġio . mock k . just Ċ import Ġio . mock k . mock k Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . channels . Channel . Factory . UN LIMIT ED Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . jetbrains . spe k . api . Spe k Ċ import Ġorg . jetbrains . spe k . api . dsl . context Ċ import Ġorg . jetbrains . spe k . api . dsl . given Ċ import Ġorg . jetbrains . spe k . api . dsl . it Ċ Ċ class ĠLog cat Recorder Spec Ġ: ĠSpe k ( Ċ { ĊĠĠĠ Ġval Ġfull Log cat Lines Ġ= ĠlistOf (" some Ġlog cat Ġline ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 1 - 0 9 Ġ 1 6 : 1 3 : 1 7 . 9 6 8 Ġ 2 1 2 8 3 Ġ 2 1 3 0 1 ĠI ĠTest Runner : Ġrun Ġstarted : Ġ 2 Ġtests ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġstarted : Ġsome TestMethod 1 ( some TestClass 1 )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 1 - 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 1 - 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġfinished : Ġsome TestMethod 1 ( some TestClass 1 )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġstarted : Ġsome TestMethod 2 ( some TestClass 2 )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġfinished : Ġsome TestMethod 2 ( some TestClass 2 )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 1 - 0 9 Ġ 1 6 : 1 3 : 2 2 . 7 4 6 Ġ 2 1 2 8 3 Ġ 2 1 3 0 1 ĠI ĠTest Runner : Ġrun Ġfinished : Ġ 2 Ġtests , Ġ 0 Ġfailed , Ġ 0 Ġignored ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 1 - 0 9 Ġ 1 6 : 1 3 : 1 7 . 9 6 8 Ġ 2 1 2 8 3 Ġ 2 1 3 0 1 ĠI ĠTest Runner : Ġrun Ġstarted : Ġ 2 Ġtests ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġstarted : Ġsome TestMethod 3 ( some TestClass 3 )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġfinished : Ġsome TestMethod 3 ( some TestClass 3 )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġstarted : Ġsome TestMethod 4 ( some TestClass 4 )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 4 - 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 4 - 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġfinished : Ġsome TestMethod 4 ( some TestClass 4 )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 1 - 0 9 Ġ 1 6 : 1 3 : 2 2 . 7 4 6 Ġ 2 1 2 8 3 Ġ 2 1 3 0 1 ĠI ĠTest Runner : Ġrun Ġfinished : Ġ 2 Ġtests , Ġ 0 Ġfailed , Ġ 0 Ġignored ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline " ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġfull Log cat Lines Invalid Start Ġ= ĠlistOf (" some Ġlog cat Ġline ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġstarted : Ġsome TestMethod 1 ( some TestClass 1 )", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 1 - 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 1 - 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġstarted : Ġsome TestMethod 2 ( some TestClass 2 )", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġfinished : Ġsome TestMethod 2 ( some TestClass 2 )" ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġfull Log cat Lines Invalid Finish 1 Ġ= ĠlistOf (" some Ġlog cat Ġline ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġfinished : Ġsome TestMethod 1 ( some TestClass 1 )", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline " ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġfull Log cat Lines Invalid Finish 2 Ġ= ĠlistOf (" some Ġlog cat Ġline ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġstarted : Ġsome TestMethod 1 ( some TestClass 1 )", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 1 - 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 1 - 2 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġfinished : Ġsome TestMethod 2 ( some TestClass 2 )" ĊĠĠĠ Ġ) ĊĠĠĠ Ġcontext (" Log cat Recorder Ġparses Ġand Ġsaves Ġlog cat Ġfor Ġeach Ġtest ") Ġ{ ĊĠĠĠĠĠĠĠ Ġgiven (" a ĠChannel Ġof Ġnew lines Ġfrom Ġthe Ġfull Ġlog cat Ġfile Ġwith Ġ 2 Ġchunks Ġruns Ġwith Ġ 2 Ġtests Ġeach ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull Log cat Tail Channel Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChannel < String >( capacity Ġ= ĠUN LIMIT ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Log cat Lines . forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffer ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog cat File Io Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock k < Log cat File IO > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġwrite Log cat File For Test ( any ()) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġredirect Log cat ToFile () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtail File () Ġ} Ġreturns Ġfull Log cat Tail Channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog cat Recorder Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog cat Recorder ( mock k ( relax ed Ġ= Ġtrue ), Ġlog cat File Io ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" redirects Ġlog cat , Ġt ails Ġthat Ġfile Ġand Ġemits Ġ 4 ĠTest Log cat Ġwith Ġcorrect Ġfields ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Log cat 1 Ġ= ĠTest Log cat ( test Details Ġ= ĠTest Details (" some TestClass 1 ", Ġ" some TestMethod 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Ġ= Ġ" TestRunner : Ġstarted : Ġsome TestMethod 1 ( some TestClass 1 )\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 1 - 1 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 1 - 2 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġfinished : Ġsome TestMethod 1 ( some TestClass 1 )\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Log cat 2 Ġ= ĠTest Log cat ( test Details Ġ= ĠTest Details (" some TestClass 2 ", Ġ" some TestMethod 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Ġ= Ġ" TestRunner : Ġstarted : Ġsome TestMethod 2 ( some TestClass 2 )\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 2 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġfinished : Ġsome TestMethod 2 ( some TestClass 2 )\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Log cat 3 Ġ= ĠTest Log cat ( test Details Ġ= ĠTest Details (" some TestClass 3 ", Ġ" some TestMethod 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Ġ= Ġ" TestRunner : Ġstarted : Ġsome TestMethod 3 ( some TestClass 3 )\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 3 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġfinished : Ġsome TestMethod 3 ( some TestClass 3 )\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Log cat 4 Ġ= ĠTest Log cat ( test Details Ġ= ĠTest Details (" some TestClass 4 ", Ġ" some TestMethod 4 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Ġ= Ġ" TestRunner : Ġstarted : Ġsome TestMethod 4 ( some TestClass 4 )\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 4 - 1 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 4 - 2 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġfinished : Ġsome TestMethod 4 ( some TestClass 4 )\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Recorder . start ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Order Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat File Io . redirect Log cat ToFile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat File Io . tail File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat File Io . write Log cat File For Test ( test Log cat 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat File Io . write Log cat File For Test ( test Log cat 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat File Io . write Log cat File For Test ( test Log cat 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat File Io . write Log cat File For Test ( test Log cat 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a ĠChannel Ġof Ġnew lines Ġfrom Ġthe Ġfull Ġlog cat Ġfile Ġwith Ġinvalid Ġstart ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull Log cat Tail Channel Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChannel < String >( capacity Ġ= ĠUN LIMIT ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Log cat Lines Invalid Start . forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffer ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog cat File Io Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock k < Log cat File IO > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġwrite Log cat File For Test ( any ()) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġredirect Log cat ToFile () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtail File () Ġ} Ġreturns Ġfull Log cat Tail Channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog cat Recorder Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog cat Recorder ( mock k ( relax ed Ġ= Ġtrue ), Ġlog cat File Io ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" redirects Ġlog cat , Ġt ails Ġthat Ġfile Ġand Ġemits Ġ 2 ĠTest Log cat Ġwith Ġthe Ġfirst Ġhaving Ġan Ġart ificial Ġend Ġlog Ġand Ġlogs Ġthe Ġnext Ġone Ġnormally ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Log cat 1 Ġ= ĠTest Log cat ( test Details Ġ= ĠTest Details (" some TestClass 1 ", Ġ" some TestMethod 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Ġ= Ġ" TestRunner : Ġstarted : Ġsome TestMethod 1 ( some TestClass 1 )\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 1 - 1 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 1 - 2 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ Tor que ]: ĠStarted Ġnext Ġtest Ġwithout Ġfinish ing Ġthe Ġlast Ġone . ĠUn finished Ġtest : Ġsome TestClass 1 . some TestMethod 1 \ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Log cat 2 Ġ= ĠTest Log cat ( test Details Ġ= ĠTest Details (" some TestClass 2 ", Ġ" some TestMethod 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Ġ= Ġ" TestRunner : Ġstarted : Ġsome TestMethod 2 ( some TestClass 2 )\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" some Ġlog cat Ġline Ġ 2 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" TestRunner : Ġfinished : Ġsome TestMethod 2 ( some TestClass 2 )\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Recorder . start ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Order Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat File Io . redirect Log cat ToFile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat File Io . tail File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat File Io . write Log cat File For Test ( test Log cat 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat File Io . write Log cat File For Test ( test Log cat 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a ĠChannel Ġof Ġnew lines Ġfrom Ġthe Ġfull Ġlog cat Ġfile Ġwith Ġinvalid Ġfinish Ġthat Ġhad Ġno Ġstart ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull Log cat Tail Channel Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChannel < String >( capacity Ġ= ĠUN LIMIT ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Log cat Lines Invalid Finish 1 . forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffer ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog cat File Io Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock k < Log cat File IO > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġwrite Log cat File For Test ( any ()) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġredirect Log cat ToFile () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtail File () Ġ} Ġreturns Ġfull Log cat Tail Channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog cat Recorder Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog cat Recorder ( mock k ( relax ed Ġ= Ġtrue ), Ġlog cat File Io ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġcall Ġwrite Log cat File For Test ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Recorder . start ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġlog cat File Io . write Log cat File For Test ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgiven (" a ĠChannel Ġof Ġnew lines Ġfrom Ġthe Ġfull Ġlog cat Ġfile Ġwith Ġinvalid Ġfinish Ġthat Ġhad Ġwrong Ġstart ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull Log cat Tail Channel Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChannel < String >( capacity Ġ= ĠUN LIMIT ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Log cat Lines Invalid Finish 2 . forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffer ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog cat File Io Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock k < Log cat File IO > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġwrite Log cat File For Test ( any ()) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġredirect Log cat ToFile () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtail File () Ġ} Ġreturns Ġfull Log cat Tail Channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog cat Recorder Ġby Ġmemoized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog cat Recorder ( mock k ( relax ed Ġ= Ġtrue ), Ġlog cat File Io ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġcall Ġwrite Log cat File For Test ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog cat Recorder . start ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġlog cat File Io . write Log cat File For Test ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ