Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201105173854-bc9fc8d8c4bc / internal / lsp / completion_test.go
1 package lsp
2
3 import (
4         "strings"
5         "testing"
6
7         "golang.org/x/tools/internal/lsp/protocol"
8         "golang.org/x/tools/internal/lsp/source"
9         "golang.org/x/tools/internal/lsp/tests"
10         "golang.org/x/tools/internal/span"
11 )
12
13 func (r *runner) Completion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) {
14         got := r.callCompletion(t, src, func(opts *source.Options) {
15                 opts.DeepCompletion = false
16                 opts.Matcher = source.CaseInsensitive
17                 opts.CompleteUnimported = false
18                 opts.InsertTextFormat = protocol.SnippetTextFormat
19                 if !strings.Contains(string(src.URI()), "literal") {
20                         opts.LiteralCompletions = false
21                 }
22         })
23         got = tests.FilterBuiltins(src, got)
24         want := expected(t, test, items)
25         if diff := tests.DiffCompletionItems(want, got); diff != "" {
26                 t.Errorf("%s", diff)
27         }
28 }
29
30 func (r *runner) CompletionSnippet(t *testing.T, src span.Span, expected tests.CompletionSnippet, placeholders bool, items tests.CompletionItems) {
31         list := r.callCompletion(t, src, func(opts *source.Options) {
32                 opts.UsePlaceholders = placeholders
33                 opts.DeepCompletion = true
34                 opts.Matcher = source.Fuzzy
35                 opts.CompleteUnimported = false
36         })
37         got := tests.FindItem(list, *items[expected.CompletionItem])
38         want := expected.PlainSnippet
39         if placeholders {
40                 want = expected.PlaceholderSnippet
41         }
42         if diff := tests.DiffSnippets(want, got); diff != "" {
43                 t.Errorf("%s", diff)
44         }
45 }
46
47 func (r *runner) UnimportedCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) {
48         got := r.callCompletion(t, src, func(opts *source.Options) {})
49         got = tests.FilterBuiltins(src, got)
50         want := expected(t, test, items)
51         if diff := tests.CheckCompletionOrder(want, got, false); diff != "" {
52                 t.Errorf("%s", diff)
53         }
54 }
55
56 func (r *runner) DeepCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) {
57         got := r.callCompletion(t, src, func(opts *source.Options) {
58                 opts.DeepCompletion = true
59                 opts.Matcher = source.CaseInsensitive
60                 opts.CompleteUnimported = false
61         })
62         got = tests.FilterBuiltins(src, got)
63         want := expected(t, test, items)
64         if msg := tests.DiffCompletionItems(want, got); msg != "" {
65                 t.Errorf("%s", msg)
66         }
67 }
68
69 func (r *runner) FuzzyCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) {
70         got := r.callCompletion(t, src, func(opts *source.Options) {
71                 opts.DeepCompletion = true
72                 opts.Matcher = source.Fuzzy
73                 opts.CompleteUnimported = false
74         })
75         got = tests.FilterBuiltins(src, got)
76         want := expected(t, test, items)
77         if msg := tests.DiffCompletionItems(want, got); msg != "" {
78                 t.Errorf("%s", msg)
79         }
80 }
81
82 func (r *runner) CaseSensitiveCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) {
83         got := r.callCompletion(t, src, func(opts *source.Options) {
84                 opts.Matcher = source.CaseSensitive
85                 opts.CompleteUnimported = false
86         })
87         got = tests.FilterBuiltins(src, got)
88         want := expected(t, test, items)
89         if msg := tests.DiffCompletionItems(want, got); msg != "" {
90                 t.Errorf("%s", msg)
91         }
92 }
93
94 func (r *runner) RankCompletion(t *testing.T, src span.Span, test tests.Completion, items tests.CompletionItems) {
95         got := r.callCompletion(t, src, func(opts *source.Options) {
96                 opts.DeepCompletion = true
97                 opts.Matcher = source.Fuzzy
98                 opts.CompleteUnimported = false
99                 opts.LiteralCompletions = true
100         })
101         want := expected(t, test, items)
102         if msg := tests.CheckCompletionOrder(want, got, true); msg != "" {
103                 t.Errorf("%s", msg)
104         }
105 }
106
107 func expected(t *testing.T, test tests.Completion, items tests.CompletionItems) []protocol.CompletionItem {
108         t.Helper()
109
110         var want []protocol.CompletionItem
111         for _, pos := range test.CompletionItems {
112                 item := items[pos]
113                 want = append(want, tests.ToProtocolCompletionItem(*item))
114         }
115         return want
116 }
117
118 func (r *runner) callCompletion(t *testing.T, src span.Span, options func(*source.Options)) []protocol.CompletionItem {
119         t.Helper()
120
121         view, err := r.server.session.ViewOf(src.URI())
122         if err != nil {
123                 t.Fatal(err)
124         }
125         original := view.Options()
126         modified := view.Options().Clone()
127         options(modified)
128         view, err = view.SetOptions(r.ctx, modified)
129         if err != nil {
130                 t.Error(err)
131                 return nil
132         }
133         defer view.SetOptions(r.ctx, original)
134
135         list, err := r.server.Completion(r.ctx, &protocol.CompletionParams{
136                 TextDocumentPositionParams: protocol.TextDocumentPositionParams{
137                         TextDocument: protocol.TextDocumentIdentifier{
138                                 URI: protocol.URIFromSpanURI(src.URI()),
139                         },
140                         Position: protocol.Position{
141                                 Line:      float64(src.Start().Line() - 1),
142                                 Character: float64(src.Start().Column() - 1),
143                         },
144                 },
145         })
146         if err != nil {
147                 t.Fatal(err)
148         }
149         return list.Items
150 }