// 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) } }) } }