// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. namespace WixBuildTools.TestSupport { using System; using System.Linq; using System.Xml.Linq; using Xunit; public class WixAssert : Assert { public static void CompareLineByLine(string[] expectedLines, string[] actualLines) { for (var i = 0; i < expectedLines.Length; ++i) { 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 expecteds = xExpected.Descendants().Select(x => $"{x.Name.LocalName}:{String.Join(",", x.Attributes().OrderBy(a => a.Name.LocalName).Select(a => $"{a.Name.LocalName}={a.Value}"))}"); 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}"))}"); 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) { throw new SucceededException(hr, String.Format(format, formatArgs)); } } } }