private static void Equal(JTokenAndSource expected, JTokenAndSource actual, IEqualityComparer <JValue> comparer, JsonAssertOptions options) { var expectedToken = expected?.JToken; var actualToken = actual?.JToken; if (expectedToken?.Type != actualToken?.Type) { var message = CreateMessage(expected, actual); throw new AssertException(message); } CheckElementOrder(expected, actual, options); if (expected?.JProperty?.Name != actual?.JProperty?.Name) { var message = CreateMessage(expected, actual); throw new AssertException(message); } var expectedValue = expectedToken as JValue; var actualValue = actualToken as JValue; if (expectedValue != null || actualValue != null) { if (expectedValue == null || actualValue == null) { var message = CreateMessage(expected, actual); throw new AssertException(message); } if (actualValue.HasValues) { var message = CreateMessage(expected, actual); throw new AssertException(message); } var valueComparer = JValueComparer.GetFor(options); if (valueComparer.Equals(expectedValue, actualValue)) { return; } if (comparer?.Equals(expectedValue, actualValue) == true) { return; } else { var message = CreateMessage(expected, actual); throw new AssertException(message); } } for (int i = 0; i < Math.Max(expected?.Children.Count ?? 0, actual?.Children.Count ?? 0); i++) { var expectedChild = expected?.Children.ElementAtOrDefault(i); var actualChild = actual?.Children.ElementAtOrDefault(i); Equal(expectedChild, actualChild, comparer, options); } }
private static void Equal(JTokenAndSource expected, JTokenAndSource actual, IEqualityComparer<JValue> comparer, JsonAssertOptions options) { var expectedToken = expected?.JToken; var actualToken = actual?.JToken; if (expectedToken?.Type != actualToken?.Type) { var message = CreateMessage(expected, actual); throw new AssertException(message); } CheckElementOrder(expected, actual, options); if (expected?.JProperty?.Name != actual?.JProperty?.Name) { var message = CreateMessage(expected, actual); throw new AssertException(message); } var expectedValue = expectedToken as JValue; var actualValue = actualToken as JValue; if (expectedValue != null || actualValue != null) { if (expectedValue == null || actualValue == null) { var message = CreateMessage(expected, actual); throw new AssertException(message); } if (actualValue.HasValues) { var message = CreateMessage(expected, actual); throw new AssertException(message); } var valueComparer = JValueComparer.GetFor(options); if (valueComparer.Equals(expectedValue, actualValue)) { return; } if (comparer?.Equals(expectedValue, actualValue) == true) { return; } else { var message = CreateMessage(expected, actual); throw new AssertException(message); } } for (int i = 0; i < Math.Max(expected?.Children.Count ?? 0, actual?.Children.Count ?? 0); i++) { var expectedChild = expected?.Children.ElementAtOrDefault(i); var actualChild = actual?.Children.ElementAtOrDefault(i); Equal(expectedChild, actualChild, comparer, options); } }
private static void CheckElementOrder(JTokenAndSource expected, JTokenAndSource actual, JsonAssertOptions options) { if (!options.HasFlag(JsonAssertOptions.Verbatim) || expected == null || actual == null) { return; } for (int i = 0; i < Math.Min(expected.Children.Count, actual.Children.Count); i++) { if (expected.Children[i].JProperty?.Name != actual.Children[i].JProperty?.Name && actual.Children.Any(x => x.JProperty?.Name == expected.Children[i].JProperty?.Name)) { var message = CreateMessage(expected.Children[i], actual.Children[i], " The order of elements is incorrect."); throw new AssertException(message); } } }
private static string CreateMessage(JTokenAndSource expected, JTokenAndSource actual, string subHeader = null) { var expectedLine = expected?.Json.Line(expected.LineNumber).Trim(); var actualLine = actual?.Json.Line(actual.LineNumber).Trim(); var index = expectedLine.FirstDiff(actualLine); var lineNumber = expected?.LineNumber ?? actual.LineNumber; using (var writer = new StringWriter()) { if (subHeader != null) { writer.Write(subHeader); writer.WriteLine(); } writer.WriteLine($" Json differ at line {lineNumber} index {index}."); writer.WriteLine($" Expected: {expected?.LineNumber}| {expectedLine}"); writer.WriteLine($" But was: {actual?.LineNumber.ToString() ?? new string('?', expected?.LineNumber.ToString().Length ?? 0)}| {actualLine ?? "Missing"}"); writer.Write($" {new string('-', index + 13)}^"); return(writer.ToString()); } }
private static string CreateMessage(JTokenAndSource expected, JTokenAndSource actual, string subHeader = null) { var expectedLine = expected?.Json.Line(expected.LineNumber).Trim(); var actualLine = actual?.Json.Line(actual.LineNumber).Trim(); var index = expectedLine.FirstDiff(actualLine); var lineNumber = expected?.LineNumber ?? actual.LineNumber; using (var writer = new StringWriter()) { if (subHeader != null) { writer.Write(subHeader); writer.WriteLine(); } writer.WriteLine($" Json differ at line {lineNumber} index {index}."); writer.WriteLine($" Expected: {expected?.LineNumber}| {expectedLine}"); writer.WriteLine($" But was: {actual?.LineNumber.ToString() ?? new string('?', expected?.LineNumber.ToString().Length ?? 0)}| {actualLine ?? "Missing"}"); writer.Write($" {new string('-', index + 13)}^"); return writer.ToString(); } }