shithub: hugo

Download patch

ref: 4113693ac1b275f3a40aa5c248269340ef9b57f6
parent: f41f72822251c9a31031fd5b3dda585c57c8b028
author: Cameron Moore <[email protected]>
date: Mon May 22 11:05:58 EDT 2017

tpl/cast: Handle template.HTML and friends in ToInt

Also add tests for ToInt and ToString.

Resolves #3308

--- a/tpl/cast/cast.go
+++ b/tpl/cast/cast.go
@@ -14,6 +14,8 @@
 package cast
 
 import (
+	"html/template"
+
 	_cast "github.com/spf13/cast"
 )
 
@@ -28,6 +30,18 @@
 
 // ToInt converts the given value to an int.
 func (ns *Namespace) ToInt(v interface{}) (int, error) {
+	switch vv := v.(type) {
+	case template.HTML:
+		v = string(vv)
+	case template.CSS:
+		v = string(vv)
+	case template.HTMLAttr:
+		v = string(vv)
+	case template.JS:
+		v = string(vv)
+	case template.JSStr:
+		v = string(vv)
+	}
 	return _cast.ToIntE(v)
 }
 
--- /dev/null
+++ b/tpl/cast/cast_test.go
@@ -1,0 +1,83 @@
+// Copyright 2017 The Hugo Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cast
+
+import (
+	"fmt"
+	"html/template"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+)
+
+func TestToInt(t *testing.T) {
+	t.Parallel()
+
+	ns := New()
+
+	for i, test := range []struct {
+		v      interface{}
+		expect interface{}
+	}{
+		{"1", 1},
+		{template.HTML("2"), 2},
+		{template.CSS("3"), 3},
+		{template.HTMLAttr("4"), 4},
+		{template.JS("5"), 5},
+		{template.JSStr("6"), 6},
+		{"a", false},
+		{t, false},
+	} {
+		errMsg := fmt.Sprintf("[%d] %v", i, test.v)
+
+		result, err := ns.ToInt(test.v)
+
+		if b, ok := test.expect.(bool); ok && !b {
+			require.Error(t, err, errMsg)
+			continue
+		}
+
+		require.NoError(t, err, errMsg)
+		assert.Equal(t, test.expect, result, errMsg)
+	}
+}
+
+func TestToString(t *testing.T) {
+	t.Parallel()
+
+	ns := New()
+
+	for i, test := range []struct {
+		v      interface{}
+		expect interface{}
+	}{
+		{1, "1"},
+		{template.HTML("2"), "2"},
+		{"a", "a"},
+		{t, false},
+	} {
+		errMsg := fmt.Sprintf("[%d] %v", i, test.v)
+
+		result, err := ns.ToString(test.v)
+
+		if b, ok := test.expect.(bool); ok && !b {
+			require.Error(t, err, errMsg)
+			continue
+		}
+
+		require.NoError(t, err, errMsg)
+		assert.Equal(t, test.expect, result, errMsg)
+	}
+}