cadc8ad72d
I notice that the Hugo use this project to convert the string to time.Time. When I migrate to Hugo from Hexo (another static blog generator). The Hugo said : > page.go:750: Failed to parse date '2016-03-06 15:28:01' in page xxxxx.md I hope you can merge this Pull request, so that those people who migrate to Hugo from Hexo are easy to use Hugo to generate the static blog. Thanks.
221 lines
8.4 KiB
Go
221 lines
8.4 KiB
Go
// Copyright © 2014 Steve Francia <spf@spf13.com>.
|
|
//
|
|
// Use of this source code is governed by an MIT-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package cast
|
|
|
|
import (
|
|
"html/template"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestToInt(t *testing.T) {
|
|
var eight interface{} = 8
|
|
assert.Equal(t, ToInt(8), 8)
|
|
assert.Equal(t, ToInt(8.31), 8)
|
|
assert.Equal(t, ToInt("8"), 8)
|
|
assert.Equal(t, ToInt(true), 1)
|
|
assert.Equal(t, ToInt(false), 0)
|
|
assert.Equal(t, ToInt(eight), 8)
|
|
}
|
|
|
|
func TestToInt64(t *testing.T) {
|
|
var eight interface{} = 8
|
|
assert.Equal(t, ToInt64(int64(8)), int64(8))
|
|
assert.Equal(t, ToInt64(8), int64(8))
|
|
assert.Equal(t, ToInt64(8.31), int64(8))
|
|
assert.Equal(t, ToInt64("8"), int64(8))
|
|
assert.Equal(t, ToInt64(true), int64(1))
|
|
assert.Equal(t, ToInt64(false), int64(0))
|
|
assert.Equal(t, ToInt64(eight), int64(8))
|
|
}
|
|
|
|
func TestToFloat64(t *testing.T) {
|
|
var eight interface{} = 8
|
|
assert.Equal(t, ToFloat64(8), 8.00)
|
|
assert.Equal(t, ToFloat64(8.31), 8.31)
|
|
assert.Equal(t, ToFloat64("8.31"), 8.31)
|
|
assert.Equal(t, ToFloat64(eight), 8.0)
|
|
}
|
|
|
|
func TestToString(t *testing.T) {
|
|
var foo interface{} = "one more time"
|
|
assert.Equal(t, ToString(8), "8")
|
|
assert.Equal(t, ToString(int64(16)), "16")
|
|
assert.Equal(t, ToString(8.12), "8.12")
|
|
assert.Equal(t, ToString([]byte("one time")), "one time")
|
|
assert.Equal(t, ToString(template.HTML("one time")), "one time")
|
|
assert.Equal(t, ToString(template.URL("http://somehost.foo")), "http://somehost.foo")
|
|
assert.Equal(t, ToString(template.JS("(1+2)")), "(1+2)")
|
|
assert.Equal(t, ToString(template.CSS("a")), "a")
|
|
assert.Equal(t, ToString(template.HTMLAttr("a")), "a")
|
|
assert.Equal(t, ToString(foo), "one more time")
|
|
assert.Equal(t, ToString(nil), "")
|
|
assert.Equal(t, ToString(true), "true")
|
|
assert.Equal(t, ToString(false), "false")
|
|
}
|
|
|
|
type foo struct {
|
|
val string
|
|
}
|
|
|
|
func (x foo) String() string {
|
|
return x.val
|
|
}
|
|
|
|
func TestStringerToString(t *testing.T) {
|
|
|
|
var x foo
|
|
x.val = "bar"
|
|
assert.Equal(t, "bar", ToString(x))
|
|
}
|
|
|
|
type fu struct {
|
|
val string
|
|
}
|
|
|
|
func (x fu) Error() string {
|
|
return x.val
|
|
}
|
|
|
|
func TestErrorToString(t *testing.T) {
|
|
var x fu
|
|
x.val = "bar"
|
|
assert.Equal(t, "bar", ToString(x))
|
|
}
|
|
|
|
func TestMaps(t *testing.T) {
|
|
var taxonomies = map[interface{}]interface{}{"tag": "tags", "group": "groups"}
|
|
var stringMapBool = map[interface{}]interface{}{"v1": true, "v2": false}
|
|
|
|
// ToStringMapString inputs/outputs
|
|
var stringMapString = map[string]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
|
|
var stringMapInterface = map[string]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
|
|
var interfaceMapString = map[interface{}]string{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
|
|
var interfaceMapInterface = map[interface{}]interface{}{"key 1": "value 1", "key 2": "value 2", "key 3": "value 3"}
|
|
|
|
// ToStringMapStringSlice inputs/outputs
|
|
var stringMapStringSlice = map[string][]string{"key 1": []string{"value 1", "value 2", "value 3"}, "key 2": []string{"value 1", "value 2", "value 3"}, "key 3": []string{"value 1", "value 2", "value 3"}}
|
|
var stringMapInterfaceSlice = map[string][]interface{}{"key 1": []interface{}{"value 1", "value 2", "value 3"}, "key 2": []interface{}{"value 1", "value 2", "value 3"}, "key 3": []interface{}{"value 1", "value 2", "value 3"}}
|
|
var stringMapStringSingleSliceFieldsResult = map[string][]string{"key 1": []string{"value", "1"}, "key 2": []string{"value", "2"}, "key 3": []string{"value", "3"}}
|
|
var interfaceMapStringSlice = map[interface{}][]string{"key 1": []string{"value 1", "value 2", "value 3"}, "key 2": []string{"value 1", "value 2", "value 3"}, "key 3": []string{"value 1", "value 2", "value 3"}}
|
|
var interfaceMapInterfaceSlice = map[interface{}][]interface{}{"key 1": []interface{}{"value 1", "value 2", "value 3"}, "key 2": []interface{}{"value 1", "value 2", "value 3"}, "key 3": []interface{}{"value 1", "value 2", "value 3"}}
|
|
|
|
var stringMapStringSliceMultiple = map[string][]string{"key 1": []string{"value 1", "value 2", "value 3"}, "key 2": []string{"value 1", "value 2", "value 3"}, "key 3": []string{"value 1", "value 2", "value 3"}}
|
|
var stringMapStringSliceSingle = map[string][]string{"key 1": []string{"value 1"}, "key 2": []string{"value 2"}, "key 3": []string{"value 3"}}
|
|
|
|
var stringMapInterface1 = map[string]interface{}{"key 1": []string{"value 1"}, "key 2": []string{"value 2"}}
|
|
var stringMapInterfaceResult1 = map[string][]string{"key 1": []string{"value 1"}, "key 2": []string{"value 2"}}
|
|
|
|
assert.Equal(t, ToStringMap(taxonomies), map[string]interface{}{"tag": "tags", "group": "groups"})
|
|
assert.Equal(t, ToStringMapBool(stringMapBool), map[string]bool{"v1": true, "v2": false})
|
|
|
|
// ToStringMapString tests
|
|
assert.Equal(t, ToStringMapString(stringMapString), stringMapString)
|
|
assert.Equal(t, ToStringMapString(stringMapInterface), stringMapString)
|
|
assert.Equal(t, ToStringMapString(interfaceMapString), stringMapString)
|
|
assert.Equal(t, ToStringMapString(interfaceMapInterface), stringMapString)
|
|
|
|
// ToStringMapStringSlice tests
|
|
assert.Equal(t, ToStringMapStringSlice(stringMapStringSlice), stringMapStringSlice)
|
|
assert.Equal(t, ToStringMapStringSlice(stringMapInterfaceSlice), stringMapStringSlice)
|
|
assert.Equal(t, ToStringMapStringSlice(stringMapStringSliceMultiple), stringMapStringSlice)
|
|
assert.Equal(t, ToStringMapStringSlice(stringMapStringSliceMultiple), stringMapStringSlice)
|
|
assert.Equal(t, ToStringMapStringSlice(stringMapString), stringMapStringSliceSingle)
|
|
assert.Equal(t, ToStringMapStringSlice(stringMapInterface), stringMapStringSliceSingle)
|
|
assert.Equal(t, ToStringMapStringSlice(interfaceMapStringSlice), stringMapStringSlice)
|
|
assert.Equal(t, ToStringMapStringSlice(interfaceMapInterfaceSlice), stringMapStringSlice)
|
|
assert.Equal(t, ToStringMapStringSlice(interfaceMapString), stringMapStringSingleSliceFieldsResult)
|
|
assert.Equal(t, ToStringMapStringSlice(interfaceMapInterface), stringMapStringSingleSliceFieldsResult)
|
|
assert.Equal(t, ToStringMapStringSlice(stringMapInterface1), stringMapInterfaceResult1)
|
|
}
|
|
|
|
func TestSlices(t *testing.T) {
|
|
assert.Equal(t, []string{"a", "b"}, ToStringSlice([]string{"a", "b"}))
|
|
assert.Equal(t, []string{"1", "3"}, ToStringSlice([]interface{}{1, 3}))
|
|
assert.Equal(t, []int{1, 3}, ToIntSlice([]int{1, 3}))
|
|
assert.Equal(t, []int{1, 3}, ToIntSlice([]interface{}{1.2, 3.2}))
|
|
assert.Equal(t, []int{2, 3}, ToIntSlice([]string{"2", "3"}))
|
|
assert.Equal(t, []int{2, 3}, ToIntSlice([2]string{"2", "3"}))
|
|
assert.Equal(t, []bool{true, false, true}, ToBoolSlice([]bool{true, false, true}))
|
|
assert.Equal(t, []bool{true, false, true}, ToBoolSlice([]interface{}{true, false, true}))
|
|
assert.Equal(t, []bool{true, false, true}, ToBoolSlice([]int{1, 0, 1}))
|
|
assert.Equal(t, []bool{true, false, true}, ToBoolSlice([]string{"true", "false", "true"}))
|
|
}
|
|
|
|
func TestToBool(t *testing.T) {
|
|
assert.Equal(t, ToBool(0), false)
|
|
assert.Equal(t, ToBool(nil), false)
|
|
assert.Equal(t, ToBool("false"), false)
|
|
assert.Equal(t, ToBool("FALSE"), false)
|
|
assert.Equal(t, ToBool("False"), false)
|
|
assert.Equal(t, ToBool("f"), false)
|
|
assert.Equal(t, ToBool("F"), false)
|
|
assert.Equal(t, ToBool(false), false)
|
|
assert.Equal(t, ToBool("foo"), false)
|
|
|
|
assert.Equal(t, ToBool("true"), true)
|
|
assert.Equal(t, ToBool("TRUE"), true)
|
|
assert.Equal(t, ToBool("True"), true)
|
|
assert.Equal(t, ToBool("t"), true)
|
|
assert.Equal(t, ToBool("T"), true)
|
|
assert.Equal(t, ToBool(1), true)
|
|
assert.Equal(t, ToBool(true), true)
|
|
assert.Equal(t, ToBool(-1), true)
|
|
}
|
|
|
|
func BenchmarkTooBool(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
if !ToBool(true) {
|
|
b.Fatal("ToBool returned false")
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestIndirectPointers(t *testing.T) {
|
|
x := 13
|
|
y := &x
|
|
z := &y
|
|
|
|
assert.Equal(t, ToInt(y), 13)
|
|
assert.Equal(t, ToInt(z), 13)
|
|
}
|
|
|
|
func TestToDuration(t *testing.T) {
|
|
var td time.Duration = 5
|
|
tests := []struct {
|
|
input interface{}
|
|
expected time.Duration
|
|
}{
|
|
{time.Duration(5), td},
|
|
{int64(5), td},
|
|
{int32(5), td},
|
|
{int16(5), td},
|
|
{int8(5), td},
|
|
{int(5), td},
|
|
{float64(5), td},
|
|
{float32(5), td},
|
|
{string("5"), td},
|
|
{string("5ns"), td},
|
|
{string("5us"), time.Microsecond * td},
|
|
{string("5µs"), time.Microsecond * td},
|
|
{string("5ms"), time.Millisecond * td},
|
|
{string("5s"), time.Second * td},
|
|
{string("5m"), time.Minute * td},
|
|
{string("5h"), time.Hour * td},
|
|
}
|
|
for _, v := range tests {
|
|
assert.Equal(t, v.expected, ToDuration(v.input))
|
|
}
|
|
}
|
|
|
|
func TestStringToDate(t *testing.T) {
|
|
dateString := "2016-12-01 15:05:04"
|
|
tv, _ := time.Parse("2006-01-02 15:04:05", dateString)
|
|
assert.Equal(t, ToTime(dateString), tv)
|
|
}
|