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

import (
	"go/format"
	"testing"

	"go.fuchsia.dev/infra/gotidy"
)

func gofmt(t *testing.T, input string) string {
	output, err := format.Source([]byte(input))
	if err != nil {
		t.Errorf("maformed input: %v", err)
	}
	return string(output)
}

func TestCopyrightHeader(t *testing.T) {
	tests := []struct {
		name     string
		input    string
		step     *gotidy.AddCopyrightHeader
		expected string
	}{
		{
			name: "should handle unformatted input",
			step: &gotidy.AddCopyrightHeader{Year: 2019},
			input: `package main

import "fmt"

func main() {
				fmt.Println("Hello, World!")
}
`,
			expected: `// 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 main

import "fmt"

func main() {
				fmt.Println("Hello, World!")
}
`},
		{
			name: "should add copyright if missing",
			step: &gotidy.AddCopyrightHeader{Year: 2019},
			input: gofmt(t, `
			package main

			import "fmt"

			func main() {
				fmt.Println("Hello, World!")
			}
			`),
			expected: gofmt(t, `
			// 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 main

			import "fmt"

			func main() {
				fmt.Println("Hello, World!")
			}
			`),
		}, {
			name: "should not overwrite existing header",
			step: &gotidy.AddCopyrightHeader{Year: 2019},
			input: gofmt(t, `
			// Copyright 2015 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 main

			import "fmt"

			func main() {
				fmt.Println("Hello, World!")
			}
			`),
			expected: gofmt(t, `
			// Copyright 2015 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 main

			import "fmt"

			func main() {
				fmt.Println("Hello, World!")
			}
			`),
		}, {
			name: "should preserve package doc comment",
			step: &gotidy.AddCopyrightHeader{Year: 2019},
			// No space between package decl and header
			input: gofmt(t, `
			// Package main says hello.
			package main

			import "fmt"

			func main() {
				fmt.Println("Hello, World!")
			}
			`),
			expected: gofmt(t, `
			// 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 main says hello.
			package main

			import "fmt"

			func main() {
				fmt.Println("Hello, World!")
			}
			`),
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			output, err := tt.step.Tidy([]byte(tt.input))
			if err != nil {
				t.Fatal(err)
			}

			if string(output) != tt.expected {
				t.Errorf("case '%s'\ngot:\n'%s'\nwant:\n'%s'\n", tt.name, output, tt.expected)
			}
		})
	}
}
