mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-12-01 06:53:39 +08:00
0c5015d467
This has been driving nuts for years. The output of the diff emitted when a test fails was always reversed, because the diff tool is called with `${difftool} ${new} ${old}` so all the `-` and `+` contexts are reversed, and the highlights are all screwed up. The output of a `make test` run should show what has changed from the baseline/expected, not how the expected differs from the actual. When considered from both the perspective of intentional changes to the test outputs and failed test outputs, it is desirable to see how the test output has changed from the previously expected, and not the other way around. (If you were used to the previous behavior, I apologize. But it was wrong.)
88 lines
2.4 KiB
Fish
88 lines
2.4 KiB
Fish
# Fishscript tests
|
|
#
|
|
# There is no shebang line because you shouldn't be running this by hand. You
|
|
# should be running it via `make test` to ensure the environment is properly
|
|
# setup.
|
|
|
|
# Set this var to modify behavior of the code being tests. Such as avoiding running
|
|
# `fish_update_completions` when running tests.
|
|
set -x FISH_UNIT_TESTS_RUNNING 1
|
|
|
|
# Change to directory containing this script
|
|
cd (dirname (status -f))
|
|
|
|
# Test files specified on commandline, or all *.in files
|
|
if set -q argv[1]
|
|
set files_to_test $argv.in
|
|
else
|
|
set files_to_test *.in
|
|
end
|
|
|
|
# These env vars should not be inherited from the user environment because they can affect the
|
|
# behavior of the tests. So either remove them or set them to a known value.
|
|
# See also tests/interactive.fish.
|
|
set TERM xterm
|
|
set -e ITERM_PROFILE
|
|
|
|
source test_util.fish (status -f) $argv
|
|
or exit
|
|
|
|
say -o cyan "Testing high level script functionality"
|
|
|
|
function test_file
|
|
set -l file $argv[1]
|
|
set -l base (basename $file .in)
|
|
|
|
echo -n "Testing file $file ... "
|
|
set starttime (date +%s)
|
|
|
|
../test/root/bin/fish <$file >$base.tmp.out 2>$base.tmp.err
|
|
set -l exit_status $status
|
|
set -l res ok
|
|
set test_duration (math (date +%s) - $starttime)
|
|
|
|
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
|
|
|
|
if test $out_status -eq 0 -a $err_status -eq 0 -a $exit_status -eq 0
|
|
say green "ok ($test_duration sec)"
|
|
# 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.out $base.tmp.out
|
|
end
|
|
if test $err_status -ne 0
|
|
say yellow "Error output differs for file $file. Diff follows:"
|
|
colordiff -u $base.err $base.tmp.err
|
|
end
|
|
if test $exit_status -ne 0
|
|
say yellow "Exit status differs for file $file."
|
|
echo "Unexpected test exit status $exit_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
|