mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-12-01 15:14:26 +08:00
ed9268f99c
* math: Make function parentheses optional It's a bit annoying to use parentheses here because that requires quoting or escaping. This allows the parens to be omitted, so math sin pi is the same as math 'sin(pi)' Function calls have the lowest precedence, so math sin 2 + 6 is the same as math 'sin(2 + 6)' * Add more tests * Add a note to the docs * even moar docs Moar docca * moar tests Call me Nikola Testla
219 lines
3.7 KiB
Fish
219 lines
3.7 KiB
Fish
#RUN: %fish %s
|
|
# Validate basic expressions
|
|
math 3 / 2
|
|
# CHECK: 1.5
|
|
math 10/6
|
|
# CHECK: 1.666667
|
|
math -s0 10 / 6
|
|
# CHECK: 1
|
|
math 'floor(10 / 6)'
|
|
# CHECK: 1
|
|
math -s3 10/6
|
|
# CHECK: 1.667
|
|
math '10 % 6'
|
|
# CHECK: 4
|
|
math -s0 '10 % 6'
|
|
# CHECK: 4
|
|
math '23 % 7'
|
|
# CHECK: 2
|
|
math --scale=6 '5 / 3 * 0.3'
|
|
# CHECK: 0.5
|
|
math --scale=max '5 / 3'
|
|
# CHECK: 1.666666666666667
|
|
math "7^2"
|
|
# CHECK: 49
|
|
math -1 + 1
|
|
# CHECK: 0
|
|
math '-2 * -2'
|
|
# CHECK: 4
|
|
math 5 \* -2
|
|
# CHECK: -10
|
|
math -- -4 / 2
|
|
# CHECK: -2
|
|
math -- '-4 * 2'
|
|
# CHECK: -8
|
|
|
|
# Validate max and min
|
|
math 'max(1,2)'
|
|
math 'min(1,2)'
|
|
# CHECK: 2
|
|
# CHECK: 1
|
|
|
|
# Validate some rounding functions
|
|
math 'round(3/2)'
|
|
math 'floor(3/2)'
|
|
math 'ceil(3/2)'
|
|
# CHECK: 2
|
|
# CHECK: 1
|
|
# CHECK: 2
|
|
math 'round(-3/2)'
|
|
math 'floor(-3/2)'
|
|
math 'ceil(-3/2)'
|
|
# CHECK: -2
|
|
# CHECK: -2
|
|
# CHECK: -1
|
|
|
|
# Validate some integral computations
|
|
math 1
|
|
math 10
|
|
math 100
|
|
math 1000
|
|
# CHECK: 1
|
|
# CHECK: 10
|
|
# CHECK: 100
|
|
# CHECK: 1000
|
|
math '10^15'
|
|
math '-10^14'
|
|
math '-10^15'
|
|
# CHECK: 1000000000000000
|
|
# CHECK: 100000000000000
|
|
# CHECK: -1000000000000000
|
|
|
|
math 3^0.5^2
|
|
math -2^2
|
|
# CHECK: 1.316074
|
|
# CHECK: 4
|
|
|
|
math -s0 '1.0 / 2.0'
|
|
math -s0 '3.0 / 2.0'
|
|
math -s0 '10^15 / 2.0'
|
|
# CHECK: 0
|
|
# CHECK: 1
|
|
# CHECK: 500000000000000
|
|
|
|
# Validate how variables in an expression are handled
|
|
math $x + 1
|
|
set x 1
|
|
math $x + 1
|
|
set x 3
|
|
set y 1.5
|
|
math "-$x * $y"
|
|
math -s0 "-$x * $y"
|
|
# CHECK: 1
|
|
# CHECK: 2
|
|
# CHECK: -4.5
|
|
# CHECK: -4
|
|
|
|
# Validate math error reporting
|
|
# NOTE: The leading whitespace for the carets here is ignored
|
|
# by littlecheck.
|
|
not math '2 - '
|
|
# CHECKERR: math: Error: Too few arguments
|
|
# CHECKERR: '2 - '
|
|
# CHECKERR: ^
|
|
not math 'ncr(1)'
|
|
# CHECKERR: math: Error: Too few arguments
|
|
# CHECKERR: 'ncr(1)'
|
|
# CHECKERR: ^
|
|
|
|
# There is no "blah" function.
|
|
not math 'blah()'
|
|
# CHECKERR: math: Error: Unknown function
|
|
# CHECKERR: 'blah()'
|
|
# CHECKERR: ^
|
|
|
|
math n + 4
|
|
# CHECKERR: math: Error: Unknown function
|
|
# CHECKERR: 'n + 4'
|
|
# CHECKERR: ^
|
|
|
|
|
|
not math 'sin()'
|
|
# CHECKERR: math: Error: Too few arguments
|
|
# CHECKERR: 'sin()'
|
|
# CHECKERR: ^
|
|
not math '2 + 2 4'
|
|
# CHECKERR: math: Error: Too many arguments
|
|
# CHECKERR: '2 + 2 4'
|
|
# CHECKERR: ^
|
|
not math
|
|
# CHECKERR: math: Expected at least 1 args, got 0
|
|
not math -s 12
|
|
# CHECKERR: math: Expected at least 1 args, got 0
|
|
not math 2^999999
|
|
# CHECKERR: math: Error: Result is infinite
|
|
# CHECKERR: '2^999999'
|
|
not math 1 / 0
|
|
# CHECKERR: math: Error: Result is infinite
|
|
# CHECKERR: '1 / 0'
|
|
|
|
# Validate "x" as multiplier
|
|
math 0x2 # Hex
|
|
math 5 x 4
|
|
math 2x 4
|
|
math 2 x4 # ERROR
|
|
# CHECKERR: math: Error: Unknown function
|
|
# CHECKERR: '2 x4'
|
|
# CHECKERR: ^
|
|
math 0x 3
|
|
# CHECK: 2
|
|
# CHECK: 20
|
|
# CHECK: 8
|
|
# CHECK: 0
|
|
|
|
math "42 >= 1337"
|
|
# CHECKERR: math: Error: Logical operations are not supported, use `test` instead
|
|
# CHECKERR: '42 >= 1337'
|
|
# CHECKERR: ^
|
|
|
|
math "bitand(0xFE, 1)"
|
|
# CHECK: 0
|
|
math "bitor(0xFE, 1)"
|
|
# CHECK: 255
|
|
math "bitxor(5, 1)"
|
|
# CHECK: 4
|
|
math "bitand(5.5, 2)"
|
|
# CHECK: 0
|
|
math "bitand(5.5, 1)"
|
|
# CHECK: 1
|
|
|
|
math "bitor(37 ^ 5, 255)"
|
|
# CHECK: 69343999
|
|
|
|
math 'log 16'
|
|
# CHECK: 1.20412
|
|
|
|
math 'log(16'
|
|
# CHECKERR: math: Error: Missing closing parenthesis
|
|
# CHECKERR: 'log(16'
|
|
# CHECKERR: ^
|
|
|
|
math --base=16 255 / 15
|
|
# CHECK: 0x11
|
|
math -bhex 16 x 2
|
|
# CHECK: 0x20
|
|
math --base hex 12 + 0x50
|
|
# CHECK: 0x5c
|
|
math --base octal --scale=0 55
|
|
# CHECK: 067
|
|
math --base notabase
|
|
# CHECKERR: math: 'notabase' is not a valid base value
|
|
echo $status
|
|
# CHECK: 2
|
|
|
|
math 'log2(8)'
|
|
# CHECK: 3
|
|
|
|
# same as sin(cos(2 x pi))
|
|
math sin cos 2 x pi
|
|
# CHECK: 0.841471
|
|
# Inner function binds stronger, so this is interpreted as
|
|
# pow(sin(3,5))
|
|
|
|
math pow sin 3, 5
|
|
# CHECKERR: math: Error: Too many arguments
|
|
# CHECKERR: 'pow sin 3, 5'
|
|
# CHECKERR: ^
|
|
|
|
math sin pow 3, 5
|
|
# CHECK: -0.890009
|
|
|
|
math pow 2, cos -pi
|
|
# CHECK: 0.5
|
|
|
|
# pow(2*cos(-pi), 2)
|
|
# i.e. 2^2
|
|
# i.e. 4
|
|
math pow 2 x cos'(-pi)', 2
|
|
# CHECK: 4
|