github.com/april1989/origin-go-tools@v0.0.32/internal/lsp/completion_test.go (about) 1 package lsp 2 3 import ( 4 "strings" 5 "testing" 6 7 "github.com/april1989/origin-go-tools/internal/lsp/protocol" 8 "github.com/april1989/origin-go-tools/internal/lsp/source" 9 "github.com/april1989/origin-go-tools/internal/lsp/tests" 10 "github.com/april1989/origin-go-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.UnimportedCompletion = 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.Placeholders = placeholders 33 opts.DeepCompletion = true 34 opts.Matcher = source.Fuzzy 35 opts.UnimportedCompletion = 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.UnimportedCompletion = 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.UnimportedCompletion = 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.UnimportedCompletion = 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.UnimportedCompletion = 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 := original 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 }