blob: 1f2f99a41603a6122b4161af94d04abb245bfd00 [file] [log] [blame]
// 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 (
// Type describes the type of TAP Object returned by the Parser.
type Type int
const (
// VersionType is the type returned by a Version Object.
VersionType Type = iota
// PlanType is the type returned by a Plan Object.
// TestLineType is the type returned by a TestLine.
// Object is a TAP element such as a test line, plan, version header, or Yaml block.
type Object interface {
Type() Type
// Document represents a complete TAP document.
type Document struct {
Version Version
Plan Plan
TestLines []TestLine
// WriteTo writes this document to the given Writer as a formatted TAP output stream.
func (d *Document) WriteTo(w io.Writer) (int64, error) {
n, err := w.Write([]byte(d.format()))
return int64(n), err
// Format renders this document as thought it were a TAP output stream.
func (d *Document) format() string {
output := new(bytes.Buffer)
output.WriteString(fmt.Sprintf("TAP version %d\n", d.Version))
output.WriteString(fmt.Sprintf("%d..%d\n", d.Plan.Start, d.Plan.End))
for _, line := range d.TestLines {
var parts []string
ok := "ok"
if !line.Ok {
ok = "not ok"
parts = append(parts, ok)
if line.Count != 0 {
parts = append(parts, fmt.Sprintf("%d", line.Count))
if line.Description != "" {
parts = append(parts, line.Description)
switch line.Directive {
case Todo:
parts = append(parts, "# TODO", line.Explanation)
case Skip:
parts = append(parts, "# SKIP", line.Explanation)
output.WriteString(strings.Join(parts, " ") + "\n")
return output.String()
// Version represents a TAP version line.
type Version int
// Type implements Object.
func (v Version) Type() Type {
return VersionType
func (v Version) String() string {
return fmt.Sprintf("TAP version %d", v)
// Plan represents a TAP plan line.
type Plan struct {
Start int
End int
// Type implements Object.
func (p Plan) Type() Type {
return PlanType
func (p Plan) String() string {
return fmt.Sprintf("%d..%d", p.Start, p.End)
// Directive represents a TAP directive (TODO|SKIP|<none>)
type Directive int
// Valid Tap directives.
const (
None Directive = iota
// TestLine represents a TAP test line beginning with "ok" or "not ok".
type TestLine struct {
Ok bool
Count int
Description string
Directive Directive
Explanation string
Diagnostic string
YAML string
// Type implements Object.
func (t TestLine) Type() Type {
return TestLineType