diff --git a/Rubberduck.Main/ComClientLibrary/UnitTesting/FakeBase.cs b/Rubberduck.Main/ComClientLibrary/UnitTesting/FakeBase.cs index db628abc2a..f315b18a81 100644 --- a/Rubberduck.Main/ComClientLibrary/UnitTesting/FakeBase.cs +++ b/Rubberduck.Main/ComClientLibrary/UnitTesting/FakeBase.cs @@ -75,7 +75,7 @@ protected bool TrySetReturnValue(bool any = false) #region IFake - private static readonly List ReturnValues = new List(); + private readonly List ReturnValues = new List(); public virtual void Returns(object value, int invocation = FakesProvider.AllInvocations) { ReturnValues.Add(new ReturnValueInfo(invocation, string.Empty, string.Empty, value)); diff --git a/Rubberduck.Main/ComClientLibrary/UnitTesting/Fakes/Date.cs b/Rubberduck.Main/ComClientLibrary/UnitTesting/Fakes/Date.cs index f8764ef4f0..d0247b14e0 100644 --- a/Rubberduck.Main/ComClientLibrary/UnitTesting/Fakes/Date.cs +++ b/Rubberduck.Main/ComClientLibrary/UnitTesting/Fakes/Date.cs @@ -18,14 +18,16 @@ public Date() public void DateCallback(IntPtr retVal) { OnCallBack(true); - if (!TrySetReturnValue()) // specific invocation + if (!TrySetReturnValue()) { - TrySetReturnValue(true); // any invocation + TrySetReturnValue(true); } if (PassThrough) { + FakesProvider.SuspendFake(typeof(Now)); var nativeCall = Marshal.GetDelegateForFunctionPointer(NativeFunctionAddress); nativeCall(retVal); + FakesProvider.ResumeFake(typeof(Now)); return; } Marshal.GetNativeVariantForObject(ReturnValue ?? 0, retVal); diff --git a/Rubberduck.Main/ComClientLibrary/UnitTesting/Fakes/Time.cs b/Rubberduck.Main/ComClientLibrary/UnitTesting/Fakes/Time.cs index 0ca75c54ef..79c74600e6 100644 --- a/Rubberduck.Main/ComClientLibrary/UnitTesting/Fakes/Time.cs +++ b/Rubberduck.Main/ComClientLibrary/UnitTesting/Fakes/Time.cs @@ -24,8 +24,10 @@ public void TimeCallback(IntPtr retVal) } if (PassThrough) { + FakesProvider.SuspendFake(typeof(Now)); var nativeCall = Marshal.GetDelegateForFunctionPointer(NativeFunctionAddress); nativeCall(retVal); + FakesProvider.ResumeFake(typeof(Now)); return; } Marshal.GetNativeVariantForObject(ReturnValue ?? 0, retVal); diff --git a/Rubberduck.Main/ComClientLibrary/UnitTesting/FakesProvider.cs b/Rubberduck.Main/ComClientLibrary/UnitTesting/FakesProvider.cs index 9f104f67dd..c0bb2cfb6e 100644 --- a/Rubberduck.Main/ComClientLibrary/UnitTesting/FakesProvider.cs +++ b/Rubberduck.Main/ComClientLibrary/UnitTesting/FakesProvider.cs @@ -37,6 +37,30 @@ public void StartTest() CodeIsUnderTest = true; } + public static void SuspendFake(Type type) + { + foreach (var fake in ActiveFakes.Values) + { + if (fake.GetType() == type) + { + fake.DisableHook(); + return; + } + } + } + + public static void ResumeFake(Type type) + { + foreach (var fake in ActiveFakes.Values) + { + if (fake.GetType() == type) + { + fake.EnableHook(); + return; + } + } + } + public void StopTest() { foreach (var fake in ActiveFakes.Values) diff --git a/Rubberduck.Main/ComClientLibrary/UnitTesting/StubBase.cs b/Rubberduck.Main/ComClientLibrary/UnitTesting/StubBase.cs index 48be3edac4..ba876b3eed 100644 --- a/Rubberduck.Main/ComClientLibrary/UnitTesting/StubBase.cs +++ b/Rubberduck.Main/ComClientLibrary/UnitTesting/StubBase.cs @@ -53,6 +53,21 @@ protected void OnCallBack(bool trackNoParams = false) } } + public void DisableHook() + { + foreach (var hook in _hooks) + { + hook.ThreadACL.SetExclusiveACL(new[] { 0 }); + } + } + public void EnableHook() + { + foreach (var hook in _hooks) + { + hook.ThreadACL.SetInclusiveACL(new[] { 0 }); + } + } + public virtual void Dispose() { foreach (var hook in _hooks) diff --git a/RubberduckTests/IntegrationTests/FakeTests.bas b/RubberduckTests/IntegrationTests/FakeTests.bas index 695d81782e..a271778f9c 100644 --- a/RubberduckTests/IntegrationTests/FakeTests.bas +++ b/RubberduckTests/IntegrationTests/FakeTests.bas @@ -729,3 +729,50 @@ TestExit: TestFail: Assert.Fail "Test raised an error: #" & Err.Number & " - " & Err.Description End Sub + +'@TestMethod +Public Sub TestIssue4476() + On Error GoTo TestFail + + 'Arrange: + Fakes.Now.PassThrough = True + Fakes.Date.PassThrough = True + Dim retVal As Variant + + 'Act: + retVal = Now + retVal = Date '<== KA-BOOOM + retVal = Now 'ensure fake reinstated + + 'Assert: + Fakes.Now.Verify.Exactly 2 + Fakes.Date.Verify.Once + +TestExit: + Exit Sub +TestFail: + Assert.Fail "Test raised an error: #" & Err.Number & " - " & Err.Description +End Sub + +'@TestMethod +Public Sub TestIssue5944() + On Error GoTo TestFail + + Fakes.InputBox.Returns 20 + Fakes.MsgBox.Returns 20 + + Dim inputBoxReturnValue As String + Dim msgBoxReturnValue As Integer + + inputBoxReturnValue = InputBox("Dummy") + msgBoxReturnValue = MsgBox("Dummy") + + Fakes.MsgBox.Verify.Once + Fakes.InputBox.Verify.Once + +TestExit: + Exit Sub +TestFail: + Assert.Fail "Test raised an error: #" & Err.Number & " - " & Err.Description +End Sub +