blob: 7147347907848e3b327375011979bc511d01cf80 [file] [log] [blame]
// 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)
}