diff --git a/META6.json b/META6.json index 0918894..5bcad19 100644 --- a/META6.json +++ b/META6.json @@ -7,7 +7,8 @@ "Nathan McCarty " ], "depends": [ - "paths" + "paths", + "Terminal::ANSIColor" ], "provides": { "IUtils": "lib/IUtils.rakumod", diff --git a/bin/iutils b/bin/iutils index 9c2671d..2000339 100755 --- a/bin/iutils +++ b/bin/iutils @@ -1,10 +1,14 @@ #!/usr/bin/env raku use v6.d; + +use Terminal::ANSIColor; + use IUtils; use IUtils::Regexes; use IUtils::Compiler; # TODO: Add filtering for tests based on module/name +# TODO: Move some of this functionality into methods for the relevant structs #| Execute the tests in an idris project multi MAIN( "test", @@ -18,34 +22,68 @@ multi MAIN( my @runables = @packages.map: *.runnables; # Run the tests my $basedir = $*CWD; + my $total-failures = 0; for @runables -> $runable { + my $package-failures = 0; # Make sure the package is built pack-build $runable.ipkg.relative; # CD to the local directory to make sure idris can exec the expressions indir $runable.ipkg.parent, { next unless $runable.tests.elems > 0; - say "** Testing {$runable.ipkg.relative: $basedir}"; + my $test-module-name = + colored($runable.ipkg.relative($basedir), 'magenta bold'); + say "{colored '*', 'yellow bold'} Testing $test-module-name"; for $runable.tests.keys -> $module-name { + my $module-failures = 0; my $module = $runable.tests{$module-name}; next unless $module.tests.elems > 0; - say "-- Testing $module-name".indent(2); + my $colored-module = colored $module-name, 'cyan bold'; + say "{colored '**', 'magenta bold'} Testing $colored-module" + .indent(2); for $module.tests -> $test { try { + # FIXME this doesn't actually capture the exit code idris-exec $test, $module.source.relative; } + my $testf = colored $test, 'underline'; if $! { - my $stdout = $1.err.lines.map(*.indent(8)).join("\n"); - say "+ $test: FAIL".indent(4); + # TODO: Don't show stdout if its empty + $module-failures += 1; + say "{colored '+', 'red'} $testf: {colored 'FAIL', 'red bold'}" + .indent(4); say "stdout:".indent(6); - $!.err.lines.map(*.indent(8)).join("\n"); - say "stderr:".indent(6); - $!.err.lines.map(*.indent(8)).join("\n"); - say "exit code: {$!.exit-code}" + say $!.err.lines.map(*.indent(8)).join("\n"); + say (colored 'exit code', 'red').indent(6), + ": {$!.exit-code}"; } else { - say "+ $test: Pass".indent(4); + say "{colored '+', 'green'} $testf: {colored 'pass', 'green'}" + .indent(4); } } + if $module-failures == 0 { + say "All $colored-module ".indent(4), + colored('tests passed', 'green underline'); + } else { + say "$module-failures $colored-module ".indent(4), + colored('tests failed', 'red bold underline'); + } + $package-failures += $module-failures; } + if $package-failures == 0 { + say "All $test-module-name ".indent(2), + colored('tests passed', 'green underline'); + } else { + say "$package-failures $test-module-name ".indent(2), + colored('tests failed', 'red bold underline'); + } + $total-failures += $package-failures; + say ''; + } + say ''; + if $total-failures == 0 { + say 'All ', colored('tests passed', 'green underline'); + } else { + say $total-failures, ' ', colored('tests failed', 'red bold underline'); } } } diff --git a/lib/IUtils/Compiler.rakumod b/lib/IUtils/Compiler.rakumod index d8bfcba..90054c6 100644 --- a/lib/IUtils/Compiler.rakumod +++ b/lib/IUtils/Compiler.rakumod @@ -66,6 +66,7 @@ sub idris-run(*@cmd) is export { return $out; } +# TODO: Special handling for IO Bool to make this eaiser #| Exec the expression with the given name in the given file sub idris-exec($expr, $file) is export { idris-run '--find-ipkg', '--exec', $expr, $file