--- /dev/null
+// 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)))
+}