using System.Text.Json; using Recordingtest.DiffReporter; using Xunit; namespace Recordingtest.DiffReporter.Tests; public class DifferTests { private static string TempDir() { var d = Path.Combine(Path.GetTempPath(), "diffrep-" + Guid.NewGuid().ToString("N")); Directory.CreateDirectory(d); return d; } [Fact] public void Identical_JsonFiles_ReturnsIdentical() { var dir = TempDir(); var a = Path.Combine(dir, "a.json"); var b = Path.Combine(dir, "b.json"); File.WriteAllText(a, "{\"x\":1,\"y\":\"hi\"}"); File.WriteAllText(b, "{\"x\":1,\"y\":\"hi\"}"); var r = Differ.Compare(a, b); Assert.True(r.Identical); Assert.Empty(r.Hunks); } [Fact] public void OneFieldChanged_JsonFiles_OneHunk() { var dir = TempDir(); var a = Path.Combine(dir, "a.json"); var b = Path.Combine(dir, "b.json"); File.WriteAllText(a, "{\"x\":1,\"y\":\"hi\"}"); File.WriteAllText(b, "{\"x\":2,\"y\":\"hi\"}"); var r = Differ.Compare(a, b); Assert.False(r.Identical); Assert.Single(r.Hunks); Assert.Equal("changed", r.Hunks[0].Kind); } [Fact] public void BinaryDiff_ReturnsHexSummary() { var dir = TempDir(); var a = Path.Combine(dir, "a.bin"); var b = Path.Combine(dir, "b.bin"); File.WriteAllBytes(a, new byte[] { 0x00, 0x01, 0x02, 0xFF, 0x80 }); File.WriteAllBytes(b, new byte[] { 0x00, 0x01, 0x03, 0xFE, 0x80 }); var r = Differ.Compare(a, b); Assert.False(r.Identical); Assert.NotEmpty(r.Hunks); foreach (var h in r.Hunks) { // hex strings only Assert.Matches("^[0-9A-F]*$", h.Before); Assert.Matches("^[0-9A-F]*$", h.After); } } [Fact] public void Cli_IdenticalFiles_ExitZero_And_DiffJsonExists() { var dir = TempDir(); var a = Path.Combine(dir, "a.json"); var b = Path.Combine(dir, "b.json"); File.WriteAllText(a, "{\"x\":1}"); File.WriteAllText(b, "{\"x\":1}"); var outDir = Path.Combine(dir, "out"); var code = Cli.Program.Main(new[] { "--approved", a, "--received", b, "--out", outDir }); Assert.Equal(0, code); Assert.True(File.Exists(Path.Combine(outDir, "diff.json"))); Assert.True(File.Exists(Path.Combine(outDir, "diff.md"))); } [Fact] public void TriageReadable_DiffJson_CanBeParsed() { var dir = TempDir(); var a = Path.Combine(dir, "a.json"); var b = Path.Combine(dir, "b.json"); File.WriteAllText(a, "{\"x\":1}"); File.WriteAllText(b, "{\"x\":2}"); var outDir = Path.Combine(dir, "out"); var code = Cli.Program.Main(new[] { "--approved", a, "--received", b, "--out", outDir }); Assert.Equal(1, code); var json = File.ReadAllText(Path.Combine(outDir, "diff.json")); using var doc = JsonDocument.Parse(json); var root = doc.RootElement; Assert.True(root.TryGetProperty("file", out _)); Assert.True(root.TryGetProperty("hunks", out _)); Assert.True(root.TryGetProperty("summary", out var summary)); Assert.True(summary.TryGetProperty("added", out _)); Assert.True(summary.TryGetProperty("removed", out _)); Assert.True(summary.TryGetProperty("changed", out _)); } }