diff --git a/Source/Mockolate/Setup/MethodSetup.cs b/Source/Mockolate/Setup/MethodSetup.cs index 00cf63e4..38889202 100644 --- a/Source/Mockolate/Setup/MethodSetup.cs +++ b/Source/Mockolate/Setup/MethodSetup.cs @@ -142,32 +142,6 @@ protected static bool HasOutParameter(NamedParameter?[] namedParameters, stri return false; } - /// - /// Determines whether each value in the specified array matches the corresponding named parameter according to the - /// parameter's matching criteria. - /// - /// - /// The method returns false if the lengths of the namedParameters and values arrays do not match. - /// Each value is compared to its corresponding named parameter using the parameter's matching logic. - /// - protected static bool Matches(NamedParameter[] namedParameters, NamedParameterValue[] values) - { - if (namedParameters.Length != values.Length) - { - return false; - } - - for (int i = 0; i < namedParameters.Length; i++) - { - if (!namedParameters[i].Matches(values[i])) - { - return false; - } - } - - return true; - } - /// /// Triggers the parameter callbacks for each value in the specified array according to /// the corresponding named parameter. diff --git a/Source/Mockolate/Verify/VerificationResult.cs b/Source/Mockolate/Verify/VerificationResult.cs index e474918e..24d3f892 100644 --- a/Source/Mockolate/Verify/VerificationResult.cs +++ b/Source/Mockolate/Verify/VerificationResult.cs @@ -146,9 +146,7 @@ public async Task VerifyAsync(Func predicate) { return true; } - } while (!token.IsCancellationRequested); - - return false; + } while (true); } finally { diff --git a/Tests/Mockolate.Api.Tests/Expected/Mockolate_net10.0.txt b/Tests/Mockolate.Api.Tests/Expected/Mockolate_net10.0.txt index c0e92b25..1b53e675 100644 --- a/Tests/Mockolate.Api.Tests/Expected/Mockolate_net10.0.txt +++ b/Tests/Mockolate.Api.Tests/Expected/Mockolate_net10.0.txt @@ -1432,7 +1432,6 @@ namespace Mockolate.Setup protected static string FormatType(System.Type type) { } protected static bool HasOutParameter(Mockolate.Parameters.NamedParameter?[] namedParameters, string parameterName, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out Mockolate.Parameters.IOutParameter? parameter) { } protected static bool HasRefParameter(Mockolate.Parameters.NamedParameter?[] namedParameters, string parameterName, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out Mockolate.Parameters.IRefParameter? parameter) { } - protected static bool Matches(Mockolate.Parameters.NamedParameter[] namedParameters, Mockolate.Parameters.NamedParameterValue[] values) { } protected static void TriggerCallbacks(Mockolate.Parameters.NamedParameter?[] namedParameters, object?[] values) { } protected static bool TryCast([System.Diagnostics.CodeAnalysis.NotNullWhen(false)] object? value, out T result, Mockolate.MockBehavior behavior) { } } diff --git a/Tests/Mockolate.Api.Tests/Expected/Mockolate_net8.0.txt b/Tests/Mockolate.Api.Tests/Expected/Mockolate_net8.0.txt index 7fe675bc..316f9ff2 100644 --- a/Tests/Mockolate.Api.Tests/Expected/Mockolate_net8.0.txt +++ b/Tests/Mockolate.Api.Tests/Expected/Mockolate_net8.0.txt @@ -1431,7 +1431,6 @@ namespace Mockolate.Setup protected static string FormatType(System.Type type) { } protected static bool HasOutParameter(Mockolate.Parameters.NamedParameter?[] namedParameters, string parameterName, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out Mockolate.Parameters.IOutParameter? parameter) { } protected static bool HasRefParameter(Mockolate.Parameters.NamedParameter?[] namedParameters, string parameterName, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out Mockolate.Parameters.IRefParameter? parameter) { } - protected static bool Matches(Mockolate.Parameters.NamedParameter[] namedParameters, Mockolate.Parameters.NamedParameterValue[] values) { } protected static void TriggerCallbacks(Mockolate.Parameters.NamedParameter?[] namedParameters, object?[] values) { } protected static bool TryCast([System.Diagnostics.CodeAnalysis.NotNullWhen(false)] object? value, out T result, Mockolate.MockBehavior behavior) { } } diff --git a/Tests/Mockolate.Api.Tests/Expected/Mockolate_netstandard2.0.txt b/Tests/Mockolate.Api.Tests/Expected/Mockolate_netstandard2.0.txt index cae7a720..86caaf73 100644 --- a/Tests/Mockolate.Api.Tests/Expected/Mockolate_netstandard2.0.txt +++ b/Tests/Mockolate.Api.Tests/Expected/Mockolate_netstandard2.0.txt @@ -1394,7 +1394,6 @@ namespace Mockolate.Setup protected static string FormatType(System.Type type) { } protected static bool HasOutParameter(Mockolate.Parameters.NamedParameter?[] namedParameters, string parameterName, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out Mockolate.Parameters.IOutParameter? parameter) { } protected static bool HasRefParameter(Mockolate.Parameters.NamedParameter?[] namedParameters, string parameterName, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out Mockolate.Parameters.IRefParameter? parameter) { } - protected static bool Matches(Mockolate.Parameters.NamedParameter[] namedParameters, Mockolate.Parameters.NamedParameterValue[] values) { } protected static void TriggerCallbacks(Mockolate.Parameters.NamedParameter?[] namedParameters, object?[] values) { } protected static bool TryCast([System.Diagnostics.CodeAnalysis.NotNullWhen(false)] object? value, out T result, Mockolate.MockBehavior behavior) { } } diff --git a/Tests/Mockolate.Tests/Verify/VerificationResultTests.AsyncTests.cs b/Tests/Mockolate.Tests/Verify/VerificationResultTests.AsyncTests.cs index 3f7a2f2d..f2a68749 100644 --- a/Tests/Mockolate.Tests/Verify/VerificationResultTests.AsyncTests.cs +++ b/Tests/Mockolate.Tests/Verify/VerificationResultTests.AsyncTests.cs @@ -29,14 +29,53 @@ await That(Act).Throws() } [Fact] - public async Task WhenAlreadySuccessful_ShouldSucceed() + public async Task VerifyAsync_WhenAlreadySuccessful_ShouldReturnTrue() { IChocolateDispenser sut = Mock.Create(); sut.Dispense("Dark", 1); sut.Dispense("Dark", 2); - await That(sut.VerifyMock.Invoked.Dispense(Match.AnyParameters()).Within(TimeSpan.FromMilliseconds(500))) - .AtLeastOnce(); + VerificationResult result = sut.VerifyMock.Invoked.Dispense(Match.AnyParameters()) + .Within(TimeSpan.FromMilliseconds(500)); + + await That(((IAsyncVerificationResult)result).VerifyAsync(l => l.Length > 0)).IsTrue(); + } + + [Fact] + public async Task VerifyAsync_WhenMultipleIterationsAreNecessary_ShouldStopWhenSuccessful() + { + IChocolateDispenser sut = Mock.Create(); + + VerificationResult result = sut.VerifyMock.Invoked.Dispense(Match.AnyParameters()) + .Within(TimeSpan.FromSeconds(10)); + using CancellationTokenSource cts = new(); + CancellationToken token = cts.Token; + + _ = Task.Run(async () => + { + for (int i = 0; i < 1000; i++) + { + await Task.Delay(10, CancellationToken.None); + sut.Dispense("Dark", i); + if (token.IsCancellationRequested) + { + break; + } + } + }, token); + + await That(((IAsyncVerificationResult)result).VerifyAsync(l => l.Length > 20)).IsTrue(); + } + + [Fact] + public async Task WithCancellation_ShouldReturnAsyncVerificationResult() + { + IChocolateDispenser sut = Mock.Create(); + + VerificationResult result = sut.VerifyMock.Invoked.Dispense(Match.AnyParameters()) + .WithCancellation(CancellationToken.None); + + await That(result).Is(); } [Fact] @@ -107,7 +146,7 @@ public async Task Within_ShouldAbortAsSoonAsConditionIsSatisfied() { for (int i = 0; i < 100; i++) { - await Task.Delay(100); + await Task.Delay(100, CancellationToken.None); sut.Dispense("Dark", i); if (token.IsCancellationRequested) { @@ -122,7 +161,18 @@ public async Task Within_ShouldAbortAsSoonAsConditionIsSatisfied() sw.Stop(); cts.Cancel(); - await That(sw.Elapsed).IsLessThan(TimeSpan.FromSeconds(1)); + await That(sw.Elapsed).IsLessThan(TimeSpan.FromSeconds(2)); + } + + [Fact] + public async Task Within_ShouldReturnAsyncVerificationResult() + { + IChocolateDispenser sut = Mock.Create(); + + VerificationResult result = sut.VerifyMock.Invoked.Dispense(Match.AnyParameters()) + .Within(TimeSpan.FromMilliseconds(100)); + + await That(result).Is(); } [Fact]