#!/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", Str $project-path?, #= Base directory of the project, defaults to $*CWD ) { # CD into the project path if needed chdir($project-path.IO.resolve: :completely) if $project-path; # Scan for our packages my @packages = scan-packages; # Collect runables 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; 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; 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 $! { # 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); say $!.err.lines.map(*.indent(8)).join("\n"); say (colored 'exit code', 'red').indent(6), ": {$!.exit-code}"; } else { 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'); } } }