diff --git a/src/TestFramework/TestFramework/Assertions/Assert.AreEqual.InterpolatedStringHandlers.cs b/src/TestFramework/TestFramework/Assertions/Assert.AreEqual.InterpolatedStringHandlers.cs index 9f5a395e21..888d647cc8 100644 --- a/src/TestFramework/TestFramework/Assertions/Assert.AreEqual.InterpolatedStringHandlers.cs +++ b/src/TestFramework/TestFramework/Assertions/Assert.AreEqual.InterpolatedStringHandlers.cs @@ -166,7 +166,7 @@ public AssertNonGenericAreEqualInterpolatedStringHandler(int literalLength, int { _builder = new StringBuilder(literalLength + formattedCount); _failAction = (userMessage, expectedExpression, actualExpression) => - ReportAssertAreEqualFailed(expected, actual, delta, BuildUserMessageForExpectedExpressionAndActualExpression(userMessage, expectedExpression, actualExpression)); + ReportAssertAreEqualFailed(expected, actual, delta, userMessage, expectedExpression, actualExpression); } } @@ -177,7 +177,7 @@ public AssertNonGenericAreEqualInterpolatedStringHandler(int literalLength, int { _builder = new StringBuilder(literalLength + formattedCount); _failAction = (userMessage, expectedExpression, actualExpression) => - ReportAssertAreEqualFailed(expected, actual, delta, BuildUserMessageForExpectedExpressionAndActualExpression(userMessage, expectedExpression, actualExpression)); + ReportAssertAreEqualFailed(expected, actual, delta, userMessage, expectedExpression, actualExpression); } } @@ -188,7 +188,7 @@ public AssertNonGenericAreEqualInterpolatedStringHandler(int literalLength, int { _builder = new StringBuilder(literalLength + formattedCount); _failAction = (userMessage, expectedExpression, actualExpression) => - ReportAssertAreEqualFailed(expected, actual, delta, BuildUserMessageForExpectedExpressionAndActualExpression(userMessage, expectedExpression, actualExpression)); + ReportAssertAreEqualFailed(expected, actual, delta, userMessage, expectedExpression, actualExpression); } } @@ -199,7 +199,7 @@ public AssertNonGenericAreEqualInterpolatedStringHandler(int literalLength, int { _builder = new StringBuilder(literalLength + formattedCount); _failAction = (userMessage, expectedExpression, actualExpression) => - ReportAssertAreEqualFailed(expected, actual, delta, BuildUserMessageForExpectedExpressionAndActualExpression(userMessage, expectedExpression, actualExpression)); + ReportAssertAreEqualFailed(expected, actual, delta, userMessage, expectedExpression, actualExpression); } } @@ -277,7 +277,7 @@ public AssertNonGenericAreNotEqualInterpolatedStringHandler(int literalLength, i { _builder = new StringBuilder(literalLength + formattedCount); _failAction = (userMessage, notExpectedExpr, actualExpr) => - ReportAssertAreNotEqualFailed(notExpected, actual, delta, BuildUserMessageForNotExpectedExpressionAndActualExpression(userMessage, notExpectedExpr, actualExpr)); + ReportAssertAreNotEqualFailed(notExpected, actual, delta, userMessage, notExpectedExpr, actualExpr); } } @@ -288,7 +288,7 @@ public AssertNonGenericAreNotEqualInterpolatedStringHandler(int literalLength, i { _builder = new StringBuilder(literalLength + formattedCount); _failAction = (userMessage, notExpectedExpr, actualExpr) => - ReportAssertAreNotEqualFailed(notExpected, actual, delta, BuildUserMessageForNotExpectedExpressionAndActualExpression(userMessage, notExpectedExpr, actualExpr)); + ReportAssertAreNotEqualFailed(notExpected, actual, delta, userMessage, notExpectedExpr, actualExpr); } } @@ -299,7 +299,7 @@ public AssertNonGenericAreNotEqualInterpolatedStringHandler(int literalLength, i { _builder = new StringBuilder(literalLength + formattedCount); _failAction = (userMessage, notExpectedExpr, actualExpr) => - ReportAssertAreNotEqualFailed(notExpected, actual, delta, BuildUserMessageForNotExpectedExpressionAndActualExpression(userMessage, notExpectedExpr, actualExpr)); + ReportAssertAreNotEqualFailed(notExpected, actual, delta, userMessage, notExpectedExpr, actualExpr); } } @@ -310,7 +310,7 @@ public AssertNonGenericAreNotEqualInterpolatedStringHandler(int literalLength, i { _builder = new StringBuilder(literalLength + formattedCount); _failAction = (userMessage, notExpectedExpr, actualExpr) => - ReportAssertAreNotEqualFailed(notExpected, actual, delta, BuildUserMessageForNotExpectedExpressionAndActualExpression(userMessage, notExpectedExpr, actualExpr)); + ReportAssertAreNotEqualFailed(notExpected, actual, delta, userMessage, notExpectedExpr, actualExpr); } } diff --git a/src/TestFramework/TestFramework/Assertions/Assert.AreEqual.Numerics.cs b/src/TestFramework/TestFramework/Assertions/Assert.AreEqual.Numerics.cs index aa42fa6abf..44d63acafd 100644 --- a/src/TestFramework/TestFramework/Assertions/Assert.AreEqual.Numerics.cs +++ b/src/TestFramework/TestFramework/Assertions/Assert.AreEqual.Numerics.cs @@ -64,17 +64,24 @@ private static bool AreEqualFailing(long expected, long actual, long delta) : Math.Abs(expected - actual) > delta; [DoesNotReturn] - private static void ReportAssertAreEqualFailed(T expected, T actual, T delta, string userMessage) + private static void ReportAssertAreEqualFailed(T expected, T actual, T delta, string? userMessage, string expectedExpression, string actualExpression) where T : struct, IConvertible { - string finalMessage = string.Format( - CultureInfo.CurrentCulture, - FrameworkMessages.AreEqualDeltaFailMsg, - userMessage, - expected.ToString(CultureInfo.CurrentCulture.NumberFormat), - actual.ToString(CultureInfo.CurrentCulture.NumberFormat), - delta.ToString(CultureInfo.CurrentCulture.NumberFormat)); - ReportAssertFailed("Assert.AreEqual", finalMessage); + string expectedRendered = AssertionValueRenderer.RenderValue(expected); + string actualRendered = AssertionValueRenderer.RenderValue(actual); + string deltaRendered = AssertionValueRenderer.RenderValue(delta); + EvidenceBlock evidence = EvidenceBlock.Create() + .AddLine("expected:", expectedRendered) + .AddLine("actual:", actualRendered) + .AddLine("delta:", deltaRendered); + + StructuredAssertionMessage structured = new(FrameworkMessages.AreEqualDeltaFailedSummary); + structured.WithUserMessage(userMessage); + structured.WithEvidence(evidence); + structured.WithExpectedAndActual(expectedRendered, actualRendered); + structured.WithCallSiteExpression(FormatCallSiteExpression("Assert.AreEqual", expectedExpression, actualExpression, string.Empty, "", "", "")); + + ReportAssertFailed(structured); } /// @@ -124,8 +131,7 @@ public static void AreEqual(float expected, float actual, float delta, string? m if (AreEqualFailing(expected, actual, delta)) { - string userMessage = BuildUserMessageForExpectedExpressionAndActualExpression(message, expectedExpression, actualExpression); - ReportAssertAreEqualFailed(expected, actual, delta, userMessage); + ReportAssertAreEqualFailed(expected, actual, delta, message, expectedExpression, actualExpression); } } @@ -176,8 +182,7 @@ public static void AreNotEqual(float notExpected, float actual, float delta, str if (AreNotEqualFailing(notExpected, actual, delta)) { - string userMessage = BuildUserMessageForNotExpectedExpressionAndActualExpression(message, notExpectedExpression, actualExpression); - ReportAssertAreNotEqualFailed(notExpected, actual, delta, userMessage); + ReportAssertAreNotEqualFailed(notExpected, actual, delta, message, notExpectedExpression, actualExpression); } } @@ -249,8 +254,7 @@ public static void AreEqual(decimal expected, decimal actual, decimal delta, str if (AreEqualFailing(expected, actual, delta)) { - string userMessage = BuildUserMessageForExpectedExpressionAndActualExpression(message, expectedExpression, actualExpression); - ReportAssertAreEqualFailed(expected, actual, delta, userMessage); + ReportAssertAreEqualFailed(expected, actual, delta, message, expectedExpression, actualExpression); } } @@ -301,8 +305,7 @@ public static void AreNotEqual(decimal notExpected, decimal actual, decimal delt if (AreNotEqualFailing(notExpected, actual, delta)) { - string userMessage = BuildUserMessageForNotExpectedExpressionAndActualExpression(message, notExpectedExpression, actualExpression); - ReportAssertAreNotEqualFailed(notExpected, actual, delta, userMessage); + ReportAssertAreNotEqualFailed(notExpected, actual, delta, message, notExpectedExpression, actualExpression); } } @@ -356,8 +359,7 @@ public static void AreEqual(long expected, long actual, long delta, string? mess if (AreEqualFailing(expected, actual, delta)) { - string userMessage = BuildUserMessageForExpectedExpressionAndActualExpression(message, expectedExpression, actualExpression); - ReportAssertAreEqualFailed(expected, actual, delta, userMessage); + ReportAssertAreEqualFailed(expected, actual, delta, message, expectedExpression, actualExpression); } } @@ -408,8 +410,7 @@ public static void AreNotEqual(long notExpected, long actual, long delta, string if (AreNotEqualFailing(notExpected, actual, delta)) { - string userMessage = BuildUserMessageForNotExpectedExpressionAndActualExpression(message, notExpectedExpression, actualExpression); - ReportAssertAreNotEqualFailed(notExpected, actual, delta, userMessage); + ReportAssertAreNotEqualFailed(notExpected, actual, delta, message, notExpectedExpression, actualExpression); } } @@ -462,8 +463,7 @@ public static void AreEqual(double expected, double actual, double delta, string if (AreEqualFailing(expected, actual, delta)) { - string userMessage = BuildUserMessageForExpectedExpressionAndActualExpression(message, expectedExpression, actualExpression); - ReportAssertAreEqualFailed(expected, actual, delta, userMessage); + ReportAssertAreEqualFailed(expected, actual, delta, message, expectedExpression, actualExpression); } } @@ -514,8 +514,7 @@ public static void AreNotEqual(double notExpected, double actual, double delta, if (AreNotEqualFailing(notExpected, actual, delta)) { - string userMessage = BuildUserMessageForNotExpectedExpressionAndActualExpression(message, notExpectedExpression, actualExpression); - ReportAssertAreNotEqualFailed(notExpected, actual, delta, userMessage); + ReportAssertAreNotEqualFailed(notExpected, actual, delta, message, notExpectedExpression, actualExpression); } } @@ -541,17 +540,24 @@ private static bool AreNotEqualFailing(double notExpected, double actual, double } [DoesNotReturn] - private static void ReportAssertAreNotEqualFailed(T notExpected, T actual, T delta, string userMessage) + private static void ReportAssertAreNotEqualFailed(T notExpected, T actual, T delta, string? userMessage, string notExpectedExpression, string actualExpression) where T : struct, IConvertible { - string finalMessage = string.Format( - CultureInfo.CurrentCulture, - FrameworkMessages.AreNotEqualDeltaFailMsg, - userMessage, - notExpected.ToString(CultureInfo.CurrentCulture.NumberFormat), - actual.ToString(CultureInfo.CurrentCulture.NumberFormat), - delta.ToString(CultureInfo.CurrentCulture.NumberFormat)); - ReportAssertFailed("Assert.AreNotEqual", finalMessage); + string notExpectedRendered = AssertionValueRenderer.RenderValue(notExpected); + string actualRendered = AssertionValueRenderer.RenderValue(actual); + string deltaRendered = AssertionValueRenderer.RenderValue(delta); + EvidenceBlock evidence = EvidenceBlock.Create() + .AddLine("not expected:", notExpectedRendered) + .AddLine("actual:", actualRendered) + .AddLine("delta:", deltaRendered); + + StructuredAssertionMessage structured = new(FrameworkMessages.AreNotEqualDeltaFailedSummary); + structured.WithUserMessage(userMessage); + structured.WithEvidence(evidence); + structured.WithExpectedAndActual($"not {notExpectedRendered}", actualRendered); + structured.WithCallSiteExpression(FormatCallSiteExpression("Assert.AreNotEqual", notExpectedExpression, actualExpression, string.Empty, "", "", "")); + + ReportAssertFailed(structured); } #pragma warning restore RS0026 // Do not add multiple public overloads with optional parameters diff --git a/src/TestFramework/TestFramework/Assertions/Assert.cs b/src/TestFramework/TestFramework/Assertions/Assert.cs index daa9c365f0..2f4874cbe0 100644 --- a/src/TestFramework/TestFramework/Assertions/Assert.cs +++ b/src/TestFramework/TestFramework/Assertions/Assert.cs @@ -270,26 +270,6 @@ private static string FormatPrefixAndMessage(string prefix, string? message) internal static string BuildUserMessage(string? format) => format ?? string.Empty; - private static string BuildUserMessageForTwoExpressions(string? format, string callerArgExpression1, string parameterName1, string callerArgExpression2, string parameterName2) - { - string userMessage = BuildUserMessage(format); - if (string.IsNullOrEmpty(callerArgExpression1) || string.IsNullOrEmpty(callerArgExpression2)) - { - return userMessage; - } - - string callerArgMessagePart = string.Format(CultureInfo.InvariantCulture, FrameworkMessages.CallerArgumentExpressionTwoParametersMessage, parameterName1, callerArgExpression1, parameterName2, callerArgExpression2); - return string.IsNullOrEmpty(userMessage) - ? callerArgMessagePart - : $"{callerArgMessagePart} {userMessage}"; - } - - private static string BuildUserMessageForExpectedExpressionAndActualExpression(string? format, string expectedExpression, string actualExpression) - => BuildUserMessageForTwoExpressions(format, expectedExpression, "expected", actualExpression, "actual"); - - private static string BuildUserMessageForNotExpectedExpressionAndActualExpression(string? format, string notExpectedExpression, string actualExpression) - => BuildUserMessageForTwoExpressions(format, notExpectedExpression, "notExpected", actualExpression, "actual"); - /// /// Checks the parameter for valid conditions. /// diff --git a/src/TestFramework/TestFramework/Resources/FrameworkMessages.resx b/src/TestFramework/TestFramework/Resources/FrameworkMessages.resx index ea39cf0cf4..7260259912 100644 --- a/src/TestFramework/TestFramework/Resources/FrameworkMessages.resx +++ b/src/TestFramework/TestFramework/Resources/FrameworkMessages.resx @@ -129,8 +129,8 @@ Expected:<{1}>. Actual:<{2}>. {0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} + + Expected values to be equal within tolerance. Expected:<{1}>. Case is different for actual value:<{2}>. {0} @@ -221,8 +221,8 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} + + Expected values to differ beyond tolerance. Expected any value except:<{1}>. Actual:<{2}>. {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf index 10b88bf52e..20f1cad4be 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf @@ -37,9 +37,9 @@ Očekáváno:<{1}>. Případ je rozdílný pro aktuální hodnotu:<{2}>. {0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Očekáván rozdíl, který není větší jak <{3}> mezi očekávanou hodnotou <{1}> a aktuální hodnotou <{2}>. {0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Očekáván rozdíl, který je větší jak <{3}> mezi očekávanou hodnotou <{1}> a aktuální hodnotou <{2}>. {0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ Podrobnosti: + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} Zpráva: {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.de.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.de.xlf index c56225be2f..cfdb8d2a41 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.de.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.de.xlf @@ -37,9 +37,9 @@ Erwartet:<{1}>. Die Großschreibung des tatsächlichen Werts weicht davon ab:<{2}>. {0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Es wurde eine Differenz nicht größer als <{3}> zwischen dem erwarteten Wert <{1}> und dem tatsächlichen Wert <{2}> erwartet. {0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Es wurde eine Differenz größer als <{3}> zwischen dem erwarteten Wert <{1}> und dem tatsächlichen Wert <{2}> erwartet. {0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ Details: + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} Meldung: {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.es.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.es.xlf index 519af53c11..83bb0cd433 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.es.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.es.xlf @@ -37,9 +37,9 @@ Se esperaba:<{1}>. La caja es diferente para el valor actual:<{2}>. {0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Se esperaba una diferencia no superior a <{3}> entre el valor esperado <{1}> y el valor actual <{2}>. {0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Se esperaba una diferencia mayor que <{3}> entre el valor esperado <{1}> y el valor actual <{2}>. {0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ Detalles: + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} Mensaje: {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.fr.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.fr.xlf index 06e3f44bfb..4ca1a56046 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.fr.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.fr.xlf @@ -37,9 +37,9 @@ Attendu :<{1}>. La casse est différente pour la valeur réelle :<{2}>. {0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Différence attendue non supérieure à <{3}> comprise entre la valeur attendue <{1}> et la valeur réelle <{2}>. {0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Différence attendue supérieure à <{3}> comprise entre la valeur attendue <{1}> et la valeur réelle <{2}>. {0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ Détails : + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} Message : {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.it.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.it.xlf index 25fcabfb2c..1238a340b1 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.it.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.it.xlf @@ -37,9 +37,9 @@ Previsto:<{1}>. La combinazione di maiuscole e minuscole è diversa per il valore effettivo:<{2}>. {0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Prevista una differenza non maggiore di <{3}> tra il valore previsto <{1}> e il valore effettivo <{2}>. {0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Prevista una differenza maggiore di <{3}> tra il valore previsto <{1}> e il valore effettivo <{2}>. {0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ Dettagli: + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} Messaggio: {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ja.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ja.xlf index fb671257a1..dd0342f802 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ja.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ja.xlf @@ -37,9 +37,9 @@ <{1}> が必要です。実際の値: <{2}> では大文字と小文字が異なります。{0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - 指定する値 <{1}> と実際の値 <{2}> との間には <{3}> 以内の差が必要です。{0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - 指定する値 <{1}> と実際の値 <{2}> との間には、<{3}> を超える差が必要です。{0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ 詳細: + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} メッセージ: {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ko.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ko.xlf index e75ea3ca33..01f11d4c25 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ko.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ko.xlf @@ -37,9 +37,9 @@ 예상 값: <{1}>. 대/소문자가 다른 실제 값: <{2}>. {0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - 예상 값 <{1}>과(와) 실제 값 <{2}>의 차이가 <{3}>보다 크지 않아야 합니다. {0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - 예상 값 <{1}>과(와) 실제 값 <{2}>의 차이가 <{3}>보다 커야 합니다. {0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ 세부 정보: + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} 메시지: {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pl.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pl.xlf index d046015c6c..1e31eed0aa 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pl.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pl.xlf @@ -37,9 +37,9 @@ Oczekiwano:<{1}>. Przypadek różni się od rzeczywistej wartości:<{2}>. {0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Oczekiwano różnicy nie większej niż <{3}> pomiędzy oczekiwaną wartością <{1}> a rzeczywistą wartością <{2}>. {0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Oczekiwano różnicy większej niż <{3}> pomiędzy oczekiwaną wartością <{1}> a rzeczywistą wartością <{2}>. {0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ Szczegóły: + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} Komunikat: {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pt-BR.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pt-BR.xlf index c9303e0bc6..ddf1c49b7c 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pt-BR.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.pt-BR.xlf @@ -37,9 +37,9 @@ Esperado:<{1}>. Capitalização é diferente para o valor real:<{2}>. {0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Esperada uma diferença não maior que <{3}> entre o valor esperado <{1}> e o valor real <{2}>. {0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Esperada uma diferença maior que <{3}> entre o valor esperado <{1}> e o valor real <{2}>. {0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ Detalhes: + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} Mensagem: {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ru.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ru.xlf index e5ed433e3b..e868a010d0 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ru.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.ru.xlf @@ -37,9 +37,9 @@ Ожидается: <{1}>. Отличается на фактическое значение: <{2}>. {0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Между ожидаемым значением <{1}> и фактическим значением <{2}> требуется разница не более чем <{3}>. {0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Между ожидаемым значением <{1}> и фактическим значением <{2}> требуется разница более чем <{3}>. {0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ Подробности: + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} Сообщение: {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.tr.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.tr.xlf index 0de9d86526..f570186b4a 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.tr.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.tr.xlf @@ -37,9 +37,9 @@ Beklenen:<{1}>. Durum, gerçek değer için farklı:<{2}>. {0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Beklenen değer <{1}> ile gerçek değer <{2}> arasında, şundan büyük olmayan fark bekleniyor: <{3}>. {0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - Beklenen değer <{1}> ile gerçek değer <{2}> arasında, şundan büyük olan fark bekleniyor: <{3}>. {0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ Ayrıntılar: + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} İleti: {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hans.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hans.xlf index 0df0baee4f..600907e9c4 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hans.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hans.xlf @@ -37,9 +37,9 @@ 应为: <{1}>。实际值的大小写有所不同: <{2}>。{0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - 预期值 <{1}> 和实际值 <{2}> 之间的差不应大于 <{3}>。{0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - 预期值 <{1}> 和实际值 <{2}> 之间的差应大于 <{3}>。{0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ 详细信息: + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} 消息: {0} diff --git a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hant.xlf b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hant.xlf index cae600ef6f..9a091de149 100644 --- a/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hant.xlf +++ b/src/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.zh-Hant.xlf @@ -37,9 +37,9 @@ 預期: <{1}>。大小寫與下列實際值不同: <{2}>。{0} - - Expected a difference no greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - 預期值 <{1}> 和實際值 <{2}> 之間的預期差異沒有大於 <{3}>。{0} + + Expected values to be equal within tolerance. + Expected values to be equal within tolerance. @@ -193,9 +193,9 @@ <root> Placeholder used in equivalence-mismatch messages when the difference is at the top of the object graph. - - Expected a difference greater than <{3}> between expected value <{1}> and actual value <{2}>. {0} - 預期值 <{1}> 和實際值 <{2}> 之間的預期差異大於 <{3}>。{0} + + Expected values to differ beyond tolerance. + Expected values to differ beyond tolerance. @@ -303,6 +303,11 @@ 詳細資料: + + <Failed to evaluate> + <Failed to evaluate> + + Message: {0} 訊息: {0} diff --git a/test/UnitTests/TestFramework.UnitTests/Assertions/AssertTests.AreEqualTests.cs b/test/UnitTests/TestFramework.UnitTests/Assertions/AssertTests.AreEqualTests.cs index 8feba2c3f4..ade608bf67 100644 --- a/test/UnitTests/TestFramework.UnitTests/Assertions/AssertTests.AreEqualTests.cs +++ b/test/UnitTests/TestFramework.UnitTests/Assertions/AssertTests.AreEqualTests.cs @@ -336,6 +336,26 @@ public void AreNotEqual_PopulatesExpectedAndActualTextWithNotPrefix() ex.Data["assert.actual"].Should().Be("0"); } + public void AreEqualWithDelta_PopulatesExpectedAndActualText() + { + Action action = () => Assert.AreEqual(5.0f, 2.0f, 2.0f); + AssertFailedException ex = action.Should().Throw().Which; + ex.ExpectedText.Should().Be("5"); + ex.ActualText.Should().Be("2"); + ex.Data["assert.expected"].Should().Be("5"); + ex.Data["assert.actual"].Should().Be("2"); + } + + public void AreNotEqualWithDelta_PopulatesExpectedAndActualTextWithNotPrefix() + { + Action action = () => Assert.AreNotEqual(5.0f, 4.0f, 2.0f); + AssertFailedException ex = action.Should().Throw().Which; + ex.ExpectedText.Should().Be("not 5"); + ex.ActualText.Should().Be("4"); + ex.Data["assert.expected"].Should().Be("not 5"); + ex.Data["assert.actual"].Should().Be("4"); + } + public void AreNotEqual_FailsWithStructuredMessage() { Action action = () => Assert.AreNotEqual(0, 0); @@ -507,7 +527,12 @@ public async Task FloatAreEqual_InterpolatedString_DifferentValues_ShouldFail() DateTime dateTime = DateTime.Now; Func action = async () => Assert.AreEqual(1.0f, 1.1f, 0.001f, $"User-provided message. {o}, {o,35}, {await GetHelloStringAsync()}, {new DummyIFormattable()}, {dateTime:tt}, {dateTime,5:tt}"); (await action.Should().ThrowAsync()) - .WithMessage($"Assert.AreEqual failed. Expected a difference no greater than <0.001> between expected value <1> and actual value <1.1>. 'expected' expression: '1.0f', 'actual' expression: '1.1f'. User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}"); + .Which.Message.Should().Be(CreateDeltaAreEqualFailureMessage( + "1", + "1.1", + "0.001", + "Assert.AreEqual(1.0f, 1.1f, )", + $"User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}")); o.WasToStringCalled.Should().BeTrue(); } @@ -524,7 +549,12 @@ public async Task FloatAreNotEqual_InterpolatedString_SameValues_ShouldFail() DateTime dateTime = DateTime.Now; Func action = async () => Assert.AreNotEqual(1.0f, 1.1f, 0.2f, $"User-provided message. {o}, {o,35}, {await GetHelloStringAsync()}, {new DummyIFormattable()}, {dateTime:tt}, {dateTime,5:tt}"); (await action.Should().ThrowAsync()) - .WithMessage($"Assert.AreNotEqual failed. Expected a difference greater than <0.2> between expected value <1> and actual value <1.1>. 'notExpected' expression: '1.0f', 'actual' expression: '1.1f'. User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}"); + .Which.Message.Should().Be(CreateDeltaAreNotEqualFailureMessage( + "1", + "1.1", + "0.2", + "Assert.AreNotEqual(1.0f, 1.1f, )", + $"User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}")); o.WasToStringCalled.Should().BeTrue(); } @@ -541,7 +571,12 @@ public async Task DecimalAreEqual_InterpolatedString_DifferentValues_ShouldFail( DateTime dateTime = DateTime.Now; Func action = async () => Assert.AreEqual(1.0m, 1.1m, 0.001m, $"User-provided message. {o}, {o,35}, {await GetHelloStringAsync()}, {new DummyIFormattable()}, {dateTime:tt}, {dateTime,5:tt}"); (await action.Should().ThrowAsync()) - .WithMessage($"Assert.AreEqual failed. Expected a difference no greater than <0.001> between expected value <1.0> and actual value <1.1>. 'expected' expression: '1.0m', 'actual' expression: '1.1m'. User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}"); + .Which.Message.Should().Be(CreateDeltaAreEqualFailureMessage( + "1.0", + "1.1", + "0.001", + "Assert.AreEqual(1.0m, 1.1m, )", + $"User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}")); o.WasToStringCalled.Should().BeTrue(); } @@ -558,7 +593,12 @@ public async Task DecimalAreNotEqual_InterpolatedString_SameValues_ShouldFail() DateTime dateTime = DateTime.Now; Func action = async () => Assert.AreNotEqual(1.0m, 1.1m, 0.2m, $"User-provided message. {o}, {o,35}, {await GetHelloStringAsync()}, {new DummyIFormattable()}, {dateTime:tt}, {dateTime,5:tt}"); (await action.Should().ThrowAsync()) - .WithMessage($"Assert.AreNotEqual failed. Expected a difference greater than <0.2> between expected value <1.0> and actual value <1.1>. 'notExpected' expression: '1.0m', 'actual' expression: '1.1m'. User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}"); + .Which.Message.Should().Be(CreateDeltaAreNotEqualFailureMessage( + "1.0", + "1.1", + "0.2", + "Assert.AreNotEqual(1.0m, 1.1m, )", + $"User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}")); o.WasToStringCalled.Should().BeTrue(); } @@ -575,7 +615,12 @@ public async Task LongAreEqual_InterpolatedString_DifferentValues_ShouldFail() DateTime dateTime = DateTime.Now; Func action = async () => Assert.AreEqual(1L, 2L, 0L, $"User-provided message. {o}, {o,35}, {await GetHelloStringAsync()}, {new DummyIFormattable()}, {dateTime:tt}, {dateTime,5:tt}"); (await action.Should().ThrowAsync()) - .WithMessage($"Assert.AreEqual failed. Expected a difference no greater than <0> between expected value <1> and actual value <2>. 'expected' expression: '1L', 'actual' expression: '2L'. User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}"); + .Which.Message.Should().Be(CreateDeltaAreEqualFailureMessage( + "1", + "2", + "0", + "Assert.AreEqual(1L, 2L, )", + $"User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}")); o.WasToStringCalled.Should().BeTrue(); } @@ -592,7 +637,12 @@ public async Task LongAreNotEqual_InterpolatedString_SameValues_ShouldFail() DateTime dateTime = DateTime.Now; Func action = async () => Assert.AreNotEqual(1L, 2L, 1L, $"User-provided message. {o}, {o,35}, {await GetHelloStringAsync()}, {new DummyIFormattable()}, {dateTime:tt}, {dateTime,5:tt}"); (await action.Should().ThrowAsync()) - .WithMessage($"Assert.AreNotEqual failed. Expected a difference greater than <1> between expected value <1> and actual value <2>. 'notExpected' expression: '1L', 'actual' expression: '2L'. User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}"); + .Which.Message.Should().Be(CreateDeltaAreNotEqualFailureMessage( + "1", + "2", + "1", + "Assert.AreNotEqual(1L, 2L, )", + $"User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}")); o.WasToStringCalled.Should().BeTrue(); } @@ -609,7 +659,12 @@ public async Task DoubleAreEqual_InterpolatedString_DifferentValues_ShouldFail() DateTime dateTime = DateTime.Now; Func action = async () => Assert.AreEqual(1.0d, 1.1d, 0.001d, $"User-provided message. {o}, {o,35}, {await GetHelloStringAsync()}, {new DummyIFormattable()}, {dateTime:tt}, {dateTime,5:tt}"); (await action.Should().ThrowAsync()) - .WithMessage($"Assert.AreEqual failed. Expected a difference no greater than <0.001> between expected value <1> and actual value <1.1>. 'expected' expression: '1.0d', 'actual' expression: '1.1d'. User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}"); + .Which.Message.Should().Be(CreateDeltaAreEqualFailureMessage( + "1", + "1.1", + "0.001", + "Assert.AreEqual(1.0d, 1.1d, )", + $"User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}")); o.WasToStringCalled.Should().BeTrue(); } @@ -626,7 +681,12 @@ public async Task DoubleAreNotEqual_InterpolatedString_SameValues_ShouldFail() DateTime dateTime = DateTime.Now; Func action = async () => Assert.AreNotEqual(1.0d, 1.1d, 0.2d, $"User-provided message. {o}, {o,35}, {await GetHelloStringAsync()}, {new DummyIFormattable()}, {dateTime:tt}, {dateTime,5:tt}"); (await action.Should().ThrowAsync()) - .WithMessage($"Assert.AreNotEqual failed. Expected a difference greater than <0.2> between expected value <1> and actual value <1.1>. 'notExpected' expression: '1.0d', 'actual' expression: '1.1d'. User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}"); + .Which.Message.Should().Be(CreateDeltaAreNotEqualFailureMessage( + "1", + "1.1", + "0.2", + "Assert.AreNotEqual(1.0d, 1.1d, )", + $"User-provided message. DummyClassTrackingToStringCalls, DummyClassTrackingToStringCalls, Hello, DummyIFormattable.ToString(), {string.Format(null, "{0:tt}", dateTime)}, {string.Format(null, "{0,5:tt}", dateTime)}")); o.WasToStringCalled.Should().BeTrue(); } @@ -798,13 +858,13 @@ Specified argument was out of the range of valid values. public void FloatAreEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActualDifferenceGreaterThanDeltaPositive_DeltaIsNumeric_ShouldFail() { Action action = () => Assert.AreEqual(5.0f, 2.0f, 2.0f); // difference is 3. Delta is 2 - action.Should().Throw().WithMessage("Assert.AreEqual failed. Expected a difference no greater than <2> between expected value <5> and actual value <2>. 'expected' expression: '5.0f', 'actual' expression: '2.0f'."); + action.Should().Throw().Which.Message.Should().Be(CreateDeltaAreEqualFailureMessage("5", "2", "2", "Assert.AreEqual(5.0f, 2.0f, )")); } public void FloatAreEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActualDifferenceGreaterThanDeltaNegative_DeltaIsNumeric_ShouldFail() { Action action = () => Assert.AreEqual(2.0f, 5.0f, 2.0f); // difference is -3. Delta is 2 - action.Should().Throw().WithMessage("Assert.AreEqual failed. Expected a difference no greater than <2> between expected value <2> and actual value <5>. 'expected' expression: '2.0f', 'actual' expression: '5.0f'."); + action.Should().Throw().Which.Message.Should().Be(CreateDeltaAreEqualFailureMessage("2", "5", "2", "Assert.AreEqual(2.0f, 5.0f, )")); } public void FloatAreEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActualDifferenceLessThanDeltaPositive_DeltaIsNumeric_ShouldPass() @@ -816,13 +876,13 @@ public void FloatAreEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActualDif public void FloatAreEqual_ExpectedIsNumeric_ActualIsNaN_DeltaIsNumeric_ShouldFail() { Action action = () => Assert.AreEqual(5.0f, float.NaN, 2.0f); - action.Should().Throw().WithMessage("Assert.AreEqual failed. Expected a difference no greater than <2> between expected value <5> and actual value . 'expected' expression: '5.0f', 'actual' expression: 'float.NaN'."); + action.Should().Throw().Which.Message.Should().Be(CreateDeltaAreEqualFailureMessage("5", "NaN", "2", "Assert.AreEqual(5.0f, float.NaN, )")); } public void FloatAreEqual_ExpectedIsNaN_ActualIsNumeric_DeltaIsNumeric_ShouldFail() { Action action = () => Assert.AreEqual(float.NaN, 5.0f, 2.0f); - action.Should().Throw().WithMessage("Assert.AreEqual failed. Expected a difference no greater than <2> between expected value and actual value <5>. 'expected' expression: 'float.NaN', 'actual' expression: '5.0f'."); + action.Should().Throw().Which.Message.Should().Be(CreateDeltaAreEqualFailureMessage("NaN", "5", "2", "Assert.AreEqual(float.NaN, 5.0f, )")); } public void FloatAreEqual_ExpectedIsNaN_ActualIsNaN_DeltaIsNumeric_ShouldPass() @@ -1010,13 +1070,13 @@ public void FloatAreNotEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActual public void FloatAreNotEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActualDifferenceLessThanDeltaPositive_DeltaIsNumeric_ShouldFail() { Action action = () => Assert.AreNotEqual(5.0f, 4.0f, 2.0f); // difference is 1. Delta is 2 - action.Should().Throw().WithMessage("Assert.AreNotEqual failed. Expected a difference greater than <2> between expected value <5> and actual value <4>. 'notExpected' expression: '5.0f', 'actual' expression: '4.0f'."); + action.Should().Throw().Which.Message.Should().Be(CreateDeltaAreNotEqualFailureMessage("5", "4", "2", "Assert.AreNotEqual(5.0f, 4.0f, )")); } public void FloatAreNotEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActualDifferenceLessThanDeltaNegative_DeltaIsNumeric_ShouldFail() { Action action = () => Assert.AreNotEqual(4.0f, 5.0f, 2.0f); // difference is -1. Delta is 2 - action.Should().Throw().WithMessage("Assert.AreNotEqual failed. Expected a difference greater than <2> between expected value <4> and actual value <5>. 'notExpected' expression: '4.0f', 'actual' expression: '5.0f'."); + action.Should().Throw().Which.Message.Should().Be(CreateDeltaAreNotEqualFailureMessage("4", "5", "2", "Assert.AreNotEqual(4.0f, 5.0f, )")); } public void FloatAreNotEqual_ExpectedIsNumeric_ActualIsNaN_DeltaIsNumeric_ShouldPass() => Assert.AreNotEqual(5.0f, float.NaN, 2.0f); @@ -1027,7 +1087,7 @@ public void FloatAreNotEqual_ExpectedIsNaN_ActualIsNumeric_DeltaIsNumeric_Should public void FloatAreNotEqual_ExpectedIsNaN_ActualIsNaN_DeltaIsNumeric_ShouldFail() { Action action = () => Assert.AreNotEqual(float.NaN, float.NaN, 2.0f); - action.Should().Throw().WithMessage("Assert.AreNotEqual failed. Expected a difference greater than <2> between expected value and actual value . 'notExpected' expression: 'float.NaN', 'actual' expression: 'float.NaN'."); + action.Should().Throw().Which.Message.Should().Be(CreateDeltaAreNotEqualFailureMessage("NaN", "NaN", "2", "Assert.AreNotEqual(float.NaN, float.NaN, )")); } public void DoubleAreEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActualNotEquals_DeltaIsNaN_ShouldFail() @@ -1211,14 +1271,14 @@ public void DoubleAreEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActualDi { Action action = () => Assert.AreEqual(5.0d, 2.0d, 2.0d); // difference is 3. Delta is 2 action.Should().Throw() - .WithMessage("Assert.AreEqual failed. Expected a difference no greater than <2> between expected value <5> and actual value <2>. 'expected' expression: '5.0d', 'actual' expression: '2.0d'."); + .Which.Message.Should().Be(CreateDeltaAreEqualFailureMessage("5", "2", "2", "Assert.AreEqual(5.0d, 2.0d, )")); } public void DoubleAreEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActualDifferenceGreaterThanDeltaNegative_DeltaIsNumeric_ShouldFail() { Action action = () => Assert.AreEqual(2.0d, 5.0d, 2.0d); // difference is -3. Delta is 2 action.Should().Throw() - .WithMessage("Assert.AreEqual failed. Expected a difference no greater than <2> between expected value <2> and actual value <5>. 'expected' expression: '2.0d', 'actual' expression: '5.0d'."); + .Which.Message.Should().Be(CreateDeltaAreEqualFailureMessage("2", "5", "2", "Assert.AreEqual(2.0d, 5.0d, )")); } public void DoubleAreEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActualDifferenceLessThanDeltaPositive_DeltaIsNumeric_ShouldPass() @@ -1231,14 +1291,14 @@ public void DoubleAreEqual_ExpectedIsNumeric_ActualIsNaN_DeltaIsNumeric_ShouldFa { Action action = () => Assert.AreEqual(5.0d, double.NaN, 2.0d); action.Should().Throw() - .WithMessage("Assert.AreEqual failed. Expected a difference no greater than <2> between expected value <5> and actual value . 'expected' expression: '5.0d', 'actual' expression: 'double.NaN'."); + .Which.Message.Should().Be(CreateDeltaAreEqualFailureMessage("5", "NaN", "2", "Assert.AreEqual(5.0d, double.NaN, )")); } public void DoubleAreEqual_ExpectedIsNaN_ActualIsNumeric_DeltaIsNumeric_ShouldFail() { Action action = () => Assert.AreEqual(double.NaN, 5.0d, 2.0d); action.Should().Throw() - .WithMessage("Assert.AreEqual failed. Expected a difference no greater than <2> between expected value and actual value <5>. 'expected' expression: 'double.NaN', 'actual' expression: '5.0d'."); + .Which.Message.Should().Be(CreateDeltaAreEqualFailureMessage("NaN", "5", "2", "Assert.AreEqual(double.NaN, 5.0d, )")); } public void DoubleAreEqual_ExpectedIsNaN_ActualIsNaN_DeltaIsNumeric_ShouldPass() @@ -1434,14 +1494,14 @@ public void DoubleAreNotEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActua { Action action = () => Assert.AreNotEqual(5.0d, 4.0d, 2.0d); // difference is 1. Delta is 2 action.Should().Throw() - .WithMessage("Assert.AreNotEqual failed. Expected a difference greater than <2> between expected value <5> and actual value <4>. 'notExpected' expression: '5.0d', 'actual' expression: '4.0d'."); + .Which.Message.Should().Be(CreateDeltaAreNotEqualFailureMessage("5", "4", "2", "Assert.AreNotEqual(5.0d, 4.0d, )")); } public void DoubleAreNotEqual_ExpectedIsNumeric_ActualIsNumeric_ExpectedAndActualDifferenceLessThanDeltaNegative_DeltaIsNumeric_ShouldFail() { Action action = () => Assert.AreNotEqual(4.0d, 5.0d, 2.0d); // difference is -1. Delta is 2 action.Should().Throw() - .WithMessage("Assert.AreNotEqual failed. Expected a difference greater than <2> between expected value <4> and actual value <5>. 'notExpected' expression: '4.0d', 'actual' expression: '5.0d'."); + .Which.Message.Should().Be(CreateDeltaAreNotEqualFailureMessage("4", "5", "2", "Assert.AreNotEqual(4.0d, 5.0d, )")); } public void DoubleAreNotEqual_ExpectedIsNumeric_ActualIsNaN_DeltaIsNumeric_ShouldPass() => Assert.AreNotEqual(5.0d, double.NaN, 2.0d); @@ -1453,7 +1513,61 @@ public void DoubleAreNotEqual_ExpectedIsNaN_ActualIsNaN_DeltaIsNumeric_ShouldFai { Action action = () => Assert.AreNotEqual(double.NaN, double.NaN, 2.0d); action.Should().Throw() - .WithMessage("Assert.AreNotEqual failed. Expected a difference greater than <2> between expected value and actual value . 'notExpected' expression: 'double.NaN', 'actual' expression: 'double.NaN'."); + .Which.Message.Should().Be(CreateDeltaAreNotEqualFailureMessage("NaN", "NaN", "2", "Assert.AreNotEqual(double.NaN, double.NaN, )")); + } + + private static string CreateDeltaAreEqualFailureMessage(string expected, string actual, string delta, string callSite, string? userMessage = null) + { + string[] lines = userMessage is null + ? + [ + "Assertion failed. Expected values to be equal within tolerance.", + string.Empty, + $"expected: {expected}", + $"actual: {actual}", + $"delta: {delta}", + string.Empty, + callSite, + ] + : + [ + "Assertion failed. Expected values to be equal within tolerance.", + userMessage, + string.Empty, + $"expected: {expected}", + $"actual: {actual}", + $"delta: {delta}", + string.Empty, + callSite, + ]; + return string.Join(Environment.NewLine, lines); + } + + private static string CreateDeltaAreNotEqualFailureMessage(string notExpected, string actual, string delta, string callSite, string? userMessage = null) + { + string[] lines = userMessage is null + ? + [ + "Assertion failed. Expected values to differ beyond tolerance.", + string.Empty, + $"not expected: {notExpected}", + $"actual: {actual}", + $"delta: {delta}", + string.Empty, + callSite, + ] + : + [ + "Assertion failed. Expected values to differ beyond tolerance.", + userMessage, + string.Empty, + $"not expected: {notExpected}", + $"actual: {actual}", + $"delta: {delta}", + string.Empty, + callSite, + ]; + return string.Join(Environment.NewLine, lines); } private class TypeOverridesEquals