internal/store/symbols_test.go
93 lines · 2680 bytes
4 symbols in this file
1package store
2
3import (
4 "strings"
5 "testing"
6)
7
8func symbolFixture(t *testing.T) (*Store, int64) {
9 t.Helper()
10 s := open(t)
11 if err := s.MigrateUp(); err != nil {
12 t.Fatal(err)
13 }
14 uid, err := s.CreateUser("alice", false)
15 if err != nil {
16 t.Fatal(err)
17 }
18 repoID, err := s.CreateRepo("user", uid, "app", "public")
19 if err != nil {
20 t.Fatal(err)
21 }
22 idx, err := s.ReplaceSymbolIndex(SymbolIndex{RepoID: repoID, Commit: "c", Tree: "t", State: "ok"}, []SymbolRow{
23 {Name: "handlers", Key: "handlers", Kind: "var", Path: "b.go", Line: 1},
24 {Name: "Server.Handle", Key: "Handle", Kind: "method", Path: "a.go", Line: 9},
25 {Name: "Handle", Key: "Handle", Kind: "function", Path: "z.go", Line: 3},
26 {Name: "handle", Key: "handle", Kind: "function", Path: "c.go", Line: 2},
27 {Name: "HandleFunc", Key: "HandleFunc", Kind: "function", Path: "a.go", Line: 20},
28 {Name: "Other", Key: "Other", Kind: "type", Path: "a.go", Line: 30},
29 })
30 if err != nil {
31 t.Fatal(err)
32 }
33 return s, idx
34}
35
36func symbolNames(rows []SymbolRow) string {
37 var out []string
38 for _, r := range rows {
39 out = append(out, r.Name)
40 }
41 return strings.Join(out, " ")
42}
43
44// Exact before prefix, case-sensitive before not, then by name; a method
45// matches on the name it is called by as well as Type.Method.
46func TestSearchSymbolsRanks(t *testing.T) {
47 s, idx := symbolFixture(t)
48 rows, err := s.SearchSymbols(idx, "Handle", "", 0, 0)
49 if err != nil {
50 t.Fatal(err)
51 }
52 if got, want := symbolNames(rows), "Handle Server.Handle HandleFunc handle handlers"; got != want {
53 t.Fatalf("got %q, want %q", got, want)
54 }
55 rows, _ = s.SearchSymbols(idx, "Handle", "method", 0, 0)
56 if got := symbolNames(rows); got != "Server.Handle" {
57 t.Fatalf("kind filter: %q", got)
58 }
59 rows, _ = s.SearchSymbols(idx, "server.", "", 0, 0)
60 if got := symbolNames(rows); got != "Server.Handle" {
61 t.Fatalf("Type. prefix: %q", got)
62 }
63
64 // Paging walks the same order without repeats.
65 var paged []SymbolRow
66 var after int64
67 for {
68 page, err := s.SearchSymbols(idx, "handle", "", 2, after)
69 if err != nil {
70 t.Fatal(err)
71 }
72 if len(page) == 0 {
73 break
74 }
75 paged = append(paged, page...)
76 after = page[len(page)-1].ID
77 }
78 all, _ := s.SearchSymbols(idx, "handle", "", 0, 0)
79 if symbolNames(paged) != symbolNames(all) || len(all) != 5 {
80 t.Fatalf("paged %q, all %q", symbolNames(paged), symbolNames(all))
81 }
82}
83
84func TestSymbolTargets(t *testing.T) {
85 s, idx := symbolFixture(t)
86 got, err := s.SymbolTargets(idx, []string{"Handle", "Other", "missing"})
87 if err != nil {
88 t.Fatal(err)
89 }
90 if len(got) != 2 || got["Handle"].Count != 2 || got["Other"] != (SymbolTarget{1, "a.go", 30}) {
91 t.Fatalf("targets = %+v", got)
92 }
93}