public async Task ShouldReturnWithoutAnError_WhenSafeDisposeAsyncIsCalled_AndTheObjectIsNull()
        {
            // ARRANGE

            // ACT
            await MyAsyncDisposable.SafeDisposeAsync(null).ConfigureAwait(false);

            // ASSERT
        }
        public async Task ShouldDisposeAnIAsyncDisposableObject_WhenSafeDisposeAsyncIsCalled()
        {
            // ARRANGE
            var disposable = new MyAsyncDisposable(base.Logger);

            // ACT
            await MyAsyncDisposable.SafeDisposeAsync(disposable).ConfigureAwait(false);

            // ASSERT
            LogAssert.IsTrue("Is Disposed", disposable.IsDisposed);
        }
 private void AssertInitialState(MyAsyncDisposable disposable)
 {
     LogAssert.IsFalse("IsDisposed", disposable.IsDisposed);
     LogAssert.AreEqual("OnDisposing Call Position", 0, disposable.OnDisposingCallPosition);
     LogAssert.AreEqual("DisposeManagedResources Call Position", 0, disposable.DisposeManagedResourcesCallPosition);
     LogAssert.AreEqual("DisposeUnmanagedResources Call Position", 0, disposable.DisposeUnmanagedResourcesCallPosition);
     LogAssert.AreEqual("SetResourcesToNull Call Position", 0, disposable.SetResourcesToNullCallPosition);
     LogAssert.AreEqual("OnDisposed Call Position", 0, disposable.OnDisposedCallPosition);
     LogAssert.AreEqual("DisposeManagedResourcesAsync Call Position", 0, disposable.DisposeManagedResourcesAsyncCallPosition);
     LogAssert.AreEqual("DisposeUnmanagedResourcesAsync Call Position", 0, disposable.DisposeUnmanagedResourcesAsyncCallPosition);
 }
        public async Task ShouldPerformLifecycleOfOverridableAsyncDisposeMethods()
        {
            // ARRANGE
            var disposable = new MyAsyncDisposable(base.Logger);

            AssertInitialState(disposable);

            // ACT
            await disposable.DisposeAsync().ConfigureAwait(false);

            // ASSERT
            // Assert lifecycle of Async Dispose methods were invoked
            LogAssert.IsTrue("IsDisposed", disposable.IsDisposed);
            LogAssert.AreEqual("OnDisposing Call Position", 1, disposable.OnDisposingCallPosition);
            LogAssert.AreEqual("DisposeManagedResourcesAsync Call Position", 2, disposable.DisposeManagedResourcesAsyncCallPosition);
            LogAssert.AreEqual("DisposeUnmanagedResourcesAsync Call Position", 3, disposable.DisposeUnmanagedResourcesAsyncCallPosition);
            LogAssert.AreEqual("SetResourcesToNull Call Position", 4, disposable.SetResourcesToNullCallPosition);
            LogAssert.AreEqual("OnDisposed Call Position", 5, disposable.OnDisposedCallPosition);

            // Assert the normal Dispose methods were NOT invoked
            LogAssert.AreEqual("DisposeManagedResources Call Position", 0, disposable.DisposeManagedResourcesCallPosition);
            LogAssert.AreEqual("DisposeUnmanagedResources Call Position", 0, disposable.DisposeUnmanagedResourcesCallPosition);
        }
        public void ShouldPerformLifecycleOfOverridableDisposeMethods()
        {
            // ARRANGE
            var disposable = new MyAsyncDisposable(base.Logger);

            AssertInitialState(disposable);

            // ACT
            disposable.Dispose();

            // ASSERT
            // Assert lifecycle of Dispose methods were invoked
            LogAssert.IsTrue("IsDisposed", disposable.IsDisposed);
            LogAssert.AreEqual("OnDisposing Call Position", 1, disposable.OnDisposingCallPosition);
            LogAssert.AreEqual("DisposeManagedResources Call Position", 2, disposable.DisposeManagedResourcesCallPosition);
            LogAssert.AreEqual("DisposeUnmanagedResources Call Position", 3, disposable.DisposeUnmanagedResourcesCallPosition);
            LogAssert.AreEqual("SetResourcesToNull Call Position", 4, disposable.SetResourcesToNullCallPosition);
            LogAssert.AreEqual("OnDisposed Call Position", 5, disposable.OnDisposedCallPosition);

            // Assert async methods were NOT invoked
            LogAssert.AreEqual("DisposeManagedResourcesAsync Call Position", 0, disposable.DisposeManagedResourcesAsyncCallPosition);
            LogAssert.AreEqual("DisposeUnmanagedResourcesAsync Call Position", 0, disposable.DisposeUnmanagedResourcesAsyncCallPosition);
        }