Skip to content

Commit

Permalink
tpl: Add math.Abs
Browse files Browse the repository at this point in the history
Fixes #10941.
  • Loading branch information
alexandear committed May 16, 2023
1 parent 241b21b commit bda082c
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 1 deletion.
3 changes: 2 additions & 1 deletion docs/content/en/functions/math.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: Math
description: Hugo provides mathematical operators in templates.
date: 2017-02-01
publishdate: 2017-02-01
lastmod: 2023-03-11
lastmod: 2023-05-15
keywords: [math, operators]
categories: [functions]
menu:
Expand Down Expand Up @@ -31,6 +31,7 @@ aliases: []
| | *If one of the numbers is a float, the result is a float.* | `{{ div 6 4.0 }}` → `1.5` |
| `mod` | Modulus of two integers. | `{{ mod 15 3 }}` → `0` |
| `modBool` | Boolean of modulus of two integers. Evaluates to `true` if result equals 0. | `{{ modBool 15 3 }}` → `true` |
| `math.Abs` | Returns the absolute value of the given number. | `{{ math.Abs -2.1 }}` → `2.1` |
| `math.Ceil` | Returns the least integer value greater than or equal to the given number. | `{{ math.Ceil 2.1 }}` → `3` |
| `math.Floor` | Returns the greatest integer value less than or equal to the given number. | `{{ math.Floor 1.9 }}` → `1` |
| `math.Log` | Returns the natural logarithm of the given number. | `{{ math.Log 42 }}` → `3.737` |
Expand Down
7 changes: 7 additions & 0 deletions tpl/math/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ func init() {
Context: func(cctx context.Context, args ...any) (any, error) { return ctx, nil },
}

ns.AddMethodMapping(ctx.Abs,
nil,
[][2]string{
{"{{ math.Abs -2.1 }}", "2.1"},
},
)

ns.AddMethodMapping(ctx.Add,
[]string{"add"},
[][2]string{
Expand Down
10 changes: 10 additions & 0 deletions tpl/math/math.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,16 @@ func New() *Namespace {
// Namespace provides template functions for the "math" namespace.
type Namespace struct{}

// Abs returns the absolute value of n.
func (ns *Namespace) Abs(n any) (float64, error) {
af, err := cast.ToFloat64E(n)
if err != nil {
return 0, errors.New("the math.Abs function requires a numeric argument")
}

return math.Abs(af), nil
}

// Add adds the multivalued addends n1 and n2 or more values.
func (ns *Namespace) Add(inputs ...any) (any, error) {
return ns.doArithmetic(inputs, '+')
Expand Down
27 changes: 27 additions & 0 deletions tpl/math/math_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,33 @@ func TestBasicNSArithmetic(t *testing.T) {
}
}

func TestAbs(t *testing.T) {
t.Parallel()
c := qt.New(t)
ns := New()

for _, test := range []struct {
x any
expect any
}{
{0.0, 0.0},
{1.5, 1.5},
{-1.5, 1.5},
{-2, 2.0},
{"abc", false},
} {
result, err := ns.Abs(test.x)

if b, ok := test.expect.(bool); ok && !b {
c.Assert(err, qt.Not(qt.IsNil))
continue
}

c.Assert(err, qt.IsNil)
c.Assert(result, qt.Equals, test.expect)
}
}

func TestCeil(t *testing.T) {
t.Parallel()
c := qt.New(t)
Expand Down

0 comments on commit bda082c

Please sign in to comment.