diff --git a/Jint.Tests/Runtime/Debugger/TestHelpers.cs b/Jint.Tests/Runtime/Debugger/TestHelpers.cs index 3b0aa3138b..ea130ce18c 100644 --- a/Jint.Tests/Runtime/Debugger/TestHelpers.cs +++ b/Jint.Tests/Runtime/Debugger/TestHelpers.cs @@ -1,4 +1,5 @@ -using Esprima.Ast; +using System.Globalization; +using Esprima.Ast; using Jint.Runtime.Debugger; namespace Jint.Tests.Runtime.Debugger @@ -68,5 +69,80 @@ public static void TestAtBreak(string script, Action breakHand { TestAtBreak(script, (engine, info) => breakHandler(info)); } + + public static void ShouldEqualWithDiff(this string actualValue, string expectedValue) + { + ShouldEqualWithDiff(actualValue, expectedValue, DiffStyle.Full, Console.Out); + } + + public static void ShouldEqualWithDiff(this string actualValue, string expectedValue, DiffStyle diffStyle) + { + ShouldEqualWithDiff(actualValue, expectedValue, diffStyle, Console.Out); + } + + public static void ShouldEqualWithDiff(this string actualValue, string expectedValue, DiffStyle diffStyle, TextWriter output) + { + if (actualValue == null || expectedValue == null) + { + //Assert.AreEqual(expectedValue, actualValue); + Assert.Equal(expectedValue, actualValue); + return; + } + + //if (actualValue.Equals(expectedValue, StringComparison.Ordinal)) return; + + output.WriteLine(" Idx Expected Actual"); + output.WriteLine("-------------------------"); + int maxLen = Math.Max(actualValue.Length, expectedValue.Length); + int minLen = Math.Min(actualValue.Length, expectedValue.Length); + for (int i = 0; i < maxLen; i++) + { + if (diffStyle != DiffStyle.Minimal || i >= minLen || actualValue[i] != expectedValue[i]) + { + output.WriteLine("{0} {1,-3} {2,-4} {3,-3} {4,-4} {5,-3}", + i < minLen && actualValue[i] == expectedValue[i] ? " " : "*", // put a mark beside a differing row + i, // the index + i < expectedValue.Length ? ((int) expectedValue[i]).ToString() : "", // character decimal value + i < expectedValue.Length ? expectedValue[i].ToSafeString() : "", // character safe string + i < actualValue.Length ? ((int) actualValue[i]).ToString() : "", // character decimal value + i < actualValue.Length ? actualValue[i].ToSafeString() : "" // character safe string + ); + } + } + output.WriteLine(); + + //Assert.AreEqual(expectedValue, actualValue); + Assert.Equal(expectedValue, actualValue); + } + + private static string ToSafeString(this char c) + { + if (Char.IsControl(c) || Char.IsWhiteSpace(c)) + { + switch (c) + { + case '\r': + return @"\r"; + case '\n': + return @"\n"; + case '\t': + return @"\t"; + case '\a': + return @"\a"; + case '\v': + return @"\v"; + case '\f': + return @"\f"; + default: + return String.Format("\\u{0:X};", (int) c); + } + } + return c.ToString(CultureInfo.InvariantCulture); + } + } + public enum DiffStyle + { + Full, + Minimal } } diff --git a/Jint.Tests/Runtime/NumberTests.cs b/Jint.Tests/Runtime/NumberTests.cs index 43aefc1ef7..de5177f5d5 100644 --- a/Jint.Tests/Runtime/NumberTests.cs +++ b/Jint.Tests/Runtime/NumberTests.cs @@ -1,4 +1,6 @@ +using System.Globalization; using Jint.Runtime; +using Jint.Tests.Runtime.Debugger; namespace Jint.Tests.Runtime { @@ -129,8 +131,7 @@ public void ParseFloat(string input, double result) public void ToLocaleString(string parseNumber, string culture, string result) { var value = _engine.Evaluate($"({parseNumber}).toLocaleString('{culture}')").AsString(); - // Normalized strings to handle different space characters. - Assert.Equal(result.Normalize(), value.Normalize()); + TestHelpers.ShouldEqualWithDiff(result, value); } [Theory]