95 lines
2.3 KiB
Go
95 lines
2.3 KiB
Go
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package main
|
|
|
|
import (
|
|
"slices"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func lines(ss ...string) []string { return ss }
|
|
|
|
func TestUnifiedDiffIdentical(t *testing.T) {
|
|
if got := unifiedDiff("f", lines("a", "b"), lines("a", "b")); got != "" {
|
|
t.Errorf("identical inputs produced %q, want empty", got)
|
|
}
|
|
}
|
|
|
|
func TestUnifiedDiffSingleChange(t *testing.T) {
|
|
a := lines("1", "2", "3", "4", "5", "6", "7", "8")
|
|
b := lines("1", "2", "3!", "4", "5", "6", "7", "8")
|
|
want := "--- f\n+++ f\n" +
|
|
"@@ -1,6 +1,6 @@\n" +
|
|
" 1\n 2\n-3\n+3!\n 4\n 5\n 6\n"
|
|
if got := unifiedDiff("f", a, b); got != want {
|
|
t.Errorf("diff = %q, want %q", got, want)
|
|
}
|
|
}
|
|
|
|
func TestUnifiedDiffInsertAtStart(t *testing.T) {
|
|
got := unifiedDiff("f", lines("x"), lines("new", "x"))
|
|
// The single existing line is shown as trailing context, so the hunk
|
|
// covers it.
|
|
want := "--- f\n+++ f\n@@ -1,1 +1,2 @@\n+new\n x\n"
|
|
if got != want {
|
|
t.Errorf("diff = %q, want %q", got, want)
|
|
}
|
|
}
|
|
|
|
func TestUnifiedDiffDeleteAtEnd(t *testing.T) {
|
|
got := unifiedDiff("f", lines("x", "y"), lines("x"))
|
|
want := "--- f\n+++ f\n@@ -1,2 +1,1 @@\n x\n-y\n"
|
|
if got != want {
|
|
t.Errorf("diff = %q, want %q", got, want)
|
|
}
|
|
}
|
|
|
|
func TestUnifiedDiffTwoHunks(t *testing.T) {
|
|
var a, b []string
|
|
for i := 1; i <= 20; i++ {
|
|
a = append(a, itoa(i))
|
|
b = append(b, itoa(i))
|
|
}
|
|
b[1] = "2!"
|
|
b[17] = "18!"
|
|
got := unifiedDiff("f", a, b)
|
|
if !strings.Contains(got, "@@ -1,5 +1,5 @@\n 1\n-2\n+2!\n 3\n 4\n 5\n") {
|
|
t.Errorf("first hunk wrong:\n%s", got)
|
|
}
|
|
if !strings.Contains(got, "@@ -15,6 +15,6 @@\n 15\n 16\n 17\n-18\n+18!\n 19\n 20\n") {
|
|
t.Errorf("second hunk wrong:\n%s", got)
|
|
}
|
|
}
|
|
|
|
// TestUnifiedDiffAdjacentHunks merges changes separated by exactly twice the
|
|
// context into one hunk.
|
|
func TestUnifiedDiffAdjacentHunks(t *testing.T) {
|
|
a := lines("1", "2", "3", "4", "5", "6", "7", "8")
|
|
b := slices.Clone(a)
|
|
b[0] = "1!"
|
|
b[7] = "8!"
|
|
got := unifiedDiff("f", a, b)
|
|
want := "--- f\n+++ f\n" +
|
|
"@@ -1,8 +1,8 @@\n" +
|
|
"-1\n+1!\n 2\n 3\n 4\n 5\n 6\n 7\n-8\n+8!\n"
|
|
if got != want {
|
|
t.Errorf("diff = %q, want %q", got, want)
|
|
}
|
|
}
|
|
|
|
func itoa(n int) string {
|
|
if n == 0 {
|
|
return "0"
|
|
}
|
|
var buf [4]byte
|
|
i := len(buf)
|
|
for n > 0 {
|
|
i--
|
|
buf[i] = byte('0' + n%10)
|
|
n /= 10
|
|
}
|
|
return string(buf[i:])
|
|
}
|