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
|
package lsp
import (
"bytes"
"encoding/json"
"io"
"log"
"testing"
"time"
)
func TestDidOpenChangeClose_UpdateDocs(t *testing.T) {
s := newTestServer()
uri := "file:///x.go"
// didOpen
open := DidOpenTextDocumentParams{TextDocument: TextDocumentItem{URI: uri, Text: "a\n"}}
s.handleDidOpen(Request{JSONRPC: "2.0", Method: "textDocument/didOpen", Params: mustJSON(open)})
if s.getDocument(uri) == nil {
t.Fatalf("doc not opened")
}
// didChange
ch := DidChangeTextDocumentParams{TextDocument: VersionedTextDocumentIdentifier{URI: uri}, ContentChanges: []TextDocumentContentChangeEvent{{Text: "b\n"}}}
s.handleDidChange(Request{JSONRPC: "2.0", Method: "textDocument/didChange", Params: mustJSON(ch)})
if d := s.getDocument(uri); d == nil || d.text != "b\n" {
t.Fatalf("doc not changed")
}
// didClose
s.handleDidClose(Request{JSONRPC: "2.0", Method: "textDocument/didClose", Params: mustJSON(DidCloseTextDocumentParams{TextDocument: TextDocumentIdentifier{URI: uri}})})
if s.getDocument(uri) != nil {
t.Fatalf("doc not closed")
}
}
func TestClientShowDocument_WritesRequest(t *testing.T) {
var out bytes.Buffer
s := &Server{logger: log.New(io.Discard, "", 0), docs: make(map[string]*document), out: &out}
initServerDefaults(s)
uri := "file:///x.go"
sel := Range{Start: Position{Line: 1}, End: Position{Line: 2}}
out.Reset()
s.clientShowDocument(uri, &sel)
req := captureRequest(t, &out)
if req.Method != "window/showDocument" {
t.Fatalf("got %s", req.Method)
}
}
func TestHandleExecuteCommand_ShowDocument(t *testing.T) {
var out bytes.Buffer
s := &Server{logger: log.New(io.Discard, "", 0), docs: make(map[string]*document), out: &out}
initServerDefaults(s)
uri := "file:///x.go"
r := Range{Start: Position{Line: 0}, End: Position{Line: 0}}
args := []any{uri, r}
params := ExecuteCommandParams{Command: "hexai.showDocument", Arguments: args}
s.handleExecuteCommand(Request{JSONRPC: "2.0", ID: json.RawMessage("11"), Method: "workspace/executeCommand", Params: mustJSON(params)})
req := captureRequest(t, &out)
if req.Method != "window/showDocument" {
t.Fatalf("expected showDocument after executeCommand, got %s", req.Method)
}
}
func TestDeferShowDocument_WritesLater(t *testing.T) {
var out bytes.Buffer
s := &Server{logger: log.New(io.Discard, "", 0), docs: make(map[string]*document), out: &out}
initServerDefaults(s)
uri := "file:///x.go"
out.Reset()
s.deferShowDocument(uri, Range{Start: Position{Line: 0}, End: Position{Line: 0}})
// wait >120ms per implementation
time.Sleep(160 * time.Millisecond)
req := captureRequest(t, &out)
if req.Method != "window/showDocument" {
t.Fatalf("expected showDocument, got %s", req.Method)
}
}
|