| // Copyright 2017, The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE.md file. |
| |
| package cmp |
| |
| import ( |
| "fmt" |
| "reflect" |
| "strings" |
| |
| "github.com/google/go-cmp/cmp/internal/value" |
| ) |
| |
| type defaultReporter struct { |
| Option |
| diffs []string // List of differences, possibly truncated |
| ndiffs int // Total number of differences |
| nbytes int // Number of bytes in diffs |
| nlines int // Number of lines in diffs |
| } |
| |
| var _ reporter = (*defaultReporter)(nil) |
| |
| func (r *defaultReporter) Report(x, y reflect.Value, eq bool, p Path) { |
| if eq { |
| return // Ignore equal results |
| } |
| const maxBytes = 4096 |
| const maxLines = 256 |
| r.ndiffs++ |
| if r.nbytes < maxBytes && r.nlines < maxLines { |
| sx := value.Format(x, value.FormatConfig{UseStringer: true}) |
| sy := value.Format(y, value.FormatConfig{UseStringer: true}) |
| if sx == sy { |
| // Unhelpful output, so use more exact formatting. |
| sx = value.Format(x, value.FormatConfig{PrintPrimitiveType: true}) |
| sy = value.Format(y, value.FormatConfig{PrintPrimitiveType: true}) |
| } |
| s := fmt.Sprintf("%#v:\n\t-: %s\n\t+: %s\n", p, sx, sy) |
| r.diffs = append(r.diffs, s) |
| r.nbytes += len(s) |
| r.nlines += strings.Count(s, "\n") |
| } |
| } |
| |
| func (r *defaultReporter) String() string { |
| s := strings.Join(r.diffs, "") |
| if r.ndiffs == len(r.diffs) { |
| return s |
| } |
| return fmt.Sprintf("%s... %d more differences ...", s, r.ndiffs-len(r.diffs)) |
| } |