oss.indeed.com/go/go-opine@v1.3.0/internal/gotest/output.go (about)

     1  package gotest
     2  
     3  import (
     4  	"io"
     5  	"regexp"
     6  )
     7  
     8  var (
     9  	removeCoverageOutputRegexp = regexp.MustCompile(`(?m)(?:^|\n|\t)coverage:[^\t\n]*`)
    10  	removePassOutputRegexp     = regexp.MustCompile(`(?m)(?:\nPASS$|^PASS\n)`)
    11  )
    12  
    13  const testFailure = "fail"
    14  
    15  // removeCoverageOutput is a resultAccepter that removes coverage-related
    16  // output from results before forwarding to the next result accepter.
    17  type removeCoverageOutput struct {
    18  	next resultAccepter
    19  }
    20  
    21  var _ resultAccepter = (*removeCoverageOutput)(nil)
    22  
    23  func newRemoveCoverageOutput(next resultAccepter) *removeCoverageOutput {
    24  	return &removeCoverageOutput{next: next}
    25  }
    26  
    27  func (r *removeCoverageOutput) Accept(res result) error {
    28  	res.Output = removeCoverageOutputRegexp.ReplaceAllString(res.Output, "")
    29  	return r.next.Accept(res)
    30  }
    31  
    32  // verboseOutput is a resultAccepter that writes "go test -v"-like
    33  // output to an io.Writer.
    34  type verboseOutput struct {
    35  	to io.Writer
    36  }
    37  
    38  var _ resultAccepter = (*verboseOutput)(nil)
    39  
    40  func newVerboseOutput(to io.Writer) *verboseOutput {
    41  	return &verboseOutput{to: to}
    42  }
    43  
    44  func (v *verboseOutput) Accept(res result) error {
    45  	_, err := v.to.Write([]byte(res.Output))
    46  	return err
    47  }
    48  
    49  // quietOutput is a resultAccepter that writes "go test"-like (no "-v")
    50  // output to an io.Writer.
    51  type quietOutput struct {
    52  	to io.Writer
    53  }
    54  
    55  var _ resultAccepter = (*quietOutput)(nil)
    56  
    57  func newQuietOutput(to io.Writer) *quietOutput {
    58  	return &quietOutput{to: to}
    59  }
    60  
    61  func (q quietOutput) Accept(res result) error {
    62  	// Only print output from failed tests.
    63  	if res.Key.Test != "" && res.Outcome == testFailure {
    64  		_, err := q.to.Write([]byte(res.Output))
    65  		return err
    66  	}
    67  
    68  	// Remove "PASS" lines from the non-test (i.e. package) output. There
    69  	// is already a line starting with "?", "ok", or "fail" that indicates the
    70  	// package result.
    71  	if res.Key.Test == "" {
    72  		_, err := q.to.Write([]byte(removePassOutputRegexp.ReplaceAllString(res.Output, "")))
    73  		return err
    74  	}
    75  
    76  	return nil
    77  }