github.com/elves/elvish@v0.15.0/pkg/eval/mods/math/math_test.go (about) 1 package math 2 3 import ( 4 "math" 5 "testing" 6 7 "github.com/elves/elvish/pkg/eval" 8 "github.com/elves/elvish/pkg/eval/errs" 9 . "github.com/elves/elvish/pkg/eval/evaltest" 10 ) 11 12 func TestMath(t *testing.T) { 13 setup := func(ev *eval.Evaler) { 14 ev.AddGlobal(eval.NsBuilder{}.AddNs("math", Ns).Ns()) 15 } 16 TestWithSetup(t, setup, 17 That(`put $math:pi`).Puts(math.Pi), 18 That(`put $math:e`).Puts(math.E), 19 20 That(`math:abs 2.1`).Puts(2.1), 21 That(`math:abs -2.1`).Puts(2.1), 22 23 That(`math:ceil 2.1`).Puts(3.0), 24 That(`math:ceil -2.1`).Puts(-2.0), 25 26 That(`math:floor 2.1`).Puts(2.0), 27 That(`math:floor -2.1`).Puts(-3.0), 28 29 That(`math:is-inf 1.3`).Puts(false), 30 That(`math:is-inf &sign=0 inf`).Puts(true), 31 That(`math:is-inf &sign=1 inf`).Puts(true), 32 That(`math:is-inf &sign=-1 -inf`).Puts(true), 33 That(`math:is-inf &sign=1 -inf`).Puts(false), 34 That(`math:is-inf -inf`).Puts(true), 35 That(`math:is-inf nan`).Puts(false), 36 That(`math:is-inf &sign=0 (float64 inf)`).Puts(true), 37 That(`math:is-inf &sign=1 (float64 inf)`).Puts(true), 38 That(`math:is-inf &sign=-1 (float64 -inf)`).Puts(true), 39 That(`math:is-inf &sign=1 (float64 -inf)`).Puts(false), 40 That(`math:is-inf (float64 -inf)`).Puts(true), 41 That(`math:is-inf (float64 nan)`).Puts(false), 42 That(`math:is-inf (float64 1.3)`).Puts(false), 43 44 That(`math:is-nan 1.3`).Puts(false), 45 That(`math:is-nan inf`).Puts(false), 46 That(`math:is-nan nan`).Puts(true), 47 That(`math:is-nan (float64 inf)`).Puts(false), 48 That(`math:is-nan (float64 nan)`).Puts(true), 49 50 That(`math:round 2.1`).Puts(2.0), 51 That(`math:round -2.1`).Puts(-2.0), 52 That(`math:round 2.5`).Puts(3.0), 53 That(`math:round -2.5`).Puts(-3.0), 54 That(`math:round (float64 Inf)`).Puts(math.Inf(1)), 55 That(`math:round (float64 NaN)`).Puts(math.NaN()), 56 57 That(`math:round-to-even 2.1`).Puts(2.0), 58 That(`math:round-to-even -2.1`).Puts(-2.0), 59 That(`math:round-to-even 2.5`).Puts(2.0), 60 That(`math:round-to-even -2.5`).Puts(-2.0), 61 That(`math:round-to-even (float64 Inf)`).Puts(math.Inf(1)), 62 That(`math:round-to-even (float64 NaN)`).Puts(math.NaN()), 63 64 That(`math:trunc 2.1`).Puts(2.0), 65 That(`math:trunc -2.1`).Puts(-2.0), 66 That(`math:trunc 2.5`).Puts(2.0), 67 That(`math:trunc -2.5`).Puts(-2.0), 68 That(`math:trunc (float64 Inf)`).Puts(math.Inf(1)), 69 That(`math:trunc (float64 NaN)`).Puts(math.NaN()), 70 71 That(`math:log $math:e`).Puts(1.0), 72 That(`math:log 1`).Puts(0.0), 73 That(`math:log 0`).Puts(math.Inf(-1)), 74 That(`math:log -1`).Puts(math.NaN()), 75 76 That(`math:log10 10.0`).Puts(1.0), 77 That(`math:log10 100.0`).Puts(2.0), 78 That(`math:log10 1`).Puts(0.0), 79 That(`math:log10 0`).Puts(math.Inf(-1)), 80 That(`math:log10 -1`).Puts(math.NaN()), 81 82 That(`math:log2 8`).Puts(3.0), 83 That(`math:log2 1024.0`).Puts(10.0), 84 That(`math:log2 1`).Puts(0.0), 85 That(`math:log2 0`).Puts(math.Inf(-1)), 86 That(`math:log2 -1`).Puts(math.NaN()), 87 88 That(`math:cos 0`).Puts(1.0), 89 That(`math:cos 1`).Puts(math.Cos(1.0)), 90 That(`math:cos $math:pi`).Puts(-1.0), 91 92 That(`math:cosh 0`).Puts(1.0), 93 That(`math:cosh inf`).Puts(math.Inf(1)), 94 That(`math:cosh nan`).Puts(math.NaN()), 95 96 That(`math:sin 0`).Puts(0.0), 97 That(`math:sin 1`).Puts(math.Sin(1.0)), 98 That(`math:sin $math:pi`).Puts(math.Sin(math.Pi)), 99 100 That(`math:sinh 0`).Puts(0.0), 101 That(`math:sinh inf`).Puts(math.Inf(1)), 102 That(`math:sinh nan`).Puts(math.NaN()), 103 104 That(`math:tan 0`).Puts(0.0), 105 That(`math:tan 1`).Puts(math.Tan(1.0)), 106 That(`math:tan $math:pi`).Puts(math.Tan(math.Pi)), 107 108 That(`math:tanh 0`).Puts(0.0), 109 That(`math:tanh inf`).Puts(1.0), 110 That(`math:tanh nan`).Puts(math.NaN()), 111 112 // This block of tests isn't strictly speaking necessary. But it helps 113 // ensure that we're not just confirming Go statements such as 114 // math.Tan(math.Pi) == math.Tan(math.Pi) 115 // are true. The ops that should return a zero value do not actually 116 // do so. Which illustrates why an approximate match is needed. 117 That(`math:cos 1`).Puts(Approximately{F: 0.5403023058681397174}), 118 That(`math:sin 1`).Puts(Approximately{F: 0.8414709848078965066}), 119 That(`math:sin $math:pi`).Puts(Approximately{F: 0.0}), 120 That(`math:tan 1`).Puts(Approximately{F: 1.5574077246549023}), 121 That(`math:tan $math:pi`).Puts(Approximately{F: 0.0}), 122 123 That(`math:sqrt 0`).Puts(0.0), 124 That(`math:sqrt 4`).Puts(2.0), 125 That(`math:sqrt -4`).Puts(math.NaN()), 126 127 // Test the inverse trigonometric block of functions. 128 That(`math:acos 0`).Puts(math.Acos(0)), 129 That(`math:acos 1`).Puts(math.Acos(1)), 130 That(`math:acos 1.00001`).Puts(math.NaN()), 131 132 That(`math:asin 0`).Puts(math.Asin(0)), 133 That(`math:asin 1`).Puts(math.Asin(1)), 134 That(`math:asin 1.00001`).Puts(math.NaN()), 135 136 That(`math:atan 0`).Puts(math.Atan(0)), 137 That(`math:atan 1`).Puts(math.Atan(1)), 138 That(`math:atan inf`).Puts(math.Pi/2), 139 140 // Test the inverse hyperbolic trigonometric block of functions. 141 That(`math:acosh 0`).Puts(math.Acosh(0)), 142 That(`math:acosh 1`).Puts(math.Acosh(1)), 143 That(`math:acosh nan`).Puts(math.NaN()), 144 145 That(`math:asinh 0`).Puts(math.Asinh(0)), 146 That(`math:asinh 1`).Puts(math.Asinh(1)), 147 That(`math:asinh inf`).Puts(math.Inf(1)), 148 149 That(`math:atanh 0`).Puts(math.Atanh(0)), 150 That(`math:atanh 1`).Puts(math.Inf(1)), 151 152 That(`math:pow nan 2`).Puts(math.NaN()), 153 That(`math:pow inf 2`).Puts(math.Inf(1)), 154 That(`math:pow 1 3`).Puts(1.0), 155 That(`math:pow 2 3`).Puts(8.0), 156 That(`math:pow -2 2`).Puts(4.0), 157 158 That(`math:pow10 0`).Puts(1.0), 159 That(`math:pow10 3`).Puts(1000.0), 160 That(`math:pow10 -3`).Puts(0.001), 161 162 That(`math:max`).Throws( 163 errs.ArityMismatch{What: "arguments here", ValidLow: 1, ValidHigh: -1, Actual: 0}, 164 "math:max"), 165 That(`math:max 42`).Puts(float64(42)), 166 That(`math:max 11 -3 1 7`).Puts(float64(11)), 167 That(`math:max 3 NaN 5`).Puts(math.NaN()), 168 169 That(`math:min`).Throws( 170 errs.ArityMismatch{What: "arguments here", ValidLow: 1, ValidHigh: -1, Actual: 0}, 171 "math:min"), 172 That(`math:min 42`).Puts(float64(42)), 173 That(`math:min 11 -3 1 7`).Puts(float64(-3)), 174 That(`math:min 3 NaN 5`).Puts(math.NaN()), 175 ) 176 }