@@ -0,0 +1,68 @@
1+package util
2+
3+import (
4+ "testing"
5+
6+ "github.com/stretchr/testify/require"
7+
8+ "github.com/charmbracelet/x/powernap/pkg/lsp/protocol"
9+)
10+
11+func TestRangesOverlap(t *testing.T) {
12+ t.Parallel()
13+
14+ tests := []struct {
15+ name string
16+ r1 protocol.Range
17+ r2 protocol.Range
18+ want bool
19+ }{
20+ {
21+ name: "adjacent ranges do not overlap",
22+ r1: protocol.Range{
23+ Start: protocol.Position{Line: 0, Character: 0},
24+ End: protocol.Position{Line: 0, Character: 5},
25+ },
26+ r2: protocol.Range{
27+ Start: protocol.Position{Line: 0, Character: 5},
28+ End: protocol.Position{Line: 0, Character: 10},
29+ },
30+ want: false,
31+ },
32+ {
33+ name: "overlapping ranges",
34+ r1: protocol.Range{
35+ Start: protocol.Position{Line: 0, Character: 0},
36+ End: protocol.Position{Line: 0, Character: 8},
37+ },
38+ r2: protocol.Range{
39+ Start: protocol.Position{Line: 0, Character: 5},
40+ End: protocol.Position{Line: 0, Character: 10},
41+ },
42+ want: true,
43+ },
44+ {
45+ name: "non-overlapping with gap",
46+ r1: protocol.Range{
47+ Start: protocol.Position{Line: 0, Character: 0},
48+ End: protocol.Position{Line: 0, Character: 3},
49+ },
50+ r2: protocol.Range{
51+ Start: protocol.Position{Line: 0, Character: 7},
52+ End: protocol.Position{Line: 0, Character: 10},
53+ },
54+ want: false,
55+ },
56+ }
57+
58+ for _, tt := range tests {
59+ t.Run(tt.name, func(t *testing.T) {
60+ t.Parallel()
61+ got := rangesOverlap(tt.r1, tt.r2)
62+ require.Equal(t, tt.want, got, "rangesOverlap(r1, r2)")
63+ // Overlap should be symmetric
64+ got2 := rangesOverlap(tt.r2, tt.r1)
65+ require.Equal(t, tt.want, got2, "rangesOverlap(r2, r1) symmetry")
66+ })
67+ }
68+}