aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/test_util.fish
blob: 2aef2b9802d8c9040e99380106d7aaed5f7e32f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# 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

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
    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]
        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