| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package tap |
| |
| import ( |
| "fmt" |
| "io" |
| "os" |
| "strings" |
| ) |
| |
| // Producer produces TAP output. |
| // |
| // This producer always includes test numbers. |
| type Producer struct { |
| output io.Writer |
| directive Directive |
| testNumber int |
| } |
| |
| // NewProducer creates a new Producer that writes to the given Writer. |
| func NewProducer(w io.Writer) *Producer { |
| p := &Producer{ |
| output: w, |
| directive: None, |
| } |
| // Output the TAP version line. |
| p.writeln("TAP version 13") |
| return p |
| } |
| |
| // Plan outputs the TAP plan line: 1..count. If count <= 0, nothing is printed |
| func (p *Producer) Plan(count int) { |
| if count > 0 { |
| p.writeln("1..%d", count) |
| } |
| } |
| |
| // Ok outputs a test line containing the given description and starting with either "ok" |
| // if test is true or "not ok" if false. If this producer was created using |
| // Todo or Skip, then the corresponding directive is also printed, and the description is |
| // used as the explanation of that directive. |
| func (p *Producer) Ok(test bool, description string) { |
| p.testNumber++ |
| |
| ok := "ok" |
| if !test { |
| ok = "not ok" |
| } |
| |
| switch p.directive { |
| case None: |
| p.writeln("%s %d %s", ok, p.testNumber, description) |
| case Todo: |
| p.writeln("%s %d # TODO %s", ok, p.testNumber, description) |
| case Skip: |
| p.writeln("%s %d # SKIP %s", ok, p.testNumber, description) |
| } |
| |
| p.directive = None |
| } |
| |
| // Todo returns a new Producer that prints TODO directives. |
| func (p *Producer) Todo() *Producer { |
| p.directive = Todo |
| return p |
| } |
| |
| // Skip returns a new Producer that prints SKIP directives. |
| func (p *Producer) Skip() *Producer { |
| p.directive = Skip |
| return p |
| } |
| |
| func (p *Producer) writeln(format string, args ...interface{}) { |
| line := strings.TrimSpace(fmt.Sprintf(format, args...)) + "\n" |
| fmt.Fprintf(p.writer(), line) |
| } |
| |
| // writer initializes the Writer to use for this Producer, in case the Producer was |
| // initialized with nil output. |
| func (p *Producer) writer() io.Writer { |
| if p.output == nil { |
| p.output = os.Stdout |
| } |
| return p.output |
| } |