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  }