all repos

clerk @ 2298caf

missing tooling for ledger/hledger

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

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
lsp: textdocument/foldingRange, 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_FoldingRange(t *testing.T) {
16
	ar := golden.Read(t, "folding-range")
17
	h := newTxtarHarness(t, ar)
18
19
	res, err := h.srv.FoldingRange(t.Context(), &protocol.FoldingRangeParams{
20
		TextDocument: protocol.TextDocumentIdentifier{URI: h.uri},
21
	})
22
	if err != nil {
23
		t.Fatal(err)
24
	}
25
26
	var b strings.Builder
27
	for _, r := range res {
28
		fmt.Fprintf(&b, "%d-%d %s\n", r.StartLine, r.EndLine, r.Kind)
29
	}
30
	golden.Assert(t, ar, b.String())
31
}
32
33
func BenchmarkFoldingRange(b *testing.B) {
34
	content := openJournal(b, "../../journal/testdata/journals/actual-1ktxns-100accts.journal")
35
36
	srv := newServer(b)
37
	u := uri.URI("file:///test.journal")
38
	srv.server.openDoc(u, content, 1, "journal")
39
	srv.server.analysisFor(u) // warm the per-doc cache
40
41
	params := &protocol.FoldingRangeParams{
42
		TextDocument: protocol.TextDocumentIdentifier{URI: u},
43
	}
44
45
	// warm up: assert the ranges are populated
46
	res, err := srv.server.FoldingRange(b.Context(), params)
47
	if err != nil {
48
		b.Fatal(err)
49
	}
50
	if len(res) == 0 {
51
		b.Fatalf("FoldingRange returned 0 ranges")
52
	}
53
54
	b.ReportAllocs()
55
	b.ResetTimer()
56
	for b.Loop() {
57
		if _, err := srv.server.FoldingRange(b.Context(), params); err != nil {
58
			b.Fatal(err)
59
		}
60
	}
61
62
	// guard: folding iterates the AST once per request; a whole-file
63
	// re-parse or quadratic scan must be caught
64
	if avg := b.Elapsed() / time.Duration(b.N); avg > 5*time.Millisecond {
65
		b.Fatalf("foldingRange %v/op: regression", avg)
66
	}
67
}