fish-shell/tests/test_util.fish
Kurtis Rader 4424909801 simplify, and fix, setting the current locale
Fix test setup bogosities. Specifically, they weren't hermetic with respect to
locale env vars.

Rewrite the handling of locale vars to simplify the code and make it more like
the pattern most programs employ.

Fixes #3110
2016-06-20 16:54:34 -07:00

133 lines
4.1 KiB
Fish

# vim: set ts=4 sw=4 tw=100 et:
# Utilities for the test runners
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
# Any remaining arguments are passed back to test.fish
set -l args_for_test_script
if set -q argv[2]
set args_for_test_script $argv[2..-1]
end
function die
set -q argv[1]; and echo $argv[1] >&2
exit 1
end
# 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
begin
set -l IFS # clear IFS so cmd substitution doesn't split
cd (dirname $script); or die
end
set -lx XDG_DATA_HOME ../test/data
rm -rf $XDG_DATA_HOME/fish
mkdir -p $XDG_DATA_HOME/fish; or die
set -lx XDG_CONFIG_HOME ../test/home
rm -rf $XDG_CONFIG_HOME/fish
mkdir -p $XDG_CONFIG_HOME/fish; or die
ln -s $PWD/test_functions $XDG_CONFIG_HOME/fish/functions; or die
set -l escaped_parent (dirname $PWD | sed -e 's/[\'\\\\]/\\\\&/g'); or die
set -l escaped_config (printf '%s/fish' $XDG_CONFIG_HOME | sed -e 's/[\'\\\\]/\\\\&/g'); or die
printf 'set fish_function_path \'%s/functions\' \'%s/share/functions\'\n' $escaped_config $escaped_parent > $XDG_CONFIG_HOME/fish/config.fish; or die
set -xl __fish_is_running_tests $XDG_CONFIG_HOME
# Set locale information for consistent tests. Fish should work with a lot of locales but the
# tests assume an english UTF-8 locale unless they explicitly override this default. We do not
# want the users locale to affect the tests since they might, for example, change the wording of
# logged messages.
#
# TODO: set LANG to en_US.UTF-8 so we test the locale message conversions (i.e., gettext).
set -e LANGUAGE
set -x LANG C
# Remove "LC_" env vars from the test environment.
for var in (set -xn)
string match -q 'LC_*' $var
and set -e $var
end
set -x LC_CTYPE en_US.UTF-8
exec ../test/root/bin/fish $script $args_for_test_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
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]
switch $argv[1]
case -b -o -u
set color_flags $color_flags $argv[1]
case -n
set suppress_newline 1
case --
set -e argv[1]
break
case -\*
continue
case \*
break
end
set -e argv[1]
end
if not set -q argv[2]
echo 'usage: say [flags] color string [string...]' >&2
return 1
end
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
end
end
function colordiff -d 'Colored diff output for unified diffs'
diff $argv | while read -l line
switch $line
case '+*'
say green $line
case '-*'
say red $line
case '@*'
say cyan $line
case '*'
echo $line
end
end
end