blob: cd86cd30052d3b4e1d207e7c5621051ee6515db6 [file] [log] [blame]
// Copyright 2015 Google Inc. 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 proptools
import (
"fmt"
"testing"
)
var typeEqualTestCases = []struct {
in1 interface{}
in2 interface{}
out bool
}{
{
// Matching structs
in1: struct{ S1 string }{},
in2: struct{ S1 string }{},
out: true,
},
{
// Mismatching structs
in1: struct{ S1 string }{},
in2: struct{ S2 string }{},
out: false,
},
{
// Matching pointer to struct
in1: &struct{ S1 string }{},
in2: &struct{ S1 string }{},
out: true,
},
{
// Mismatching pointer to struct
in1: &struct{ S1 string }{},
in2: &struct{ S2 string }{},
out: false,
},
{
// Matching embedded structs
in1: struct{ S struct{ S1 string } }{},
in2: struct{ S struct{ S1 string } }{},
out: true,
},
{
// Misatching embedded structs
in1: struct{ S struct{ S1 string } }{},
in2: struct{ S struct{ S2 string } }{},
out: false,
},
{
// Matching embedded pointer to struct
in1: &struct{ S *struct{ S1 string } }{S: &struct{ S1 string }{}},
in2: &struct{ S *struct{ S1 string } }{S: &struct{ S1 string }{}},
out: true,
},
{
// Mismatching embedded pointer to struct
in1: &struct{ S *struct{ S1 string } }{S: &struct{ S1 string }{}},
in2: &struct{ S *struct{ S2 string } }{S: &struct{ S2 string }{}},
out: false,
},
{
// Matching embedded nil pointer to struct
in1: &struct{ S *struct{ S1 string } }{},
in2: &struct{ S *struct{ S1 string } }{},
out: true,
},
{
// Mismatching embedded nil pointer to struct
in1: &struct{ S *struct{ S1 string } }{},
in2: &struct{ S *struct{ S2 string } }{},
out: false,
},
{
// Mismatching nilitude embedded pointer to struct
in1: &struct{ S *struct{ S1 string } }{S: &struct{ S1 string }{}},
in2: &struct{ S *struct{ S1 string } }{},
out: true,
},
{
// Matching embedded interface to pointer to struct
in1: &struct{ S interface{} }{S: &struct{ S1 string }{}},
in2: &struct{ S interface{} }{S: &struct{ S1 string }{}},
out: true,
},
{
// Mismatching embedded interface to pointer to struct
in1: &struct{ S interface{} }{S: &struct{ S1 string }{}},
in2: &struct{ S interface{} }{S: &struct{ S2 string }{}},
out: false,
},
{
// Matching embedded nil interface to pointer to struct
in1: &struct{ S interface{} }{},
in2: &struct{ S interface{} }{},
out: true,
},
{
// Mismatching nilitude embedded interface to pointer to struct
in1: &struct{ S interface{} }{S: &struct{ S1 string }{}},
in2: &struct{ S interface{} }{},
out: false,
},
{
// Matching pointer to non-struct
in1: struct{ S1 *string }{S1: StringPtr("test1")},
in2: struct{ S1 *string }{S1: StringPtr("test2")},
out: true,
},
{
// Matching nilitude pointer to non-struct
in1: struct{ S1 *string }{S1: StringPtr("test1")},
in2: struct{ S1 *string }{},
out: true,
},
{
// Mismatching pointer to non-struct
in1: struct{ S1 *string }{},
in2: struct{ S2 *string }{},
out: false,
},
}
func TestTypeEqualProperties(t *testing.T) {
for _, testCase := range typeEqualTestCases {
testString := fmt.Sprintf("%#v, %#v -> %t", testCase.in1, testCase.in2, testCase.out)
got := TypeEqual(testCase.in1, testCase.in2)
if got != testCase.out {
t.Errorf("test case: %s", testString)
t.Errorf("incorrect output")
t.Errorf(" expected: %t", testCase.out)
t.Errorf(" got: %t", got)
}
}
}