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  }