Skip to content

Commit

Permalink
Merge pull request #136 from frankban/different-pointers-same-format
Browse files Browse the repository at this point in the history
Improve failure output when comparing different pointers
  • Loading branch information
frankban authored Mar 24, 2022
2 parents 0ed90fe + ed9fd1f commit 5315a53
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 1 deletion.
1 change: 1 addition & 0 deletions checker.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ func (c *equalsChecker) Check(got interface{}, args []interface{}, note func(key
}
}
}

return errors.New("values are not equal")
}

Expand Down
32 changes: 31 additions & 1 deletion checker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,37 @@ want type:
got:
e"bad wolf"
want:
<same as "got">
<same as "got" but different pointer value>
`,
}, {
about: "Equals: different pointer errors with the same message",
checker: qt.Equals,
got: &errTest{
msg: "bad wolf",
},
args: []interface{}{&errTest{
msg: "bad wolf",
}},
expectedCheckFailure: `
error:
values are not equal
got:
e"bad wolf"
want:
<same as "got" but different pointer value>
`,
}, {
about: "Equals: different pointers with the same formatted output",
checker: qt.Equals,
got: new(int),
args: []interface{}{new(int)},
expectedCheckFailure: `
error:
values are not equal
got:
&int(0)
want:
<same as "got" but different pointer value>
`,
}, {
about: "Equals: nil struct",
Expand Down
9 changes: 9 additions & 0 deletions report.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ func report(err error, p reportParams) string {
// writeError writes a pretty formatted output of the given error using the
// provided report parameters.
func writeError(w io.Writer, err error, p reportParams) {
ptrs := make(map[string]interface{})
values := make(map[string]string)
printPair := func(key string, value interface{}) {
fmt.Fprintln(w, key+":")
Expand All @@ -60,10 +61,18 @@ func writeError(w io.Writer, err error, p reportParams) {
} else {
v = p.format(value)
}
isPtr := reflect.ValueOf(value).Kind() == reflect.Ptr
if k := values[v]; k != "" {
if previousValue, ok := ptrs[k]; ok && isPtr && previousValue != value {
fmt.Fprint(w, prefixf(prefix, "<same as %q but different pointer value>", k))
return
}
fmt.Fprint(w, prefixf(prefix, "<same as %q>", k))
return
}
if isPtr {
ptrs[key] = value
}
values[v] = key
fmt.Fprint(w, prefixf(prefix, "%s", v))
}
Expand Down

0 comments on commit 5315a53

Please sign in to comment.