fish-shell/tests/checks/test.fish
Mahmoud Al-Qudsi 472fc3ec10 [tests] Fix pre-epoch test workaround on non-Linux
I forgot `stat` is non-portable. There's no great way to portably get a
machine-readable representation of stat(2) for a file. I don't want to ship our
own lstat(2) wrapper executable just for this test and don't want to fork out to
python or perl for this either - I just wanted to get the tests to pass under
WSL :'(

Anyway, just give up and make it skip just for WSL. If another OS fails this
test in the future, the comments and existing workaround will make it easy to
figure out what the problem is and what needs to be done. We'll cross that
bridge when we get there.
2022-09-16 19:38:49 -05:00

104 lines
2.9 KiB
Fish

# RUN: %fish %s
#
# Tests for the `test` builtin, aka `[`.
test inf -gt 0
# CHECKERR: Number is infinite
# CHECKERR: {{.*}}test.fish (line {{\d+}}):
# CHECKERR: test inf -gt 0
# CHECKERR: ^
test 5 -eq nan
# CHECKERR: Not a number
# CHECKERR: {{.*}}test.fish (line {{\d+}}):
# CHECKERR: test 5 -eq nan
# CHECKERR: ^
test -z nan || echo nan is fine
# CHECK: nan is fine
test 1 =
# CHECKERR: test: Missing argument at index 3
# CHECKERR: 1 =
# CHECKERR: ^
# CHECKERR: {{.*}}test.fish (line {{\d+}}):
# CHECKERR: test 1 =
# CHECKERR: ^
test 1 = 2 and echo true or echo false
# CHECKERR: test: Expected a combining operator like '-a' at index 4
# CHECKERR: 1 = 2 and echo true or echo false
# CHECKERR: ^
# CHECKERR: {{.*}}test.fish (line {{\d+}}):
# CHECKERR: test 1 = 2 and echo true or echo false
# CHECKERR: ^
function t
test $argv[1] -eq 5
end
t foo
# CHECKERR: Argument is not a number: 'foo'
# CHECKERR: {{.*}}test.fish (line {{\d+}}):
# CHECKERR: test $argv[1] -eq 5
# CHECKERR: ^
# CHECKERR: in function 't' with arguments 'foo'
# CHECKERR: called on line {{\d+}} of file {{.*}}test.fish
t 5,2
# CHECKERR: Integer 5 in '5,2' followed by non-digit
# CHECKERR: {{.*}}test.fish (line {{\d+}}):
# CHECKERR: test $argv[1] -eq 5
# CHECKERR: ^
# CHECKERR: in function 't' with arguments '5,2'
# CHECKERR: called on line {{\d+}} of file {{.*}}test.fish
test -x /usr/bin/go /usr/local/bin/go
# CHECKERR: test: unexpected argument at index 3: '/usr/local/bin/go'
# CHECKERR: -x /usr/bin/go /usr/local/bin/go
# CHECKERR: {{ \^}}
# CHECKERR: {{.*}}test.fish (line {{\d+}}):
# CHECKERR: test -x /usr/bin/go /usr/local/bin/go
# CHECKERR: ^
# Test `test` date comparison logic for dates older than epoch
touch -m -t 197001010000.00 epoch
touch -m -t 190212112045.40 old
touch -m -t 190112112040.39 oldest
touch -m -t 203801080314.07 newest
# XXX: This workaround only works w/ GNU `stat`. There is no great portable way of getting mtime.
if string match -qr -- "GNU coreutils" "$(stat --version 2>/dev/null)" && \
string match -qr -- '^(0|'(stat -c %Y epoch)')$' (stat -c %Y oldest)
# Filesystem does not support dates older than epoch, so silently skip this test - there's no
# guarantee that an FS supports pre-epoch timestamps and lxfs (virtual WSLv1 fs) doesn't.
else
test oldest -ot old || echo bad ot 1
test newest -nt old || echo bad nt
test old -ot oldest && echo bad ot 2
test epoch -nt newest && echo bad nt
end
for file in epoch old oldest newest
test $file -nt nonexist && echo good nt || echo $file: bad nt;
end
#CHECK: good nt
#CHECK: good nt
#CHECK: good nt
#CHECK: good nt
for file in epoch old oldest newest
test nonexist -ot $file && echo good ot || echo $file: bad ot;
end
#CHECK: good ot
#CHECK: good ot
#CHECK: good ot
#CHECK: good ot
ln -sf epoch epochlink
test epoch -ef epochlink && echo good ef || echo bad ef
#CHECK: good ef
test epoch -ef old && echo bad ef || echo good ef
#CHECK: good ef
rm -f epoch old oldest newest epochlink