diff --git a/Makefile.in b/Makefile.in index 24e461768..722d6117a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -315,20 +315,14 @@ test_low_level: fish_tests $(call filter_up_to,test_low_level,$(active_test_goal test_high_level: test_fishscript test_interactive .PHONY: test_high_level -test_fishscript: $(PROGRAMS) test_fishscript_config $(call filter_up_to,test_fishscript,$(active_test_goals)) - cd tests; XDG_CONFIG_HOME="$$PWD"/tmp.config ../fish test.fish +test_fishscript: $(PROGRAMS) $(call filter_up_to,test_fishscript,$(active_test_goals)) + cd tests && ../fish test.fish .PHONY: test_fishscript -test_interactive: $(PROGRAMS) test_fishscript_config $(call filter_up_to,test_interactive,$(active_test_goals)) - cd tests; XDG_CONFIG_HOME="$$PWD"/tmp.config ../fish interactive.fish +test_interactive: $(PROGRAMS) $(call filter_up_to,test_interactive,$(active_test_goals)) + cd tests && ../fish interactive.fish .PHONY: test_interactive -test_fishscript_config: - @rm -rf tests/tmp.config - @mkdir -p tests/tmp.config/fish - @echo 'set fish_function_path "$$PWD/../share/functions"' > tests/tmp.config/fish/config.fish -.PHONY: test_fishscript_config - # # commands.hdr collects documentation on all commands, functions and # builtins diff --git a/tests/interactive.config b/tests/interactive.config index 835bdfd36..ee6fee949 100644 --- a/tests/interactive.config +++ b/tests/interactive.config @@ -1,8 +1,5 @@ # vim: set filetype=fish sw=4 ts=4 et: -# source the non-interactive config -source $XDG_CONFIG_HOME/../tmp.config/fish/config.fish - set -g prompt_counter 0 set -g prompt_counter_incr 0 function fish_prompt diff --git a/tests/interactive.fish b/tests/interactive.fish index dbc9bf889..ad53e2624 100644 --- a/tests/interactive.fish +++ b/tests/interactive.fish @@ -2,7 +2,7 @@ # # Interactive tests using `expect` -source test_util.fish +source test_util.fish (status -f); or exit say -o cyan "Testing interactive functionality" if not type -q expect @@ -13,7 +13,8 @@ end function test_file rm -Rf tmp.interactive.config; or die "Couldn't remove tmp.interactive.config" mkdir -p tmp.interactive.config/fish; or die "Couldn't create tmp.interactive.config/fish" - cp interactive.config tmp.interactive.config/fish/config.fish; or die "Couldn't create tmp.interactive.config/fish/config.fish" + cat $XDG_CONFIG_HOME/fish/config.fish interactive.config > tmp.interactive.config/fish/config.fish + or die "Couldn't create tmp.interactive.config/fish/config.fish" set -l file $argv[1] diff --git a/tests/test.fish b/tests/test.fish index 35850197d..7a48ddbf8 100644 --- a/tests/test.fish +++ b/tests/test.fish @@ -2,7 +2,7 @@ # # Fishscript tests -source test_util.fish +source test_util.fish (status -f); or exit say -o cyan "Testing high level script functionality" diff --git a/tests/test_util.fish b/tests/test_util.fish index 659cbda47..2aef2b980 100644 --- a/tests/test_util.fish +++ b/tests/test_util.fish @@ -1,18 +1,73 @@ # Utilities for the test runners -function die - echo $argv[1] >&2 +if test "$argv[1]" = (status -f) + echo 'test_util.fish requires sourcing script as argument to `source`' >&2 + echo 'use `source test_util.fish (status -f); or exit`' >&2 + status --print-stack-trace >&2 exit 1 end -if not tty 0>&1 >/dev/null - function set_color - # do nothing - return 0 - end +function die + set -q argv[1]; and echo $argv[1] >&2 + exit 1 end -function say +# check if we're running in the test environment +# if not, set it up and rerun fish with exec. +# The test is whether the special var __fish_is_running_tests +# exists and contains the same value as XDG_CONFIG_HOME. It checks +# the value and not just the presence because we're going to delete +# the config directory later if we're exiting successfully. +if not set -q __fish_is_running_tests + # set up our test environment and re-run the original script + set -l script $argv[1] + switch $script + case '/*' + # path is absolute + case '*' + # path is relative, make it absolute + set script $PWD/$script + end + set -l IFS # clear IFS so cmd substitution doesn't split + cd (dirname $script); or die + set -xl XDG_CONFIG_HOME (printf '%s/tmp.config/%s' $PWD %self); or die + if test -d $XDG_CONFIG_HOME + # if the dir already exists, we've reused a pid + # this would be surprising to reuse a fish pid that failed in the past, + # but clear it anyway + rm -r $XDG_CONFIG_HOME; or die + end + mkdir -p $XDG_CONFIG_HOME/fish; or die + set -l escaped_parent (dirname $PWD | sed -e 's/[\'\\\\]/\\\\&/g'); or die + printf 'set fish_function_path \'%s/share/functions\'\n' $escaped_parent > $XDG_CONFIG_HOME/fish/config.fish; or die + set -xl __fish_is_running_tests $XDG_CONFIG_HOME + exec ../fish $script + die 'exec failed' +else if test "$__fish_is_running_tests" != "$XDG_CONFIG_HOME" + echo 'Something went wrong with the test runner.' >&2 + echo "__fish_is_running_tests: $__fish_is_running_tests" >&2 + echo "XDG_CONFIG_HOME: $XDG_CONFIG_HOME" >&2 + exit 10 +else + # we're running tests with a temporary config directory + function test_util_on_exit --on-process-exit %self -V __fish_is_running_tests + # remove the temporary config directory + # unfortunately if this fails we can't alter the exit status of fish + if not rm -r "$__fish_is_running_tests" + echo "error: Couldn't remove temporary config directory '$__fish_is_running_tests'" >&2 + end + end + # unset __fish_is_running_tests so any children that source + # test_util.fish will set up a new test environment. + set -e __fish_is_running_tests +end + +set -l suppress_color +if not tty 0>&1 >/dev/null + set suppress_color yes +end + +function say -V suppress_color set -l color_flags set -l suppress_newline while set -q argv[1] @@ -32,15 +87,14 @@ function say set -e argv[1] end - if not set -q argv[1] - echo 'usage: say [flags] color [string...]' >&2 + if not set -q argv[2] + echo 'usage: say [flags] color string [string...]' >&2 return 1 end - if set_color $color_flags $argv[1] - set -e argv[1] - echo -n $argv - set_color reset + if begin; test -n "$suppress_color"; or set_color $color_flags $argv[1]; end + printf '%s' $argv[2..-1] + test -z "$suppress_color"; and set_color reset if test -z "$suppress_newline" echo end