Files
Artem Lytkin f6e276c1e7 diff kitten: Fix search missing matches at the end of a line
find_matches_in_lines was passing the exclusive end offset of a match to
find_pos, so a match ending at the end of the joined screen lines mapped
to no line and was dropped. It was not highlighted, not counted and n/N
skipped it. Since screen lines are not padded, this hit any match on the
last character of a line, for example searching for foo in "x := foo".

Look up the line holding the last matched byte instead.
2026-09-27 12:39:13 +03:00

40 lines
1.1 KiB
Go

// License: GPLv3 Copyright: 2026, Kovid Goyal, <kovid at kovidgoyal.net>
package diff
import (
"regexp"
"testing"
"github.com/google/go-cmp/cmp"
)
func TestDiffSearchFindMatches(t *testing.T) {
wrapped := []string{"abc def ", "ghi rows"}
for _, tc := range []struct {
pat string
lines []string
origin int
expected [][3]int
}{
{"foo", []string{"x := foo"}, 0, [][3]int{{0, 5, 3}}},
{"o", []string{"foo"}, 0, [][3]int{{0, 1, 1}, {0, 2, 1}}},
{"rows", wrapped, 0, [][3]int{{1, 4, 4}}},
{"def ghi", wrapped, 0, [][3]int{{0, 4, 4}, {1, 0, 3}}},
{"def ", wrapped, 0, [][3]int{{0, 4, 4}}},
{"foo", []string{"日本 foo"}, 0, [][3]int{{0, 5, 3}}},
{"foo", []string{"x := foo"}, 7, [][3]int{{0, 12, 3}}},
} {
s := &Search{pat: regexp.MustCompile(tc.pat)}
var actual [][3]int
s.find_matches_in_lines(tc.lines, tc.origin, func(screen_line, offset, size int) {
if size > 0 {
actual = append(actual, [3]int{screen_line, offset, size})
}
})
if diff := cmp.Diff(tc.expected, actual); diff != "" {
t.Errorf("Unexpected matches for %#v in %#v:\n%s", tc.pat, tc.lines, diff)
}
}
}