diff options
Diffstat (limited to 'tests/test.fish')
-rwxr-xr-x | tests/test.fish | 131 |
1 files changed, 60 insertions, 71 deletions
diff --git a/tests/test.fish b/tests/test.fish index 6d2ce42c..994e7a76 100755 --- a/tests/test.fish +++ b/tests/test.fish @@ -1,85 +1,74 @@ #!/usr/local/bin/fish # -# Main loop of the test suite. I wrote this -# instad of using autotest to provide additional -# testing for fish. :-) +# Fishscript tests +# Change to directory containing this script +cd (dirname (status -f)) -if [ "$argv" != '-n' ] - # begin...end has bug in error redirecting... - begin - ../fish -n ./test.fish ^top.tmp.err - ../fish -n ./test.fish -n ^^top.tmp.err - ../fish ./test.fish -n ^^top.tmp.err - end | tee top.tmp.out - echo $status >top.tmp.status - set res ok - if diff top.tmp.out top.out >/dev/null - else - set res fail - echo Output differs for file test.fish - end - - if diff top.tmp.err top.err >/dev/null - else - set res fail - echo Error output differs for file test.fish - end - - if test (cat top.tmp.status) = (cat top.status) - else - set res fail - echo Exit status differs for file test.fish - end - - ../fish -p /dev/null -c 'echo testing' >/dev/null - if test $status -ne 0 - set res fail - echo Profiling fails - end - - if test $res = ok; - echo File test.fish tested ok - else - echo File test.fish failed tests - end; - - exit +# Test files specified on commandline, or all *.in files +set -q argv[1] +if set -q argv[1] + set files_to_test $argv.in +else + set files_to_test *.in end -echo Testing high level script functionality +source test_util.fish (status -f) $argv; or exit + +say -o cyan "Testing high level script functionality" -for i in *.in - set template_out (basename $i .in).out - set template_err (basename $i .in).err - set template_status (basename $i .in).status +function test_file + set -l file $argv[1] + set -l base (basename $file .in) - ../fish <$i >tmp.out ^tmp.err - echo $status >tmp.status - set res ok - if diff tmp.out $template_out >/dev/null - else - set res fail - echo Output differs for file $i - end + echo -n "Testing file $file ... " - if diff tmp.err $template_err >/dev/null - else - set res fail - echo Error output differs for file $i - end + ../fish <$file >$base.tmp.out ^$base.tmp.err + set -l tmp_status $status + set -l res ok - if test (cat tmp.status) = (cat $template_status) - else - set res fail - echo Exit status differs for file $i - end + diff $base.tmp.out $base.out >/dev/null + set -l out_status $status + diff $base.tmp.err $base.err >/dev/null + set -l err_status $status + set -l exp_status (cat $base.status)[1] - if test $res = ok; - echo File $i tested ok - else - echo File $i failed tests - end; + if test $out_status -eq 0 -a $err_status -eq 0 -a $exp_status -eq $tmp_status + say green "ok" + # clean up tmp files + rm -f $base.tmp.{err,out} + return 0 + else + say red "fail" + if test $out_status -ne 0 + say yellow "Output differs for file $file. Diff follows:" + colordiff -u $base.tmp.out $base.out + end + if test $err_status -ne 0 + say yellow "Error output differs for file $file. Diff follows:" + colordiff -u $base.tmp.err $base.err + end + if test $exp_status -ne $tmp_status + say yellow "Exit status differs for file $file." + echo "Expected $exp_status, got $tmp_status." + end + return 1 + end +end +set -l failed +for i in $files_to_test + if not test_file $i + set failed $failed $i + end end +set failed (count $failed) +if test $failed -eq 0 + say green "All tests completed successfully" + exit 0 +else + set plural (test $failed -eq 1; or echo s) + say red "$failed test$plural failed" + exit 1 +end |