diff options
author | Joe Tsai <joetsai@digital-static.net> | 2020-05-20 13:22:30 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-20 13:22:30 -0700 |
commit | d08c604e6f3e6b88ac9497ab252e6488f268d260 (patch) | |
tree | 491df96406d41b825ef38e3992573e67fa2bd491 /cmp/cmpopts/util_test.go | |
parent | aa7c82a3f2093118656c72614a55b7746c369301 (diff) | |
download | go-cmp-d08c604e6f3e6b88ac9497ab252e6488f268d260.tar.gz |
Permit use of IgnoreFields with unexported fields (#203)
Modify IgnoreFields to permit the specification of unexported fields.
To avoid a bug with reflect.Type.FieldByName, we disallow forwarding
on unexported fields. See https://golang.org/issue/4876 for details.
Fixes #196
Diffstat (limited to 'cmp/cmpopts/util_test.go')
-rw-r--r-- | cmp/cmpopts/util_test.go | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/cmp/cmpopts/util_test.go b/cmp/cmpopts/util_test.go index d0fd888..37704c8 100644 --- a/cmp/cmpopts/util_test.go +++ b/cmp/cmpopts/util_test.go @@ -772,6 +772,39 @@ func TestOptions(t *testing.T) { wantEqual: false, reason: "not equal because highest-level field is not ignored: Foo3", }, { + label: "IgnoreFields", + x: ParentStruct{ + privateStruct: &privateStruct{private: 1}, + PublicStruct: &PublicStruct{private: 2}, + private: 3, + }, + y: ParentStruct{ + privateStruct: &privateStruct{private: 10}, + PublicStruct: &PublicStruct{private: 20}, + private: 30, + }, + opts: []cmp.Option{cmp.AllowUnexported(ParentStruct{}, PublicStruct{}, privateStruct{})}, + wantEqual: false, + reason: "not equal because unexported fields mismatch", + }, { + label: "IgnoreFields", + x: ParentStruct{ + privateStruct: &privateStruct{private: 1}, + PublicStruct: &PublicStruct{private: 2}, + private: 3, + }, + y: ParentStruct{ + privateStruct: &privateStruct{private: 10}, + PublicStruct: &PublicStruct{private: 20}, + private: 30, + }, + opts: []cmp.Option{ + cmp.AllowUnexported(ParentStruct{}, PublicStruct{}, privateStruct{}), + IgnoreFields(ParentStruct{}, "PublicStruct.private", "privateStruct.private", "private"), + }, + wantEqual: true, + reason: "equal because mismatching unexported fields are ignored", + }, { label: "IgnoreTypes", x: []interface{}{5, "same"}, y: []interface{}{6, "same"}, @@ -1193,11 +1226,21 @@ func TestPanic(t *testing.T) { wantPanic: "must be a struct", reason: "the type must be a struct (not pointer to a struct)", }, { + label: "IgnoreFields", + fnc: IgnoreFields, + args: args(struct{ privateStruct }{}, "privateStruct"), + reason: "privateStruct field permitted since it is the default name of the embedded type", + }, { + label: "IgnoreFields", + fnc: IgnoreFields, + args: args(struct{ privateStruct }{}, "Public"), + reason: "Public field permitted since it is a forwarded field that is exported", + }, { label: "IgnoreFields", fnc: IgnoreFields, - args: args(Foo1{}, "unexported"), - wantPanic: "name must be exported", - reason: "unexported fields must not be specified", + args: args(struct{ privateStruct }{}, "private"), + wantPanic: "does not exist", + reason: "private field not permitted since it is a forwarded field that is unexported", }, { label: "IgnoreTypes", fnc: IgnoreTypes, |