From ec61ceb6b2bc0b6cf12259e08c1f8db2a9335773 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Wed, 15 Jun 2022 17:07:27 -0500 Subject: Improve WixAssert.StringEqual to print where the first difference is. --- .../XunitExtensions/WixAssert.cs | 92 ++++++++++++++++------ 1 file changed, 66 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/internal/WixBuildTools.TestSupport/XunitExtensions/WixAssert.cs b/src/internal/WixBuildTools.TestSupport/XunitExtensions/WixAssert.cs index 1ede55b3..d8d02746 100644 --- a/src/internal/WixBuildTools.TestSupport/XunitExtensions/WixAssert.cs +++ b/src/internal/WixBuildTools.TestSupport/XunitExtensions/WixAssert.cs @@ -5,9 +5,11 @@ namespace WixBuildTools.TestSupport using System; using System.Collections.Generic; using System.Linq; + using System.Text; using System.Xml.Linq; using WixBuildTools.TestSupport.XunitExtensions; using Xunit; + using Xunit.Sdk; public class WixAssert : Assert { @@ -23,7 +25,7 @@ namespace WixBuildTools.TestSupport var additionalExpectedLines = expectedLines.Length > lineNumber ? String.Join(Environment.NewLine, expectedLines.Skip(lineNumber).Select((s, i) => $"{lineNumber + i}: {s}")) : $"Missing {actualLines.Length - lineNumber} lines"; var additionalActualLines = actualLines.Length > lineNumber ? String.Join(Environment.NewLine, actualLines.Skip(lineNumber).Select((s, i) => $"{lineNumber + i}: {s}")) : $"Missing {expectedLines.Length - lineNumber} lines"; - WixAssert.StringEqual(additionalExpectedLines, additionalActualLines); + Assert.Equal(additionalExpectedLines, additionalActualLines, StringObjectEqualityComparer.InvariantCulture); } public static void CompareXml(XContainer xExpected, XContainer xActual) @@ -78,8 +80,7 @@ namespace WixBuildTools.TestSupport public static void StringEqual(string expected, string actual, bool ignoreCase = false) { - var comparer = ignoreCase ? StringObjectEqualityComparer.InvariantCultureIgnoreCase : StringObjectEqualityComparer.InvariantCulture; - Assert.Equal(expected, actual, comparer); + WixStringEqualException.ThrowIfNotEqual(expected, actual, ignoreCase); } public static void NotStringEqual(string expected, string actual, bool ignoreCase = false) @@ -88,29 +89,6 @@ namespace WixBuildTools.TestSupport Assert.NotEqual(expected, actual, comparer); } - private class StringObjectEqualityComparer : IEqualityComparer - { - public static readonly StringObjectEqualityComparer InvariantCultureIgnoreCase = new StringObjectEqualityComparer(true); - public static readonly StringObjectEqualityComparer InvariantCulture = new StringObjectEqualityComparer(false); - - private readonly StringComparer stringComparer; - - public StringObjectEqualityComparer(bool ignoreCase) - { - this.stringComparer = ignoreCase ? StringComparer.InvariantCultureIgnoreCase : StringComparer.InvariantCulture; - } - - public new bool Equals(object x, object y) - { - return this.stringComparer.Equals((string)x,(string)y); - } - - public int GetHashCode(object obj) - { - return this.stringComparer.GetHashCode((string)obj); - } - } - // There appears to have been a bug in VC++, which might or might not have been partially // or completely corrected. It was unable to disambiguate a call to: // Xunit::Assert::Throws(System::Type^, System::Action^) @@ -158,4 +136,66 @@ namespace WixBuildTools.TestSupport return Xunit.Assert.Throws(exceptionType, testCode); } } + + internal class StringObjectEqualityComparer : IEqualityComparer + { + public static readonly StringObjectEqualityComparer InvariantCultureIgnoreCase = new StringObjectEqualityComparer(true); + public static readonly StringObjectEqualityComparer InvariantCulture = new StringObjectEqualityComparer(false); + + private readonly StringComparer stringComparer; + + public StringObjectEqualityComparer(bool ignoreCase) + { + this.stringComparer = ignoreCase ? StringComparer.InvariantCultureIgnoreCase : StringComparer.InvariantCulture; + } + + public new bool Equals(object x, object y) + { + return this.stringComparer.Equals((string)x, (string)y); + } + + public int GetHashCode(object obj) + { + return this.stringComparer.GetHashCode((string)obj); + } + } + + public class WixStringEqualException : XunitException + { + public WixStringEqualException(string userMessage) : base(userMessage) { } + + public static void ThrowIfNotEqual(string expected, string actual, bool ignoreCase) + { + var comparer = ignoreCase ? StringObjectEqualityComparer.InvariantCultureIgnoreCase : StringObjectEqualityComparer.InvariantCulture; + if (comparer.Equals(expected, actual)) + { + return; + } + + var sbMessage = new StringBuilder(); + + try + { + Assert.Equal(expected, actual, ignoreCase); + } + catch (XunitException xe) + { + // If either string is not completely in the message, then make sure it gets in there. + if (!xe.Message.Contains(expected) || !xe.Message.Contains(actual)) + { + sbMessage.AppendLine(xe.Message); + sbMessage.AppendLine(); + sbMessage.AppendFormat("Expected: {0}", expected); + sbMessage.AppendLine(); + sbMessage.AppendFormat("Actual: {0}", actual); + } + else + { + throw; + } + } + + throw new WixStringEqualException(sbMessage.ToString()); + } + } } -- cgit v1.2.3-55-g6feb