github.com/integration-system/go-cmp@v0.0.0-20190131081942-ac5582987a2f/cmp/reporter.go (about)

     1  // Copyright 2017, The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE.md file.
     4  
     5  package cmp
     6  
     7  import (
     8  	"fmt"
     9  	"reflect"
    10  	"strings"
    11  
    12  	"github.com/integration-system/go-cmp/cmp/internal/value"
    13  )
    14  
    15  type defaultReporter struct {
    16  	Option
    17  	diffs  []string // List of differences, possibly truncated
    18  	ndiffs int      // Total number of differences
    19  	nbytes int      // Number of bytes in diffs
    20  	nlines int      // Number of lines in diffs
    21  }
    22  
    23  var _ Reporter = (*defaultReporter)(nil)
    24  
    25  func (r *defaultReporter) Report(x, y reflect.Value, eq bool, p Path) {
    26  	if eq {
    27  		return // Ignore equal results
    28  	}
    29  	const maxBytes = 4096
    30  	const maxLines = 256
    31  	r.ndiffs++
    32  	if r.nbytes < maxBytes && r.nlines < maxLines {
    33  		sx := value.Format(x, value.FormatConfig{UseStringer: true})
    34  		sy := value.Format(y, value.FormatConfig{UseStringer: true})
    35  		if sx == sy {
    36  			// Unhelpful output, so use more exact formatting.
    37  			sx = value.Format(x, value.FormatConfig{PrintPrimitiveType: true})
    38  			sy = value.Format(y, value.FormatConfig{PrintPrimitiveType: true})
    39  		}
    40  		s := fmt.Sprintf("%#v:\n\t-: %s\n\t+: %s\n", p, sx, sy)
    41  		r.diffs = append(r.diffs, s)
    42  		r.nbytes += len(s)
    43  		r.nlines += strings.Count(s, "\n")
    44  	}
    45  }
    46  
    47  func (r *defaultReporter) String() string {
    48  	s := strings.Join(r.diffs, "")
    49  	if r.ndiffs == len(r.diffs) {
    50  		return s
    51  	}
    52  	return fmt.Sprintf("%s... %d more differences ...", s, r.ndiffs-len(r.diffs))
    53  }