diff options
Diffstat (limited to 'internal/lsp/init_and_trigger_test.go')
| -rw-r--r-- | internal/lsp/init_and_trigger_test.go | 104 |
1 files changed, 63 insertions, 41 deletions
diff --git a/internal/lsp/init_and_trigger_test.go b/internal/lsp/init_and_trigger_test.go index 64253a9..10c04fd 100644 --- a/internal/lsp/init_and_trigger_test.go +++ b/internal/lsp/init_and_trigger_test.go @@ -1,51 +1,73 @@ package lsp import ( - "bytes" - "encoding/json" - "io" - "log" - "testing" + "bytes" + "encoding/json" + "io" + "log" + "testing" ) func TestHandleInitialize_Capabilities(t *testing.T) { - var out bytes.Buffer - s := &Server{logger: log.New(io.Discard, "", 0), docs: make(map[string]*document), out: &out} - s.triggerChars = []string{".", ":"} - req := Request{JSONRPC: "2.0", ID: json.RawMessage("7"), Method: "initialize"} - out.Reset() - s.handleInitialize(req) - resp := captureResponse(t, &out) - var init InitializeResult - b, _ := json.Marshal(resp.Result) - if err := json.Unmarshal(b, &init); err != nil { t.Fatalf("decode init: %v", err) } - if init.Capabilities.CodeActionProvider == nil { t.Fatalf("expected codeActionProvider") } - // CodeActionProvider is any; re-marshal to struct - var cap struct{ ResolveProvider bool `json:"resolveProvider"` } - cb, _ := json.Marshal(init.Capabilities.CodeActionProvider) - _ = json.Unmarshal(cb, &cap) - if !cap.ResolveProvider { t.Fatalf("expected resolveProvider=true") } - if init.Capabilities.CompletionProvider == nil || len(init.Capabilities.CompletionProvider.TriggerCharacters) == 0 { - t.Fatalf("expected trigger characters") } + var out bytes.Buffer + s := &Server{logger: log.New(io.Discard, "", 0), docs: make(map[string]*document), out: &out} + s.triggerChars = []string{".", ":"} + req := Request{JSONRPC: "2.0", ID: json.RawMessage("7"), Method: "initialize"} + out.Reset() + s.handleInitialize(req) + resp := captureResponse(t, &out) + var init InitializeResult + b, _ := json.Marshal(resp.Result) + if err := json.Unmarshal(b, &init); err != nil { + t.Fatalf("decode init: %v", err) + } + if init.Capabilities.CodeActionProvider == nil { + t.Fatalf("expected codeActionProvider") + } + // CodeActionProvider is any; re-marshal to struct + var cap struct { + ResolveProvider bool `json:"resolveProvider"` + } + cb, _ := json.Marshal(init.Capabilities.CodeActionProvider) + _ = json.Unmarshal(cb, &cap) + if !cap.ResolveProvider { + t.Fatalf("expected resolveProvider=true") + } + if init.Capabilities.CompletionProvider == nil || len(init.Capabilities.CompletionProvider.TriggerCharacters) == 0 { + t.Fatalf("expected trigger characters") + } } func TestIsTriggerEvent_Variants(t *testing.T) { - s := newTestServer() - s.triggerChars = []string{".", ":"} - // 1) Manual invoke via context - ctx := struct{ TriggerKind int `json:"triggerKind"` }{TriggerKind:1} - raw, _ := json.Marshal(ctx) - p := CompletionParams{Position: Position{Line:0, Character:1}, Context: json.RawMessage(raw)} - if !s.isTriggerEvent(p, "a") { t.Fatalf("manual invoke should trigger") } - // 2) TriggerCharacter present and allowed - ctx2 := struct{ TriggerKind int `json:"triggerKind"`; TriggerCharacter string `json:"triggerCharacter"` }{TriggerKind:2, TriggerCharacter: "."} - raw2, _ := json.Marshal(ctx2) - p2 := CompletionParams{Position: Position{Line:0, Character:1}, Context: json.RawMessage(raw2)} - if !s.isTriggerEvent(p2, "a.") { t.Fatalf("trigger char should trigger") } - // 3) Fallback char left of cursor - p3 := CompletionParams{Position: Position{Line:0, Character:3}} - if !s.isTriggerEvent(p3, "ab:") { t.Fatalf("fallback char should trigger") } - // 4) Bare double-open disables trigger - p4 := CompletionParams{Position: Position{Line:0, Character:2}} - if s.isTriggerEvent(p4, ">>") { t.Fatalf("bare double-open should not trigger") } + s := newTestServer() + s.triggerChars = []string{".", ":"} + // 1) Manual invoke via context + ctx := struct { + TriggerKind int `json:"triggerKind"` + }{TriggerKind: 1} + raw, _ := json.Marshal(ctx) + p := CompletionParams{Position: Position{Line: 0, Character: 1}, Context: json.RawMessage(raw)} + if !s.isTriggerEvent(p, "a") { + t.Fatalf("manual invoke should trigger") + } + // 2) TriggerCharacter present and allowed + ctx2 := struct { + TriggerKind int `json:"triggerKind"` + TriggerCharacter string `json:"triggerCharacter"` + }{TriggerKind: 2, TriggerCharacter: "."} + raw2, _ := json.Marshal(ctx2) + p2 := CompletionParams{Position: Position{Line: 0, Character: 1}, Context: json.RawMessage(raw2)} + if !s.isTriggerEvent(p2, "a.") { + t.Fatalf("trigger char should trigger") + } + // 3) Fallback char left of cursor + p3 := CompletionParams{Position: Position{Line: 0, Character: 3}} + if !s.isTriggerEvent(p3, "ab:") { + t.Fatalf("fallback char should trigger") + } + // 4) Bare double-open disables trigger + p4 := CompletionParams{Position: Position{Line: 0, Character: 2}} + if s.isTriggerEvent(p4, ">>") { + t.Fatalf("bare double-open should not trigger") + } } |
