--- /dev/null
+// Copyright 2020 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 source
+
+import (
+ "strings"
+ "testing"
+)
+
+func TestParseQuery(t *testing.T) {
+ tests := []struct {
+ query, s string
+ wantMatch bool
+ }{
+ {"", "anything", false},
+ {"any", "anything", true},
+ {"any$", "anything", false},
+ {"ing$", "anything", true},
+ {"ing$", "anythinG", true},
+ {"inG$", "anything", false},
+ {"^any", "anything", true},
+ {"^any", "Anything", true},
+ {"^Any", "anything", false},
+ {"at", "anything", true},
+ // TODO: this appears to be a bug in the fuzzy matching algorithm. 'At'
+ // should cause a case-sensitive match.
+ // {"At", "anything", false},
+ {"At", "Anything", true},
+ {"'yth", "Anything", true},
+ {"'yti", "Anything", false},
+ {"'any 'thing", "Anything", true},
+ {"anythn nythg", "Anything", true},
+ {"ntx", "Anything", false},
+ {"anythn", "anything", true},
+ {"ing", "anything", true},
+ {"anythn nythgx", "anything", false},
+ }
+
+ for _, test := range tests {
+ matcher := parseQuery(test.query)
+ if score := matcher(test.s); score > 0 != test.wantMatch {
+ t.Errorf("parseQuery(%q) match for %q: %.2g, want match: %t", test.query, test.s, score, test.wantMatch)
+ }
+ }
+}
+
+func TestBestMatch(t *testing.T) {
+ tests := []struct {
+ desc string
+ symbol string
+ matcher matcherFunc
+ wantMatch string
+ wantScore float64
+ }{
+ {
+ desc: "shortest match",
+ symbol: "foo/bar/baz.quux",
+ matcher: func(string) float64 { return 1.0 },
+ wantMatch: "quux",
+ wantScore: 1.0,
+ },
+ {
+ desc: "partial match",
+ symbol: "foo/bar/baz.quux",
+ matcher: func(s string) float64 {
+ if strings.HasPrefix(s, "bar") {
+ return 1.0
+ }
+ return 0.0
+ },
+ wantMatch: "bar/baz.quux",
+ wantScore: 1.0,
+ },
+ {
+ desc: "longest match",
+ symbol: "foo/bar/baz.quux",
+ matcher: func(s string) float64 {
+ parts := strings.Split(s, "/")
+ return float64(len(parts))
+ },
+ wantMatch: "foo/bar/baz.quux",
+ wantScore: 3.0,
+ },
+ }
+
+ for _, test := range tests {
+ test := test
+ t.Run(test.desc, func(t *testing.T) {
+ gotMatch, gotScore := bestMatch(test.symbol, test.matcher)
+ if gotMatch != test.wantMatch || gotScore != test.wantScore {
+ t.Errorf("bestMatch(%q, matcher) = (%q, %.2g), want (%q, %.2g)", test.symbol, gotMatch, gotScore, test.wantMatch, test.wantScore)
+ }
+ })
+ }
+}