aboutsummaryrefslogtreecommitdiff
path: root/cmp/cmpopts/util_test.go
diff options
context:
space:
mode:
authorJoe Tsai <joetsai@digital-static.net>2020-05-20 13:22:30 -0700
committerGitHub <noreply@github.com>2020-05-20 13:22:30 -0700
commitd08c604e6f3e6b88ac9497ab252e6488f268d260 (patch)
tree491df96406d41b825ef38e3992573e67fa2bd491 /cmp/cmpopts/util_test.go
parentaa7c82a3f2093118656c72614a55b7746c369301 (diff)
downloadgo-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.go49
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,