From 137d438f743198030c6df626b046af04d10abb99 Mon Sep 17 00:00:00 2001
From: Bob Arnson <bob@firegiant.com>
Date: Thu, 20 Aug 2020 20:57:06 -0400
Subject: Add CompareXml methods to assert XML equality.

---
 src/WixBuildTools.TestSupport/WixAssert.cs | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

(limited to 'src')

diff --git a/src/WixBuildTools.TestSupport/WixAssert.cs b/src/WixBuildTools.TestSupport/WixAssert.cs
index 32a98463..0882e26e 100644
--- a/src/WixBuildTools.TestSupport/WixAssert.cs
+++ b/src/WixBuildTools.TestSupport/WixAssert.cs
@@ -3,6 +3,8 @@
 namespace WixBuildTools.TestSupport
 {
     using System;
+    using System.Linq;
+    using System.Xml.Linq;
     using Xunit;
 
     public class WixAssert : Assert
@@ -14,9 +16,26 @@ namespace WixBuildTools.TestSupport
                 Assert.True(actualLines.Length > i, $"{i}: expectedLines longer than actualLines");
                 Assert.Equal($"{i}: {expectedLines[i]}", $"{i}: {actualLines[i]}");
             }
+
             Assert.True(expectedLines.Length == actualLines.Length, "actualLines longer than expectedLines");
         }
 
+        public static void CompareXml(XContainer xExpected, XContainer xActual)
+        {
+            var actuals = xActual.Descendants().Select(x => $"{x.Name.LocalName}:{String.Join(",", x.Attributes().OrderBy(a => a.Name.LocalName).Select(a => $"{a.Name.LocalName}={a.Value}"))}");
+            var expecteds = xExpected.Descendants().Select(x => $"{x.Name.LocalName}:{String.Join(",", x.Attributes().OrderBy(a => a.Name.LocalName).Select(a => $"{a.Name.LocalName}={a.Value}"))}");
+
+            CompareLineByLine(expecteds.OrderBy(s => s).ToArray(), actuals.OrderBy(s => s).ToArray());
+        }
+
+        public static void CompareXml(string expectedPath, string actualPath)
+        {
+            var expectedDoc = XDocument.Load(expectedPath, LoadOptions.PreserveWhitespace | LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);
+            var actualDoc = XDocument.Load(actualPath, LoadOptions.PreserveWhitespace | LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);
+
+            CompareXml(expectedDoc, actualDoc);
+        }
+
         public static void Succeeded(int hr, string format, params object[] formatArgs)
         {
             if (0 > hr)
-- 
cgit v1.2.3-55-g6feb