// 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_test

import (
	"os"
	"time"

	"go.fuchsia.dev/tools/testing/tap"
	"gopkg.in/yaml.v2"
)

func ExampleProducer_single_test() {
	p := tap.NewProducer(os.Stdout)
	p.Plan(1)
	p.Ok(true, "- this test passed")
	// Output:
	// TAP version 13
	// 1..1
	// ok 1 - this test passed
}

func ExampleProducer_Todo() {
	p := tap.NewProducer(os.Stdout)
	p.Plan(1)
	p.Todo().Ok(true, "implement this test")
	// Output:
	// TAP version 13
	// 1..1
	// ok 1 # TODO implement this test
}

func ExampleProducer_Skip() {
	p := tap.NewProducer(os.Stdout)
	p.Plan(1)
	p.Skip().Ok(true, "implement this test")
	// Output:
	// TAP version 13
	// 1..1
	// ok 1 # SKIP implement this test
}

func ExampleProducer_many_test() {
	p := tap.NewProducer(os.Stdout)
	p.Plan(4)
	p.Ok(true, "- this test passed")
	p.Ok(false, "")
	// Output:
	// TAP version 13
	// 1..4
	// ok 1 - this test passed
	// not ok 2
}

func ExampleProducer_skip_todo_alternating() {
	p := tap.NewProducer(os.Stdout)
	p.Plan(4)
	p.Skip().Ok(true, "implement this test")
	p.Todo().Ok(false, "oh no!")
	p.Skip().Ok(false, "skipped another")
	p.Todo().Skip().Todo().Ok(true, "please don't write code like this")
	// Output:
	// TAP version 13
	// 1..4
	// ok 1 # SKIP implement this test
	// not ok 2 # TODO oh no!
	// not ok 3 # SKIP skipped another
	// ok 4 # TODO please don't write code like this
}

func ExampleProducer_YAML() {
	p := tap.NewProducer(os.Stdout)
	p.Plan(1)
	p.Ok(true, "passed")
	bytes, err := yaml.Marshal(struct {
		Name  string    `yaml:"name"`
		Start time.Time `yaml:"start_time"`
		End   time.Time `yaml:"end_time"`
	}{
		Name:  "foo_test",
		Start: time.Date(2019, 1, 1, 12, 30, 0, 0, time.UTC),
		End:   time.Date(2019, 1, 1, 12, 40, 0, 0, time.UTC),
	})
	if err != nil {
		panic(err)
	}
	p.YAML(bytes)
	// Output:
	// TAP version 13
	// 1..1
	// ok 1 passed
	//  ---
	//  name: foo_test
	//  start_time: 2019-01-01T12:30:00Z
	//  end_time: 2019-01-01T12:40:00Z
	//  ...
}
