// 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 (
	"reflect"
	"strings"
	"testing"
)

func TestParse(t *testing.T) {
	tests := []struct {
		name     string
		input    string
		expected *Document
	}{
		{
			name:  "should parse a document containing only the version",
			input: strings.TrimSpace(`TAP version 13`),
			expected: &Document{
				Version: 13,
			},
		}, {
			name: "should parse a document containing only the version and plan",
			input: strings.TrimSpace(`
TAP version 13
1..2
`),
			expected: &Document{
				Version: 13,
				Plan:    Plan{Start: 1, End: 2},
			},
		}, {
			name: "should parse a basic TAP document",
			input: strings.TrimSpace(`
TAP version 13
1..4
ok 1 - This test passed
ok 2 # TODO this test is disabled
not ok 3 - This test failed
ok 4 - This test passed also # TODO congratulate the author
`),
			expected: &Document{
				Version: 13,
				Plan:    Plan{Start: 1, End: 4},
				TestLines: []TestLine{
					{Ok: true, Count: 1, Description: "- This test passed"},
					{Ok: true, Count: 2, Directive: Todo, Explanation: "this test is disabled"},
					{Ok: false, Count: 3, Description: "- This test failed"},
					{Ok: true, Count: 4, Description: "- This test passed also", Directive: Todo, Explanation: "congratulate the author"},
				},
			},
		},
		{
			name: "should parse a plan at the end of the document",
			input: strings.TrimSpace(`
TAP version 13
ok 1 - This test passed
ok 2 # TODO this test is disabled
not ok 3 - This test failed
1..3
`),
			expected: &Document{
				Version: 13,
				Plan: Plan{
					Start: 1,
					End:   3,
				},
				TestLines: []TestLine{
					{Ok: true, Count: 1, Description: "- This test passed"},
					{Ok: true, Count: 2, Directive: Todo, Explanation: "this test is disabled"},
					{Ok: false, Count: 3, Description: "- This test failed"},
				},
			},
		},
		{
			name: "should skip garbage output",
			input: strings.TrimSpace(`
TAP version 13
ERROR: segfault at 0x33123. print stackdump;
0x00001fff: 0x88881
0x00001ffe: 0x88881
0x00001ffd: 0x88881
1..3
0x00001ffc: 0x88881
ok 1 - This test passed
ok 2 # TODO this test is disabled
exiting
not ok 3 - This test failed
`),
			expected: &Document{
				Version: 13,
				Plan: Plan{
					Start: 1,
					End:   3,
				},
				TestLines: []TestLine{
					{Ok: true, Count: 1, Description: "- This test passed"},
					{Ok: true, Count: 2, Directive: Todo, Explanation: "this test is disabled"},
					{Ok: false, Count: 3, Description: "- This test failed"},
				},
			},
		},
		{
			name: "should skip a line with an incomplete test plan",
			input: strings.TrimSpace(`
TAP version 13
1..
not ok 3 - This test failed
`),
			expected: &Document{
				Version: 13,
				TestLines: []TestLine{
					{Ok: false, Count: 3, Description: "- This test failed"},
				},
			},
		},
		{
			name: "should preserve spaces in description",
			input: strings.TrimSpace(`
TAP version 13
1..1
ok 1 - This test     passed
`),
			expected: &Document{
				Version: 13,
				Plan:    Plan{Start: 1, End: 1},
				TestLines: []TestLine{
					{Ok: true, Count: 1, Description: "- This test     passed"},
				},
			},
		},
		{
			name: "should preserve spaces in directive explanation",
			input: strings.TrimSpace(`
TAP version 13
1..1
ok 1 # SKIP this  is   disabled
`),
			expected: &Document{
				Version: 13,
				Plan:    Plan{Start: 1, End: 1},
				TestLines: []TestLine{
					{Ok: true, Count: 1, Directive: Skip, Explanation: "this  is   disabled"},
				},
			},
		},
		{
			name: "should parse a YAML block",
			input: strings.TrimSpace(`
TAP version 13
1..1
ok 1
 ---
 name: foo
 start: 1
 end: 2
 ...
`),
			expected: &Document{
				Version: 13,
				Plan:    Plan{Start: 1, End: 1},
				TestLines: []TestLine{
					{
						Ok:    true,
						Count: 1,
						YAML:  "name: foo\nstart: 1\nend: 2\n",
					},
				},
			},
		},
		{
			name: "should parse a YAML block whose header contains trailing characters",
			input: strings.TrimSpace(`
TAP version 13
1..1
ok 1
 ---trailing chars
 name: foo
 start: 1
 end: 2
 ...
`),
			expected: &Document{
				Version: 13,
				Plan:    Plan{Start: 1, End: 1},
				TestLines: []TestLine{
					{
						Ok:    true,
						Count: 1,
						YAML:  "name: foo\nstart: 1\nend: 2\n",
					},
				},
			},
		},
		{
			name: "should parse a YAML block whose footer contains trailing characters",
			input: strings.TrimSpace(`
TAP version 13
1..1
ok 1
 ---
 name: foo
 start: 1
 end: 2
 ...trailing chars
`),
			expected: &Document{
				Version: 13,
				Plan:    Plan{Start: 1, End: 1},
				TestLines: []TestLine{
					{
						Ok:    true,
						Count: 1,
						YAML:  "name: foo\nstart: 1\nend: 2\n",
					},
				},
			},
		},
		{
			name: "should parse a YAML block whose header and footer contain trailing characters",
			input: strings.TrimSpace(`
TAP version 13
1..1
ok 1
 --- trailing chars
 name: foo
 start: 1
 end: 2
 ... even more trailing chars
`),
			expected: &Document{
				Version: 13,
				Plan:    Plan{Start: 1, End: 1},
				TestLines: []TestLine{
					{
						Ok:    true,
						Count: 1,
						YAML:  "name: foo\nstart: 1\nend: 2\n",
					},
				},
			},
		},
		{
			name: "should skip a YAML block at the start of the output",
			input: strings.TrimSpace(`
TAP version 13
1..1
	---
	name: foo
	start: 1
	end: 2
	...
`),
			expected: &Document{
				Version: 13,
				Plan:    Plan{Start: 1, End: 1},
			},
		},
		{
			name: "should skip a YAML block that does not follow a test line",
			input: strings.TrimSpace(`
TAP version 13
1..1
ok 1
	---
	name: foo_test
	start: 1
	end: 2
	...
	---
	name: bar_test
	start: 3
	end: 4
	...
`),
			expected: &Document{
				Version:   13,
				Plan:      Plan{Start: 1, End: 1},
				TestLines: []TestLine{{Ok: true, Count: 1, YAML: "name: foo_test\nstart: 1\nend: 2\n"}},
			},
		},
		{
			name: "should parse a YAML block with no trailing /\\s+.../",
			input: strings.TrimSpace(`
TAP version 13
1..1
ok 1
  ---
  name: foo_test
  start: 1
  end: 2
`),
			expected: &Document{
				Version: 13,
				Plan:    Plan{Start: 1, End: 1},
				TestLines: []TestLine{
					{Ok: true, Count: 1, YAML: "name: foo_test\nstart: 1\nend: 2\n"},
				},
			},
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			doc, err := Parse([]byte(tt.input))
			if err != nil {
				t.Fatal(err)
			}
			if !reflect.DeepEqual(doc, tt.expected) {
				t.Errorf("got\n%+v\nbut wanted\n%+v", doc, tt.expected)
			}
		})
	}
}
