Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/tpl
diff options
context:
space:
mode:
authorChris Dennis <ssa@fbcs.co.uk>2020-02-25 01:45:04 +0300
committerGitHub <noreply@github.com>2020-02-25 01:45:04 +0300
commitd184e5059c72c15df055192b01da0fd8c5b0fc5c (patch)
tree02cc841727b6b76fd57c852c8326153454f81811 /tpl
parent322c285ba2f3aa95826fe2135646b4d35f4d2a30 (diff)
tpl: Add math.Sqrt
Fixes #6941
Diffstat (limited to 'tpl')
-rw-r--r--tpl/math/init.go7
-rw-r--r--tpl/math/math.go12
-rw-r--r--tpl/math/math_test.go45
3 files changed, 64 insertions, 0 deletions
diff --git a/tpl/math/init.go b/tpl/math/init.go
index bbffb23aa..45240c5e1 100644
--- a/tpl/math/init.go
+++ b/tpl/math/init.go
@@ -64,6 +64,13 @@ func init() {
},
)
+ ns.AddMethodMapping(ctx.Sqrt,
+ nil,
+ [][2]string{
+ {"{{math.Sqrt 81}}", "9"},
+ },
+ )
+
ns.AddMethodMapping(ctx.Mod,
[]string{"mod"},
[][2]string{
diff --git a/tpl/math/math.go b/tpl/math/math.go
index 08be42b47..950d95905 100644
--- a/tpl/math/math.go
+++ b/tpl/math/math.go
@@ -72,6 +72,18 @@ func (ns *Namespace) Log(a interface{}) (float64, error) {
return math.Log(af), nil
}
+// Sqrt returns the square root of a number.
+// NOTE: will return for NaN for negative values of a
+func (ns *Namespace) Sqrt(a interface{}) (float64, error) {
+ af, err := cast.ToFloat64E(a)
+
+ if err != nil {
+ return 0, errors.New("Sqrt operator can't be used with non integer or float value")
+ }
+
+ return math.Sqrt(af), nil
+}
+
// Mod returns a % b.
func (ns *Namespace) Mod(a, b interface{}) (int64, error) {
ai, erra := cast.ToInt64E(a)
diff --git a/tpl/math/math_test.go b/tpl/math/math_test.go
index 0beec8204..70f6749ba 100644
--- a/tpl/math/math_test.go
+++ b/tpl/math/math_test.go
@@ -153,6 +153,51 @@ func TestLog(t *testing.T) {
c.Assert(err, qt.IsNil)
c.Assert(result, qt.Equals, test.expect)
}
+
+ // Separate test for Log(-1) -- returns NaN
+ result, err := ns.Log(-1)
+ c.Assert(err, qt.IsNil)
+ c.Assert(result, qt.Satisfies, math.IsNaN)
+}
+
+func TestSqrt(t *testing.T) {
+ t.Parallel()
+ c := qt.New(t)
+
+ ns := New()
+
+ for _, test := range []struct {
+ a interface{}
+ expect interface{}
+ }{
+ {81, float64(9)},
+ {0.25, float64(0.5)},
+ {0, float64(0)},
+ {"abc", false},
+ } {
+
+ result, err := ns.Sqrt(test.a)
+
+ if b, ok := test.expect.(bool); ok && !b {
+ c.Assert(err, qt.Not(qt.IsNil))
+ continue
+ }
+
+ // we compare only 4 digits behind point if its a real float
+ // otherwise we usually get different float values on the last positions
+ if result != math.Inf(-1) {
+ result = float64(int(result*10000)) / 10000
+ }
+
+ c.Assert(err, qt.IsNil)
+ c.Assert(result, qt.Equals, test.expect)
+ }
+
+ // Separate test for Sqrt(-1) -- returns NaN
+ result, err := ns.Sqrt(-1)
+ c.Assert(err, qt.IsNil)
+ c.Assert(result, qt.Satisfies, math.IsNaN)
+
}
func TestMod(t *testing.T) {