diff --git a/Source/Mockolate.SourceGenerators/Sources/Sources.IndexerSetups.cs b/Source/Mockolate.SourceGenerators/Sources/Sources.IndexerSetups.cs index 555f15fb..8f0bf627 100644 --- a/Source/Mockolate.SourceGenerators/Sources/Sources.IndexerSetups.cs +++ b/Source/Mockolate.SourceGenerators/Sources/Sources.IndexerSetups.cs @@ -774,11 +774,6 @@ private static void AppendIndexerSetup(StringBuilder sb, int numberOfParameters) sb.Append("\t\t\t=> _skipBaseClass;").AppendLine(); sb.AppendLine(); - sb.Append("\t\t/// ").AppendLine(); - sb.Append("\t\tprotected override bool HasReturnCalls()").AppendLine(); - sb.Append("\t\t\t=> _returnCallbacks.Count > 0;").AppendLine(); - sb.AppendLine(); - sb.Append( "\t\t/// ") .AppendLine(); diff --git a/Source/Mockolate/Setup/IndexerSetup.cs b/Source/Mockolate/Setup/IndexerSetup.cs index 55cd5881..37af8f15 100644 --- a/Source/Mockolate/Setup/IndexerSetup.cs +++ b/Source/Mockolate/Setup/IndexerSetup.cs @@ -12,10 +12,6 @@ namespace Mockolate.Setup; /// public abstract class IndexerSetup : IInteractiveIndexerSetup { - /// - bool IInteractiveIndexerSetup.HasReturnCalls() - => HasReturnCalls(); - /// bool IInteractiveIndexerSetup.Matches(IndexerAccess indexerAccess) => IsMatch(indexerAccess.Parameters); @@ -111,11 +107,6 @@ protected static bool Matches(NamedParameter[] namedParameters, NamedParameterVa /// protected abstract bool? GetSkipBaseClass(); - /// - /// Gets a value indicating whether this setup has return calls configured. - /// - protected abstract bool HasReturnCalls(); - /// /// Attempts to retrieve the initial for the , if an /// initialization is set up. @@ -390,10 +381,6 @@ IIndexerSetup IIndexerSetupReturnWhenBuilder.Only(int ti protected override bool? GetSkipBaseClass() => _skipBaseClass; - /// - protected override bool HasReturnCalls() - => _returnCallbacks.Count > 0; - /// protected override T ExecuteGetterCallback(IndexerGetterAccess indexerGetterAccess, T value, MockBehavior behavior) @@ -746,10 +733,6 @@ IIndexerSetup IIndexerSetupReturnWhenBuilder.Onl protected override bool? GetSkipBaseClass() => _skipBaseClass; - /// - protected override bool HasReturnCalls() - => _returnCallbacks.Count > 0; - /// protected override T ExecuteGetterCallback(IndexerGetterAccess indexerGetterAccess, T value, MockBehavior behavior) @@ -1117,10 +1100,6 @@ IIndexerSetup IIndexerSetupReturnWhenBuilder _skipBaseClass; - /// - protected override bool HasReturnCalls() - => _returnCallbacks.Count > 0; - /// protected override T ExecuteGetterCallback(IndexerGetterAccess indexerGetterAccess, T value, MockBehavior behavior) @@ -1503,10 +1482,6 @@ IIndexerSetup IIndexerSetupReturnWhenBuilder _skipBaseClass; - /// - protected override bool HasReturnCalls() - => _returnCallbacks.Count > 0; - /// protected override T ExecuteGetterCallback(IndexerGetterAccess indexerGetterAccess, T value, MockBehavior behavior) diff --git a/Source/Mockolate/Setup/IndexerSetupResult.cs b/Source/Mockolate/Setup/IndexerSetupResult.cs index 908e38f2..24c50f0b 100644 --- a/Source/Mockolate/Setup/IndexerSetupResult.cs +++ b/Source/Mockolate/Setup/IndexerSetupResult.cs @@ -59,14 +59,16 @@ public TResult GetResult(Func defaultValueGenerator) TResult value; if (_setup is IndexerSetup indexerSetup) { - _setup.GetInitialValue(_behavior, defaultValueGenerator, indexerAccess.Parameters, out value); + value = getIndexerValue(_setup, + () => + { + _setup.GetInitialValue(_behavior, defaultValueGenerator, indexerAccess.Parameters, + out var v); + return v; + }, indexerAccess.Parameters); value = indexerSetup.InvokeGetter(indexerAccess, value, _behavior); - - if (_setup.HasReturnCalls()) - { - setIndexerValue(indexerAccess.Parameters, value); - return value; - } + setIndexerValue(indexerAccess.Parameters, value); + return value; } else if (_behavior.ThrowWhenNotSetup) { diff --git a/Source/Mockolate/Setup/Interfaces.IndexerSetup.cs b/Source/Mockolate/Setup/Interfaces.IndexerSetup.cs index 61c0c78a..45c395d7 100644 --- a/Source/Mockolate/Setup/Interfaces.IndexerSetup.cs +++ b/Source/Mockolate/Setup/Interfaces.IndexerSetup.cs @@ -15,11 +15,6 @@ public interface IInteractiveIndexerSetup : ISetup /// bool? SkipBaseClass(); - /// - /// Gets a value indicating whether this setup has return calls configured. - /// - bool HasReturnCalls(); - /// /// Checks if the matches the setup. /// diff --git a/Tests/Mockolate.Api.Tests/Expected/Mockolate_net10.0.txt b/Tests/Mockolate.Api.Tests/Expected/Mockolate_net10.0.txt index c5ae838f..7cfa92cd 100644 --- a/Tests/Mockolate.Api.Tests/Expected/Mockolate_net10.0.txt +++ b/Tests/Mockolate.Api.Tests/Expected/Mockolate_net10.0.txt @@ -858,7 +858,6 @@ namespace Mockolate.Setup public interface IInteractiveIndexerSetup : Mockolate.Setup.ISetup { void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out TValue value); - bool HasReturnCalls(); bool Matches(Mockolate.Interactions.IndexerAccess indexerAccess); bool? SkipBaseClass(); } @@ -1286,7 +1285,6 @@ namespace Mockolate.Setup protected abstract void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior); protected abstract void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value); protected abstract bool? GetSkipBaseClass(); - protected abstract bool HasReturnCalls(); protected abstract bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters); protected static bool Matches(Mockolate.Parameters.NamedParameter[] namedParameters, Mockolate.Parameters.NamedParameterValue[] values) { } protected static bool TryCast([System.Diagnostics.CodeAnalysis.NotNullWhen(false)] object? value, out T result, Mockolate.MockBehavior behavior) { } @@ -1311,7 +1309,6 @@ namespace Mockolate.Setup protected override void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior) { } protected override void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value) { } protected override bool? GetSkipBaseClass() { } - protected override bool HasReturnCalls() { } public Mockolate.Setup.IIndexerSetup InitializeWith(System.Func valueGenerator) { } public Mockolate.Setup.IIndexerSetup InitializeWith(TValue value) { } protected override bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters) { } @@ -1336,7 +1333,6 @@ namespace Mockolate.Setup protected override void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior) { } protected override void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value) { } protected override bool? GetSkipBaseClass() { } - protected override bool HasReturnCalls() { } public Mockolate.Setup.IIndexerSetup InitializeWith(System.Func valueGenerator) { } public Mockolate.Setup.IIndexerSetup InitializeWith(TValue value) { } protected override bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters) { } @@ -1361,7 +1357,6 @@ namespace Mockolate.Setup protected override void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior) { } protected override void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value) { } protected override bool? GetSkipBaseClass() { } - protected override bool HasReturnCalls() { } public Mockolate.Setup.IIndexerSetup InitializeWith(System.Func valueGenerator) { } public Mockolate.Setup.IIndexerSetup InitializeWith(TValue value) { } protected override bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters) { } @@ -1386,7 +1381,6 @@ namespace Mockolate.Setup protected override void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior) { } protected override void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value) { } protected override bool? GetSkipBaseClass() { } - protected override bool HasReturnCalls() { } public Mockolate.Setup.IIndexerSetup InitializeWith(System.Func valueGenerator) { } public Mockolate.Setup.IIndexerSetup InitializeWith(TValue value) { } protected override bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters) { } diff --git a/Tests/Mockolate.Api.Tests/Expected/Mockolate_net8.0.txt b/Tests/Mockolate.Api.Tests/Expected/Mockolate_net8.0.txt index b0dd316d..893e0cab 100644 --- a/Tests/Mockolate.Api.Tests/Expected/Mockolate_net8.0.txt +++ b/Tests/Mockolate.Api.Tests/Expected/Mockolate_net8.0.txt @@ -857,7 +857,6 @@ namespace Mockolate.Setup public interface IInteractiveIndexerSetup : Mockolate.Setup.ISetup { void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out TValue value); - bool HasReturnCalls(); bool Matches(Mockolate.Interactions.IndexerAccess indexerAccess); bool? SkipBaseClass(); } @@ -1285,7 +1284,6 @@ namespace Mockolate.Setup protected abstract void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior); protected abstract void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value); protected abstract bool? GetSkipBaseClass(); - protected abstract bool HasReturnCalls(); protected abstract bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters); protected static bool Matches(Mockolate.Parameters.NamedParameter[] namedParameters, Mockolate.Parameters.NamedParameterValue[] values) { } protected static bool TryCast([System.Diagnostics.CodeAnalysis.NotNullWhen(false)] object? value, out T result, Mockolate.MockBehavior behavior) { } @@ -1310,7 +1308,6 @@ namespace Mockolate.Setup protected override void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior) { } protected override void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value) { } protected override bool? GetSkipBaseClass() { } - protected override bool HasReturnCalls() { } public Mockolate.Setup.IIndexerSetup InitializeWith(System.Func valueGenerator) { } public Mockolate.Setup.IIndexerSetup InitializeWith(TValue value) { } protected override bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters) { } @@ -1335,7 +1332,6 @@ namespace Mockolate.Setup protected override void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior) { } protected override void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value) { } protected override bool? GetSkipBaseClass() { } - protected override bool HasReturnCalls() { } public Mockolate.Setup.IIndexerSetup InitializeWith(System.Func valueGenerator) { } public Mockolate.Setup.IIndexerSetup InitializeWith(TValue value) { } protected override bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters) { } @@ -1360,7 +1356,6 @@ namespace Mockolate.Setup protected override void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior) { } protected override void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value) { } protected override bool? GetSkipBaseClass() { } - protected override bool HasReturnCalls() { } public Mockolate.Setup.IIndexerSetup InitializeWith(System.Func valueGenerator) { } public Mockolate.Setup.IIndexerSetup InitializeWith(TValue value) { } protected override bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters) { } @@ -1385,7 +1380,6 @@ namespace Mockolate.Setup protected override void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior) { } protected override void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value) { } protected override bool? GetSkipBaseClass() { } - protected override bool HasReturnCalls() { } public Mockolate.Setup.IIndexerSetup InitializeWith(System.Func valueGenerator) { } public Mockolate.Setup.IIndexerSetup InitializeWith(TValue value) { } protected override bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters) { } diff --git a/Tests/Mockolate.Api.Tests/Expected/Mockolate_netstandard2.0.txt b/Tests/Mockolate.Api.Tests/Expected/Mockolate_netstandard2.0.txt index e8ed0772..4db24ded 100644 --- a/Tests/Mockolate.Api.Tests/Expected/Mockolate_netstandard2.0.txt +++ b/Tests/Mockolate.Api.Tests/Expected/Mockolate_netstandard2.0.txt @@ -820,7 +820,6 @@ namespace Mockolate.Setup public interface IInteractiveIndexerSetup : Mockolate.Setup.ISetup { void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out TValue value); - bool HasReturnCalls(); bool Matches(Mockolate.Interactions.IndexerAccess indexerAccess); bool? SkipBaseClass(); } @@ -1248,7 +1247,6 @@ namespace Mockolate.Setup protected abstract void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior); protected abstract void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value); protected abstract bool? GetSkipBaseClass(); - protected abstract bool HasReturnCalls(); protected abstract bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters); protected static bool Matches(Mockolate.Parameters.NamedParameter[] namedParameters, Mockolate.Parameters.NamedParameterValue[] values) { } protected static bool TryCast([System.Diagnostics.CodeAnalysis.NotNullWhen(false)] object? value, out T result, Mockolate.MockBehavior behavior) { } @@ -1273,7 +1271,6 @@ namespace Mockolate.Setup protected override void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior) { } protected override void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value) { } protected override bool? GetSkipBaseClass() { } - protected override bool HasReturnCalls() { } public Mockolate.Setup.IIndexerSetup InitializeWith(System.Func valueGenerator) { } public Mockolate.Setup.IIndexerSetup InitializeWith(TValue value) { } protected override bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters) { } @@ -1298,7 +1295,6 @@ namespace Mockolate.Setup protected override void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior) { } protected override void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value) { } protected override bool? GetSkipBaseClass() { } - protected override bool HasReturnCalls() { } public Mockolate.Setup.IIndexerSetup InitializeWith(System.Func valueGenerator) { } public Mockolate.Setup.IIndexerSetup InitializeWith(TValue value) { } protected override bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters) { } @@ -1323,7 +1319,6 @@ namespace Mockolate.Setup protected override void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior) { } protected override void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value) { } protected override bool? GetSkipBaseClass() { } - protected override bool HasReturnCalls() { } public Mockolate.Setup.IIndexerSetup InitializeWith(System.Func valueGenerator) { } public Mockolate.Setup.IIndexerSetup InitializeWith(TValue value) { } protected override bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters) { } @@ -1348,7 +1343,6 @@ namespace Mockolate.Setup protected override void ExecuteSetterCallback(Mockolate.Interactions.IndexerSetterAccess indexerSetterAccess, T value, Mockolate.MockBehavior behavior) { } protected override void GetInitialValue(Mockolate.MockBehavior behavior, System.Func defaultValueGenerator, Mockolate.Parameters.NamedParameterValue[] parameters, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value) { } protected override bool? GetSkipBaseClass() { } - protected override bool HasReturnCalls() { } public Mockolate.Setup.IIndexerSetup InitializeWith(System.Func valueGenerator) { } public Mockolate.Setup.IIndexerSetup InitializeWith(TValue value) { } protected override bool IsMatch(Mockolate.Parameters.NamedParameterValue[] parameters) { } diff --git a/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.ReturnsThrowsTests.cs b/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.ReturnsThrowsTests.cs index ad020f9e..f725b2f2 100644 --- a/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.ReturnsThrowsTests.cs +++ b/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.ReturnsThrowsTests.cs @@ -7,326 +7,353 @@ public sealed partial class SetupIndexerTests { public sealed class ReturnsThrowsTests { - [Fact] - public async Task IndexerReturns_WithSpecificParameter_ShouldIterateThroughValues() + public sealed class With1Level { - IIndexerService mock = Mock.Create(); - mock.SetupMock.Indexer(It.Is(1)) - .Returns("a") - .Returns("b"); - - string result11 = mock[1]; - string result2 = mock[2]; - string result12 = mock[1]; - string result13 = mock[1]; - string result14 = mock[1]; - string result15 = mock[1]; - - await That(result11).IsEqualTo("a"); - await That(result2).IsEqualTo(""); - await That(result12).IsEqualTo("b"); - await That(result13).IsEqualTo("a"); - await That(result14).IsEqualTo("b"); - await That(result15).IsEqualTo("a"); - } + [Fact] + public async Task IndexerReturns_WithSpecificParameter_ShouldIterateThroughValues() + { + IIndexerService mock = Mock.Create(); + mock.SetupMock.Indexer(It.Is(1)) + .Returns("a") + .Returns("b"); - [Fact] - public async Task MixReturnsAndThrows_ShouldIterateThroughBoth() - { - IIndexerService sut = Mock.Create(); + string result11 = mock[1]; + string result2 = mock[2]; + string result12 = mock[1]; + string result13 = mock[1]; + string result14 = mock[1]; + string result15 = mock[1]; - sut.SetupMock.Indexer(It.IsAny()) - .Returns("a") - .Throws(new Exception("foo")) - .Returns(() => "b"); + await That(result11).IsEqualTo("a"); + await That(result2).IsEqualTo(""); + await That(result12).IsEqualTo("b"); + await That(result13).IsEqualTo("a"); + await That(result14).IsEqualTo("b"); + await That(result15).IsEqualTo("a"); + } - string result1 = sut[1]; - Exception? result2 = Record.Exception(() => _ = sut[2]); - string result3 = sut[3]; + [Fact] + public async Task MixReturnsAndThrows_ShouldIterateThroughBoth() + { + IIndexerService sut = Mock.Create(); - await That(result1).IsEqualTo("a"); - await That(result2).HasMessage("foo"); - await That(result3).IsEqualTo("b"); - } + sut.SetupMock.Indexer(It.IsAny()) + .Returns("a") + .Throws(new Exception("foo")) + .Returns(() => "b"); - [Fact] - public async Task MultipleReturns_ShouldIterateThroughAllRegisteredValues() - { - IIndexerService sut = Mock.Create(); + string result1 = sut[1]; + Exception? result2 = Record.Exception(() => _ = sut[2]); + string result3 = sut[3]; - sut.SetupMock.Indexer(It.IsAny()) - .Returns("a") - .Returns(() => "b") - .Returns(p1 => $"foo-{p1}"); + await That(result1).IsEqualTo("a"); + await That(result2).HasMessage("foo"); + await That(result3).IsEqualTo("b"); + } - string[] result = new string[10]; - for (int i = 0; i < 10; i++) + [Fact] + public async Task MultipleReturns_ShouldIterateThroughAllRegisteredValues() { - result[i] = sut[i]; - } + IIndexerService sut = Mock.Create(); - await That(result).IsEqualTo(["a", "b", "foo-2", "a", "b", "foo-5", "a", "b", "foo-8", "a",]); - } + sut.SetupMock.Indexer(It.IsAny()) + .Returns("a") + .Returns(() => "b") + .Returns(p1 => $"foo-{p1}"); - [Fact] - public async Task Returns_Callback_ShouldReturnExpectedValue() - { - IIndexerService sut = Mock.Create(); + string[] result = new string[10]; + for (int i = 0; i < 10; i++) + { + result[i] = sut[i]; + } - sut.SetupMock.Indexer(It.IsAny()) - .Returns(() => "foo"); + await That(result).IsEqualTo(["a", "b", "foo-2", "a", "b", "foo-5", "a", "b", "foo-8", "a",]); + } - string result = sut[1]; + [Fact] + public async Task Returns_Callback_ShouldReturnExpectedValue() + { + IIndexerService sut = Mock.Create(); - await That(result).IsEqualTo("foo"); - } + sut.SetupMock.Indexer(It.IsAny()) + .Returns(() => "foo"); - [Fact] - public async Task Returns_CallbackWithParameters_ShouldReturnExpectedValue() - { - IIndexerService sut = Mock.Create(); + string result = sut[1]; - sut.SetupMock.Indexer(It.IsAny()) - .InitializeWith("a") - .Returns(p1 => $"foo-{p1}"); + await That(result).IsEqualTo("foo"); + } - string result = sut[3]; + [Fact] + public async Task Returns_CallbackWithParameters_ShouldReturnExpectedValue() + { + IIndexerService sut = Mock.Create(); - await That(result).IsEqualTo("foo-3"); - } + sut.SetupMock.Indexer(It.IsAny()) + .InitializeWith("a") + .Returns(p1 => $"foo-{p1}"); - [Fact] - public async Task Returns_CallbackWithParametersAndValue_ShouldReturnExpectedValue() - { - IIndexerService sut = Mock.Create(); + string result = sut[3]; - sut.SetupMock.Indexer(It.IsAny()) - .InitializeWith("init") - .Returns((p1, v) => $"foo-{v}-{p1}"); + await That(result).IsEqualTo("foo-3"); + } - string result = sut[3]; + [Fact] + public async Task Returns_CallbackWithParametersAndValue_ShouldReturnExpectedValue() + { + IIndexerService sut = Mock.Create(); - await That(result).IsEqualTo("foo-init-3"); - } + sut.SetupMock.Indexer(It.IsAny()) + .InitializeWith("init") + .Returns((p1, v) => $"foo-{v}-{p1}"); - [Fact] - public async Task Returns_For_ShouldLimitUsage_ToSpecifiedNumber() - { - IIndexerService sut = Mock.Create(); + string result = sut[3]; - sut.SetupMock.Indexer(It.IsAny()) - .Returns("foo").For(2) - .Returns("bar").For(3); + await That(result).IsEqualTo("foo-init-3"); + } - List values = []; - for (int i = 0; i < 10; i++) + [Fact] + public async Task Returns_For_ShouldLimitUsage_ToSpecifiedNumber() { - values.Add(sut[i]); - } + IIndexerService sut = Mock.Create(); - await That(values).IsEqualTo(["foo", "foo", "bar", "bar", "bar", "", "", "", "", "",]); - } + sut.SetupMock.Indexer(It.IsAny()) + .Returns("foo").For(2) + .Returns("bar").For(3); - [Fact] - public async Task Returns_Forever_ShouldUseTheLastValueForever() - { - IIndexerService sut = Mock.Create(); + List values = []; + for (int i = 0; i < 10; i++) + { + values.Add(sut[i]); + } - sut.SetupMock.Indexer(It.IsAny()) - .Returns("a") - .Returns("b") - .Returns("c").Forever(); + await That(values).IsEqualTo(["foo", "foo", "bar", "bar", "bar", "", "", "", "", "",]); + } - string[] result = new string[10]; - for (int i = 0; i < 10; i++) + [Fact] + public async Task Returns_Forever_ShouldUseTheLastValueForever() { - result[i] = sut[i]; - } + IIndexerService sut = Mock.Create(); - await That(result).IsEqualTo(["a", "b", "c", "c", "c", "c", "c", "c", "c", "c",]); - } + sut.SetupMock.Indexer(It.IsAny()) + .Returns("a") + .Returns("b") + .Returns("c").Forever(); - [Fact] - public async Task Returns_ShouldReturnExpectedValue() - { - IIndexerService sut = Mock.Create(); + string[] result = new string[10]; + for (int i = 0; i < 10; i++) + { + result[i] = sut[i]; + } - sut.SetupMock.Indexer(It.IsAny()) - .Returns("foo"); + await That(result).IsEqualTo(["a", "b", "c", "c", "c", "c", "c", "c", "c", "c",]); + } - string result = sut[3]; + [Fact] + public async Task Returns_ShouldReturnExpectedValue() + { + IIndexerService sut = Mock.Create(); - await That(result).IsEqualTo("foo"); - } + sut.SetupMock.Indexer(It.IsAny()) + .Returns("foo"); - [Fact] - public async Task Returns_When_ShouldOnlyUseValueWhenPredicateIsTrue() - { - IIndexerService sut = Mock.Create(); + string result = sut[3]; - sut.SetupMock.Indexer(It.IsAny()) - .Returns("foo").When(i => i > 0); + await That(result).IsEqualTo("foo"); + } - string result1 = sut[3]; - string result2 = sut[4]; - string result3 = sut[5]; + [Fact] + public async Task Returns_When_ShouldOnlyUseValueWhenPredicateIsTrue() + { + IIndexerService sut = Mock.Create(); - await That(result1).IsEqualTo(""); - await That(result2).IsEqualTo("foo"); - await That(result3).IsEqualTo("foo"); - } + sut.SetupMock.Indexer(It.IsAny()) + .Returns("foo").When(i => i > 0); - [Fact] - public async Task Returns_WhenFor_ShouldLimitUsage_ToSpecifiedNumber() - { - IIndexerService sut = Mock.Create(); + string result1 = sut[3]; + string result2 = sut[4]; + string result3 = sut[5]; - sut.SetupMock.Indexer(It.IsAny()) - .Returns("foo").When(i => i > 0).For(2) - .Returns("baz") - .Returns("bar").For(3); + await That(result1).IsEqualTo(""); + await That(result2).IsEqualTo("foo"); + await That(result3).IsEqualTo("foo"); + } - List values = []; - for (int i = 0; i < 10; i++) + [Fact] + public async Task Returns_WhenFor_ShouldLimitUsage_ToSpecifiedNumber() { - values.Add(sut[i]); - } + IIndexerService sut = Mock.Create(); - await That(values).IsEqualTo(["baz", "bar", "bar", "bar", "foo", "foo", "baz", "baz", "baz", "baz",]); - } + sut.SetupMock.Indexer(It.IsAny()) + .Returns("foo").When(i => i > 0).For(2) + .Returns("baz") + .Returns("bar").For(3); - [Fact] - public async Task Returns_WithoutSetup_ShouldReturnDefault() - { - IIndexerService sut = Mock.Create(); + List values = []; + for (int i = 0; i < 10; i++) + { + values.Add(sut[i]); + } - string result = sut[2]; + await That(values).IsEqualTo(["baz", "bar", "bar", "bar", "foo", "foo", "baz", "baz", "baz", "baz",]); + } - await That(result).IsEmpty(); - } + [Fact] + public async Task Returns_WithoutSetup_ShouldReturnDefault() + { + IIndexerService sut = Mock.Create(); - [Fact] - public async Task Throws_Callback_ShouldThrowException() - { - IIndexerService sut = Mock.Create(); + string result = sut[2]; - sut.SetupMock.Indexer(It.IsAny()) - .Throws(() => new Exception("foo")); + await That(result).IsEmpty(); + } - void Act() + [Fact] + public async Task SetupWithoutReturn_ShouldUseBaseValue() { - _ = sut[3]; + IndexerMethodSetupTest sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny()) + .OnGet.Do(() => { }); + + string result = sut[1]; + + await That(result).IsEqualTo("foo-1"); } - await That(Act).ThrowsException().WithMessage("foo"); - } + [Fact] + public async Task SetupWithReturn_ShouldIgnoreBaseValue() + { + IndexerMethodSetupTest sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny()) + .Returns("bar"); - [Fact] - public async Task Throws_CallbackWithParameters_ShouldThrowException() - { - IIndexerService sut = Mock.Create(); + string result = sut[1]; - sut.SetupMock.Indexer(It.IsAny()) - .InitializeWith("init") - .Throws(p1 => new Exception($"foo-{p1}")); + await That(result).IsEqualTo("bar"); + } - void Act() + [Fact] + public async Task Throws_Callback_ShouldThrowException() { - _ = sut[3]; - } + IIndexerService sut = Mock.Create(); - await That(Act).ThrowsException().WithMessage("foo-3"); - } + sut.SetupMock.Indexer(It.IsAny()) + .Throws(() => new Exception("foo")); - [Fact] - public async Task Throws_CallbackWithParametersAndValue_ShouldThrowException() - { - IIndexerService sut = Mock.Create(); + void Act() + { + _ = sut[3]; + } - sut.SetupMock.Indexer(It.IsAny()) - .InitializeWith("init") - .Throws((p1, v) => new Exception($"foo-{v}-{p1}")); + await That(Act).ThrowsException().WithMessage("foo"); + } - void Act() + [Fact] + public async Task Throws_CallbackWithParameters_ShouldThrowException() { - _ = sut[3]; - } + IIndexerService sut = Mock.Create(); - await That(Act).ThrowsException().WithMessage("foo-init-3"); - } + sut.SetupMock.Indexer(It.IsAny()) + .InitializeWith("init") + .Throws(p1 => new Exception($"foo-{p1}")); - [Fact] - public async Task Throws_Generic_ShouldThrowException() - { - IIndexerService sut = Mock.Create(); + void Act() + { + _ = sut[3]; + } - sut.SetupMock.Indexer(It.IsAny()) - .Throws(); + await That(Act).ThrowsException().WithMessage("foo-3"); + } - void Act() + [Fact] + public async Task Throws_CallbackWithParametersAndValue_ShouldThrowException() { - _ = sut[3]; - } + IIndexerService sut = Mock.Create(); - await That(Act).ThrowsExactly(); - } + sut.SetupMock.Indexer(It.IsAny()) + .InitializeWith("init") + .Throws((p1, v) => new Exception($"foo-{v}-{p1}")); - [Fact] - public async Task Throws_ShouldThrowException() - { - IIndexerService sut = Mock.Create(); + void Act() + { + _ = sut[3]; + } - sut.SetupMock.Indexer(It.IsAny()) - .Throws(new Exception("foo")); + await That(Act).ThrowsException().WithMessage("foo-init-3"); + } - void Act() + [Fact] + public async Task Throws_Generic_ShouldThrowException() { - _ = sut[3]; - } + IIndexerService sut = Mock.Create(); - await That(Act).ThrowsException().WithMessage("foo"); - } + sut.SetupMock.Indexer(It.IsAny()) + .Throws(); - [Fact] - public async Task WithoutCallback_IIndexerSetupReturnBuilder_ShouldNotThrow() - { - IIndexerService mock = Mock.Create(); - IIndexerSetupReturnBuilder setup = - (IIndexerSetupReturnBuilder)mock.SetupMock.Indexer(It.IsAny()); + void Act() + { + _ = sut[3]; + } - void ActWhen() - { - setup.When(_ => true); + await That(Act).ThrowsExactly(); } - void ActFor() + [Fact] + public async Task Throws_ShouldThrowException() { - setup.For(2); - } + IIndexerService sut = Mock.Create(); - await That(ActWhen).DoesNotThrow(); - await That(ActFor).DoesNotThrow(); - } + sut.SetupMock.Indexer(It.IsAny()) + .Throws(new Exception("foo")); - [Fact] - public async Task WithoutCallback_IIndexerSetupReturnWhenBuilder_ShouldNotThrow() - { - IIndexerService mock = Mock.Create(); - IIndexerSetupReturnWhenBuilder setup = - (IIndexerSetupReturnWhenBuilder)mock.SetupMock.Indexer(It.IsAny()); + void Act() + { + _ = sut[3]; + } - void ActFor() - { - setup.For(2); + await That(Act).ThrowsException().WithMessage("foo"); } - void ActOnly() + [Fact] + public async Task WithoutCallback_IIndexerSetupReturnBuilder_ShouldNotThrow() { - setup.Only(2); + IIndexerService mock = Mock.Create(); + IIndexerSetupReturnBuilder setup = + (IIndexerSetupReturnBuilder)mock.SetupMock.Indexer(It.IsAny()); + + void ActWhen() + { + setup.When(_ => true); + } + + void ActFor() + { + setup.For(2); + } + + await That(ActWhen).DoesNotThrow(); + await That(ActFor).DoesNotThrow(); } - await That(ActFor).DoesNotThrow(); - await That(ActOnly).DoesNotThrow(); + [Fact] + public async Task WithoutCallback_IIndexerSetupReturnWhenBuilder_ShouldNotThrow() + { + IIndexerService mock = Mock.Create(); + IIndexerSetupReturnWhenBuilder setup = + (IIndexerSetupReturnWhenBuilder)mock.SetupMock.Indexer(It.IsAny()); + + void ActFor() + { + setup.For(2); + } + + void ActOnly() + { + setup.Only(2); + } + + await That(ActFor).DoesNotThrow(); + await That(ActOnly).DoesNotThrow(); + } } public sealed class With2Levels @@ -529,6 +556,30 @@ public async Task Returns_WithoutSetup_ShouldReturnDefault() await That(result).IsEmpty(); } + [Fact] + public async Task SetupWithoutReturn_ShouldUseBaseValue() + { + IndexerMethodSetupTest sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny(), It.IsAny()) + .OnGet.Do(() => { }); + + string result = sut[1, 2]; + + await That(result).IsEqualTo("foo-1-2"); + } + + [Fact] + public async Task SetupWithReturn_ShouldIgnoreBaseValue() + { + IndexerMethodSetupTest sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny(), It.IsAny()) + .Returns("bar"); + + string result = sut[1, 2]; + + await That(result).IsEqualTo("bar"); + } + [Fact] public async Task Throws_Callback_ShouldThrowException() { @@ -857,6 +908,51 @@ public async Task Returns_WithoutSetup_ShouldReturnDefault() await That(result).IsEmpty(); } + [Fact] + public async Task SetupWithoutReturn_ShouldUseBaseValue() + { + IndexerMethodSetupTest sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny(), It.IsAny(), It.IsAny()) + .OnGet.Do(() => { }); + + string result = sut[1, 2, 3]; + + await That(result).IsEqualTo("foo-1-2-3"); + } + + [Fact] + public async Task Returns_WithPredicate_ShouldApplyReturnWhenPredicateMatches() + { + List results = []; + IIndexerService sut = Mock.Create(); + + sut.SetupMock.Indexer(It.IsAny()) + .Returns(() => "foo").When(i => i is > 3 and < 6); + + results.Add(sut[1]); + results.Add(sut[1]); + sut[1] = "bar"; + results.Add(sut[1]); + results.Add(sut[1]); + results.Add(sut[1]); + results.Add(sut[1]); + results.Add(sut[1]); + + await That(results).IsEqualTo(["", "", "bar", "bar", "foo", "foo", "foo",]); + } + + [Fact] + public async Task SetupWithReturn_ShouldIgnoreBaseValue() + { + IndexerMethodSetupTest sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny(), It.IsAny(), It.IsAny()) + .Returns("bar"); + + string result = sut[1, 2, 3]; + + await That(result).IsEqualTo("bar"); + } + [Fact] public async Task Throws_Callback_ShouldThrowException() { @@ -1186,6 +1282,30 @@ public async Task Returns_WithoutSetup_ShouldReturnDefault() await That(result).IsEmpty(); } + [Fact] + public async Task SetupWithoutReturn_ShouldUseBaseValue() + { + IndexerMethodSetupTest sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()) + .OnGet.Do(() => { }); + + string result = sut[1, 2, 3, 4]; + + await That(result).IsEqualTo("foo-1-2-3-4"); + } + + [Fact] + public async Task SetupWithReturn_ShouldIgnoreBaseValue() + { + IndexerMethodSetupTest sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()) + .Returns("bar"); + + string result = sut[1, 2, 3, 4]; + + await That(result).IsEqualTo("bar"); + } + [Fact] public async Task Throws_Callback_ShouldThrowException() { @@ -1525,6 +1645,32 @@ public async Task Returns_WithoutSetup_ShouldReturnDefault() await That(result).IsEmpty(); } + [Fact] + public async Task SetupWithoutReturn_ShouldUseBaseValue() + { + IndexerMethodSetupTest sut = Mock.Create(); + sut.SetupMock.Indexer( + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()) + .OnGet.Do(() => { }); + + string result = sut[1, 2, 3, 4, 5]; + + await That(result).IsEqualTo("foo-1-2-3-4-5"); + } + + [Fact] + public async Task SetupWithReturn_ShouldIgnoreBaseValue() + { + IndexerMethodSetupTest sut = Mock.Create(); + sut.SetupMock.Indexer( + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()) + .Returns("bar"); + + string result = sut[1, 2, 3, 4, 5]; + + await That(result).IsEqualTo("bar"); + } + [Fact] public async Task Throws_Callback_ShouldThrowException() { @@ -1656,5 +1802,44 @@ void ActOnly() await That(ActOnly).DoesNotThrow(); } } + + public class IndexerMethodSetupTest + { + private string? _data1; + private string? _data2; + private string? _data3; + private string? _data4; + private string? _data5; + + public virtual string this[int index] + { + get => _data1 ?? $"foo-{index}"; + set => _data1 = value; + } + + public virtual string this[int index1, int index2] + { + get => _data2 ?? $"foo-{index1}-{index2}"; + set => _data2 = value; + } + + public virtual string this[int index1, int index2, int index3] + { + get => _data3 ?? $"foo-{index1}-{index2}-{index3}"; + set => _data3 = value; + } + + public virtual string this[int index1, int index2, int index3, int index4] + { + get => _data4 ?? $"foo-{index1}-{index2}-{index3}-{index4}"; + set => _data4 = value; + } + + public virtual string this[int index1, int index2, int index3, int index4, int index5] + { + get => _data5 ?? $"foo-{index1}-{index2}-{index3}-{index4}-{index5}"; + set => _data5 = value; + } + } } } diff --git a/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.cs b/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.cs index f03b0c03..fb3c70c7 100644 --- a/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.cs +++ b/Tests/Mockolate.Tests/MockIndexers/SetupIndexerTests.cs @@ -305,9 +305,6 @@ protected override bool IsMatch(NamedParameterValue[] parameters) protected override bool? GetSkipBaseClass() => throw new NotSupportedException(); - protected override bool HasReturnCalls() - => throw new NotSupportedException(); - protected override void GetInitialValue(MockBehavior behavior, Func defaultValueGenerator, NamedParameterValue[] parameters, [NotNullWhen(true)] out T value) diff --git a/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.ReturnsThrowsTests.cs b/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.ReturnsThrowsTests.cs index 5412c289..6b6a64ac 100644 --- a/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.ReturnsThrowsTests.cs +++ b/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.ReturnsThrowsTests.cs @@ -125,6 +125,41 @@ public async Task Returns_Forever_ShouldUseTheLastValueForever() await That(result).IsEqualTo([2, 3, 4, 4, 4, 4, 4, 4, 4, 4,]); } + [Fact] + public async Task Returns_OnlyOnce_ShouldKeepLastUsedValue() + { + IPropertyService sut = Mock.Create(); + sut.SetupMock.Property.MyProperty.Returns(1).OnlyOnce(); + + int[] values = new int[10]; + for (int i = 0; i < 10; i++) + { + values[i] = sut.MyProperty; + if (i == 4) + { + sut.MyProperty = 10; + } + } + + await That(values).IsEqualTo([1, 1, 1, 1, 1, 10, 10, 10, 10, 10,]); + } + + [Fact] + public async Task Returns_OnlyOnce_ShouldUseReturnValueOnlyOnce() + { + IPropertyService sut = Mock.Create(); + sut.SetupMock.Property.MyProperty.Returns(1).OnlyOnce(); + + int[] values = new int[10]; + for (int i = 0; i < 10; i++) + { + sut.MyProperty = 0; + values[i] = sut.MyProperty; + } + + await That(values).IsEqualTo([1, 0, 0, 0, 0, 0, 0, 0, 0, 0,]); + } + [Fact] public async Task Returns_PredicateIsFalse_ShouldUseInitializedDefaultValue() { @@ -132,7 +167,7 @@ public async Task Returns_PredicateIsFalse_ShouldUseInitializedDefaultValue() IPropertyService sut = Mock.Create(); sut.SetupMock.Property.MyProperty - .Returns(() => 4).When(i => i > 3); + .Returns(() => 4).When(i => i is > 3 and < 6); results.Add(sut.MyProperty); results.Add(sut.MyProperty); diff --git a/Tests/Mockolate.Tests/SetupExtensionsTests.cs b/Tests/Mockolate.Tests/SetupExtensionsTests.cs index 036c09ba..1523fe2c 100644 --- a/Tests/Mockolate.Tests/SetupExtensionsTests.cs +++ b/Tests/Mockolate.Tests/SetupExtensionsTests.cs @@ -262,7 +262,7 @@ public async Task Forever_With5Parameters_When_ShouldKeepApplyingTheSetupWhenThe } [Fact] - public async Task OnlyOnce_With1Parameter_ShouldApplySetupOnlyOnce() + public async Task OnlyOnce_With1Parameter_ShouldKeepLastUsedValue() { ISetupExtensionsTestService sut = Mock.Create(); sut.SetupMock.Indexer(It.IsAny()).Returns(1).OnlyOnce(); @@ -271,6 +271,26 @@ public async Task OnlyOnce_With1Parameter_ShouldApplySetupOnlyOnce() for (int i = 0; i < 10; i++) { values[i] = sut[10]; + if (i == 4) + { + sut[10] = 10; + } + } + + await That(values).IsEqualTo([1, 1, 1, 1, 1, 10, 10, 10, 10, 10,]); + } + + [Fact] + public async Task OnlyOnce_With1Parameter_ShouldUseReturnValueOnlyOnce() + { + ISetupExtensionsTestService sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny()).Returns(1).OnlyOnce(); + + int[] values = new int[10]; + for (int i = 0; i < 10; i++) + { + sut[10] = 0; + values[i] = sut[10]; } await That(values).IsEqualTo([1, 0, 0, 0, 0, 0, 0, 0, 0, 0,]); @@ -285,6 +305,7 @@ public async Task OnlyOnce_With1Parameter_WithFor_ShouldApplySetupOnlyForTimes() int[] values = new int[10]; for (int i = 0; i < 10; i++) { + sut[10] = 0; values[i] = sut[10]; } @@ -292,7 +313,26 @@ public async Task OnlyOnce_With1Parameter_WithFor_ShouldApplySetupOnlyForTimes() } [Fact] - public async Task OnlyOnce_With2Parameters_ShouldApplySetupOnlyOnce() + public async Task OnlyOnce_With2Parameters_ShouldKeepLastUsedValue() + { + ISetupExtensionsTestService sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny(), It.IsAny()).Returns(1).OnlyOnce(); + + int[] values = new int[10]; + for (int i = 0; i < 10; i++) + { + values[i] = sut[10, 20]; + if (i == 4) + { + sut[10, 20] = 10; + } + } + + await That(values).IsEqualTo([1, 1, 1, 1, 1, 10, 10, 10, 10, 10,]); + } + + [Fact] + public async Task OnlyOnce_With2Parameters_ShouldUseReturnValueOnlyOnce() { ISetupExtensionsTestService sut = Mock.Create(); sut.SetupMock.Indexer(It.IsAny(), It.IsAny()).Returns(1).OnlyOnce(); @@ -300,6 +340,7 @@ public async Task OnlyOnce_With2Parameters_ShouldApplySetupOnlyOnce() int[] values = new int[10]; for (int i = 0; i < 10; i++) { + sut[10, 20] = 0; values[i] = sut[10, 20]; } @@ -315,6 +356,7 @@ public async Task OnlyOnce_With2Parameters_WithFor_ShouldApplySetupOnlyForTimes( int[] values = new int[10]; for (int i = 0; i < 10; i++) { + sut[10, 20] = 0; values[i] = sut[10, 20]; } @@ -322,7 +364,26 @@ public async Task OnlyOnce_With2Parameters_WithFor_ShouldApplySetupOnlyForTimes( } [Fact] - public async Task OnlyOnce_With3Parameters_ShouldApplySetupOnlyOnce() + public async Task OnlyOnce_With3Parameters_ShouldKeepLastUsedValue() + { + ISetupExtensionsTestService sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny(), It.IsAny(), It.IsAny()).Returns(1).OnlyOnce(); + + int[] values = new int[10]; + for (int i = 0; i < 10; i++) + { + values[i] = sut[10, 20, 30]; + if (i == 4) + { + sut[10, 20, 30] = 10; + } + } + + await That(values).IsEqualTo([1, 1, 1, 1, 1, 10, 10, 10, 10, 10,]); + } + + [Fact] + public async Task OnlyOnce_With3Parameters_ShouldUseReturnValueOnlyOnce() { ISetupExtensionsTestService sut = Mock.Create(); sut.SetupMock.Indexer(It.IsAny(), It.IsAny(), It.IsAny()).Returns(1).OnlyOnce(); @@ -330,6 +391,7 @@ public async Task OnlyOnce_With3Parameters_ShouldApplySetupOnlyOnce() int[] values = new int[10]; for (int i = 0; i < 10; i++) { + sut[10, 20, 30] = 0; values[i] = sut[10, 20, 30]; } @@ -345,6 +407,7 @@ public async Task OnlyOnce_With3Parameters_WithFor_ShouldApplySetupOnlyForTimes( int[] values = new int[10]; for (int i = 0; i < 10; i++) { + sut[10, 20, 30] = 0; values[i] = sut[10, 20, 30]; } @@ -352,15 +415,36 @@ public async Task OnlyOnce_With3Parameters_WithFor_ShouldApplySetupOnlyForTimes( } [Fact] - public async Task OnlyOnce_With4Parameters_ShouldApplySetupOnlyOnce() + public async Task OnlyOnce_With4Parameters_ShouldKeepLastUsedValue() { ISetupExtensionsTestService sut = Mock.Create(); - sut.SetupMock.Indexer(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()).Returns(1) - .OnlyOnce(); + sut.SetupMock.Indexer(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()) + .Returns(1).OnlyOnce(); + + int[] values = new int[10]; + for (int i = 0; i < 10; i++) + { + values[i] = sut[10, 20, 30, 40]; + if (i == 4) + { + sut[10, 20, 30, 40] = 10; + } + } + + await That(values).IsEqualTo([1, 1, 1, 1, 1, 10, 10, 10, 10, 10,]); + } + + [Fact] + public async Task OnlyOnce_With4Parameters_ShouldUseReturnValueOnlyOnce() + { + ISetupExtensionsTestService sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()) + .Returns(1).OnlyOnce(); int[] values = new int[10]; for (int i = 0; i < 10; i++) { + sut[10, 20, 30, 40] = 0; values[i] = sut[10, 20, 30, 40]; } @@ -377,6 +461,7 @@ public async Task OnlyOnce_With4Parameters_WithFor_ShouldApplySetupOnlyForTimes( int[] values = new int[10]; for (int i = 0; i < 10; i++) { + sut[10, 20, 30, 40] = 0; values[i] = sut[10, 20, 30, 40]; } @@ -384,7 +469,27 @@ public async Task OnlyOnce_With4Parameters_WithFor_ShouldApplySetupOnlyForTimes( } [Fact] - public async Task OnlyOnce_With5Parameters_ShouldApplySetupOnlyOnce() + public async Task OnlyOnce_With5Parameters_ShouldKeepLastUsedValue() + { + ISetupExtensionsTestService sut = Mock.Create(); + sut.SetupMock.Indexer(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()) + .Returns(1).OnlyOnce(); + + int[] values = new int[10]; + for (int i = 0; i < 10; i++) + { + values[i] = sut[10, 20, 30, 40, 50]; + if (i == 4) + { + sut[10, 20, 30, 40, 50] = 10; + } + } + + await That(values).IsEqualTo([1, 1, 1, 1, 1, 10, 10, 10, 10, 10,]); + } + + [Fact] + public async Task OnlyOnce_With5Parameters_ShouldUseReturnValueOnlyOnce() { ISetupExtensionsTestService sut = Mock.Create(); sut.SetupMock.Indexer(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()) @@ -393,6 +498,7 @@ public async Task OnlyOnce_With5Parameters_ShouldApplySetupOnlyOnce() int[] values = new int[10]; for (int i = 0; i < 10; i++) { + sut[10, 20, 30, 40, 50] = 0; values[i] = sut[10, 20, 30, 40, 50]; } @@ -409,6 +515,7 @@ public async Task OnlyOnce_With5Parameters_WithFor_ShouldApplySetupOnlyForTimes( int[] values = new int[10]; for (int i = 0; i < 10; i++) { + sut[10, 20, 30, 40, 50] = 0; values[i] = sut[10, 20, 30, 40, 50]; }