open-code-review/internal/suggestdiff/diff_test.go
kite 98fe309f03 test: add unit tests for pure logic functions across 6 packages
Add table-driven tests for pure computation functions with no external
dependencies, improving overall coverage from 45.9% to 48.8%.

Covered functions:
- suggestdiff: ComputeLineDiff (LCS algorithm)
- tool: CommentCollector, DiffMap, FileReadDiff, Registry, ParseReviewMode, scanLines
- llmloop: CountMessagesTokens, groupIntoRounds, partitionMessages, StripMarkdownFences
- agent: buildFilterCommentsJSON, parseFilterResponse, extFromPath, formatToolDefs, BuildToolDefs
- viewer: truncateText, formatDuration, formatTime
2026-06-26 22:41:35 +08:00

127 lines
2.6 KiB
Go

package suggestdiff
import (
"testing"
)
func TestComputeLineDiff(t *testing.T) {
tests := []struct {
name string
old []string
new []string
wantLen int
wantAdds int
wantDels int
}{
{
name: "both empty",
old: nil,
new: nil,
wantLen: 0,
wantAdds: 0,
wantDels: 0,
},
{
name: "identical single line",
old: []string{"hello"},
new: []string{"hello"},
wantLen: 1,
wantAdds: 0,
wantDels: 0,
},
{
name: "add lines to empty",
old: []string{},
new: []string{"a", "b"},
wantLen: 2,
wantAdds: 2,
wantDels: 0,
},
{
name: "delete all lines",
old: []string{"a", "b"},
new: []string{},
wantLen: 2,
wantAdds: 0,
wantDels: 2,
},
{
name: "replace single line",
old: []string{"old"},
new: []string{"new"},
wantLen: 2,
wantAdds: 1,
wantDels: 1,
},
{
name: "insert in middle",
old: []string{"a", "c"},
new: []string{"a", "b", "c"},
wantLen: 3,
wantAdds: 1,
wantDels: 0,
},
{
name: "delete from middle",
old: []string{"a", "b", "c"},
new: []string{"a", "c"},
wantLen: 3,
wantAdds: 0,
wantDels: 1,
},
{
name: "case insensitive match with whitespace",
old: []string{" Hello "},
new: []string{"hello"},
wantLen: 1,
wantAdds: 0,
wantDels: 0,
},
{
name: "multi-line edit",
old: []string{"func main() {", " fmt.Println(\"old\")", "}"},
new: []string{"func main() {", " fmt.Println(\"new\")", " return", "}"},
wantLen: 5,
wantAdds: 2,
wantDels: 1,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := ComputeLineDiff(tt.old, tt.new)
if len(got) != tt.wantLen {
t.Errorf("len = %d, want %d; diff = %v", len(got), tt.wantLen, got)
}
var adds, dels int
for _, l := range got {
switch l.Type {
case DiffAdded:
adds++
case DiffDeleted:
dels++
}
}
if adds != tt.wantAdds {
t.Errorf("adds = %d, want %d", adds, tt.wantAdds)
}
if dels != tt.wantDels {
t.Errorf("dels = %d, want %d", dels, tt.wantDels)
}
})
}
}
func TestComputeLineDiff_ContextContent(t *testing.T) {
old := []string{"a", "b", "c"}
new := []string{"a", "x", "c"}
got := ComputeLineDiff(old, new)
if got[0].Type != DiffContext || got[0].Content != "a" {
t.Errorf("first line should be context 'a', got %+v", got[0])
}
last := got[len(got)-1]
if last.Type != DiffContext || last.Content != "c" {
t.Errorf("last line should be context 'c', got %+v", last)
}
}