1package fuzzy
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7)
8
9func TestMatch(t *testing.T) {
10 tests := []struct {
11 name string
12 text string
13 query string
14 want Score
15 ok bool
16 }{
17 {name: "empty query", text: "work", query: "", want: Score{Kind: Exact}, ok: true},
18 {name: "exact", text: "work", query: "work", want: Score{Kind: Exact, Positions: []int{0, 1, 2, 3}, Span: 4}, ok: true},
19 {name: "prefix", text: "workspace", query: "wor", want: Score{Kind: Prefix, Positions: []int{0, 1, 2}, Span: 3}, ok: true},
20 {name: "subsequence", text: "a-b-c", query: "bc", want: Score{Kind: Subsequence, Positions: []int{2, 4}, Span: 3, First: 2}, ok: true},
21 {name: "runes not bytes", text: "été-x", query: "x", want: Score{Kind: Subsequence, Positions: []int{4}, Span: 1, First: 4}, ok: true},
22 {name: "no match", text: "work", query: "z", ok: false},
23 {name: "out of order", text: "ab", query: "ba", ok: false},
24 }
25 for _, tt := range tests {
26 t.Run(tt.name, func(t *testing.T) {
27 got, ok := Match(tt.text, tt.query, []rune(tt.query))
28 require.Equal(t, tt.ok, ok)
29 require.Equal(t, tt.want, got)
30 })
31 }
32}
33
34func TestLess(t *testing.T) {
35 tests := []struct {
36 name string
37 leftRank int
38 left Score
39 rightRank int
40 right Score
41 wantLess bool
42 wantGreater bool
43 }{
44 {name: "rank wins", leftRank: 0, left: Score{Span: 9}, rightRank: 1, right: Score{Span: 1}, wantLess: true},
45 {name: "span breaks rank tie", left: Score{Span: 2, First: 5}, right: Score{Span: 3}, wantLess: true},
46 {name: "first breaks span tie", left: Score{Span: 2, First: 1}, right: Score{Span: 2, First: 3}, wantLess: true},
47 {name: "equal", left: Score{Span: 2}, right: Score{Span: 2}},
48 }
49 for _, tt := range tests {
50 t.Run(tt.name, func(t *testing.T) {
51 require.Equal(t, tt.wantLess, Less(tt.leftRank, tt.left, tt.rightRank, tt.right))
52 require.Equal(t, tt.wantGreater, Less(tt.rightRank, tt.right, tt.leftRank, tt.left))
53 })
54 }
55}