from test/more import *;

requires_capability( "proc" );

from std/proc import Proc, sleep_async;
from std/task import all;

async function main () {
	let run := await {
		Proc.run_async(
			"perl",
			[ "-e", "my $x = <STDIN>; print uc($x);" ],
			{ stdin: "ok\n" },
		);
	};
	ok( run{ok}, "run_async reports successful process" );
	is( run{stdout}, "OK\n", "run_async captures stdout" );

	let pipeline := await {
		Proc.pipeline_async(
			[
				[ "perl", "-e", "print qq<hello>" ],
				[ "perl", "-pe", "s/hello/HELLO/" ],
			],
		);
	};
	ok( pipeline{ok}, "pipeline_async reports successful pipeline" );
	is( pipeline{stdout}, "HELLO", "pipeline_async pipes stdout" );
	is( pipeline{steps}.length(), 2, "pipeline_async records steps" );

	await {
		sleep_async(0.01);
	};
	ok( true, "sleep_async can be awaited" );

	let both := await {
		all( [
			Proc.run_async( "perl", [ "-e", "print qq<a>" ] ),
			Proc.run_async( "perl", [ "-e", "print qq<b>" ] ),
		] );
	};
	is( both[0]{stdout}, "a", "first run_async result composes with all" );
	is( both[1]{stdout}, "b", "second run_async result composes with all" );
}

await {
	main();
};

done_testing();
