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:
authorJoe Mooring <joe.mooring@veriphor.com>2020-05-13 20:35:07 +0300
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2020-05-14 11:00:31 +0300
commit991934497e88dcd4134a369a213bb5072c51c139 (patch)
treed8a6aa405dc93f821dc1b389f70827e14fea6bce /tpl
parent558c09305e2be16953238c6c0e828f62b950e4f5 (diff)
Add math.Pow
Closes #7266
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.go40
3 files changed, 59 insertions, 0 deletions
diff --git a/tpl/math/init.go b/tpl/math/init.go
index 45240c5e1..e7f9114ba 100644
--- a/tpl/math/init.go
+++ b/tpl/math/init.go
@@ -92,6 +92,13 @@ func init() {
},
)
+ ns.AddMethodMapping(ctx.Pow,
+ []string{"pow"},
+ [][2]string{
+ {"{{math.Pow 2 3}}", "8"},
+ },
+ )
+
ns.AddMethodMapping(ctx.Round,
nil,
[][2]string{
diff --git a/tpl/math/math.go b/tpl/math/math.go
index 950d95905..ecaf61ebc 100644
--- a/tpl/math/math.go
+++ b/tpl/math/math.go
@@ -115,6 +115,18 @@ func (ns *Namespace) Mul(a, b interface{}) (interface{}, error) {
return _math.DoArithmetic(a, b, '*')
}
+// Pow returns a raised to the power of b.
+func (ns *Namespace) Pow(a, b interface{}) (float64, error) {
+ af, erra := cast.ToFloat64E(a)
+ bf, errb := cast.ToFloat64E(b)
+
+ if erra != nil || errb != nil {
+ return 0, errors.New("Pow operator can't be used with non-float value")
+ }
+
+ return math.Pow(af, bf), nil
+}
+
// Round returns the nearest integer, rounding half away from zero.
func (ns *Namespace) Round(x interface{}) (float64, error) {
xf, err := cast.ToFloat64E(x)
diff --git a/tpl/math/math_test.go b/tpl/math/math_test.go
index 70f6749ba..c48f71837 100644
--- a/tpl/math/math_test.go
+++ b/tpl/math/math_test.go
@@ -318,3 +318,43 @@ func TestRound(t *testing.T) {
c.Assert(result, qt.Equals, test.expect)
}
}
+
+func TestPow(t *testing.T) {
+ t.Parallel()
+ c := qt.New(t)
+
+ ns := New()
+
+ for _, test := range []struct {
+ a interface{}
+ b interface{}
+ expect interface{}
+ }{
+ {0, 0, float64(1)},
+ {2, 0, float64(1)},
+ {2, 3, float64(8)},
+ {-2, 3, float64(-8)},
+ {2, -3, float64(0.125)},
+ {-2, -3, float64(-0.125)},
+ {0.2, 3, float64(0.008)},
+ {2, 0.3, float64(1.2311)},
+ {0.2, 0.3, float64(0.617)},
+ {"aaa", "3", false},
+ {"2", "aaa", false},
+ } {
+
+ result, err := ns.Pow(test.a, test.b)
+
+ 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
+ result = float64(int(result*10000)) / 10000
+
+ c.Assert(err, qt.IsNil)
+ c.Assert(result, qt.Equals, test.expect)
+ }
+}