// Copyright (c) 2026 Petr BalvĂ­n (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:]) }