summaryrefslogtreecommitdiff
path: root/internal/lsp/document_handlers_test.go
blob: bb12dd26c77d077878909b576499b63a7962ac1c (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
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}
    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}
    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}
    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) }
}