diff options
| author | Paul Buetow <paul@buetow.org> | 2025-09-04 16:04:58 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-09-04 16:04:58 +0300 |
| commit | bf53cf2a673af254d7a08bc3b2ab815a08f66117 (patch) | |
| tree | 3c29faaaaa6777d9a9346c90bc7cba88978d8477 /internal/lsp/init_and_trigger_test.go | |
| parent | 448d4b169904cfd6e1f701524539a27d8de18734 (diff) | |
tests: add shared test fixtures, expand provider breadth (multi-choice, error bodies), add LSP rewrite/diagnostics realism and table-driven tests
Diffstat (limited to 'internal/lsp/init_and_trigger_test.go')
| -rw-r--r-- | internal/lsp/init_and_trigger_test.go | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/internal/lsp/init_and_trigger_test.go b/internal/lsp/init_and_trigger_test.go new file mode 100644 index 0000000..cdc907e --- /dev/null +++ b/internal/lsp/init_and_trigger_test.go @@ -0,0 +1,52 @@ +package lsp + +import ( + "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") } +} + +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 ';;' disables trigger + p4 := CompletionParams{Position: Position{Line:0, Character:2}} + if s.isTriggerEvent(p4, ";;") { t.Fatalf("bare ;; should not trigger") } +} + |
