From d9d251cc698b6874b2bd3e4923d7d7fe89d1f83e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Breu=C3=9F=20Valentin?= Date: Sat, 13 Dec 2025 07:00:49 +0100 Subject: [PATCH 1/2] refactor: rename `It.Is` with predicate to `It.Satisfies` Also move comparer to separate fluent callback and add it to `It.IsOneOf` --- Docs/pages/02-setup.md | 13 +- README.md | 10 +- Source/Mockolate/It.Is.cs | 54 ++++---- Source/Mockolate/It.IsOneOf.cs | 42 +++++- Source/Mockolate/It.Satisfies.cs | 27 ++++ .../Expected/Mockolate_net10.0.txt | 15 ++- .../Expected/Mockolate_net8.0.txt | 15 ++- .../Expected/Mockolate_netstandard2.0.txt | 15 ++- Tests/Mockolate.ExampleTests/ExampleTests.cs | 2 +- Tests/Mockolate.Tests/ItTests.IsOneOfTests.cs | 2 +- Tests/Mockolate.Tests/ItTests.IsTests.cs | 105 +-------------- .../Mockolate.Tests/ItTests.SatisfiesTests.cs | 122 ++++++++++++++++++ Tests/Mockolate.Tests/ItTests.cs | 8 +- Tests/Mockolate.Tests/MatchExtensionsTests.cs | 2 +- ...ts.cs => MatchTests.AnyParametersTests.cs} | 4 +- .../MockBehaviorTests.InitializeTests.cs | 4 +- .../SetupIndexerTests.InitializeWithTests.cs | 32 ++--- .../SetupIndexerTests.OnGetTests.cs | 32 ++--- .../SetupIndexerTests.OnSetTests.cs | 32 ++--- .../SetupIndexerTests.SpanTests.cs | 8 +- .../VerifyGotIndexerTests.SpanTests.cs | 6 +- .../MockIndexers/VerifyGotIndexerTests.cs | 4 +- .../VerifySetIndexerTests.SpanTests.cs | 6 +- .../MockIndexers/VerifySetIndexerTests.cs | 4 +- .../SetupMethodTests.CallbackTests.cs | 72 +++++------ .../SetupMethodTests.OutRefParameterTests.cs | 60 ++++----- .../MockMethods/SetupMethodTests.SpanTests.cs | 4 +- .../MockMethods/SetupMethodTests.cs | 2 +- .../VerifyInvokedTests.SpanTests.cs | 6 +- 29 files changed, 407 insertions(+), 301 deletions(-) create mode 100644 Source/Mockolate/It.Satisfies.cs create mode 100644 Tests/Mockolate.Tests/ItTests.SatisfiesTests.cs rename Tests/Mockolate.Tests/{ItTests.IsAnyParametersTests.cs => MatchTests.AnyParametersTests.cs} (88%) diff --git a/Docs/pages/02-setup.md b/Docs/pages/02-setup.md index f68c566b..f6abdb65 100644 --- a/Docs/pages/02-setup.md +++ b/Docs/pages/02-setup.md @@ -55,13 +55,18 @@ sut.SetupMock.Method.DispenseAsync(It.IsAny(), It.IsAny()) Mockolate provides flexible parameter matching for method setups and verifications: - `It.IsAny()`: Matches any value of type `T`. -- `It.Is(predicate)`: Matches values based on a predicate. -- `It.Is(value)`: Matches a specific value. +- `It.Is(value)`: Matches a specific value. With `.Using(IEqualityComparer)`, you can provide a custom equality comparer. +- `It.IsOneOf(params T[] values)`: Matches any of the given values. With `.Using(IEqualityComparer)`, you can provide a custom equality comparer. - `It.IsNull()`: Matches null. - `It.IsTrue()`/`It.IsFalse()`: Matches boolean true/false. -- `It.IsInRange(min, max)`: Matches a number within the given range. You can append `.Exclusive()` to exclude the minimum and maximum value. -- `It.IsOut(…)`/`It.IsRef(…)`: Matches and sets out/ref parameters, supports value setting and +- `It.IsInRange(min, max)`: Matches a number within the given range. You can append `.Exclusive()` to exclude the + minimum and maximum value. +- `It.IsOut(…)`/`It.IsAnyOut(…)`: Matches and sets out parameters, supports value setting and predicates. +- `It.IsRef(…)`/`It.IsAnyRef(…)`: Matches and sets ref parameters, supports value setting and + predicates. +- `It.Matches(pattern)`: Matches strings using wildcard patterns (`*` and `?`). With `.AsRegex()`, you can use regular expressions instead. +- `It.Satisfies(predicate)`: Matches values based on a predicate. #### Parameter Interaction diff --git a/README.md b/README.md index 8a74dbb8..e1f95c25 100644 --- a/README.md +++ b/README.md @@ -191,14 +191,18 @@ sut.SetupMock.Method.DispenseAsync(It.IsAny(), It.IsAny()) Mockolate provides flexible parameter matching for method setups and verifications: - `It.IsAny()`: Matches any value of type `T`. -- `It.Is(predicate)`: Matches values based on a predicate. -- `It.Is(value)`: Matches a specific value. +- `It.Is(value)`: Matches a specific value. With `.Using(IEqualityComparer)`, you can provide a custom equality comparer. +- `It.IsOneOf(params T[] values)`: Matches any of the given values. With `.Using(IEqualityComparer)`, you can provide a custom equality comparer. - `It.IsNull()`: Matches null. - `It.IsTrue()`/`It.IsFalse()`: Matches boolean true/false. - `It.IsInRange(min, max)`: Matches a number within the given range. You can append `.Exclusive()` to exclude the minimum and maximum value. -- `It.IsOut(…)`/`It.IsRef(…)`: Matches and sets out/ref parameters, supports value setting and +- `It.IsOut(…)`/`It.IsAnyOut(…)`: Matches and sets out parameters, supports value setting and predicates. +- `It.IsRef(…)`/`It.IsAnyRef(…)`: Matches and sets ref parameters, supports value setting and + predicates. +- `It.Matches(pattern)`: Matches strings using wildcard patterns (`*` and `?`). With `.AsRegex()`, you can use regular expressions instead. +- `It.Satisfies(predicate)`: Matches values based on a predicate. #### Parameter Interaction diff --git a/Source/Mockolate/It.Is.cs b/Source/Mockolate/It.Is.cs index ffe161af..60a4e88a 100644 --- a/Source/Mockolate/It.Is.cs +++ b/Source/Mockolate/It.Is.cs @@ -1,7 +1,5 @@ -using System; using System.Collections.Generic; using System.Runtime.CompilerServices; -using Mockolate.Internals; using Mockolate.Parameters; namespace Mockolate; @@ -13,43 +11,43 @@ public partial class It /// /// Matches a parameter that is equal to . /// - public static IParameter Is(T value, + public static IIsParameter Is(T value, [CallerArgumentExpression(nameof(value))] string doNotPopulateThisValue = "") => new ParameterEqualsMatch(value, doNotPopulateThisValue); /// - /// Matches a parameter that is equal to according to the . + /// An used for equality comparison. /// - public static IParameter Is(T value, IEqualityComparer comparer, - [CallerArgumentExpression(nameof(value))] - string doNotPopulateThisValue1 = "", - [CallerArgumentExpression(nameof(comparer))] - string doNotPopulateThisValue2 = "") - => new ParameterEqualsMatch(value, doNotPopulateThisValue1, comparer, doNotPopulateThisValue2); - - /// - /// Matches a parameter of type that satisfies the . - /// - public static IParameter Is(Func predicate, - [CallerArgumentExpression("predicate")] - string doNotPopulateThisValue = "") - => new PredicateParameterMatch(predicate, doNotPopulateThisValue); + public interface IIsParameter : IParameter + { + /// + /// Use the specified comparer to determine equality. + /// + IIsParameter Using(IEqualityComparer comparer, + [CallerArgumentExpression(nameof(comparer))] + string doNotPopulateThisValue = ""); + } - private sealed class ParameterEqualsMatch : TypedMatch + private sealed class ParameterEqualsMatch : TypedMatch, IIsParameter { - private readonly IEqualityComparer? _comparer; - private readonly string? _comparerExpression; private readonly T _value; private readonly string _valueExpression; + private IEqualityComparer? _comparer; + private string? _comparerExpression; - public ParameterEqualsMatch(T value, string valueExpression, IEqualityComparer? comparer = null, - string? comparerExpression = null) + public ParameterEqualsMatch(T value, string valueExpression) { _value = value; _valueExpression = valueExpression; + } + + /// + public IIsParameter Using(IEqualityComparer comparer, string doNotPopulateThisValue = "") + { _comparer = comparer; - _comparerExpression = comparerExpression; + _comparerExpression = doNotPopulateThisValue; + return this; } /// @@ -68,18 +66,12 @@ public override string ToString() { if (_comparer is not null) { - return $"It.Is({_valueExpression}, {_comparerExpression})"; + return $"It.Is({_valueExpression}).Using({_comparerExpression})"; } return _valueExpression; } } - - private sealed class PredicateParameterMatch(Func predicate, string predicateExpression) : TypedMatch - { - protected override bool Matches(T value) => predicate(value); - public override string ToString() => $"It.Is<{typeof(T).FormatType()}>({predicateExpression})"; - } } #pragma warning restore S3218 // Inner class members should not shadow outer class "static" or type members #pragma warning restore S3453 // This class can't be instantiated; make its constructor 'public'. diff --git a/Source/Mockolate/It.IsOneOf.cs b/Source/Mockolate/It.IsOneOf.cs index 24aadcdb..079a0a02 100644 --- a/Source/Mockolate/It.IsOneOf.cs +++ b/Source/Mockolate/It.IsOneOf.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Runtime.CompilerServices; using Mockolate.Parameters; namespace Mockolate; @@ -11,21 +12,54 @@ public partial class It /// /// Matches a parameter that is equal to one of the . /// - public static IParameter IsOneOf(params T[] values) + public static IIsOneOfParameter IsOneOf(params T[] values) => new ParameterIsOneOfMatch(values); - private sealed class ParameterIsOneOfMatch(T[] values) : TypedMatch + /// + /// An used for equality comparison of a collection of alternatives. + /// + public interface IIsOneOfParameter : IParameter + { + /// + /// Use the specified comparer to determine equality. + /// + IIsOneOfParameter Using(IEqualityComparer comparer, + [CallerArgumentExpression(nameof(comparer))] + string doNotPopulateThisValue = ""); + } + + private sealed class ParameterIsOneOfMatch(T[] values) : TypedMatch, IIsOneOfParameter { + private IEqualityComparer? _comparer; + private string? _comparerExpression; + + /// + public IIsOneOfParameter Using(IEqualityComparer comparer, string doNotPopulateThisValue = "") + { + _comparer = comparer; + _comparerExpression = doNotPopulateThisValue; + return this; + } + /// protected override bool Matches(T value) { - EqualityComparer comparer = EqualityComparer.Default; + IEqualityComparer comparer = _comparer ?? EqualityComparer.Default; return values.Any(v => comparer.Equals(value, v)); } /// public override string ToString() - => $"It.IsOneOf({string.Join(", ", values.Select(v => v is string ? $"\"{v}\"" : v?.ToString() ?? "null"))})"; + { + string result = + $"It.IsOneOf({string.Join(", ", values.Select(v => v is string ? $"\"{v}\"" : v?.ToString() ?? "null"))})"; + if (_comparer is not null) + { + result += $".Using({_comparerExpression})"; + } + + return result; + } } } #pragma warning restore S3218 // Inner class members should not shadow outer class "static" or type members diff --git a/Source/Mockolate/It.Satisfies.cs b/Source/Mockolate/It.Satisfies.cs new file mode 100644 index 00000000..a7444bca --- /dev/null +++ b/Source/Mockolate/It.Satisfies.cs @@ -0,0 +1,27 @@ +using System; +using System.Runtime.CompilerServices; +using Mockolate.Internals; +using Mockolate.Parameters; + +namespace Mockolate; + +#pragma warning disable S3453 // This class can't be instantiated; make its constructor 'public'. +#pragma warning disable S3218 // Inner class members should not shadow outer class "static" or type members +public partial class It +{ + /// + /// Matches a parameter of type that satisfies the . + /// + public static IParameter Satisfies(Func predicate, + [CallerArgumentExpression("predicate")] + string doNotPopulateThisValue = "") + => new SatisfiesPredicateMatch(predicate, doNotPopulateThisValue); + + private sealed class SatisfiesPredicateMatch(Func predicate, string predicateExpression) : TypedMatch + { + protected override bool Matches(T value) => predicate(value); + public override string ToString() => $"It.Satisfies<{typeof(T).FormatType()}>({predicateExpression})"; + } +} +#pragma warning restore S3218 // Inner class members should not shadow outer class "static" or type members +#pragma warning restore S3453 // This class can't be instantiated; make its constructor 'public'. diff --git a/Tests/Mockolate.Api.Tests/Expected/Mockolate_net10.0.txt b/Tests/Mockolate.Api.Tests/Expected/Mockolate_net10.0.txt index 9859eade..414f1aa6 100644 --- a/Tests/Mockolate.Api.Tests/Expected/Mockolate_net10.0.txt +++ b/Tests/Mockolate.Api.Tests/Expected/Mockolate_net10.0.txt @@ -28,9 +28,7 @@ namespace Mockolate } public class It { - public static Mockolate.Parameters.IParameter Is(System.Func predicate, [System.Runtime.CompilerServices.CallerArgumentExpression("predicate")] string doNotPopulateThisValue = "") { } - public static Mockolate.Parameters.IParameter Is(T value, [System.Runtime.CompilerServices.CallerArgumentExpression("value")] string doNotPopulateThisValue = "") { } - public static Mockolate.Parameters.IParameter Is(T value, System.Collections.Generic.IEqualityComparer comparer, [System.Runtime.CompilerServices.CallerArgumentExpression("value")] string doNotPopulateThisValue1 = "", [System.Runtime.CompilerServices.CallerArgumentExpression("comparer")] string doNotPopulateThisValue2 = "") { } + public static Mockolate.It.IIsParameter Is(T value, [System.Runtime.CompilerServices.CallerArgumentExpression("value")] string doNotPopulateThisValue = "") { } public static Mockolate.Parameters.IParameter IsAny() { } public static Mockolate.Parameters.IOutParameter IsAnyOut() { } public static Mockolate.Parameters.IVerifyReadOnlySpanParameter IsAnyReadOnlySpan() { } @@ -40,7 +38,7 @@ namespace Mockolate public static Mockolate.It.IInRangeParameter IsInRange(T minimum, T maximum, [System.Runtime.CompilerServices.CallerArgumentExpression("minimum")] string doNotPopulateThisValue1 = "", [System.Runtime.CompilerServices.CallerArgumentExpression("maximum")] string doNotPopulateThisValue2 = "") where T : System.IComparable { } public static Mockolate.Parameters.IParameter IsNull() { } - public static Mockolate.Parameters.IParameter IsOneOf(params T[] values) { } + public static Mockolate.It.IIsOneOfParameter IsOneOf(params T[] values) { } public static Mockolate.Parameters.IVerifyOutParameter IsOut() { } public static Mockolate.Parameters.IOutParameter IsOut(System.Func setter, [System.Runtime.CompilerServices.CallerArgumentExpression("setter")] string doNotPopulateThisValue = "") { } public static Mockolate.Parameters.IVerifyReadOnlySpanParameter IsReadOnlySpan(System.Func predicate) { } @@ -51,11 +49,20 @@ namespace Mockolate public static Mockolate.Parameters.IVerifySpanParameter IsSpan(System.Func predicate) { } public static Mockolate.Parameters.IParameter IsTrue() { } public static Mockolate.It.IParameterMatches Matches(string pattern) { } + public static Mockolate.Parameters.IParameter Satisfies(System.Func predicate, [System.Runtime.CompilerServices.CallerArgumentExpression("predicate")] string doNotPopulateThisValue = "") { } public interface IInRangeParameter : Mockolate.Parameters.IParameter { Mockolate.Parameters.IParameter Exclusive(); Mockolate.Parameters.IParameter Inclusive(); } + public interface IIsOneOfParameter : Mockolate.Parameters.IParameter + { + Mockolate.It.IIsOneOfParameter Using(System.Collections.Generic.IEqualityComparer comparer, [System.Runtime.CompilerServices.CallerArgumentExpression("comparer")] string doNotPopulateThisValue = ""); + } + public interface IIsParameter : Mockolate.Parameters.IParameter + { + Mockolate.It.IIsParameter Using(System.Collections.Generic.IEqualityComparer comparer, [System.Runtime.CompilerServices.CallerArgumentExpression("comparer")] string doNotPopulateThisValue = ""); + } public interface IParameterMatches : Mockolate.Parameters.IParameter { Mockolate.It.IParameterMatches AsRegex(System.Text.RegularExpressions.RegexOptions options = 0, System.TimeSpan? timeout = default); diff --git a/Tests/Mockolate.Api.Tests/Expected/Mockolate_net8.0.txt b/Tests/Mockolate.Api.Tests/Expected/Mockolate_net8.0.txt index 626c3e54..483dc76f 100644 --- a/Tests/Mockolate.Api.Tests/Expected/Mockolate_net8.0.txt +++ b/Tests/Mockolate.Api.Tests/Expected/Mockolate_net8.0.txt @@ -27,9 +27,7 @@ namespace Mockolate } public class It { - public static Mockolate.Parameters.IParameter Is(System.Func predicate, [System.Runtime.CompilerServices.CallerArgumentExpression("predicate")] string doNotPopulateThisValue = "") { } - public static Mockolate.Parameters.IParameter Is(T value, [System.Runtime.CompilerServices.CallerArgumentExpression("value")] string doNotPopulateThisValue = "") { } - public static Mockolate.Parameters.IParameter Is(T value, System.Collections.Generic.IEqualityComparer comparer, [System.Runtime.CompilerServices.CallerArgumentExpression("value")] string doNotPopulateThisValue1 = "", [System.Runtime.CompilerServices.CallerArgumentExpression("comparer")] string doNotPopulateThisValue2 = "") { } + public static Mockolate.It.IIsParameter Is(T value, [System.Runtime.CompilerServices.CallerArgumentExpression("value")] string doNotPopulateThisValue = "") { } public static Mockolate.Parameters.IParameter IsAny() { } public static Mockolate.Parameters.IOutParameter IsAnyOut() { } public static Mockolate.Parameters.IVerifyReadOnlySpanParameter IsAnyReadOnlySpan() { } @@ -39,7 +37,7 @@ namespace Mockolate public static Mockolate.It.IInRangeParameter IsInRange(T minimum, T maximum, [System.Runtime.CompilerServices.CallerArgumentExpression("minimum")] string doNotPopulateThisValue1 = "", [System.Runtime.CompilerServices.CallerArgumentExpression("maximum")] string doNotPopulateThisValue2 = "") where T : System.IComparable { } public static Mockolate.Parameters.IParameter IsNull() { } - public static Mockolate.Parameters.IParameter IsOneOf(params T[] values) { } + public static Mockolate.It.IIsOneOfParameter IsOneOf(params T[] values) { } public static Mockolate.Parameters.IVerifyOutParameter IsOut() { } public static Mockolate.Parameters.IOutParameter IsOut(System.Func setter, [System.Runtime.CompilerServices.CallerArgumentExpression("setter")] string doNotPopulateThisValue = "") { } public static Mockolate.Parameters.IVerifyReadOnlySpanParameter IsReadOnlySpan(System.Func predicate) { } @@ -50,11 +48,20 @@ namespace Mockolate public static Mockolate.Parameters.IVerifySpanParameter IsSpan(System.Func predicate) { } public static Mockolate.Parameters.IParameter IsTrue() { } public static Mockolate.It.IParameterMatches Matches(string pattern) { } + public static Mockolate.Parameters.IParameter Satisfies(System.Func predicate, [System.Runtime.CompilerServices.CallerArgumentExpression("predicate")] string doNotPopulateThisValue = "") { } public interface IInRangeParameter : Mockolate.Parameters.IParameter { Mockolate.Parameters.IParameter Exclusive(); Mockolate.Parameters.IParameter Inclusive(); } + public interface IIsOneOfParameter : Mockolate.Parameters.IParameter + { + Mockolate.It.IIsOneOfParameter Using(System.Collections.Generic.IEqualityComparer comparer, [System.Runtime.CompilerServices.CallerArgumentExpression("comparer")] string doNotPopulateThisValue = ""); + } + public interface IIsParameter : Mockolate.Parameters.IParameter + { + Mockolate.It.IIsParameter Using(System.Collections.Generic.IEqualityComparer comparer, [System.Runtime.CompilerServices.CallerArgumentExpression("comparer")] string doNotPopulateThisValue = ""); + } public interface IParameterMatches : Mockolate.Parameters.IParameter { Mockolate.It.IParameterMatches AsRegex(System.Text.RegularExpressions.RegexOptions options = 0, System.TimeSpan? timeout = default); diff --git a/Tests/Mockolate.Api.Tests/Expected/Mockolate_netstandard2.0.txt b/Tests/Mockolate.Api.Tests/Expected/Mockolate_netstandard2.0.txt index bc43cb05..68aca9c2 100644 --- a/Tests/Mockolate.Api.Tests/Expected/Mockolate_netstandard2.0.txt +++ b/Tests/Mockolate.Api.Tests/Expected/Mockolate_netstandard2.0.txt @@ -26,9 +26,7 @@ namespace Mockolate } public class It { - public static Mockolate.Parameters.IParameter Is(System.Func predicate, [System.Runtime.CompilerServices.CallerArgumentExpression("predicate")] string doNotPopulateThisValue = "") { } - public static Mockolate.Parameters.IParameter Is(T value, [System.Runtime.CompilerServices.CallerArgumentExpression("value")] string doNotPopulateThisValue = "") { } - public static Mockolate.Parameters.IParameter Is(T value, System.Collections.Generic.IEqualityComparer comparer, [System.Runtime.CompilerServices.CallerArgumentExpression("value")] string doNotPopulateThisValue1 = "", [System.Runtime.CompilerServices.CallerArgumentExpression("comparer")] string doNotPopulateThisValue2 = "") { } + public static Mockolate.It.IIsParameter Is(T value, [System.Runtime.CompilerServices.CallerArgumentExpression("value")] string doNotPopulateThisValue = "") { } public static Mockolate.Parameters.IParameter IsAny() { } public static Mockolate.Parameters.IOutParameter IsAnyOut() { } public static Mockolate.Parameters.IRefParameter IsAnyRef() { } @@ -36,7 +34,7 @@ namespace Mockolate public static Mockolate.It.IInRangeParameter IsInRange(T minimum, T maximum, [System.Runtime.CompilerServices.CallerArgumentExpression("minimum")] string doNotPopulateThisValue1 = "", [System.Runtime.CompilerServices.CallerArgumentExpression("maximum")] string doNotPopulateThisValue2 = "") where T : System.IComparable { } public static Mockolate.Parameters.IParameter IsNull() { } - public static Mockolate.Parameters.IParameter IsOneOf(params T[] values) { } + public static Mockolate.It.IIsOneOfParameter IsOneOf(params T[] values) { } public static Mockolate.Parameters.IVerifyOutParameter IsOut() { } public static Mockolate.Parameters.IOutParameter IsOut(System.Func setter, [System.Runtime.CompilerServices.CallerArgumentExpression("setter")] string doNotPopulateThisValue = "") { } public static Mockolate.Parameters.IVerifyRefParameter IsRef() { } @@ -45,11 +43,20 @@ namespace Mockolate public static Mockolate.Parameters.IRefParameter IsRef(System.Func predicate, System.Func setter, [System.Runtime.CompilerServices.CallerArgumentExpression("predicate")] string doNotPopulateThisValue1 = "", [System.Runtime.CompilerServices.CallerArgumentExpression("setter")] string doNotPopulateThisValue2 = "") { } public static Mockolate.Parameters.IParameter IsTrue() { } public static Mockolate.It.IParameterMatches Matches(string pattern) { } + public static Mockolate.Parameters.IParameter Satisfies(System.Func predicate, [System.Runtime.CompilerServices.CallerArgumentExpression("predicate")] string doNotPopulateThisValue = "") { } public interface IInRangeParameter : Mockolate.Parameters.IParameter { Mockolate.Parameters.IParameter Exclusive(); Mockolate.Parameters.IParameter Inclusive(); } + public interface IIsOneOfParameter : Mockolate.Parameters.IParameter + { + Mockolate.It.IIsOneOfParameter Using(System.Collections.Generic.IEqualityComparer comparer, [System.Runtime.CompilerServices.CallerArgumentExpression("comparer")] string doNotPopulateThisValue = ""); + } + public interface IIsParameter : Mockolate.Parameters.IParameter + { + Mockolate.It.IIsParameter Using(System.Collections.Generic.IEqualityComparer comparer, [System.Runtime.CompilerServices.CallerArgumentExpression("comparer")] string doNotPopulateThisValue = ""); + } public interface IParameterMatches : Mockolate.Parameters.IParameter { Mockolate.It.IParameterMatches AsRegex(System.Text.RegularExpressions.RegexOptions options = 0, System.TimeSpan? timeout = default); diff --git a/Tests/Mockolate.ExampleTests/ExampleTests.cs b/Tests/Mockolate.ExampleTests/ExampleTests.cs index 7af218c1..285cc8b6 100644 --- a/Tests/Mockolate.ExampleTests/ExampleTests.cs +++ b/Tests/Mockolate.ExampleTests/ExampleTests.cs @@ -173,7 +173,7 @@ public async Task WithMatching_ShouldAlwaysMatch(string name, bool expectResult) IExampleRepository mock = Mock.Create(); mock.SetupMock.Method.AddUser( - It.Is(x => x == "Alice")) + It.Satisfies(x => x == "Alice")) .Returns(new User(id, "Alice")); User result = mock.AddUser(name); diff --git a/Tests/Mockolate.Tests/ItTests.IsOneOfTests.cs b/Tests/Mockolate.Tests/ItTests.IsOneOfTests.cs index f571fedc..12dd3e58 100644 --- a/Tests/Mockolate.Tests/ItTests.IsOneOfTests.cs +++ b/Tests/Mockolate.Tests/ItTests.IsOneOfTests.cs @@ -67,7 +67,7 @@ public async Task WithValue_ShouldSupportCovarianceInSetup() public async Task WithValue_ShouldSupportCovarianceInVerify() { IMyService mock = Mock.Create(); - mock.SetupMock.Method.DoSomething(It.Is(_ => true)) + mock.SetupMock.Method.DoSomething(It.Satisfies(_ => true)) .Do(d => d.DoWork()) .Returns(3); MyImplementation value1 = new(); diff --git a/Tests/Mockolate.Tests/ItTests.IsTests.cs b/Tests/Mockolate.Tests/ItTests.IsTests.cs index 637f8693..bead0b16 100644 --- a/Tests/Mockolate.Tests/ItTests.IsTests.cs +++ b/Tests/Mockolate.Tests/ItTests.IsTests.cs @@ -6,17 +6,6 @@ public sealed partial class ItTests { public sealed class IsTests { - [Fact] - public async Task ToString_WithPredicate_ShouldReturnExpectedValue() - { - IParameter sut = It.Is(x => x.Length == 3); - string expectedValue = "It.Is(x => x.Length == 3)"; - - string? result = sut.ToString(); - - await That(result).IsEqualTo(expectedValue); - } - [Fact] public async Task ToString_WithValue_ShouldReturnExpectedValue() { @@ -31,84 +20,14 @@ public async Task ToString_WithValue_ShouldReturnExpectedValue() [Fact] public async Task ToString_WithValueWithComparer_ShouldReturnExpectedValue() { - IParameter sut = It.Is(4, new AllEqualComparer()); - string expectedValue = "It.Is(4, new AllEqualComparer())"; + IParameter sut = It.Is(4).Using(new AllEqualComparer()); + string expectedValue = "It.Is(4).Using(new AllEqualComparer())"; string? result = sut.ToString(); await That(result).IsEqualTo(expectedValue); } - [Theory] - [InlineData(null, true)] - [InlineData(1, false)] - public async Task WithMatching_CheckForNull_ShouldMatchForExpectedResult(int? value, bool expectedResult) - { - IParameter sut = It.Is(v => v is null); - - bool result = ((IParameter)sut).Matches(value); - - await That(result).IsEqualTo(expectedResult); - } - - [Theory] - [InlineData(42L)] - [InlineData("foo")] - public async Task WithMatching_DifferentType_ShouldNotMatch(object? value) - { - IParameter sut = It.Is(_ => true); - - bool result = ((IParameter)sut).Matches(value); - - await That(result).IsFalse(); - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public async Task WithMatching_ShouldMatchForExpectedResult(bool predicateValue) - { - IParameter sut = It.Is(_ => predicateValue); - - bool result = ((IParameter)sut).Matches("foo"); - - await That(result).IsEqualTo(predicateValue); - } - - [Fact] - public async Task WithPredicate_ShouldSupportCovarianceInSetup() - { - IMyService mock = Mock.Create(); - mock.SetupMock.Method.DoSomething(It.Is(_ => true)) - .Returns(3); - MyImplementation value1 = new(); - MyOtherImplementation value2 = new(); - - int result1 = mock.DoSomething(value1); - int result2 = mock.DoSomething(value2); - - await That(result1).IsEqualTo(3); - await That(result2).IsEqualTo(0); - } - - [Fact] - public async Task WithPredicate_ShouldSupportCovarianceInVerify() - { - IMyService mock = Mock.Create(); - mock.SetupMock.Method.DoSomething(It.Is(_ => true)) - .Do(d => d.DoWork()) - .Returns(3); - MyImplementation value1 = new(); - - int result1 = mock.DoSomething(value1); - - await That(mock.VerifyMock.Invoked.DoSomething(It.Is(p => p.Progress > 0))).Once(); - await That(mock.VerifyMock.Invoked.DoSomething(It.Is(p => p.Progress > 1))).Never(); - await That(value1.Progress).IsEqualTo(1); - await That(result1).IsEqualTo(3); - await That(mock.VerifyMock.Invoked.DoSomething(It.Is(_ => true))).Never(); - } - [Theory] [InlineData(1, false)] [InlineData(5, true)] @@ -139,31 +58,13 @@ public async Task WithValue_ShouldSupportCovarianceInSetup() await That(result2).IsEqualTo(0); } - [Fact] - public async Task WithValue_ShouldSupportCovarianceInVerify() - { - IMyService mock = Mock.Create(); - mock.SetupMock.Method.DoSomething(It.Is(_ => true)) - .Do(d => d.DoWork()) - .Returns(3); - MyImplementation value1 = new(); - MyOtherImplementation value2 = new(); - - int result1 = mock.DoSomething(value1); - - await That(mock.VerifyMock.Invoked.DoSomething(It.Is(value1))).Once(); - await That(value1.Progress).IsEqualTo(1); - await That(result1).IsEqualTo(3); - await That(mock.VerifyMock.Invoked.DoSomething(It.Is(value2))).Never(); - } - [Theory] [InlineData(1)] [InlineData(5)] [InlineData(-42)] public async Task WithValue_WithComparer_ShouldUseComparer(int value) { - IParameter sut = It.Is(5, new AllEqualComparer()); + IParameter sut = It.Is(5).Using(new AllEqualComparer()); bool result = ((IParameter)sut).Matches(value); diff --git a/Tests/Mockolate.Tests/ItTests.SatisfiesTests.cs b/Tests/Mockolate.Tests/ItTests.SatisfiesTests.cs new file mode 100644 index 00000000..1eee2201 --- /dev/null +++ b/Tests/Mockolate.Tests/ItTests.SatisfiesTests.cs @@ -0,0 +1,122 @@ +using Mockolate.Parameters; + +namespace Mockolate.Tests; + +public sealed partial class ItTests +{ + public sealed class SatisfiesTests + { + [Fact] + public async Task ToString_WithPredicate_ShouldReturnExpectedValue() + { + IParameter sut = It.Satisfies(x => x.Length == 3); + string expectedValue = "It.Satisfies(x => x.Length == 3)"; + + string? result = sut.ToString(); + + await That(result).IsEqualTo(expectedValue); + } + + [Theory] + [InlineData(null, true)] + [InlineData(1, false)] + public async Task WithMatching_CheckForNull_ShouldMatchForExpectedResult(int? value, bool expectedResult) + { + IParameter sut = It.Satisfies(v => v is null); + + bool result = ((IParameter)sut).Matches(value); + + await That(result).IsEqualTo(expectedResult); + } + + [Theory] + [InlineData(42L)] + [InlineData("foo")] + public async Task WithMatching_DifferentType_ShouldNotMatch(object? value) + { + IParameter sut = It.Satisfies(_ => true); + + bool result = ((IParameter)sut).Matches(value); + + await That(result).IsFalse(); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task WithMatching_ShouldMatchForExpectedResult(bool predicateValue) + { + IParameter sut = It.Satisfies(_ => predicateValue); + + bool result = ((IParameter)sut).Matches("foo"); + + await That(result).IsEqualTo(predicateValue); + } + + [Fact] + public async Task WithPredicate_ShouldSupportCovarianceInSetup() + { + IMyService mock = Mock.Create(); + mock.SetupMock.Method.DoSomething(It.Satisfies(_ => true)) + .Returns(3); + MyImplementation value1 = new(); + MyOtherImplementation value2 = new(); + + int result1 = mock.DoSomething(value1); + int result2 = mock.DoSomething(value2); + + await That(result1).IsEqualTo(3); + await That(result2).IsEqualTo(0); + } + + [Fact] + public async Task WithPredicate_ShouldSupportCovarianceInVerify() + { + IMyService mock = Mock.Create(); + mock.SetupMock.Method.DoSomething(It.Satisfies(_ => true)) + .Do(d => d.DoWork()) + .Returns(3); + MyImplementation value1 = new(); + + int result1 = mock.DoSomething(value1); + + await That(mock.VerifyMock.Invoked.DoSomething(It.Satisfies(p => p.Progress > 0))).Once(); + await That(mock.VerifyMock.Invoked.DoSomething(It.Satisfies(p => p.Progress > 1))).Never(); + await That(value1.Progress).IsEqualTo(1); + await That(result1).IsEqualTo(3); + await That(mock.VerifyMock.Invoked.DoSomething(It.Satisfies(_ => true))).Never(); + } + + public interface IMyBase + { + int DoWork(); + } + + public class MyImplementation : IMyBase + { + public int Progress { get; private set; } + + public int DoWork() + { + Progress++; + return Progress; + } + } + + public class MyOtherImplementation : IMyBase + { + public string Output { get; private set; } = ""; + + public int DoWork() + { + Output += "did something\n"; + return 1; + } + } + + public interface IMyService + { + int DoSomething(IMyBase value); + } + } +} diff --git a/Tests/Mockolate.Tests/ItTests.cs b/Tests/Mockolate.Tests/ItTests.cs index 76b8bc3b..50291135 100644 --- a/Tests/Mockolate.Tests/ItTests.cs +++ b/Tests/Mockolate.Tests/ItTests.cs @@ -11,7 +11,7 @@ public sealed partial class ItTests public async Task InvokeCallbacks_WithCorrectType_ShouldInvokeCallback() { int isCalled = 0; - IParameter sut = It.Is(_ => true) + IParameter sut = It.Satisfies(_ => true) .Do(v => isCalled += v); ((IParameter)sut).InvokeCallbacks(5); @@ -23,7 +23,7 @@ public async Task InvokeCallbacks_WithCorrectType_ShouldInvokeCallback() public async Task InvokeCallbacks_WithDifferentType_ShouldNotInvokeCallback() { int isCalled = 0; - IParameter sut = It.Is(_ => true) + IParameter sut = It.Satisfies(_ => true) .Do(v => isCalled += v); ((IParameter)sut).InvokeCallbacks("5"); @@ -35,7 +35,7 @@ public async Task InvokeCallbacks_WithDifferentType_ShouldNotInvokeCallback() public async Task InvokeCallbacks_WithNull_WhenTypeIsNotNullable_ShouldNotInvokeCallback() { int isCalled = 0; - IParameter sut = It.Is(_ => true) + IParameter sut = It.Satisfies(_ => true) .Do(_ => isCalled++); ((IParameter)sut).InvokeCallbacks(null); @@ -47,7 +47,7 @@ public async Task InvokeCallbacks_WithNull_WhenTypeIsNotNullable_ShouldNotInvoke public async Task InvokeCallbacks_WithNull_WhenTypeIsNullable_ShouldInvokeCallback() { int isCalled = 0; - IParameter sut = It.Is(_ => true) + IParameter sut = It.Satisfies(_ => true) .Do(_ => isCalled++); ((IParameter)sut).InvokeCallbacks(null); diff --git a/Tests/Mockolate.Tests/MatchExtensionsTests.cs b/Tests/Mockolate.Tests/MatchExtensionsTests.cs index 0e39199d..31510be3 100644 --- a/Tests/Mockolate.Tests/MatchExtensionsTests.cs +++ b/Tests/Mockolate.Tests/MatchExtensionsTests.cs @@ -72,7 +72,7 @@ public async Task ParameterMonitor_WithFilter_ShouldMonitorMatchingValues() { IChocolateDispenser mock = Mock.Create(); mock.SetupMock.Method.Dispense(It.IsAny(), - It.Is(x => x > 4).Monitor(out IParameterMonitor monitor)); + It.Satisfies(x => x > 4).Monitor(out IParameterMonitor monitor)); mock.Dispense("Dark", 3); mock.Dispense("White", 5); diff --git a/Tests/Mockolate.Tests/ItTests.IsAnyParametersTests.cs b/Tests/Mockolate.Tests/MatchTests.AnyParametersTests.cs similarity index 88% rename from Tests/Mockolate.Tests/ItTests.IsAnyParametersTests.cs rename to Tests/Mockolate.Tests/MatchTests.AnyParametersTests.cs index 24675234..0574ef67 100644 --- a/Tests/Mockolate.Tests/ItTests.IsAnyParametersTests.cs +++ b/Tests/Mockolate.Tests/MatchTests.AnyParametersTests.cs @@ -2,9 +2,9 @@ namespace Mockolate.Tests; -public sealed partial class ItTests +public sealed partial class MatchTests { - public sealed class IsAnyParametersTests + public sealed class AnyParametersTests { [Theory] [InlineData(null, null)] diff --git a/Tests/Mockolate.Tests/MockBehaviorTests.InitializeTests.cs b/Tests/Mockolate.Tests/MockBehaviorTests.InitializeTests.cs index c0bde122..9442c410 100644 --- a/Tests/Mockolate.Tests/MockBehaviorTests.InitializeTests.cs +++ b/Tests/Mockolate.Tests/MockBehaviorTests.InitializeTests.cs @@ -10,10 +10,10 @@ public sealed class InitializeTests public async Task Initialize_DirectSetupsTakePrecedence() { MockBehavior behavior = MockBehavior.Default.Initialize((counter, setup) - => setup.Indexer(It.Is(s => s.StartsWith("da"))).InitializeWith(5)); + => setup.Indexer(It.Satisfies(s => s.StartsWith("da"))).InitializeWith(5)); IChocolateDispenser mock = Mock.Create(behavior, - setup => setup.Indexer(It.Is(s => s.EndsWith("rk"))).InitializeWith(16)); + setup => setup.Indexer(It.Satisfies(s => s.EndsWith("rk"))).InitializeWith(16)); int bothMatchResult = mock["dark"]; int directMatchResult = mock["--rk"]; diff --git a/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.InitializeWithTests.cs b/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.InitializeWithTests.cs index 48a10bcd..616a3369 100644 --- a/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.InitializeWithTests.cs +++ b/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.InitializeWithTests.cs @@ -11,7 +11,7 @@ public sealed class InitializeWithTests public async Task InitializeWith_Callback_ShouldInitializeMatchingIndexers() { IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4)) .InitializeWith(v => $"foo-{v}"); string result2 = mock[2]; @@ -43,7 +43,7 @@ await That(Act).Throws() public async Task InitializeWith_ShouldInitializeMatchingIndexers() { IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4)) .InitializeWith("foo"); string result2 = mock[2]; @@ -93,7 +93,7 @@ public sealed class With2Levels public async Task InitializeWith_Callback_ShouldInitializeMatchingIndexers() { IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4), It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4), It.Satisfies(i => i < 4)) .InitializeWith((v1, v2) => $"foo-{v1}-{v2}"); string result12 = mock[1, 2]; @@ -127,7 +127,7 @@ await That(Act).Throws() public async Task InitializeWith_ShouldInitializeMatchingIndexers() { IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4), It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4), It.Satisfies(i => i < 4)) .InitializeWith("foo"); string result12 = mock[1, 2]; @@ -164,8 +164,8 @@ public sealed class With3Levels public async Task InitializeWith_Callback_ShouldInitializeMatchingIndexers() { IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4), It.Is(i => i < 4), - It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4), It.Satisfies(i => i < 4), + It.Satisfies(i => i < 4)) .InitializeWith((v1, v2, v3) => $"foo-{v1}-{v2}-{v3}"); string result123 = mock[1, 2, 3]; @@ -202,8 +202,8 @@ await That(Act).Throws() public async Task InitializeWith_ShouldInitializeMatchingIndexers() { IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4), It.Is(i => i < 4), - It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4), It.Satisfies(i => i < 4), + It.Satisfies(i => i < 4)) .InitializeWith("foo"); string result123 = mock[1, 2, 3]; @@ -243,8 +243,8 @@ public sealed class With4Levels public async Task InitializeWith_Callback_ShouldInitializeMatchingIndexers() { IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 5), It.Is(i => i < 5), - It.Is(i => i < 5), It.Is(i => i < 5)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 5), It.Satisfies(i => i < 5), + It.Satisfies(i => i < 5), It.Satisfies(i => i < 5)) .InitializeWith((v1, v2, v3, v4) => $"foo-{v1}-{v2}-{v3}-{v4}"); string result1234 = mock[1, 2, 3, 4]; @@ -283,8 +283,8 @@ await That(Act).Throws() public async Task InitializeWith_ShouldInitializeMatchingIndexers() { IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 5), It.Is(i => i < 5), - It.Is(i => i < 5), It.Is(i => i < 5)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 5), It.Satisfies(i => i < 5), + It.Satisfies(i => i < 5), It.Satisfies(i => i < 5)) .InitializeWith("foo"); string result1234 = mock[1, 2, 3, 4]; @@ -326,8 +326,8 @@ public sealed class With5Levels public async Task InitializeWith_Callback_ShouldInitializeMatchingIndexers() { IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 6), It.Is(i => i < 6), - It.Is(i => i < 6), It.Is(i => i < 6), It.Is(i => i < 6)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 6), It.Satisfies(i => i < 6), + It.Satisfies(i => i < 6), It.Satisfies(i => i < 6), It.Satisfies(i => i < 6)) .InitializeWith((v1, v2, v3, v4, v5) => $"foo-{v1}-{v2}-{v3}-{v4}-{v5}"); string result12345 = mock[1, 2, 3, 4, 5]; @@ -369,8 +369,8 @@ await That(Act).Throws() public async Task InitializeWith_ShouldInitializeMatchingIndexers() { IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 6), It.Is(i => i < 6), - It.Is(i => i < 6), It.Is(i => i < 6), It.Is(i => i < 6)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 6), It.Satisfies(i => i < 6), + It.Satisfies(i => i < 6), It.Satisfies(i => i < 6), It.Satisfies(i => i < 6)) .InitializeWith("foo"); string result12345 = mock[1, 2, 3, 4, 5]; diff --git a/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.OnGetTests.cs b/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.OnGetTests.cs index 9ccad7db..6321d02d 100644 --- a/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.OnGetTests.cs +++ b/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.OnGetTests.cs @@ -109,7 +109,7 @@ public async Task ShouldExecuteGetterCallbacks() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4)) .OnGet.Do(() => { callCount++; }); _ = mock[1]; @@ -127,7 +127,7 @@ public async Task ShouldExecuteGetterCallbacksWithValue() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4)) .OnGet.Do(v => { callCount += v; }); _ = mock[1]; @@ -311,7 +311,7 @@ public async Task ShouldExecuteGetterCallbacks() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4), It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4), It.Satisfies(i => i < 4)) .OnGet.Do(() => { callCount++; }); _ = mock[5, 1]; // no @@ -329,7 +329,7 @@ public async Task ShouldExecuteGetterCallbacksWithValue() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4), It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4), It.Satisfies(i => i < 4)) .OnGet.Do((v1, v2) => { callCount += v1 * v2; }); _ = mock[5, 1]; // no @@ -501,8 +501,8 @@ public async Task ShouldExecuteGetterCallbacks() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4), It.Is(i => i < 4), - It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4), It.Satisfies(i => i < 4), + It.Satisfies(i => i < 4)) .OnGet.Do(() => { callCount++; }); _ = mock[1, 5, 1]; // no @@ -521,8 +521,8 @@ public async Task ShouldExecuteGetterCallbacksWithValue() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4), It.Is(i => i < 4), - It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4), It.Satisfies(i => i < 4), + It.Satisfies(i => i < 4)) .OnGet.Do((v1, v2, v3) => { callCount += v1 * v2 * v3; }); _ = mock[1, 5, 1]; // no @@ -695,8 +695,8 @@ public async Task ShouldExecuteGetterCallbacks() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 5), It.Is(i => i < 5), - It.Is(i => i < 5), It.Is(i => i < 5)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 5), It.Satisfies(i => i < 5), + It.Satisfies(i => i < 5), It.Satisfies(i => i < 5)) .OnGet.Do(() => { callCount++; }); _ = mock[1, 1, 5, 1]; // no @@ -716,8 +716,8 @@ public async Task ShouldExecuteGetterCallbacksWithValue() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 5), It.Is(i => i < 5), - It.Is(i => i < 5), It.Is(i => i < 5)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 5), It.Satisfies(i => i < 5), + It.Satisfies(i => i < 5), It.Satisfies(i => i < 5)) .OnGet.Do((v1, v2, v3, v4) => { callCount += v1 * v2 * v3 * v4; }); _ = mock[1, 5, 1, 3]; // no @@ -897,8 +897,8 @@ public async Task ShouldExecuteGetterCallbacks() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 6), It.Is(i => i < 6), - It.Is(i => i < 6), It.Is(i => i < 6), It.Is(i => i < 6)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 6), It.Satisfies(i => i < 6), + It.Satisfies(i => i < 6), It.Satisfies(i => i < 6), It.Satisfies(i => i < 6)) .OnGet.Do(() => { callCount++; }); _ = mock[1, 1, 1, 6, 1]; // no @@ -918,8 +918,8 @@ public async Task ShouldExecuteGetterCallbacksWithValue() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 6), It.Is(i => i < 6), - It.Is(i => i < 6), It.Is(i => i < 6), It.Is(i => i < 6)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 6), It.Satisfies(i => i < 6), + It.Satisfies(i => i < 6), It.Satisfies(i => i < 6), It.Satisfies(i => i < 6)) .OnGet.Do((v1, v2, v3, v4, v5) => { callCount += v1 * v2 * v3 * v4 * v5; }); _ = mock[1, 1, 1, 7, 1]; // no diff --git a/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.OnSetTests.cs b/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.OnSetTests.cs index 098a78ca..dcd27a98 100644 --- a/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.OnSetTests.cs +++ b/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.OnSetTests.cs @@ -111,7 +111,7 @@ public async Task ShouldExecuteSetterCallbacks() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4)) .OnSet.Do(_ => { callCount++; }); mock[1] = ""; @@ -129,7 +129,7 @@ public async Task ShouldExecuteSetterCallbacksWithoutAnyValue() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4)) .OnSet.Do(() => { callCount++; }); mock[1] = ""; @@ -285,7 +285,7 @@ public async Task ShouldExecuteSetterCallbacks() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4), It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4), It.Satisfies(i => i < 4)) .OnSet.Do(v => { callCount += v.Length; }); mock[1, 1] = "a"; // yes (1) @@ -306,7 +306,7 @@ public async Task ShouldExecuteSetterCallbacksWithoutAnyValue() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4), It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4), It.Satisfies(i => i < 4)) .OnSet.Do(() => { callCount++; }); mock[1, 1] = ""; // yes @@ -464,8 +464,8 @@ public async Task ShouldExecuteSetterCallbacks() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4), It.Is(i => i < 4), - It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4), It.Satisfies(i => i < 4), + It.Satisfies(i => i < 4)) .OnSet.Do(v => { callCount += v.Length; }); mock[1, 1, 1] = "a"; // yes (1) @@ -486,8 +486,8 @@ public async Task ShouldExecuteSetterCallbacksWithoutAnyValue() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 4), It.Is(i => i < 4), - It.Is(i => i < 4)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 4), It.Satisfies(i => i < 4), + It.Satisfies(i => i < 4)) .OnSet.Do(() => { callCount++; }); mock[1, 1, 1] = ""; // yes @@ -646,8 +646,8 @@ public async Task ShouldExecuteSetterCallbacks() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 5), It.Is(i => i < 5), - It.Is(i => i < 5), It.Is(i => i < 5)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 5), It.Satisfies(i => i < 5), + It.Satisfies(i => i < 5), It.Satisfies(i => i < 5)) .OnSet.Do(v => { callCount += v.Length; }); mock[1, 1, 1, 1] = "a"; // yes (1) @@ -668,8 +668,8 @@ public async Task ShouldExecuteSetterCallbacksWithoutAnyValue() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 5), It.Is(i => i < 5), - It.Is(i => i < 5), It.Is(i => i < 5)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 5), It.Satisfies(i => i < 5), + It.Satisfies(i => i < 5), It.Satisfies(i => i < 5)) .OnSet.Do(() => { callCount++; }); mock[1, 1, 1, 1] = ""; // yes @@ -833,8 +833,8 @@ public async Task ShouldExecuteSetterCallbacks() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 6), It.Is(i => i < 6), - It.Is(i => i < 6), It.Is(i => i < 6), It.Is(i => i < 6)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 6), It.Satisfies(i => i < 6), + It.Satisfies(i => i < 6), It.Satisfies(i => i < 6), It.Satisfies(i => i < 6)) .OnSet.Do(v => { callCount += v.Length; }); mock[1, 1, 1, 1, 1] = "a"; // yes (1) @@ -855,8 +855,8 @@ public async Task ShouldExecuteSetterCallbacksWithoutAnyValue() { int callCount = 0; IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(i => i < 6), It.Is(i => i < 6), - It.Is(i => i < 6), It.Is(i => i < 6), It.Is(i => i < 6)) + mock.SetupMock.Indexer(It.Satisfies(i => i < 6), It.Satisfies(i => i < 6), + It.Satisfies(i => i < 6), It.Satisfies(i => i < 6), It.Satisfies(i => i < 6)) .OnSet.Do(() => { callCount++; }); mock[1, 1, 1, 1, 1] = ""; // yes diff --git a/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.SpanTests.cs b/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.SpanTests.cs index 409baabf..fc6c5d1a 100644 --- a/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.SpanTests.cs +++ b/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.SpanTests.cs @@ -10,7 +10,7 @@ public sealed class SpanTests public async Task Memory_WhenPredicateDoesNotMatch_ShouldUseDefaultValue() { SpanMock mock = Mock.Create(MockBehavior.Default.CallingBaseClass()); - mock.SetupMock.Indexer(It.Is>(v => v.Length == 2)).Returns(4); + mock.SetupMock.Indexer(It.Satisfies>(v => v.Length == 2)).Returns(4); int result = mock[new Memory([1, 2, 3,])]; @@ -21,7 +21,7 @@ public async Task Memory_WhenPredicateDoesNotMatch_ShouldUseDefaultValue() public async Task Memory_WhenPredicateMatches_ShouldApplySetup() { SpanMock mock = Mock.Create(MockBehavior.Default.CallingBaseClass()); - mock.SetupMock.Indexer(It.Is>(v => v.Length == 3)).Returns(42); + mock.SetupMock.Indexer(It.Satisfies>(v => v.Length == 3)).Returns(42); int result = mock[new Memory([1, 2, 3,])]; @@ -115,8 +115,8 @@ public async Task Span_IndexerWithSpecificKey_ShouldMatchAndReturn() 30, 40, 50, ]; - mock.SetupMock.Indexer(It.Is(k => k == 1)).Returns(new Span(key1Data)); - mock.SetupMock.Indexer(It.Is(k => k == 2)).Returns(new Span(key2Data)); + mock.SetupMock.Indexer(It.Satisfies(k => k == 1)).Returns(new Span(key1Data)); + mock.SetupMock.Indexer(It.Satisfies(k => k == 2)).Returns(new Span(key2Data)); int[] result1 = mock[1].ToArray(); int[] result2 = mock[2].ToArray(); diff --git a/Tests/Mockolate.Tests/MockIndexers/VerifyGotIndexerTests.SpanTests.cs b/Tests/Mockolate.Tests/MockIndexers/VerifyGotIndexerTests.SpanTests.cs index 01d2b95d..92c05320 100644 --- a/Tests/Mockolate.Tests/MockIndexers/VerifyGotIndexerTests.SpanTests.cs +++ b/Tests/Mockolate.Tests/MockIndexers/VerifyGotIndexerTests.SpanTests.cs @@ -13,9 +13,9 @@ public async Task Memory_WhenPredicateMatches_ShouldApplySetup() _ = mock[new Memory([1, 2, 3,])]; - await That(mock.VerifyMock.GotIndexer(It.Is>(v => v.Length == 2))).Never(); - await That(mock.VerifyMock.GotIndexer(It.Is>(v => v.Length == 3))).Once(); - await That(mock.VerifyMock.GotIndexer(It.Is>(v => v.Length == 4))).Never(); + await That(mock.VerifyMock.GotIndexer(It.Satisfies>(v => v.Length == 2))).Never(); + await That(mock.VerifyMock.GotIndexer(It.Satisfies>(v => v.Length == 3))).Once(); + await That(mock.VerifyMock.GotIndexer(It.Satisfies>(v => v.Length == 4))).Never(); } [Fact] diff --git a/Tests/Mockolate.Tests/MockIndexers/VerifyGotIndexerTests.cs b/Tests/Mockolate.Tests/MockIndexers/VerifyGotIndexerTests.cs index b78d17cc..771a8f27 100644 --- a/Tests/Mockolate.Tests/MockIndexers/VerifyGotIndexerTests.cs +++ b/Tests/Mockolate.Tests/MockIndexers/VerifyGotIndexerTests.cs @@ -31,7 +31,7 @@ public async Task WhenParametersDontMatch_ShouldReturnNever() _ = mock[1, 2]; await That(mock.VerifyMock.GotIndexer(It.Is(1), It.Is(2))).Once(); - await That(mock.VerifyMock.GotIndexer(It.Is(i => i != 1), It.Is(2))).Never(); - await That(mock.VerifyMock.GotIndexer(It.Is(1), It.Is(i => i != 2))).Never(); + await That(mock.VerifyMock.GotIndexer(It.Satisfies(i => i != 1), It.Is(2))).Never(); + await That(mock.VerifyMock.GotIndexer(It.Is(1), It.Satisfies(i => i != 2))).Never(); } } diff --git a/Tests/Mockolate.Tests/MockIndexers/VerifySetIndexerTests.SpanTests.cs b/Tests/Mockolate.Tests/MockIndexers/VerifySetIndexerTests.SpanTests.cs index de426a15..3b284f97 100644 --- a/Tests/Mockolate.Tests/MockIndexers/VerifySetIndexerTests.SpanTests.cs +++ b/Tests/Mockolate.Tests/MockIndexers/VerifySetIndexerTests.SpanTests.cs @@ -13,9 +13,9 @@ public async Task Memory_WhenPredicateMatches_ShouldApplySetup() mock[new Memory([1, 2, 3,])] = 3; - await That(mock.VerifyMock.SetIndexer(It.Is>(v => v.Length == 2), It.IsAny())).Never(); - await That(mock.VerifyMock.SetIndexer(It.Is>(v => v.Length == 3), It.IsAny())).Once(); - await That(mock.VerifyMock.SetIndexer(It.Is>(v => v.Length == 4), It.IsAny())).Never(); + await That(mock.VerifyMock.SetIndexer(It.Satisfies>(v => v.Length == 2), It.IsAny())).Never(); + await That(mock.VerifyMock.SetIndexer(It.Satisfies>(v => v.Length == 3), It.IsAny())).Once(); + await That(mock.VerifyMock.SetIndexer(It.Satisfies>(v => v.Length == 4), It.IsAny())).Never(); } [Fact] diff --git a/Tests/Mockolate.Tests/MockIndexers/VerifySetIndexerTests.cs b/Tests/Mockolate.Tests/MockIndexers/VerifySetIndexerTests.cs index f023c49e..5ef926db 100644 --- a/Tests/Mockolate.Tests/MockIndexers/VerifySetIndexerTests.cs +++ b/Tests/Mockolate.Tests/MockIndexers/VerifySetIndexerTests.cs @@ -31,7 +31,7 @@ public async Task WhenParametersDoNotMatch_ShouldReturnNever() mock[1, 2] = "foo"; await That(mock.VerifyMock.SetIndexer(It.Is(1), It.Is(2), It.Is("foo"))).Once(); - await That(mock.VerifyMock.SetIndexer(It.Is(i => i != 1), It.Is(2), It.Is("foo"))).Never(); - await That(mock.VerifyMock.SetIndexer(It.Is(1), It.Is(i => i != 2), It.Is("foo"))).Never(); + await That(mock.VerifyMock.SetIndexer(It.Satisfies(i => i != 1), It.Is(2), It.Is("foo"))).Never(); + await That(mock.VerifyMock.SetIndexer(It.Is(1), It.Satisfies(i => i != 2), It.Is("foo"))).Never(); } } diff --git a/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.CallbackTests.cs b/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.CallbackTests.cs index 9d3f49a2..68e12102 100644 --- a/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.CallbackTests.cs +++ b/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.CallbackTests.cs @@ -213,7 +213,7 @@ public async Task Callback_ShouldNotExecuteWhenParameterDoesNotMatch() int callCount = 0; IReturnMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method1(It.Is(v => v != 1)) + sut.SetupMock.Method.Method1(It.Satisfies(v => v != 1)) .Do(() => { callCount++; }); sut.Method1(1); @@ -262,7 +262,7 @@ public async Task CallbackWithValue_ShouldNotExecuteWhenParameterDoesNotMatch() int callCount = 0; IReturnMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method1(It.Is(v => v != 1)) + sut.SetupMock.Method.Method1(It.Satisfies(v => v != 1)) .Do(_ => { callCount++; }); sut.Method1(1); @@ -432,7 +432,7 @@ public async Task Callback_ShouldNotExecuteWhenAnyParameterDoesNotMatch(bool isM int callCount = 0; IReturnMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method2(It.Is(_ => isMatch1), It.Is(_ => isMatch2)) + sut.SetupMock.Method.Method2(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2)) .Do(() => { callCount++; }); sut.Method2(1, 2); @@ -488,7 +488,7 @@ public async Task CallbackWithValue_ShouldNotExecuteWhenAnyParameterDoesNotMatch int callCount = 0; IReturnMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method2(It.Is(_ => isMatch1), It.Is(_ => isMatch2)) + sut.SetupMock.Method.Method2(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2)) .Do((_, _) => { callCount++; }); sut.Method2(1, 2); @@ -675,8 +675,8 @@ public async Task Callback_ShouldNotExecuteWhenAnyParameterDoesNotMatch(bool isM int callCount = 0; IReturnMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method3(It.Is(_ => isMatch1), It.Is(_ => isMatch2), - It.Is(_ => isMatch3)) + sut.SetupMock.Method.Method3(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2), + It.Satisfies(_ => isMatch3)) .Do(() => { callCount++; }); sut.Method3(1, 2, 3); @@ -737,8 +737,8 @@ public async Task CallbackWithValue_ShouldNotExecuteWhenAnyParameterDoesNotMatch int callCount = 0; IReturnMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method3(It.Is(_ => isMatch1), It.Is(_ => isMatch2), - It.Is(_ => isMatch3)) + sut.SetupMock.Method.Method3(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2), + It.Satisfies(_ => isMatch3)) .Do((_, _, _) => { callCount++; }); sut.Method3(1, 2, 3); @@ -926,8 +926,8 @@ public async Task Callback_ShouldNotExecuteWhenAnyParameterDoesNotMatch(bool isM int callCount = 0; IReturnMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method4(It.Is(_ => isMatch1), It.Is(_ => isMatch2), - It.Is(_ => isMatch3), It.Is(_ => isMatch4)) + sut.SetupMock.Method.Method4(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2), + It.Satisfies(_ => isMatch3), It.Satisfies(_ => isMatch4)) .Do(() => { callCount++; }); sut.Method4(1, 2, 3, 4); @@ -992,8 +992,8 @@ public async Task CallbackWithValue_ShouldNotExecuteWhenAnyParameterDoesNotMatch int callCount = 0; IReturnMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method4(It.Is(_ => isMatch1), It.Is(_ => isMatch2), - It.Is(_ => isMatch3), It.Is(_ => isMatch4)) + sut.SetupMock.Method.Method4(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2), + It.Satisfies(_ => isMatch3), It.Satisfies(_ => isMatch4)) .Do((_, _, _, _) => { callCount++; }); sut.Method4(1, 2, 3, 4); @@ -1183,9 +1183,9 @@ public async Task Callback_ShouldNotExecuteWhenAnyParameterDoesNotMatch(bool isM int callCount = 0; IReturnMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method5(It.Is(_ => isMatch1), It.Is(_ => isMatch2), - It.Is(_ => isMatch3), It.Is(_ => isMatch4), - It.Is(_ => isMatch5)) + sut.SetupMock.Method.Method5(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2), + It.Satisfies(_ => isMatch3), It.Satisfies(_ => isMatch4), + It.Satisfies(_ => isMatch5)) .Do(() => { callCount++; }); sut.Method5(1, 2, 3, 4, 5); @@ -1256,9 +1256,9 @@ public async Task CallbackWithValue_ShouldNotExecuteWhenAnyParameterDoesNotMatch int callCount = 0; IReturnMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method5(It.Is(_ => isMatch1), It.Is(_ => isMatch2), - It.Is(_ => isMatch3), It.Is(_ => isMatch4), - It.Is(_ => isMatch5)) + sut.SetupMock.Method.Method5(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2), + It.Satisfies(_ => isMatch3), It.Satisfies(_ => isMatch4), + It.Satisfies(_ => isMatch5)) .Do((_, _, _, _, _) => { callCount++; }); sut.Method5(1, 2, 3, 4, 5); @@ -1629,7 +1629,7 @@ public async Task Callback_ShouldNotExecuteWhenParameterDoesNotMatch() int callCount = 0; IVoidMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method1(It.Is(v => v != 1)) + sut.SetupMock.Method.Method1(It.Satisfies(v => v != 1)) .Do(() => { callCount++; }); sut.Method1(1); @@ -1678,7 +1678,7 @@ public async Task CallbackWithValue_ShouldNotExecuteWhenParameterDoesNotMatch() int callCount = 0; IVoidMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method1(It.Is(v => v != 1)) + sut.SetupMock.Method.Method1(It.Satisfies(v => v != 1)) .Do(_ => { callCount++; }); sut.Method1(1); @@ -1847,7 +1847,7 @@ public async Task Callback_ShouldNotExecuteWhenAnyParameterDoesNotMatch(bool isM int callCount = 0; IVoidMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method2(It.Is(_ => isMatch1), It.Is(_ => isMatch2)) + sut.SetupMock.Method.Method2(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2)) .Do(() => { callCount++; }); sut.Method2(1, 2); @@ -1903,7 +1903,7 @@ public async Task CallbackWithValue_ShouldNotExecuteWhenAnyParameterDoesNotMatch int callCount = 0; IVoidMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method2(It.Is(_ => isMatch1), It.Is(_ => isMatch2)) + sut.SetupMock.Method.Method2(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2)) .Do((_, _) => { callCount++; }); sut.Method2(1, 2); @@ -2089,8 +2089,8 @@ public async Task Callback_ShouldNotExecuteWhenAnyParameterDoesNotMatch(bool isM int callCount = 0; IVoidMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method3(It.Is(_ => isMatch1), It.Is(_ => isMatch2), - It.Is(_ => isMatch3)) + sut.SetupMock.Method.Method3(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2), + It.Satisfies(_ => isMatch3)) .Do(() => { callCount++; }); sut.Method3(1, 2, 3); @@ -2151,8 +2151,8 @@ public async Task CallbackWithValue_ShouldNotExecuteWhenAnyParameterDoesNotMatch int callCount = 0; IVoidMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method3(It.Is(_ => isMatch1), It.Is(_ => isMatch2), - It.Is(_ => isMatch3)) + sut.SetupMock.Method.Method3(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2), + It.Satisfies(_ => isMatch3)) .Do((_, _, _) => { callCount++; }); sut.Method3(1, 2, 3); @@ -2339,8 +2339,8 @@ public async Task Callback_ShouldNotExecuteWhenAnyParameterDoesNotMatch(bool isM int callCount = 0; IVoidMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method4(It.Is(_ => isMatch1), It.Is(_ => isMatch2), - It.Is(_ => isMatch3), It.Is(_ => isMatch4)) + sut.SetupMock.Method.Method4(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2), + It.Satisfies(_ => isMatch3), It.Satisfies(_ => isMatch4)) .Do(() => { callCount++; }); sut.Method4(1, 2, 3, 4); @@ -2405,8 +2405,8 @@ public async Task CallbackWithValue_ShouldNotExecuteWhenAnyParameterDoesNotMatch int callCount = 0; IVoidMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method4(It.Is(_ => isMatch1), It.Is(_ => isMatch2), - It.Is(_ => isMatch3), It.Is(_ => isMatch4)) + sut.SetupMock.Method.Method4(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2), + It.Satisfies(_ => isMatch3), It.Satisfies(_ => isMatch4)) .Do((_, _, _, _) => { callCount++; }); sut.Method4(1, 2, 3, 4); @@ -2595,9 +2595,9 @@ public async Task Callback_ShouldNotExecuteWhenAnyParameterDoesNotMatch(bool isM int callCount = 0; IVoidMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method5(It.Is(_ => isMatch1), It.Is(_ => isMatch2), - It.Is(_ => isMatch3), It.Is(_ => isMatch4), - It.Is(_ => isMatch5)) + sut.SetupMock.Method.Method5(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2), + It.Satisfies(_ => isMatch3), It.Satisfies(_ => isMatch4), + It.Satisfies(_ => isMatch5)) .Do(() => { callCount++; }); sut.Method5(1, 2, 3, 4, 5); @@ -2668,9 +2668,9 @@ public async Task CallbackWithValue_ShouldNotExecuteWhenAnyParameterDoesNotMatch int callCount = 0; IVoidMethodSetupTest sut = Mock.Create(); - sut.SetupMock.Method.Method5(It.Is(_ => isMatch1), It.Is(_ => isMatch2), - It.Is(_ => isMatch3), It.Is(_ => isMatch4), - It.Is(_ => isMatch5)) + sut.SetupMock.Method.Method5(It.Satisfies(_ => isMatch1), It.Satisfies(_ => isMatch2), + It.Satisfies(_ => isMatch3), It.Satisfies(_ => isMatch4), + It.Satisfies(_ => isMatch5)) .Do((_, _, _, _, _) => { callCount++; }); sut.Method5(1, 2, 3, 4, 5); diff --git a/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.OutRefParameterTests.cs b/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.OutRefParameterTests.cs index 5d57e879..5bd5774b 100644 --- a/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.OutRefParameterTests.cs +++ b/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.OutRefParameterTests.cs @@ -213,7 +213,7 @@ public async Task SetRefParameter_ShouldReturnValue() } private class MyReturnMethodSetup(string name) - : ReturnMethodSetup(name, new NamedParameter("p1", (IParameter)It.Is(_ => false))) + : ReturnMethodSetup(name, new NamedParameter("p1", (IParameter)It.Satisfies(_ => false))) { public T SetOutParameter(string parameterName) => base.SetOutParameter(parameterName, () => default!); @@ -420,8 +420,8 @@ public async Task SetRefParameter_ShouldReturnValue() private class MyReturnMethodSetup(string name) : ReturnMethodSetup(name, - new NamedParameter("p1", (IParameter)It.Is(_ => false)), - new NamedParameter("p2", (IParameter)It.Is(_ => false))) + new NamedParameter("p1", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p2", (IParameter)It.Satisfies(_ => false))) { public T SetOutParameter(string parameterName) => base.SetOutParameter(parameterName, () => default!); @@ -665,9 +665,9 @@ public async Task SetRefParameter_ShouldReturnValue() private class MyReturnMethodSetup(string name) : ReturnMethodSetup(name, - new NamedParameter("p1", (IParameter)It.Is(_ => false)), - new NamedParameter("p2", (IParameter)It.Is(_ => false)), - new NamedParameter("p3", (IParameter)It.Is(_ => false))) + new NamedParameter("p1", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p2", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p3", (IParameter)It.Satisfies(_ => false))) { public T SetOutParameter(string parameterName) => base.SetOutParameter(parameterName, () => default!); @@ -948,10 +948,10 @@ public async Task SetRefParameter_ShouldReturnValue() private class MyReturnMethodSetup(string name) : ReturnMethodSetup(name, - new NamedParameter("p1", (IParameter)It.Is(_ => false)), - new NamedParameter("p2", (IParameter)It.Is(_ => false)), - new NamedParameter("p3", (IParameter)It.Is(_ => false)), - new NamedParameter("p4", (IParameter)It.Is(_ => false))) + new NamedParameter("p1", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p2", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p3", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p4", (IParameter)It.Satisfies(_ => false))) { public T SetOutParameter(string parameterName) => base.SetOutParameter(parameterName, () => default!); @@ -1270,11 +1270,11 @@ public async Task SetRefParameter_ShouldReturnValue() private class MyReturnMethodSetup(string name) : ReturnMethodSetup(name, - new NamedParameter("p1", (IParameter)It.Is(_ => false)), - new NamedParameter("p2", (IParameter)It.Is(_ => false)), - new NamedParameter("p3", (IParameter)It.Is(_ => false)), - new NamedParameter("p4", (IParameter)It.Is(_ => false)), - new NamedParameter("p5", (IParameter)It.Is(_ => false))) + new NamedParameter("p1", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p2", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p3", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p4", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p5", (IParameter)It.Satisfies(_ => false))) { public T SetOutParameter(string parameterName) => base.SetOutParameter(parameterName, () => default!); @@ -1440,7 +1440,7 @@ public async Task SetRefParameter_ShouldReturnValue() private class MyVoidMethodSetup(string name) : VoidMethodSetup(name, - new NamedParameter("p1", (IParameter)It.Is(_ => false))) + new NamedParameter("p1", (IParameter)It.Satisfies(_ => false))) { public T SetOutParameter(string parameterName) => base.SetOutParameter(parameterName, () => default!); @@ -1588,8 +1588,8 @@ public async Task SetRefParameter_ShouldReturnValue() private class MyVoidMethodSetup(string name) : VoidMethodSetup(name, - new NamedParameter("p1", (IParameter)It.Is(_ => false)), - new NamedParameter("p2", (IParameter)It.Is(_ => false))) + new NamedParameter("p1", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p2", (IParameter)It.Satisfies(_ => false))) { public T SetOutParameter(string parameterName) => base.SetOutParameter(parameterName, () => default!); @@ -1756,9 +1756,9 @@ public async Task SetRefParameter_ShouldReturnValue() private class MyVoidMethodSetup(string name) : VoidMethodSetup(name, - new NamedParameter("p1", (IParameter)It.Is(_ => false)), - new NamedParameter("p2", (IParameter)It.Is(_ => false)), - new NamedParameter("p3", (IParameter)It.Is(_ => false))) + new NamedParameter("p1", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p2", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p3", (IParameter)It.Satisfies(_ => false))) { public T SetOutParameter(string parameterName) => base.SetOutParameter(parameterName, () => default!); @@ -1944,10 +1944,10 @@ public async Task SetRefParameter_ShouldReturnValue() private class MyVoidMethodSetup(string name) : VoidMethodSetup(name, - new NamedParameter("p1", (IParameter)It.Is(_ => false)), - new NamedParameter("p2", (IParameter)It.Is(_ => false)), - new NamedParameter("p3", (IParameter)It.Is(_ => false)), - new NamedParameter("p4", (IParameter)It.Is(_ => false))) + new NamedParameter("p1", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p2", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p3", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p4", (IParameter)It.Satisfies(_ => false))) { public T SetOutParameter(string parameterName) => base.SetOutParameter(parameterName, () => default!); @@ -2153,11 +2153,11 @@ public async Task SetRefParameter_ShouldReturnValue() private class MyVoidMethodSetup(string name) : VoidMethodSetup(name, - new NamedParameter("p1", (IParameter)It.Is(_ => false)), - new NamedParameter("p2", (IParameter)It.Is(_ => false)), - new NamedParameter("p3", (IParameter)It.Is(_ => false)), - new NamedParameter("p4", (IParameter)It.Is(_ => false)), - new NamedParameter("p5", (IParameter)It.Is(_ => false))) + new NamedParameter("p1", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p2", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p3", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p4", (IParameter)It.Satisfies(_ => false)), + new NamedParameter("p5", (IParameter)It.Satisfies(_ => false))) { public T SetOutParameter(string parameterName) => base.SetOutParameter(parameterName, () => default!); diff --git a/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.SpanTests.cs b/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.SpanTests.cs index e39e2929..938f5ae3 100644 --- a/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.SpanTests.cs +++ b/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.SpanTests.cs @@ -10,7 +10,7 @@ public sealed class SpanTests public async Task Memory_WhenPredicateDoesNotMatch_ShouldUseDefaultValue() { SpanMock mock = Mock.Create(MockBehavior.Default.CallingBaseClass()); - mock.SetupMock.Method.MyMethod(It.Is>(v => v.Length == 2)).Returns(4); + mock.SetupMock.Method.MyMethod(It.Satisfies>(v => v.Length == 2)).Returns(4); int result = mock.MyMethod(new Memory([1, 2, 3,])); @@ -21,7 +21,7 @@ public async Task Memory_WhenPredicateDoesNotMatch_ShouldUseDefaultValue() public async Task Memory_WhenPredicateMatches_ShouldApplySetup() { SpanMock mock = Mock.Create(MockBehavior.Default.CallingBaseClass()); - mock.SetupMock.Method.MyMethod(It.Is>(v => v.Length == 3)).Returns(42); + mock.SetupMock.Method.MyMethod(It.Satisfies>(v => v.Length == 3)).Returns(42); int result = mock.MyMethod(new Memory([1, 2, 3,])); diff --git a/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.cs b/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.cs index 2adc7613..8ee48a10 100644 --- a/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.cs +++ b/Tests/Mockolate.Tests/MockMethods/SetupMethodTests.cs @@ -113,7 +113,7 @@ public async Task Parameter_Do_ShouldOnlyExecuteCallbackWhenAllParametersMatch() List capturedValues = []; IMethodService mock = Mock.Create(); mock.SetupMock.Method.MyIntMethodWithParameters(It.IsAny().Do(v => capturedValues.Add(v)), - It.Is(s => s.Length == 3)); + It.Satisfies(s => s.Length == 3)); mock.MyIntMethodWithParameters(1, "foo"); mock.MyIntMethodWithParameters(2, "foobar"); diff --git a/Tests/Mockolate.Tests/MockMethods/VerifyInvokedTests.SpanTests.cs b/Tests/Mockolate.Tests/MockMethods/VerifyInvokedTests.SpanTests.cs index 1a017c86..e2da3b8e 100644 --- a/Tests/Mockolate.Tests/MockMethods/VerifyInvokedTests.SpanTests.cs +++ b/Tests/Mockolate.Tests/MockMethods/VerifyInvokedTests.SpanTests.cs @@ -13,9 +13,9 @@ public async Task Memory_WhenPredicateMatches_ShouldApplySetup() mock.MyMethod(new Memory([1, 2, 3,])); - await That(mock.VerifyMock.Invoked.MyMethod(It.Is>(v => v.Length == 2))).Never(); - await That(mock.VerifyMock.Invoked.MyMethod(It.Is>(v => v.Length == 3))).Once(); - await That(mock.VerifyMock.Invoked.MyMethod(It.Is>(v => v.Length == 4))).Never(); + await That(mock.VerifyMock.Invoked.MyMethod(It.Satisfies>(v => v.Length == 2))).Never(); + await That(mock.VerifyMock.Invoked.MyMethod(It.Satisfies>(v => v.Length == 3))).Once(); + await That(mock.VerifyMock.Invoked.MyMethod(It.Satisfies>(v => v.Length == 4))).Never(); } [Fact] From 6344cf8c202df5e78b4ff8c9b2ebd8d319b1f0f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Breu=C3=9F=20Valentin?= Date: Sat, 13 Dec 2025 07:12:17 +0100 Subject: [PATCH 2/2] Fix review issues --- Tests/Mockolate.Tests/ItTests.IsOneOfTests.cs | 19 ++++++++++++++++--- Tests/Mockolate.Tests/ItTests.IsTests.cs | 10 +++++----- .../Mockolate.Tests/ItTests.SatisfiesTests.cs | 12 ++++++------ 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Tests/Mockolate.Tests/ItTests.IsOneOfTests.cs b/Tests/Mockolate.Tests/ItTests.IsOneOfTests.cs index 12dd3e58..6d16f5ce 100644 --- a/Tests/Mockolate.Tests/ItTests.IsOneOfTests.cs +++ b/Tests/Mockolate.Tests/ItTests.IsOneOfTests.cs @@ -37,7 +37,7 @@ public async Task ToString_WithStringValues_ShouldReturnExpectedValue() [InlineData(8, false)] [InlineData(-5, false)] [InlineData(42, false)] - public async Task WithValue_ShouldMatchWhenEqualToAny(int value, bool expectMatch) + public async Task ShouldMatchWhenEqualToAny(int value, bool expectMatch) { IParameter sut = It.IsOneOf(5, 6, 7); @@ -47,7 +47,7 @@ public async Task WithValue_ShouldMatchWhenEqualToAny(int value, bool expectMatc } [Fact] - public async Task WithValue_ShouldSupportCovarianceInSetup() + public async Task ShouldSupportCovarianceInSetup() { IMyService mock = Mock.Create(); MyImplementation value1 = new(); @@ -64,7 +64,7 @@ public async Task WithValue_ShouldSupportCovarianceInSetup() } [Fact] - public async Task WithValue_ShouldSupportCovarianceInVerify() + public async Task ShouldSupportCovarianceInVerify() { IMyService mock = Mock.Create(); mock.SetupMock.Method.DoSomething(It.Satisfies(_ => true)) @@ -83,6 +83,19 @@ public async Task WithValue_ShouldSupportCovarianceInVerify() await That(mock.VerifyMock.Invoked.DoSomething(It.IsOneOf(other1, other2))).Never(); } + [Theory] + [InlineData(1)] + [InlineData(5)] + [InlineData(-42)] + public async Task WithComparer_ShouldUseComparer(int value) + { + IParameter sut = It.IsOneOf(4, 5, 6).Using(new AllEqualComparer()); + + bool result = ((IParameter)sut).Matches(value); + + await That(result).IsTrue(); + } + public interface IMyBase { int DoWork(); diff --git a/Tests/Mockolate.Tests/ItTests.IsTests.cs b/Tests/Mockolate.Tests/ItTests.IsTests.cs index bead0b16..9bf7d0ca 100644 --- a/Tests/Mockolate.Tests/ItTests.IsTests.cs +++ b/Tests/Mockolate.Tests/ItTests.IsTests.cs @@ -7,7 +7,7 @@ public sealed partial class ItTests public sealed class IsTests { [Fact] - public async Task ToString_WithValue_ShouldReturnExpectedValue() + public async Task ToString_ShouldReturnExpectedValue() { IParameter sut = It.Is("foo"); string expectedValue = "\"foo\""; @@ -18,7 +18,7 @@ public async Task ToString_WithValue_ShouldReturnExpectedValue() } [Fact] - public async Task ToString_WithValueWithComparer_ShouldReturnExpectedValue() + public async Task ToString_WithComparer_ShouldReturnExpectedValue() { IParameter sut = It.Is(4).Using(new AllEqualComparer()); string expectedValue = "It.Is(4).Using(new AllEqualComparer())"; @@ -33,7 +33,7 @@ public async Task ToString_WithValueWithComparer_ShouldReturnExpectedValue() [InlineData(5, true)] [InlineData(-5, false)] [InlineData(42, false)] - public async Task WithValue_ShouldMatchWhenEqual(int value, bool expectMatch) + public async Task ShouldMatchWhenEqual(int value, bool expectMatch) { IParameter sut = It.Is(5); @@ -43,7 +43,7 @@ public async Task WithValue_ShouldMatchWhenEqual(int value, bool expectMatch) } [Fact] - public async Task WithValue_ShouldSupportCovarianceInSetup() + public async Task ShouldSupportCovarianceInSetup() { IMyService mock = Mock.Create(); MyImplementation value1 = new(); @@ -62,7 +62,7 @@ public async Task WithValue_ShouldSupportCovarianceInSetup() [InlineData(1)] [InlineData(5)] [InlineData(-42)] - public async Task WithValue_WithComparer_ShouldUseComparer(int value) + public async Task WithComparer_ShouldUseComparer(int value) { IParameter sut = It.Is(5).Using(new AllEqualComparer()); diff --git a/Tests/Mockolate.Tests/ItTests.SatisfiesTests.cs b/Tests/Mockolate.Tests/ItTests.SatisfiesTests.cs index 1eee2201..dcecc127 100644 --- a/Tests/Mockolate.Tests/ItTests.SatisfiesTests.cs +++ b/Tests/Mockolate.Tests/ItTests.SatisfiesTests.cs @@ -7,7 +7,7 @@ public sealed partial class ItTests public sealed class SatisfiesTests { [Fact] - public async Task ToString_WithPredicate_ShouldReturnExpectedValue() + public async Task ToString_ShouldReturnExpectedValue() { IParameter sut = It.Satisfies(x => x.Length == 3); string expectedValue = "It.Satisfies(x => x.Length == 3)"; @@ -20,7 +20,7 @@ public async Task ToString_WithPredicate_ShouldReturnExpectedValue() [Theory] [InlineData(null, true)] [InlineData(1, false)] - public async Task WithMatching_CheckForNull_ShouldMatchForExpectedResult(int? value, bool expectedResult) + public async Task CheckForNull_ShouldMatchForExpectedResult(int? value, bool expectedResult) { IParameter sut = It.Satisfies(v => v is null); @@ -32,7 +32,7 @@ public async Task WithMatching_CheckForNull_ShouldMatchForExpectedResult(int? va [Theory] [InlineData(42L)] [InlineData("foo")] - public async Task WithMatching_DifferentType_ShouldNotMatch(object? value) + public async Task DifferentType_ShouldNotMatch(object? value) { IParameter sut = It.Satisfies(_ => true); @@ -44,7 +44,7 @@ public async Task WithMatching_DifferentType_ShouldNotMatch(object? value) [Theory] [InlineData(true)] [InlineData(false)] - public async Task WithMatching_ShouldMatchForExpectedResult(bool predicateValue) + public async Task ShouldMatchForExpectedResult(bool predicateValue) { IParameter sut = It.Satisfies(_ => predicateValue); @@ -54,7 +54,7 @@ public async Task WithMatching_ShouldMatchForExpectedResult(bool predicateValue) } [Fact] - public async Task WithPredicate_ShouldSupportCovarianceInSetup() + public async Task ShouldSupportCovarianceInSetup() { IMyService mock = Mock.Create(); mock.SetupMock.Method.DoSomething(It.Satisfies(_ => true)) @@ -70,7 +70,7 @@ public async Task WithPredicate_ShouldSupportCovarianceInSetup() } [Fact] - public async Task WithPredicate_ShouldSupportCovarianceInVerify() + public async Task ShouldSupportCovarianceInVerify() { IMyService mock = Mock.Create(); mock.SetupMock.Method.DoSomething(It.Satisfies(_ => true))