// Copyright 2020 The Go Authors. All rights reserved.
// Licensed under the MIT License.
// See LICENSE in the project root for license information.

package main

import (
	"bytes"
	"os/exec"
	"path/filepath"
	"strings"
	"testing"
)

func TestRun(t *testing.T) {
	if _, err := exec.LookPath("gopls"); err != nil {
		t.Skipf("gopls is not found (%v), skipping...", err)
	}
	if _, err := exec.LookPath("jq"); err != nil {
		t.Skipf("jq is not found (%v), skipping...", err)
	}
	testfile := filepath.Join("..", "..", "package.json")
	got, err := run(testfile)
	if err != nil {
		t.Fatalf("run failed: %v", err)
	}
	t.Logf("%s", got)
}

func TestWriteAsVSCodeSettings(t *testing.T) {
	if _, err := exec.LookPath("jq"); err != nil {
		t.Skipf("jq is not found (%v), skipping...", err)
	}
	testCases := []struct {
		name string
		in   *OptionJSON
		out  string
	}{
		{
			name: "boolean",
			in: &OptionJSON{
				Name:    "verboseOutput",
				Type:    "bool",
				Doc:     "verboseOutput enables additional debug logging.\n",
				Default: "false",
			},
			out: `"verboseOutput": {
					"type": "boolean",
					"markdownDescription": "verboseOutput enables additional debug logging.\n",
					"default": false,
					"scope": "resource"
				}`,
		},
		{
			name: "time",
			in: &OptionJSON{
				Name:    "completionBudget",
				Type:    "time.Duration",
				Default: "\"100ms\"",
			},
			out: `"completionBudget": {
					"type": "string",
					"default": "100ms",
					"scope": "resource"
				}`,
		},
		{
			name: "map",
			in: &OptionJSON{
				Name:    "analyses",
				Type:    "map[string]bool",
				Default: "{}",
			},
			out: `"analyses":{
					"type": "object",
					"scope": "resource"
				}`,
		},
		{
			name: "enum",
			in: &OptionJSON{
				Name: "matcher",
				Type: "enum",
				EnumValues: []EnumValue{
					{
						Value: "\"CaseInsensitive\"",
						Doc:   "",
					},
					{
						Value: "\"CaseSensitive\"",
						Doc:   "",
					},
					{
						Value: "\"Fuzzy\"",
						Doc:   "",
					},
				},
				Default: "\"Fuzzy\"",
			},
			out: `"matcher": {
 					"type": "string",
					"enum": [ "CaseInsensitive", "CaseSensitive", "Fuzzy" ],
					"markdownEnumDescriptions": [ "","","" ],
					"default": "Fuzzy",
					"scope": "resource"
				}`,
		},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			options := []*OptionJSON{tc.in}
			b, err := asVSCodeSettings(options)
			if err != nil {
				t.Fatal(err)
			}
			if got, want := normalize(t, string(b)), normalize(t, `
			{
				"gopls": {
					"type": "object",
					"markdownDescription": "Configure the default Go language server ('gopls'). In most cases, configuring this section is unnecessary. See [the documentation](https://github.com/golang/tools/blob/master/gopls/doc/settings.md) for all available settings.",
					"scope": "resource",
					"properties": {
				       `+tc.out+`
					}
				}
			}`); got != want {
				t.Errorf("writeAsVSCodeSettings = %v, want %v", got, want)
			}
		})
	}
}

func normalize(t *testing.T, in string) string {
	t.Helper()
	cmd := exec.Command("jq")
	cmd.Stdin = strings.NewReader(in)
	stderr := new(bytes.Buffer)
	cmd.Stderr = stderr

	out, err := cmd.Output()
	if err != nil {
		t.Fatalf("%s\n%s\nfailed to run jq: %v", in, stderr, err)
	}
	return string(out)
}
