| // 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) |
| } |