summaryrefslogtreecommitdiff
path: root/internal/lsp/init_and_trigger_test.go
blob: 2c5cd62f61fa3485106feee55c3d5c9a40e49921 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package lsp

import (
	"bytes"
	"encoding/json"
	"io"
	"log"
	"testing"
)

func TestHandleInitialize_Capabilities(t *testing.T) {
	var out bytes.Buffer
	s := newTestServer()
	s.logger = log.New(io.Discard, "", 0)
	s.out = &out
	cfg := s.cfg
	cfg.TriggerCharacters = []string{".", ":"}
	s.cfg = cfg
	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()
	cfg := s.cfg
	cfg.TriggerCharacters = []string{".", ":"}
	s.cfg = cfg
	// 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")
	}
}