diff --git a/Source/Mockolate/Setup/PropertySetup.cs b/Source/Mockolate/Setup/PropertySetup.cs index beee5133..ece27685 100644 --- a/Source/Mockolate/Setup/PropertySetup.cs +++ b/Source/Mockolate/Setup/PropertySetup.cs @@ -113,13 +113,13 @@ public class PropertySetup(string name) : PropertySetup, private readonly List>> _getterCallbacks = []; private readonly List>> _returnCallbacks = []; private readonly List>> _setterCallbacks = []; - private bool? _skipBaseClass; private Callback? _currentCallback; private int _currentGetterCallbacksIndex; private Callback? _currentReturnCallback; private int _currentReturnCallbackIndex; private int _currentSetterCallbacksIndex; private bool _isInitialized; + private bool? _skipBaseClass; private T _value = default!; /// @@ -209,7 +209,7 @@ protected override TResult InvokeGetter(MockBehavior behavior, Func 0) + if (!foundCallback && _returnCallbacks.Count > 0 && !_isInitialized) { _value = defaultValueGenerator() is T value ? value : default!; _isInitialized = true; diff --git a/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.InitializeWithTests.cs b/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.InitializeWithTests.cs index 114ec3d1..e871fcdd 100644 --- a/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.InitializeWithTests.cs +++ b/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.InitializeWithTests.cs @@ -1,29 +1,42 @@ -namespace Mockolate.Tests.MockProperties; +using System.Collections.Generic; + +namespace Mockolate.Tests.MockProperties; public sealed partial class SetupPropertyTests { public sealed class InitializeWithTests { [Fact] - public async Task WhenRead_ShouldReturnInitializedValue() + public async Task Returns_PredicateIsFalse_ShouldUseInitializedDefaultValue() { + List results = []; IPropertyService sut = Mock.Create(); - sut.SetupMock.Property.MyProperty.InitializeWith(42); - int result = sut.MyProperty; + sut.SetupMock.Property.MyProperty + .InitializeWith(2) + .Returns(() => 4).When(i => i > 3); - await That(result).IsEqualTo(42); + results.Add(sut.MyProperty); + results.Add(sut.MyProperty); + sut.MyProperty = -3; + results.Add(sut.MyProperty); + results.Add(sut.MyProperty); + results.Add(sut.MyProperty); + results.Add(sut.MyProperty); + results.Add(sut.MyProperty); + + await That(results).IsEqualTo([2, 2, -3, -3, 4, 4, 4,]); } [Fact] - public async Task WithNull_ShouldReturnNull() + public async Task WhenRead_ShouldReturnInitializedValue() { IPropertyService sut = Mock.Create(); - sut.SetupMock.Property.MyStringProperty.InitializeWith(null); + sut.SetupMock.Property.MyProperty.InitializeWith(42); - string? result = sut.MyStringProperty; + int result = sut.MyProperty; - await That(result).IsNull(); + await That(result).IsEqualTo(42); } [Fact] @@ -39,5 +52,16 @@ public async Task WhenSet_ShouldUpdateValue_ShouldReturnInitializedValue() await That(result1).IsEqualTo(42); await That(result2).IsEqualTo(100); } + + [Fact] + public async Task WithNull_ShouldReturnNull() + { + IPropertyService sut = Mock.Create(); + sut.SetupMock.Property.MyStringProperty.InitializeWith(null); + + string? result = sut.MyStringProperty; + + await That(result).IsNull(); + } } } diff --git a/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.ReturnsThrowsTests.cs b/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.ReturnsThrowsTests.cs index cb2e6ba6..5412c289 100644 --- a/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.ReturnsThrowsTests.cs +++ b/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.ReturnsThrowsTests.cs @@ -59,74 +59,32 @@ public async Task Returns_Callback_ShouldReturnExpectedValue() } [Fact] - public async Task Returns_CallbackWithWhen_ShouldReturnDefaultValueWhenPredicateIsFalse() + public async Task Returns_CallbackWithValue_ShouldReturnExpectedValue() { IPropertyService sut = Mock.Create(); sut.SetupMock.Property.MyProperty - .Returns(() => 4).When(i => i > 0); - - int result1 = sut.MyProperty; - int result2 = sut.MyProperty; - - await That(result1).IsEqualTo(0); - await That(result2).IsEqualTo(4); - } - - [Fact] - public async Task WithoutCallback_IPropertySetupReturnBuilder_ShouldNotThrow() - { - IPropertyService mock = Mock.Create(); - IPropertySetupReturnBuilder setup = - (IPropertySetupReturnBuilder)mock.SetupMock.Property.MyProperty; - - void ActWhen() - { - setup.When(_ => true); - } - - void ActFor() - { - setup.For(2); - } - - await That(ActWhen).DoesNotThrow(); - await That(ActFor).DoesNotThrow(); - } - - [Fact] - public async Task WithoutCallback_IPropertySetupReturnWhenBuilder_ShouldNotThrow() - { - IPropertyService mock = Mock.Create(); - IPropertySetupReturnWhenBuilder setup = - (IPropertySetupReturnWhenBuilder)mock.SetupMock.Property.MyProperty; - - void ActFor() - { - setup.For(2); - } + .InitializeWith(3) + .Returns(x => 4 * x); - void ActOnly() - { - setup.Only(2); - } + int result = sut.MyProperty; - await That(ActFor).DoesNotThrow(); - await That(ActOnly).DoesNotThrow(); + await That(result).IsEqualTo(12); } [Fact] - public async Task Returns_CallbackWithValue_ShouldReturnExpectedValue() + public async Task Returns_CallbackWithWhen_ShouldReturnDefaultValueWhenPredicateIsFalse() { IPropertyService sut = Mock.Create(); sut.SetupMock.Property.MyProperty - .InitializeWith(3) - .Returns(x => 4 * x); + .Returns(() => 4).When(i => i > 0); - int result = sut.MyProperty; + int result1 = sut.MyProperty; + int result2 = sut.MyProperty; - await That(result).IsEqualTo(12); + await That(result1).IsEqualTo(0); + await That(result2).IsEqualTo(4); } [Fact] @@ -141,10 +99,11 @@ public async Task Returns_For_ShouldLimitUsage_ToSpecifiedNumber() List values = []; for (int i = 0; i < 10; i++) { + sut.MyStringProperty = "-"; values.Add(sut.MyStringProperty); } - await That(values).IsEqualTo(["foo", "foo", "bar", "bar", "bar", "", "", "", "", "",]); + await That(values).IsEqualTo(["foo", "foo", "bar", "bar", "bar", "-", "-", "-", "-", "-",]); } [Fact] @@ -166,6 +125,27 @@ 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_PredicateIsFalse_ShouldUseInitializedDefaultValue() + { + List results = []; + IPropertyService sut = Mock.Create(); + + sut.SetupMock.Property.MyProperty + .Returns(() => 4).When(i => i > 3); + + results.Add(sut.MyProperty); + results.Add(sut.MyProperty); + sut.MyProperty = -3; + results.Add(sut.MyProperty); + results.Add(sut.MyProperty); + results.Add(sut.MyProperty); + results.Add(sut.MyProperty); + results.Add(sut.MyProperty); + + await That(results).IsEqualTo([0, 0, -3, -3, 4, 4, 4,]); + } + [Fact] public async Task Returns_ShouldReturnExpectedValue() { @@ -289,5 +269,47 @@ void Act() await That(Act).ThrowsException().WithMessage("foo"); } + + [Fact] + public async Task WithoutCallback_IPropertySetupReturnBuilder_ShouldNotThrow() + { + IPropertyService mock = Mock.Create(); + IPropertySetupReturnBuilder setup = + (IPropertySetupReturnBuilder)mock.SetupMock.Property.MyProperty; + + void ActWhen() + { + setup.When(_ => true); + } + + void ActFor() + { + setup.For(2); + } + + await That(ActWhen).DoesNotThrow(); + await That(ActFor).DoesNotThrow(); + } + + [Fact] + public async Task WithoutCallback_IPropertySetupReturnWhenBuilder_ShouldNotThrow() + { + IPropertyService mock = Mock.Create(); + IPropertySetupReturnWhenBuilder setup = + (IPropertySetupReturnWhenBuilder)mock.SetupMock.Property.MyProperty; + + void ActFor() + { + setup.For(2); + } + + void ActOnly() + { + setup.Only(2); + } + + await That(ActFor).DoesNotThrow(); + await That(ActOnly).DoesNotThrow(); + } } } diff --git a/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.cs b/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.cs index 7125c1f7..b7591d80 100644 --- a/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.cs +++ b/Tests/Mockolate.Tests/MockProperties/SetupPropertyTests.cs @@ -5,6 +5,17 @@ namespace Mockolate.Tests.MockProperties; public sealed partial class SetupPropertyTests { + [Fact] + public async Task InitializeValue_NotMatchingTypes_ShouldUseDefault() + { + MyPropertySetup setup = new(); + + setup.MyInitializeValue("f"); + + int result = setup.InvokeGetter(); + await That(result).IsEqualTo(0); + } + [Fact] public async Task InvokeGetter_InvalidType_ShouldThrowMockException() { @@ -161,5 +172,8 @@ public void InvokeSetter(object? value) public TResult InvokeGetter() => InvokeGetter(MockBehavior.Default, () => default!); + + public void MyInitializeValue(object? value) + => InitializeValue(value); } } diff --git a/Tests/Mockolate.Tests/SetupExtensionsTests.cs b/Tests/Mockolate.Tests/SetupExtensionsTests.cs index be10102a..036c09ba 100644 --- a/Tests/Mockolate.Tests/SetupExtensionsTests.cs +++ b/Tests/Mockolate.Tests/SetupExtensionsTests.cs @@ -45,6 +45,7 @@ public async Task OnlyOnce_ShouldApplySetupOnlyOnce() int[] values = new int[10]; for (int i = 0; i < 10; i++) { + sut.MyProperty = 0; values[i] = sut.MyProperty; } @@ -60,6 +61,7 @@ public async Task OnlyOnce_WithFor_ShouldApplySetupOnlyForTimes() int[] values = new int[10]; for (int i = 0; i < 10; i++) { + sut.MyProperty = 0; values[i] = sut.MyProperty; }