From 58a95c051b7ed005c46c011e36a858c9aa5c3a0b Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sat, 22 Aug 2026 10:30:05 +1000 Subject: [PATCH] Make Definitions agree with the enum about tool order Both files carry a "keep in sync" comment and they had drifted in two places: TortoiseMerge sat before the TortoiseGit pair in the enum and after it in Definitions, and the enum had VisualStudio before Cursor while Definitions had them the other way round. That matters because the two lists are used for different things. The enum is the default resolution order - OrderReader hands back Enum.GetValues - while the generated docs and the remainder after a DiffEngine_ToolOrder prefix follow Definitions. So the published order was not the order tools actually resolve in, and a user reading the docs to pick a prefix was reading the wrong list. Definitions moves to match the enum, since the enum is what actually decides. Generated docs regenerated to match. The test that exists to catch this could not: IsEquivalentTo is order insensitive by default, so it passed on both lists. IsEqualTo is no good either - on two lists it compares references - so the assertion joins them, which is order sensitive and names the first tool that differs instead of reporting that the contents match. --- docs/diff-tool.order.md | 4 ++-- src/DiffEngine.Tests/DefinitionsTest.cs | 16 +++++++++++++--- src/DiffEngine.Tests/defaultOrder.include.md | 4 ++-- src/DiffEngine/Definitions.cs | 4 ++-- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/docs/diff-tool.order.md b/docs/diff-tool.order.md index ceb99b41..4cd981d9 100644 --- a/docs/diff-tool.order.md +++ b/docs/diff-tool.order.md @@ -17,9 +17,9 @@ To change this file edit the source file and then run MarkdownSnippets. * **[Kaleidoscope](/docs/diff-tool.md#kaleidoscope)** OSX (Cost: Paid) * **[DeltaWalker](/docs/diff-tool.md#deltawalker)** Windows/OSX (Cost: Paid) * **[WinMerge](/docs/diff-tool.md#winmerge)** Windows (Cost: Free with option to donate) + * **[TortoiseMerge](/docs/diff-tool.md#tortoisemerge)** Windows (Cost: Free) * **[TortoiseGitMerge](/docs/diff-tool.md#tortoisegitmerge)** Windows (Cost: Free) * **[TortoiseGitIDiff](/docs/diff-tool.md#tortoisegitidiff)** Windows (Cost: Free) - * **[TortoiseMerge](/docs/diff-tool.md#tortoisemerge)** Windows (Cost: Free) * **[TortoiseIDiff](/docs/diff-tool.md#tortoiseidiff)** Windows (Cost: Free) * **[KDiff3](/docs/diff-tool.md#kdiff3)** Windows/OSX (Cost: Free) * **[TkDiff](/docs/diff-tool.md#tkdiff)** OSX (Cost: Free) @@ -33,8 +33,8 @@ To change this file edit the source file and then run MarkdownSnippets. * **[Meld](/docs/diff-tool.md#meld)** Windows/OSX/Linux (Cost: Free) * **[SublimeMerge](/docs/diff-tool.md#sublimemerge)** Windows/OSX/Linux (Cost: Paid) * **[VisualStudioCode](/docs/diff-tool.md#visualstudiocode)** Windows/OSX/Linux (Cost: Free) - * **[Cursor](/docs/diff-tool.md#cursor)** Windows/OSX/Linux (Cost: Free and Paid) * **[VisualStudio](/docs/diff-tool.md#visualstudio)** Windows (Cost: Paid and free options) + * **[Cursor](/docs/diff-tool.md#cursor)** Windows/OSX/Linux (Cost: Free and Paid) * **[DiffEngineViewer](/docs/diff-tool.md#diffengineviewer)** Windows/OSX/Linux (Cost: Free) diff --git a/src/DiffEngine.Tests/DefinitionsTest.cs b/src/DiffEngine.Tests/DefinitionsTest.cs index 4b489ada..b32079cd 100644 --- a/src/DiffEngine.Tests/DefinitionsTest.cs +++ b/src/DiffEngine.Tests/DefinitionsTest.cs @@ -74,12 +74,22 @@ static string GetOsSupport(OsSupport osSupport) return builder.ToString(); } + /// + /// Both files say "keep in sync", and this is what checks it. Ordered, because the order is + /// the thing being kept in sync: the enum is the default resolution order (OrderReader hands + /// back Enum.GetValues), while the generated docs and the remainder after a + /// DiffEngine_ToolOrder prefix follow Definitions. IsEquivalentTo is order insensitive by + /// default, so the two drifted apart under a green test. + /// [Test] public async Task ToolOrderMatchesEnumOrder() { - var definitionsOrder = Definitions.Tools.Select(_ => _.Tool).ToList(); - var enumOrder = Enum.GetValues(typeof(DiffTool)).Cast().ToList(); - await Assert.That(definitionsOrder).IsEquivalentTo(enumOrder); + // Joined, because the collection assertions here are order insensitive and the order is + // the whole point. A string also names the first tool that differs, rather than saying the + // two lists have the same contents + var definitionsOrder = string.Join(", ", Definitions.Tools.Select(_ => _.Tool)); + var enumOrder = string.Join(", ", Enum.GetValues(typeof(DiffTool)).Cast()); + await Assert.That(definitionsOrder).IsEqualTo(enumOrder); } [Test] diff --git a/src/DiffEngine.Tests/defaultOrder.include.md b/src/DiffEngine.Tests/defaultOrder.include.md index ab54a8bd..829cd918 100644 --- a/src/DiffEngine.Tests/defaultOrder.include.md +++ b/src/DiffEngine.Tests/defaultOrder.include.md @@ -5,9 +5,9 @@ * **[Kaleidoscope](/docs/diff-tool.md#kaleidoscope)** OSX (Cost: Paid) * **[DeltaWalker](/docs/diff-tool.md#deltawalker)** Windows/OSX (Cost: Paid) * **[WinMerge](/docs/diff-tool.md#winmerge)** Windows (Cost: Free with option to donate) + * **[TortoiseMerge](/docs/diff-tool.md#tortoisemerge)** Windows (Cost: Free) * **[TortoiseGitMerge](/docs/diff-tool.md#tortoisegitmerge)** Windows (Cost: Free) * **[TortoiseGitIDiff](/docs/diff-tool.md#tortoisegitidiff)** Windows (Cost: Free) - * **[TortoiseMerge](/docs/diff-tool.md#tortoisemerge)** Windows (Cost: Free) * **[TortoiseIDiff](/docs/diff-tool.md#tortoiseidiff)** Windows (Cost: Free) * **[KDiff3](/docs/diff-tool.md#kdiff3)** Windows/OSX (Cost: Free) * **[TkDiff](/docs/diff-tool.md#tkdiff)** OSX (Cost: Free) @@ -21,6 +21,6 @@ * **[Meld](/docs/diff-tool.md#meld)** Windows/OSX/Linux (Cost: Free) * **[SublimeMerge](/docs/diff-tool.md#sublimemerge)** Windows/OSX/Linux (Cost: Paid) * **[VisualStudioCode](/docs/diff-tool.md#visualstudiocode)** Windows/OSX/Linux (Cost: Free) - * **[Cursor](/docs/diff-tool.md#cursor)** Windows/OSX/Linux (Cost: Free and Paid) * **[VisualStudio](/docs/diff-tool.md#visualstudio)** Windows (Cost: Paid and free options) + * **[Cursor](/docs/diff-tool.md#cursor)** Windows/OSX/Linux (Cost: Free and Paid) * **[DiffEngineViewer](/docs/diff-tool.md#diffengineviewer)** Windows/OSX/Linux (Cost: Free) diff --git a/src/DiffEngine/Definitions.cs b/src/DiffEngine/Definitions.cs index 6d9db7a2..43696838 100644 --- a/src/DiffEngine/Definitions.cs +++ b/src/DiffEngine/Definitions.cs @@ -15,9 +15,9 @@ static Definitions() => Implementation.Kaleidoscope(), Implementation.DeltaWalker(), Implementation.WinMerge(), + Implementation.TortoiseMerge(), Implementation.TortoiseGitMerge(), Implementation.TortoiseGitIDiff(), - Implementation.TortoiseMerge(), Implementation.TortoiseIDiff(), Implementation.KDiff3(), Implementation.TkDiff(), @@ -31,8 +31,8 @@ static Definitions() => Implementation.Meld(), Implementation.SublimeMerge(), Implementation.VisualStudioCode(), - Implementation.Cursor(), Implementation.VisualStudio(), + Implementation.Cursor(), Implementation.DiffEngineViewer(), ]; }