--- /dev/null
+// Copyright 2020 The Go 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 source
+
+import (
+ "testing"
+ "time"
+)
+
+func TestSetOption(t *testing.T) {
+ tests := []struct {
+ name string
+ value interface{}
+ wantError bool
+ check func(Options) bool
+ }{
+ {
+ name: "symbolStyle",
+ value: "dynamic",
+ check: func(o Options) bool { return o.SymbolStyle == DynamicSymbols },
+ },
+ {
+ name: "symbolStyle",
+ value: "",
+ wantError: true,
+ check: func(o Options) bool { return o.SymbolStyle == "" },
+ },
+ {
+ name: "symbolStyle",
+ value: false,
+ wantError: true,
+ check: func(o Options) bool { return o.SymbolStyle == "" },
+ },
+ {
+ name: "symbolMatcher",
+ value: "caseInsensitive",
+ check: func(o Options) bool { return o.SymbolMatcher == SymbolCaseInsensitive },
+ },
+ {
+ name: "completionBudget",
+ value: "2s",
+ check: func(o Options) bool { return o.CompletionBudget == 2*time.Second },
+ },
+ {
+ name: "staticcheck",
+ value: true,
+ check: func(o Options) bool { return o.Staticcheck == true },
+ },
+ {
+ name: "codelens",
+ value: map[string]interface{}{"generate": true},
+ check: func(o Options) bool { return o.Codelens["generate"] },
+ },
+ {
+ name: "allExperiments",
+ value: true,
+ check: func(o Options) bool {
+ return true // just confirm that we handle this setting
+ },
+ },
+ }
+
+ for _, test := range tests {
+ var opts Options
+ result := opts.set(test.name, test.value)
+ if (result.Error != nil) != test.wantError {
+ t.Fatalf("Options.set(%q, %v): result.Error = %v, want error: %t", test.name, test.value, result.Error, test.wantError)
+ }
+ // TODO: this could be made much better using cmp.Diff, if that becomes
+ // available in this module.
+ if !test.check(opts) {
+ t.Errorf("Options.set(%q, %v): unexpected result %+v", test.name, test.value, opts)
+ }
+ }
+}