summaryrefslogtreecommitdiff
path: root/internal/lsp/init_and_trigger_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/lsp/init_and_trigger_test.go')
-rw-r--r--internal/lsp/init_and_trigger_test.go104
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")
+ }
}