Skip to content

Commit 3ed3fab

Browse files
authored
Merge pull request #14 from vijtrip2/import-test
Correctly validate the nil check for interfaces.
2 parents 1a47363 + 087e09a commit 3ed3fab

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

pkg/compare/nil.go

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,37 @@
1313

1414
package compare
1515

16+
import (
17+
"reflect"
18+
)
19+
1620
// HasNilDifference returns true if the supplied subjects' nilness is
1721
// different
1822
func HasNilDifference(a, b interface{}) bool {
19-
if a == nil || b == nil {
20-
if (a == nil && b != nil) || (a != nil && b == nil) {
23+
if isNil(a) || isNil(b) {
24+
if (isNil(a) && isNotNil(b)) || (isNil(b) && isNotNil(a)) {
2125
return true
2226
}
2327
}
2428
return false
2529
}
30+
31+
// isNil checks the passed interface argument for Nil value.
32+
// For interfaces, only 'i==nil' check is not sufficient.
33+
// https://tour.golang.org/methods/12
34+
// More details: https://mangatmodi.medium.com/go-check-nil-interface-the-right-way-d142776edef1
35+
func isNil(i interface{}) bool {
36+
if i == nil {
37+
return true
38+
}
39+
40+
switch reflect.TypeOf(i).Kind() {
41+
case reflect.Ptr, reflect.Map, reflect.Array, reflect.Chan, reflect.Slice:
42+
return reflect.ValueOf(i).IsNil()
43+
}
44+
return false
45+
}
46+
47+
func isNotNil(i interface{}) bool {
48+
return !isNil(i)
49+
}

pkg/compare/nil_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package compare_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
8+
"github.com/aws-controllers-k8s/runtime/pkg/compare"
9+
)
10+
11+
func TestNilDifference(t *testing.T) {
12+
require := require.New(t)
13+
14+
sampleString := ""
15+
var nullPtr *string
16+
nonNullPtr := &sampleString
17+
var nullMap map[string]string
18+
nonNullMap := make(map[string]string)
19+
var nullArray []string
20+
nonNullArray := make([]string, 0)
21+
var nullChan chan int
22+
nonNullChan := make(chan int, 0)
23+
24+
require.False(compare.HasNilDifference(nil, nil))
25+
require.False(compare.HasNilDifference("a", "b"))
26+
require.True(compare.HasNilDifference(nil, "b"))
27+
require.True(compare.HasNilDifference("a", nil))
28+
29+
//Pointer
30+
require.False(compare.HasNilDifference(nullPtr, nil))
31+
require.True(compare.HasNilDifference(nullPtr, nonNullPtr))
32+
33+
//Map
34+
require.False(compare.HasNilDifference(nullMap, nil))
35+
require.True(compare.HasNilDifference(nullMap, nonNullMap))
36+
37+
//Array or Slice
38+
require.False(compare.HasNilDifference(nullArray, nil))
39+
require.True(compare.HasNilDifference(nullArray, nonNullArray))
40+
41+
//Chan
42+
require.False(compare.HasNilDifference(nullChan, nil))
43+
require.True(compare.HasNilDifference(nullChan, nonNullChan))
44+
45+
}
46+

0 commit comments

Comments
 (0)