private (WeakReference, WeakReference) AddGarbageToPool(DisposablePool pool)
        {
            var objA = new TestDisposable();
            var objB = new TestDisposable();

            pool.AddDisposable(objA);
            pool.AddDisposable(objB);

            return(new WeakReference(objA), new WeakReference(objB));
        }
        public void AddDisposable_ThenDispose()
        {
            var objA = new TestDisposable();
            var objB = new TestDisposable();
            var pool = new DisposablePool();

            pool.AddDisposable(objA).Should().BeSameAs(objA);
            pool.AddDisposable(objB).Should().BeSameAs(objB);
            pool.Dispose();

            objA.IsDisposed.Should().BeTrue();
            objB.IsDisposed.Should().BeTrue();
        }
        public void AddDisposable_ThenFinalize()
        {
            var objA = new TestDisposable();
            var objB = new TestDisposable();
            var pool = new DisposablePool();

            pool.AddDisposable(objA).Should().BeSameAs(objA);
            pool.AddDisposable(objB).Should().BeSameAs(objB);
            pool.DisposeUnmanaged(); // simulate finalizer

            // Does not dispose managed resources during finalization
            objA.IsDisposed.Should().BeFalse();
            objB.IsDisposed.Should().BeFalse();
        }
        public void Dispose_Exception()
        {
            var objA = new Mock <IDisposable>(MockBehavior.Strict);

            objA.Setup(o => o.Dispose()).Throws <InvalidOperationException>();

            var pool = new DisposablePool();

            pool.AddDisposable(objA.Object);

            pool.Dispose();

            objA.Verify();
        }