mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-04-21 08:51:14 -03:00
We need a way to encode arbitrary strings into valid fish variable names. It would also be nice if we could convert strings to valid URLs without using the slow and hard to understand `__fish_urlencode` function. In particular, eliminating the need to manipulate the locale. Fixes #4150
387 lines
9.6 KiB
Fish
387 lines
9.6 KiB
Fish
# Tests for string builtin. Mostly taken from man page examples.
|
|
|
|
# We don't want syntax errors to emit command usage help. This makes the
|
|
# stderr output considerably shorter and makes it easier to updates the tests
|
|
# and documentation without having to make pointless changes to the test
|
|
# output files.
|
|
function __fish_print_help
|
|
end
|
|
|
|
echo '# string match -r -v "c.*" dog can cat diz'
|
|
string match -r -v "c.*" dog can cat diz; and echo "exit 0"
|
|
|
|
echo
|
|
echo '# string match -q -r -v "c.*" dog can cat diz'
|
|
string match -q -r -v "c.*" dog can cat diz; and echo "exit 0"
|
|
|
|
echo
|
|
echo '# string match -v "c*" dog can cat diz'
|
|
string match -v "c*" dog can cat diz; and echo "exit 0"
|
|
|
|
echo
|
|
echo '# string match -q -v "c*" dog can cat diz'
|
|
string match -q -v "c*" dog can cat diz; and echo "exit 0"
|
|
|
|
echo
|
|
echo '# string match -v "d*" dog dan dat diz'
|
|
string match -v "d*" dog dan dat diz; or echo "exit 1"
|
|
|
|
echo
|
|
echo '# string match -q -v "d*" dog dan dat diz'
|
|
string match -q -v "d*" dog dan dat diz; or echo "exit 1"
|
|
|
|
echo
|
|
echo '# string match -r -v x y'
|
|
string match -r -v x y; and echo "exit 0"
|
|
|
|
echo
|
|
echo '# string match -r -v x x'
|
|
string match -r -v x x; or echo "exit 1"
|
|
|
|
echo
|
|
echo '# string match -q -r -v x y'
|
|
string match -q -r -v x y; and echo "exit 0"
|
|
|
|
echo
|
|
echo '# string match -q -r -v x x'
|
|
string match -q -r -v x x; or echo "exit 1"
|
|
|
|
echo
|
|
echo '# string length "hello, world"'
|
|
string length "hello, world"
|
|
|
|
echo
|
|
echo '# string length -q ""'
|
|
string length -q ""; and echo not zero length; or echo zero length
|
|
|
|
echo
|
|
echo '# string sub --length 2 abcde'
|
|
string sub --length 2 abcde
|
|
|
|
echo
|
|
echo '# string sub -s 2 -l 2 abcde'
|
|
string sub -s 2 -l 2 abcde
|
|
|
|
echo
|
|
echo '# string sub --start=-2 abcde'
|
|
string sub --start=-2 abcde
|
|
|
|
echo
|
|
echo '# string split . example.com'
|
|
string split . example.com
|
|
|
|
echo
|
|
echo '# string split -r -m1 / /usr/local/bin/fish'
|
|
string split -r -m1 / /usr/local/bin/fish
|
|
|
|
echo
|
|
echo '# string split "" abc'
|
|
string split "" abc
|
|
|
|
echo
|
|
echo '# seq 3 | string join ...'
|
|
seq 3 | string join ...
|
|
|
|
echo
|
|
echo '# string trim " abc "'
|
|
string trim " abc "
|
|
|
|
echo
|
|
echo '# string trim --right --chars=yz xyzzy zany'
|
|
string trim --right --chars=yz xyzzy zany
|
|
|
|
echo
|
|
echo '# echo \x07 | string escape'
|
|
echo \x07 | string escape
|
|
|
|
echo
|
|
echo '# string escape --style=script \'a b#c"\\\'d\''
|
|
string escape --style=script 'a b#c"\'d'
|
|
|
|
echo
|
|
echo '# string escape --style=url \'a b#c"\\\'d\''
|
|
string escape --style=url 'a b#c"\'d'
|
|
|
|
echo
|
|
echo '# string escape --style=url \\na\\nb%c~d\\n'
|
|
string escape --style=url \na\nb%c~d\n
|
|
|
|
echo
|
|
echo '# string escape --style=var \'a b#c"\\\'d\''
|
|
string escape --style=var 'a b#c"\'d'
|
|
|
|
echo
|
|
echo '# string escape --style=script a\nghi_'
|
|
string escape --style=var a\nghi_
|
|
|
|
echo
|
|
echo '# string escape --style=var \'abc\''
|
|
string escape --style=var 'abc'
|
|
|
|
echo
|
|
echo '# string escape --style=var \'_a_b_c_\''
|
|
string escape --style=var '_a_b_c_'
|
|
|
|
echo
|
|
echo '# string escape --style=var -- -'
|
|
string escape --style=var -- -
|
|
|
|
echo
|
|
echo '# string match "?" a'
|
|
string match "?" a
|
|
|
|
echo
|
|
echo '# string match "a*b" axxb'
|
|
string match "a*b" axxb
|
|
|
|
echo
|
|
echo '# string match -i "a??B" Axxb'
|
|
string match -i "a??B" Axxb
|
|
|
|
echo
|
|
echo '# echo "ok?" | string match "*\?"'
|
|
echo "ok?" | string match "*\?"
|
|
|
|
echo
|
|
echo '# string match -r "cat|dog|fish" "nice dog"'
|
|
string match -r "cat|dog|fish" "nice dog"
|
|
|
|
echo
|
|
echo '# string match -r "(\d\d?):(\d\d):(\d\d)" 2:34:56'
|
|
string match -r "(\d\d?):(\d\d):(\d\d)" 2:34:56
|
|
|
|
echo
|
|
echo '# string match -r "^(\w{2,4})\g1\$" papa mud murmur'
|
|
string match -r "^(\w{2,4})\g1\$" papa mud murmur
|
|
|
|
echo
|
|
echo '# string match -r -a -n at ratatat'
|
|
string match -r -a -n at ratatat
|
|
|
|
echo
|
|
echo '# string match -r -i "0x[0-9a-f]{1,8}" "int magic = 0xBadC0de;"'
|
|
string match -r -i "0x[0-9a-f]{1,8}" "int magic = 0xBadC0de;"
|
|
|
|
echo
|
|
echo '# string replace is was "blue is my favorite"'
|
|
string replace is was "blue is my favorite"
|
|
|
|
echo
|
|
echo '# string replace 3rd last 1st 2nd 3rd'
|
|
string replace 3rd last 1st 2nd 3rd
|
|
|
|
echo
|
|
echo '# string replace -a " " _ "spaces to underscores"'
|
|
string replace -a " " _ "spaces to underscores"
|
|
|
|
echo
|
|
echo '# string replace -r -a "[^\d.]+" " " "0 one two 3.14 four 5x"'
|
|
string replace -r -a "[^\d.]+" " " "0 one two 3.14 four 5x"
|
|
|
|
echo
|
|
echo '# string replace -r "(\w+)\s+(\w+)" "\$2 \$1 \$\$" "left right"'
|
|
string replace -r "(\w+)\s+(\w+)" "\$2 \$1 \$\$" "left right"
|
|
|
|
echo
|
|
echo '# string replace -r "\s*newline\s*" "\n" "put a newline here"'
|
|
string replace -r "\s*newline\s*" "\n" "put a newline here"
|
|
|
|
echo
|
|
echo '# string replace -r -a "(\w)" "\$1\$1" ab'
|
|
string replace -r -a "(\w)" "\$1\$1" ab
|
|
|
|
echo
|
|
echo '# string replace --filter x X abc axc x def jkx'
|
|
string replace --filter x X abc axc x def jkx
|
|
or echo Unexpected exit status at line (status --current-line-number)
|
|
|
|
string replace --filter y Y abc axc x def jkx
|
|
and echo Unexpected exit status at line (status --current-line-number)
|
|
|
|
echo
|
|
echo '# string replace --regex -f "\d" X 1bc axc 2 d3f jk4 xyz'
|
|
string replace --regex -f "\d" X 1bc axc 2 d3f jk4 xyz
|
|
or echo Unexpected exit status at line (status --current-line-number)
|
|
|
|
string replace --regex -f "Z" X 1bc axc 2 d3f jk4 xyz
|
|
and echo Unexpected exit status at line (status --current-line-number)
|
|
|
|
# test some failure cases
|
|
echo '# string match -r "[" "a[sd"' >&2
|
|
string match -r "[" "a[sd"; and echo "unexpected exit 0" >&2
|
|
|
|
echo >&2
|
|
echo '# string invalidarg' >&2
|
|
string invalidarg; and echo "unexpected exit 0" >&2
|
|
|
|
echo
|
|
echo '# string length'
|
|
string length; or echo "missing argument returns 1"
|
|
|
|
echo
|
|
echo '# string match -r -v "[dcantg].*" dog can cat diz'
|
|
string match -r -v "[dcantg].*" dog can cat diz; or echo "no regexp invert match"
|
|
|
|
echo
|
|
echo '# string match -v "???" dog can cat diz'
|
|
string match -v "???" dog can cat diz; or echo "no glob invert match"
|
|
|
|
echo
|
|
echo '# string match -rvn a bbb'
|
|
string match -rvn a bbb; or echo "exit 1"
|
|
|
|
# test repeat subcommand
|
|
echo
|
|
echo '# string repeat -n 2 "foo"'
|
|
string repeat -n 2 "foo"
|
|
|
|
echo
|
|
echo '# string repeat --count 2 "foo"'
|
|
string repeat --count 2 "foo"
|
|
|
|
echo
|
|
echo '# echo foo | string repeat -n 2'
|
|
echo foo | string repeat -n 2
|
|
|
|
echo
|
|
echo '# string repeat -n2 -q "foo"'
|
|
string repeat -n2 -q "foo"; and echo "exit 0"
|
|
|
|
echo
|
|
echo '# string repeat -n2 --quiet "foo"'
|
|
string repeat -n2 --quiet "foo"; and echo "exit 0"
|
|
|
|
echo
|
|
echo '# string repeat -n0 "foo"'
|
|
string repeat -n0 "foo"; or echo "exit 1"
|
|
|
|
echo
|
|
echo '# string repeat -n0'
|
|
string repeat -n0; or echo "exit 1"
|
|
|
|
echo
|
|
echo '# string repeat -m0'
|
|
string repeat -m0; or echo "exit 1"
|
|
|
|
echo
|
|
echo '# string repeat -n1 -N "there is "'
|
|
string repeat -n1 -N "there is "; echo "no newline"
|
|
|
|
echo
|
|
echo '# string repeat -n1 --no-newline "there is "'
|
|
string repeat -n1 --no-newline "there is "; echo "no newline"
|
|
|
|
echo
|
|
echo '# string repeat -n10 -m4 "foo"'
|
|
string repeat -n10 -m4 "foo"
|
|
|
|
echo
|
|
echo '# string repeat -n10 --max 5 "foo"'
|
|
string repeat -n10 --max 5 "foo"
|
|
|
|
echo
|
|
echo '# string repeat -n3 -m20 "foo"'
|
|
string repeat -n3 -m20 "foo"
|
|
|
|
echo
|
|
echo '# string repeat -m4 "foo"'
|
|
string repeat -m4 "foo"
|
|
|
|
echo >&2
|
|
echo '# string repeat -n-1 "foo"' >&2
|
|
string repeat -n-1 "foo"; and echo "exit 0" >&2
|
|
|
|
echo >&2
|
|
echo '# string repeat -m-1 "foo"' >&2
|
|
string repeat -m-1 "foo"; and echo "exit 0" >&2
|
|
|
|
echo >&2
|
|
echo '# string repeat -n notanumber "foo"' >&2
|
|
string repeat -n notanumber "foo"; and echo "exit 0" >&2
|
|
|
|
echo >&2
|
|
echo '# string repeat -m notanumber "foo"' >&2
|
|
string repeat -m notanumber "foo"; and echo "exit 0" >&2
|
|
|
|
echo >&2
|
|
echo '# echo "stdin" | string repeat -n1 "and arg"' >&2
|
|
echo "stdin" | string repeat -n1 "and arg"; and echo "exit 0" >&2
|
|
|
|
echo >&2
|
|
echo '# string repeat -n' >&2
|
|
string repeat -n; and echo "exit 0" >&2
|
|
|
|
echo >&2
|
|
echo '# string repeat -l fakearg 2>&1' >&2
|
|
string repeat -l fakearg
|
|
|
|
echo
|
|
echo '# string repeat ""'
|
|
string repeat ""
|
|
or echo string repeat empty string failed
|
|
|
|
echo
|
|
echo '# string repeat -n3 ""'
|
|
string repeat -n3 ""
|
|
or echo string repeat empty string failed
|
|
|
|
# Test equivalent matches with/without the --entire, --regex, and --invert flags.
|
|
echo
|
|
echo '# string match -e x abc dxf xyz jkx x z'
|
|
string match -e x abc dxf xyz jkx x z
|
|
or echo exit 1
|
|
|
|
echo
|
|
echo '# string match x abc dxf xyz jkx x z'
|
|
string match x abc dxf xyz jkx x z
|
|
|
|
echo
|
|
echo '# string match --entire -r "a*b[xy]+" abc abxc bye aaabyz kaabxz abbxy abcx caabxyxz'
|
|
string match --entire -r "a*b[xy]+" abc abxc bye aaabyz kaabxz abbxy abcx caabxyxz
|
|
or echo exit 1
|
|
|
|
echo
|
|
echo '# string match -r "a*b[xy]+" abc abxc bye aaabyz kaabxz abbxy abcx caabxyxz'
|
|
string match -r "a*b[xy]+" abc abxc bye aaabyz kaabxz abbxy abcx caabxyxz
|
|
or echo exit 1
|
|
|
|
# Make sure that groups are handled correct with/without --entire.
|
|
echo
|
|
echo '# string match --entire -r "a*b([xy]+)" abc abxc bye aaabyz kaabxz abbxy abcx caabxyxz'
|
|
string match --entire -r "a*b([xy]+)" abc abxc bye aaabyz kaabxz abbxy abcx caabxyxz
|
|
or echo exit 1
|
|
|
|
echo
|
|
echo '# string match -r "a*b([xy]+)" abc abxc bye aaabyz kaabxz abbxy abcx caabxyxz'
|
|
string match -r "a*b([xy]+)" abc abxc bye aaabyz kaabxz abbxy abcx caabxyxz
|
|
or echo exit 1
|
|
|
|
# Test `string lower` and `string upper`.
|
|
set x (string lower abc DEF gHi)
|
|
or echo string lower exit 1
|
|
test $x[1] = 'abc' -a $x[2] = 'def' -a $x[3] = 'ghi'
|
|
or echo strings not converted to lowercase
|
|
|
|
set x (echo abc DEF gHi | string lower)
|
|
or echo string lower exit 1
|
|
test $x[1] = 'abc def ghi'
|
|
or echo strings not converted to lowercase
|
|
|
|
string lower -q abc
|
|
and echo lowercasing a lowercase string did not fail as expected
|
|
|
|
set x (string upper abc DEF gHi)
|
|
or echo string upper exit 1
|
|
test $x[1] = 'ABC' -a $x[2] = 'DEF' -a $x[3] = 'GHI'
|
|
or echo strings not converted to uppercase
|
|
|
|
set x (echo abc DEF gHi | string upper)
|
|
or echo string upper exit 1
|
|
test $x[1] = 'ABC DEF GHI'
|
|
or echo strings not converted to uppercase
|
|
|
|
string upper -q ABC DEF
|
|
and echo uppercasing a uppercase string did not fail as expected
|
|
|
|
exit 0
|