in src/TestHelpers/Assertions/StringAssertionsExtensions.cs [36:72]
public static AndConstraint<StringAssertions> EqualWithLineByLineDiffOutput(this StringAssertions instance, Assembly sourceAssembly, TestContext testContext, string expected, string expectedLocation, string actualLocation, string because = "", params object[] becauseArgs)
{
const int truncate = 100;
var diff = InlineDiffBuilder.Diff(expected, instance.Subject, ignoreWhiteSpace: false, ignoreCase: false);
var lineLogs = diff.Lines
.Where(line => line.Type != ChangeType.Unchanged)
.Select(line => $"[{line.Position}] {GetDiffMarker(line.Type)} {EscapeWhitespace(line.Text)}")
.Take(truncate);
if (lineLogs.Count() >= truncate)
{
lineLogs = lineLogs.Concat(new[] { "...truncated..." });
}
var testPassed = !diff.HasDifferences;
var isBaselineUpdate = !testPassed && BaselineHelper.ShouldSetBaseline(testContext);
if (isBaselineUpdate)
{
BaselineHelper.SetBaseline(actualLocation, expectedLocation);
}
var fullActualLocation = BaselineHelper.TryGetAbsolutePathRelativeToRepoRoot(actualLocation);
var fullExpectedLocation = BaselineHelper.TryGetAbsolutePathRelativeToRepoRoot(expectedLocation);
Execute.Assertion
.BecauseOf(because, becauseArgs)
.ForCondition(testPassed)
.FailWith(
BaselineHelper.GetAssertionFormatString(isBaselineUpdate, canUpdateBaselines: fullActualLocation is not null && fullExpectedLocation is not null),
string.Join("\n", lineLogs),
fullActualLocation,
fullExpectedLocation,
sourceAssembly.Location);
return new AndConstraint<StringAssertions>(instance);
}