tpl/compare: Fix nil compare in eq/ne for interface values
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 29 Apr 2019 08:48:36 +0000 (10:48 +0200)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 29 Apr 2019 16:43:44 +0000 (18:43 +0200)
Fixes #5905

tpl/compare/compare.go
tpl/compare/compare_test.go

index 08fb492d674a7647ddd067741931f9fef343cb3c..251b3d13be6741180b51451f06f176f525c6819f 100644 (file)
@@ -20,6 +20,8 @@ import (
        "strconv"
        "time"
 
+       "github.com/gohugoio/hugo/common/types"
+
        "github.com/gohugoio/hugo/compare"
 )
 
@@ -88,7 +90,6 @@ func (*Namespace) Default(dflt interface{}, given ...interface{}) (interface{},
 
 // Eq returns the boolean truth of arg1 == arg2.
 func (*Namespace) Eq(x, y interface{}) bool {
-
        if e, ok := x.(compare.Eqer); ok {
                return e.Eq(y)
        }
@@ -98,6 +99,9 @@ func (*Namespace) Eq(x, y interface{}) bool {
        }
 
        normalize := func(v interface{}) interface{} {
+               if types.IsNil(v) {
+                       return nil
+               }
                vv := reflect.ValueOf(v)
                switch vv.Kind() {
                case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
index d83680e534f95f22c7a602d64f60dc4c41e1a4d0..6c4be7e5002eebcda467d14a069d90ae38f7083f 100644 (file)
@@ -27,6 +27,23 @@ import (
        "github.com/stretchr/testify/require"
 )
 
+type T struct {
+       NonEmptyInterfaceNil      I
+       NonEmptyInterfaceTypedNil I
+}
+
+type I interface {
+       Foo() string
+}
+
+func (t *T) Foo() string {
+       return "foo"
+}
+
+var testT = &T{
+       NonEmptyInterfaceTypedNil: (*T)(nil),
+}
+
 type tstEqerType1 string
 type tstEqerType2 string
 
@@ -183,7 +200,12 @@ func doTestCompare(t *testing.T, tp tstCompareType, funcUnderTest func(a, b inte
                {"0.37-DEV", hugo.MustParseVersion("0.37").Version(), -1},
                {"0.36", hugo.MustParseVersion("0.37-DEV").Version(), -1},
                {"0.37-DEV", hugo.MustParseVersion("0.37-DEV").Version(), 0},
+               // https://github.com/gohugoio/hugo/issues/5905
+               {nil, nil, 0},
+               {testT.NonEmptyInterfaceNil, nil, 0},
+               {testT.NonEmptyInterfaceTypedNil, nil, 0},
        } {
+
                result := funcUnderTest(test.left, test.right)
                success := false
 
@@ -206,7 +228,7 @@ func doTestCompare(t *testing.T, tp tstCompareType, funcUnderTest func(a, b inte
                }
 
                if !success {
-                       t.Errorf("[%d][%s] %v compared to %v: %t", i, path.Base(runtime.FuncForPC(reflect.ValueOf(funcUnderTest).Pointer()).Name()), test.left, test.right, result)
+                       t.Fatalf("[%d][%s] %v compared to %v: %t", i, path.Base(runtime.FuncForPC(reflect.ValueOf(funcUnderTest).Pointer()).Name()), test.left, test.right, result)
                }
        }
 }