package main import ( "fmt" "strings" "testing" "github.com/charmbracelet/x/ansi" ) func TestHighlightDiffAddsOldAndNewLineNumbers(t *testing.T) { lines := highlightDiff("main.go", "@@ -10,2 +20,2 @@\n unchanged\n-old\n+new", 20, 20, "RIGHT") rendered := make([]string, 0, len(lines)) for _, line := range lines { rendered = append(rendered, line.gutter+line.code) } plain := ansi.Strip(strings.Join(rendered, "\n")) for _, want := range []string{"20 unchanged", "11 - old", "21 + new"} { if !strings.Contains(plain, want) { t.Fatalf("diff did not contain %q:\n%s", want, plain) } } if !lines[1].selected { t.Fatal("reviewed line was not marked for background highlighting") } } func TestHighlightDiffOnlyShowsReviewedRangeAndContext(t *testing.T) { var hunk strings.Builder hunk.WriteString("@@ -1,30 +1,30 @@") for i := 1; i <= 30; i++ { fmt.Fprintf(&hunk, "\n line %d", i) } lines := highlightDiff("main.go", hunk.String(), 20, 20, "RIGHT") rendered := make([]string, 0, len(lines)) for _, line := range lines { rendered = append(rendered, line.gutter+line.code) } plain := ansi.Strip(strings.Join(rendered, "\n")) if strings.Contains(plain, "line 1\n") || strings.Contains(plain, "line 30") { t.Fatalf("unrelated parts of the hunk were rendered:\n%s", plain) } for _, want := range []string{"line 17", "line 20", "line 23"} { if !strings.Contains(plain, want) { t.Fatalf("review window did not contain %q:\n%s", want, plain) } } selected := 0 for _, line := range lines { if line.selected { selected++ } } if selected != 1 { t.Fatalf("selected lines = %d, want 1", selected) } if len(lines) > 11 { t.Fatalf("review window contains %d lines, expected a compact excerpt", len(lines)) } } func TestHighlightDiffTargetsDeletedLineOnLeft(t *testing.T) { lines := highlightDiff("main.go", "@@ -8,3 +8,2 @@\n keep\n-remove\n keep", 9, 9, "LEFT") var plain strings.Builder selected := false for _, line := range lines { plain.WriteString(ansi.Strip(line.gutter + line.code)) plain.WriteByte('\n') if line.selected && strings.Contains(ansi.Strip(line.code), "remove") { selected = true } } if !strings.Contains(plain.String(), "9 - remove") || !selected { t.Fatalf("deleted review line was not selected:\n%s", plain.String()) } } func TestHighlightDiffNeverFallsBackToUnrelatedCode(t *testing.T) { lines := highlightDiff("main.go", "@@ -1,2 +1,2 @@\n unrelated one\n unrelated two", 100, 100, "RIGHT") var plain strings.Builder for _, line := range lines { plain.WriteString(ansi.Strip(line.gutter + line.code)) plain.WriteByte('\n') } if strings.Contains(plain.String(), "unrelated one") || !strings.Contains(plain.String(), "original reviewed lines unavailable") { t.Fatalf("viewer substituted unrelated code:\n%s", plain.String()) } } func TestHighlightDiffRemovesOnlyCommonIndent(t *testing.T) { lines := highlightDiff( "example.py", "@@ -10,3 +10,3 @@\n if ready:\n run()\n finish()", 10, 12, "RIGHT", ) var code []string for _, line := range lines { if line.gutter != "" { code = append(code, ansi.Strip(line.code)) } } if got, want := strings.Join(code, "\n"), "if ready:\n run()\nfinish()"; got != want { t.Fatalf("dedented code:\n%q\nwant:\n%q", got, want) } } func TestHighlightDiffCacheReturnsIndependentSlices(t *testing.T) { highlightedDiffs.clear() first := highlightDiff("main.go", "@@ -1 +1 @@\n-old\n+new", 1, 1, "RIGHT") if len(first) == 0 { t.Fatal("highlighted diff is empty") } first[0].code = "mutated" second := highlightDiff("main.go", "@@ -1 +1 @@\n-old\n+new", 1, 1, "RIGHT") if len(second) == 0 || second[0].code == "mutated" { t.Fatalf("cached highlighted diff shares caller storage: %#v", second) } }