summaryrefslogtreecommitdiff
path: root/internal/lsp/init_and_trigger_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-09-04 16:04:58 +0300
committerPaul Buetow <paul@buetow.org>2025-09-04 16:04:58 +0300
commitbf53cf2a673af254d7a08bc3b2ab815a08f66117 (patch)
tree3c29faaaaa6777d9a9346c90bc7cba88978d8477 /internal/lsp/init_and_trigger_test.go
parent448d4b169904cfd6e1f701524539a27d8de18734 (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.go52
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") }
+}
+