// Copyright 2019 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package fuzzy_test import ( "bytes" "sort" "testing" "golang.org/x/tools/internal/lsp/fuzzy" ) var rolesTests = []struct { str string want string }{ {str: "abc::def::goo", want: "Ccc//Ccc//Ccc"}, {str: "proto::Message", want: "Ccccc//Ccccccc"}, {str: "AbstractSWTFactory", want: "CcccccccCuuCcccccc"}, {str: "Abs012", want: "Cccccc"}, {str: "/", want: " "}, {str: "fOO", want: "CCu"}, {str: "fo_oo.o_oo", want: "Cc Cc/C Cc"}, } func rolesString(roles []fuzzy.RuneRole) string { var buf bytes.Buffer for _, r := range roles { buf.WriteByte(" /cuC"[int(r)]) } return buf.String() } func TestRoles(t *testing.T) { for _, tc := range rolesTests { gotRoles := make([]fuzzy.RuneRole, len(tc.str)) fuzzy.RuneRoles(tc.str, gotRoles) got := rolesString(gotRoles) if got != tc.want { t.Errorf("roles(%s) = %v; want %v", tc.str, got, tc.want) } } } var wordSplitTests = []struct { input string want []string }{ { input: "foo bar baz", want: []string{"foo", "bar", "baz"}, }, { input: "fooBarBaz", want: []string{"foo", "Bar", "Baz"}, }, { input: "FOOBarBAZ", want: []string{"FOO", "Bar", "BAZ"}, }, { input: "foo123_bar2Baz3", want: []string{"foo123", "bar2", "Baz3"}, }, } func TestWordSplit(t *testing.T) { for _, tc := range wordSplitTests { roles := fuzzy.RuneRoles(tc.input, nil) var got []string consumer := func(i, j int) { got = append(got, tc.input[i:j]) } fuzzy.Words(roles, consumer) if eq := diffStringLists(tc.want, got); !eq { t.Errorf("input %v: (want %v -> got %v)", tc.input, tc.want, got) } } } func diffStringLists(a, b []string) bool { if len(a) != len(b) { return false } sort.Strings(a) sort.Strings(b) for i := range a { if a[i] != b[i] { return false } } return true } var lastSegmentSplitTests = []struct { str string want string }{ { str: "identifier", want: "identifier", }, { str: "two_words", want: "two_words", }, { str: "first::second", want: "second", }, { str: "foo.bar.FOOBar_buz123_test", want: "FOOBar_buz123_test", }, } func TestLastSegment(t *testing.T) { for _, tc := range lastSegmentSplitTests { roles := fuzzy.RuneRoles(tc.str, nil) got := fuzzy.LastSegment(tc.str, roles) if got != tc.want { t.Errorf("str %v: want %v; got %v", tc.str, tc.want, got) } } } func BenchmarkRoles(b *testing.B) { str := "AbstractSWTFactory" out := make([]fuzzy.RuneRole, len(str)) for i := 0; i < b.N; i++ { fuzzy.RuneRoles(str, out) } b.SetBytes(int64(len(str))) }