package Ġeu . j rie . jetbrains . kotlin shell . shell . pip ing Ċ Ċ import Ġeu . j rie . jetbrains . kotlin shell . processes . process . Process Channel Ċ import Ġeu . j rie . jetbrains . kotlin shell . processes . process . Process Channel Unit Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . io . Print Stream Ċ Ċ @ Experimental Cor outines Api Ċ class ĠP ip ing IntegrationTest Ġ: ĠP ip ing Base IntegrationTest () Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġpipe Ġ" echo Ġabc Ġ| Ġcat Ġ| Ġlambda "` () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġecho Ġ= Ġsystem Process Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ{ Ġ" echo " Ġwith Arg Ġcontent Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcat Ġ= Ġsystem Process Ġ{ Ġcmd Ġ= Ġ" cat " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Ġ{ Ġecho Ġpipe Ġcat Ġpipe Ġstore Result Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ ĠassertEquals ("$ content \ n ", Ġread Result ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġpipe Ġfile Ġto Ġ" grep Ġ" L lo rem "" `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġtest File ( content Ġ= ĠLO REM _ IP SUM ) ĊĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġ"[ Ll ] orem " ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrep Ġ= Ġsystem Process Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ{ Ġ" grep " Ġwith Arg Ġpattern Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Ġ{ Ġfile Ġpipe Ġgrep Ġpipe Ġstore Result Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ ĠassertEquals ( LO REM _ IP SUM . grep ( pattern ), Ġread Result ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġpipe Ġ" file Ġto Ġgrep Ġ" L lo rem " Ġ| Ġwc Ġ- m "` () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġtest File ( content Ġ= ĠLO REM _ IP SUM ) ĊĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġ"[ Ll ] orem " ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrep Ġ= Ġsystem Process Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ{ Ġ" grep " Ġwith Arg Ġpattern Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwc Ġ= Ġsystem Process Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ{ Ġ" wc " Ġwith Arg Ġ"- m " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Ġ{ Ġfile Ġpipe Ġgrep Ġpipe Ġwc Ġpipe Ġstore Result Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠLO REM _ IP SUM . grep ( pattern ). count () ĊĠĠĠĠĠĠĠ Ġassert Regex ( Regex ("[ \ n \ t \ r Ġ] +$ expected [\ n \ t \ r Ġ] + "), Ġread Result ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġpipe Ġ" file Ġto Ġgrep Ġ" L lo rem " Ġ| Ġwc Ġ-- chars Ġto Ġfile "` () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġtest File ( content Ġ= ĠLO REM _ IP SUM ) ĊĠĠĠĠĠĠĠ Ġval Ġresult File Ġ= Ġtest File (" result ") ĊĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġ"[ Ll ] orem " ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrep Ġ= Ġsystem Process Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ{ Ġ" grep " Ġwith Arg Ġpattern Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwc Ġ= Ġsystem Process Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ{ Ġ" wc " Ġwith Arg Ġ"- m " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Ġ{ Ġfile Ġpipe Ġgrep Ġpipe Ġwc Ġpipe Ġresult File Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠLO REM _ IP SUM . grep ( pattern ). count () ĊĠĠĠĠĠĠĠ Ġassert Regex ( Regex ("[ \ n \ t \ r Ġ] +$ expected [\ n \ t \ r Ġ] + "), Ġresult File . read Text ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġpipe Ġto Ġconsole `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġout File Ġ= Ġtest File (" console ") ĊĠĠĠĠĠĠĠ ĠSystem . set Out ( Print Stream ( out File )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġecho Ġ= Ġsystem Process Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ{ Ġ" echo " Ġwith Arg Ġcontent Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Ġ{ Ġecho Ġpipe Ġstdout Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġassert Regex ( Regex ( content ), Ġout File . read Text ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġpipe Ġto Ġconsole Ġby Ġdefault `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġout File Ġ= Ġtest File (" console ") ĊĠĠĠĠĠĠĠ ĠSystem . set Out ( Print Stream ( out File )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġecho Ġ= Ġsystem Process Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ{ Ġ" echo " Ġwith Arg Ġcontent Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Ġ{ Ġecho Ġpipe Ġ" cat ". process () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ Ġassert Regex ( Regex ( content ), Ġout File . read Text ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġpipe Ġlong Ġstream `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġ 1 0 0 _ 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġscript File ( n ) ĊĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġ" 2 " ĊĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscript Ġ= Ġsystem Process Ġ{ Ġcmd Ġ= Ġ"./ ${ file . name }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcat Ġ= Ġsystem Process Ġ{ Ġcmd Ġ= Ġ" cat " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrep Ġ= Ġsystem Process Ġ{ Ġcmd Ġ{ Ġ" grep " Ġwith Arg Ġpattern Ġ} Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Ġ{ Ġ( script Ġfork Err Ġn ul lout ) Ġpipe Ġcat Ġpipe Ġgrep Ġpipe Ġstore Result Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ ĠassertEquals ( script Std Out ( n ). grep ( pattern ), Ġread Result ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġpipe Ġinfinite Ġfib onacci Ġnumbers `() Ġ{ ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgiven ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġ 1 5 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠProcess Channel Ġ= ĠChannel ( n ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer : ĠProcess Channel Ġ= ĠChannel < Process Channel Unit >( 2 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( packet (" 0 ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( packet (" 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfib onacci Ġ= Ġcontext Lambda Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( n ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġctx . stdin . receive (). read Text (). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġctx . stdin . receive () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġp Ġ-> Ġctx . stdout . send ( p . copy ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Text (). to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpacket ("${ a + b } "). let Ġ{ Ġnext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . stdout . send ( next . copy ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . send ( next ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetach Ġ{ Ġbuffer Ġpipe Ġfib onacci Ġpipe Ġbuffer Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Ġ{ Ġresult Ġpipe Ġstring Lambda Ġ{ Ġ"$ it , Ġ" Ġto Ġ"" Ġ} Ġpipe Ġstore Result Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġ" 1 , Ġ 2 , Ġ 3 , Ġ 5 , Ġ 8 , Ġ 1 3 , Ġ 2 1 , Ġ 3 4 , Ġ 5 5 , Ġ 8 9 , Ġ 1 4 4 , Ġ 2 3 3 , Ġ 3 7 7 , Ġ 6 1 0 , Ġ 9 8 7 , Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġread Result ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` should Ġmake Ġpipeline Ġwith Ġnon ĠDSL Ġapi `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġwhen ĊĠĠĠĠĠĠĠ Ġshell Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġecho Ġ= Ġsystem Process Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ{ Ġ" echo " Ġwith Arg Ġ" abc \ ndef " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrep Ġ= Ġsystem Process Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd Ġ{ Ġ" grep " Ġwith Arg Ġ" c " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( echo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. through Process ( grep ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. through Process ( system Process Ġ{ Ġcmd Ġ= Ġ" cat " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. through Lambda Ġ{ Ġstore Result ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen ĊĠĠĠĠĠĠĠ ĠassertEquals (" abc \ n ", Ġread Result ()) ĊĠĠĠ Ġ} Ċ } Ċ