all repos

clerk @ 25c8f80

missing tooling for ledger/hledger

clerk/internal/lsp/textdocument_document_symbol_test.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
feat: config (#6), 1 month ago
1
package lsp
2
3
import (
4
	"fmt"
5
	"strings"
6
	"testing"
7
	"time"
8
9
	"go.lsp.dev/protocol"
10
	"go.lsp.dev/uri"
11
12
	"olexsmir.xyz/clerk/internal/testutil/golden"
13
)
14
15
func TestGolden_DocumentSymbols(t *testing.T) {
16
	ar := golden.Read(t, "document-symbol")
17
	h := newTxtarHarness(t, ar)
18
19
	res, err := h.srv.DocumentSymbol(t.Context(), &protocol.DocumentSymbolParams{
20
		TextDocument: protocol.TextDocumentIdentifier{URI: h.uri},
21
	})
22
	if err != nil {
23
		t.Fatal(err)
24
	}
25
	list, ok := res.(protocol.DocumentSymbolSlice)
26
	if !ok {
27
		t.Fatalf("DocumentSymbol returned %T, want DocumentSymbolSlice", res)
28
	}
29
	var b strings.Builder
30
	for _, sym := range list {
31
		r, sel := sym.Range, sym.SelectionRange
32
		fmt.Fprintf(&b, "%q %s %d:%d-%d:%d %d:%d-%d:%d\n", sym.Name, symbolKindName(sym.Kind),
33
			r.Start.Line, r.Start.Character, r.End.Line, r.End.Character,
34
			sel.Start.Line, sel.Start.Character, sel.End.Line, sel.End.Character)
35
	}
36
	golden.Assert(t, ar, b.String())
37
}
38
39
func BenchmarkDocumentSymbol(b *testing.B) {
40
	content := openJournal(b, "../../journal/testdata/journals/actual-1ktxns-100accts.journal")
41
42
	srv := newServer(b)
43
	u := uri.URI("file:///test.journal")
44
	srv.server.openDoc(u, content, 1, "journal")
45
	srv.server.analysisFor(u) // warm the per-doc cache
46
47
	params := &protocol.DocumentSymbolParams{
48
		TextDocument: protocol.TextDocumentIdentifier{URI: u},
49
	}
50
51
	// warm up: assert the outline is populated
52
	res, err := srv.server.DocumentSymbol(b.Context(), params)
53
	if err != nil {
54
		b.Fatal(err)
55
	}
56
	list, ok := res.(protocol.DocumentSymbolSlice)
57
	if !ok || len(list) == 0 {
58
		b.Fatalf("DocumentSymbol returned %T with %d symbols, want non-empty slice", res, len(list))
59
	}
60
61
	b.ReportAllocs()
62
	b.ResetTimer()
63
	for b.Loop() {
64
		if _, err := srv.server.DocumentSymbol(b.Context(), params); err != nil {
65
			b.Fatal(err)
66
		}
67
	}
68
69
	// guard: documentSymbol maps every entry per request; a whole-file
70
	// re-parse or quadratic scan must be caught
71
	if avg := b.Elapsed() / time.Duration(b.N); avg > 5*time.Millisecond {
72
		b.Fatalf("documentSymbol %v/op: regression", avg)
73
	}
74
}