all repos

clerk @ 2963f4c54119979c248426c02e700c05715604fb

missing tooling for ledger/hledger

clerk/internal/linter/linter_test.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
lsp: benchmark formatting and semantic tokens, 1 month ago
1
package linter
2
3
import (
4
	"strings"
5
	"testing"
6
7
	"olexsmir.xyz/clerk/internal/analyzer"
8
	"olexsmir.xyz/clerk/internal/testutil/golden"
9
	"olexsmir.xyz/clerk/journal"
10
)
11
12
var tests = map[string][]Rule{
13
	"correct":                  Rules,
14
	"invalid-include":          {&InvalidInclude{}},
15
	"empty-postings":           {&EmptyPostings{}},
16
	"parse-error":              {&ParseError{}},
17
	"omitted-precision":        {&OmittedPrecision{}},
18
	"missing-commodity":        {&MissingCommodity{}},
19
	"missing-status":           {&MissingStatus{}},
20
	"missing-payee":            {&MissingPayee{}},
21
	"account-depth":            {&AccountDepthLimit{MaxDepth: 3}},
22
	"multiple-omitted-amounts": {&MultipleOmittedAmounts{}},
23
	"orderdate":                {&OrderDate{}},
24
	"duplicated-account":       {&DuplicatedAccount{}},
25
	"duplicated-commodity":     {&DuplicatedCommodity{}},
26
	"duplicated-transaction":   {&DuplicatedTransaction{}},
27
	"duplicated-tag":           {&DuplicatedTag{}},
28
	"undeclared-tag":           {&UndeclaredTag{}},
29
	"undeclared-commodity":     {&UndeclaredCommodity{}},
30
	"undeclared-account":       {&UndeclaredAccount{}},
31
	"undeclared-payee":         {&UndeclaredPayee{}},
32
	"unbalanced-transaction":   {&UnbalancedTransaction{}},
33
	"unused-account":           {&UnusedAccount{}},
34
	"unused-tag":               {&UnusedTag{}},
35
	"invalid-date-tag":         {&InvalidDateTag{}},
36
	"invalid-type-tag":         {&InvalidTypeTag{}},
37
}
38
39
func TestLinter(t *testing.T) {
40
	for tname, trules := range tests {
41
		t.Run(tname, func(t *testing.T) {
42
			a := golden.Read(t, tname)
43
			fsys, err := a.FS()
44
			if err != nil {
45
				t.Fatal(err)
46
			}
47
48
			l := journal.NewLoader()
49
			rj, err := l.ResolveFS(fsys, "in.journal")
50
			if err != nil {
51
				t.Fatalf("failed to load test journal: %v", err)
52
			}
53
54
			ctx := analyzer.Build(rj)
55
			finds := NewLinter(trules).Run(ctx)
56
57
			var b strings.Builder
58
			Fprint(&b, PathBasename, finds)
59
			golden.Assert(t, a, b.String())
60
		})
61
	}
62
}
63
64
func BenchmarkLinter(b *testing.B) {
65
	ldr := journal.NewLoader()
66
	rj, err := ldr.Resolve("../../journal/testdata/journals/actual-1ktxns-100accts.journal")
67
	if err != nil {
68
		b.Fatalf("failed to load benchmark journal: %v", err)
69
	}
70
71
	ctx := analyzer.Build(rj)
72
	l := NewLinter(Rules)
73
74
	b.ResetTimer()
75
	b.ReportAllocs()
76
	for b.Loop() {
77
		l.Run(ctx)
78
	}
79
}