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