// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package arguments

import (
	"testing"

	"github.com/apparentlymart/go-shquot/shquot"
	"github.com/google/go-cmp/cmp"
	"github.com/hashicorp/terraform/internal/tfdiags"
)

func TestParseTest(t *testing.T) {
	tests := []struct {
		Input     []string
		Want      Test
		WantError string
	}{
		{
			nil,
			Test{
				Output: TestOutput{
					JUnitXMLFile: "",
				},
			},
			``,
		},
		{
			[]string{"-invalid"},
			Test{
				Output: TestOutput{
					JUnitXMLFile: "",
				},
			},
			`flag provided but not defined: -invalid`,
		},
		{
			[]string{"-junit-xml=result.xml"},
			Test{
				Output: TestOutput{
					JUnitXMLFile: "result.xml",
				},
			},
			``,
		},
		{
			[]string{"baz"},
			Test{
				Output: TestOutput{
					JUnitXMLFile: "",
				},
			},
			`Invalid command arguments`,
		},
	}

	baseCmdline := []string{"terraform", "test"}
	for _, test := range tests {
		name := shquot.POSIXShell(append(baseCmdline, test.Input...))
		t.Run(name, func(t *testing.T) {
			t.Log(name)
			got, diags := ParseTest(test.Input)

			if test.WantError != "" {
				if len(diags) != 1 {
					t.Fatalf("got %d diagnostics; want exactly 1\n%s", len(diags), diags.Err().Error())
				}
				if diags[0].Severity() != tfdiags.Error {
					t.Fatalf("got a warning; want an error\n%s", diags.Err().Error())
				}
				if desc := diags[0].Description(); desc.Summary != test.WantError {
					t.Fatalf("wrong error\ngot:  %s\nwant: %s", desc.Summary, test.WantError)
				}
			} else {
				if len(diags) != 0 {
					t.Fatalf("got %d diagnostics; want none\n%s", len(diags), diags.Err().Error())
				}
			}

			if diff := cmp.Diff(test.Want, got); diff != "" {
				t.Errorf("wrong result\n%s", diff)
			}
		})
	}
}
