public void AddReference_Fail_Dispose_M()
		{
			var disposable = new Mock<IDisposable>(MockBehavior.Strict);
			disposable.Setup(_ => _.Dispose());

			var main = new DisposableReferenceCounter(disposable.Object);

			main.Dispose();

			main.AddReference();
		}
		public void Dispose_Once()
		{
			var disposable = new Mock<IDisposable>(MockBehavior.Strict);
			disposable.Setup(_ => _.Dispose());

			var counter = new DisposableReferenceCounter(disposable.Object);
			counter.Dispose();
			counter.Dispose();
			counter.Dispose();

			disposable.Verify(_ => _.Dispose(), Times.Once);
		}
		public void AddReference_DisposeMain_AddRefFromMain()
		{
			var disposable = new Mock<IDisposable>(MockBehavior.Strict);
			disposable.Setup(_ => _.Dispose());

			var main = new DisposableReferenceCounter(disposable.Object);
			var other = main.AddReference();

			main.Dispose();
			disposable.Verify(_ => _.Dispose(), Times.Never);

			var again = main.AddReference();
			other.Dispose();
			disposable.Verify(_ => _.Dispose(), Times.Never);

			again.Dispose();
			disposable.Verify(_ => _.Dispose(), Times.Once);
		}
		public void AddReference_Dispose_Nested_NOM()
		{
			var disposable = new Mock<IDisposable>(MockBehavior.Strict);
			disposable.Setup(_ => _.Dispose());

			var main = new DisposableReferenceCounter(disposable.Object);
			var other = main.AddReference();
			var nested = other.AddReference();

			nested.Dispose();
			disposable.Verify(_ => _.Dispose(), Times.Never);

			other.Dispose();
			disposable.Verify(_ => _.Dispose(), Times.Never);

			main.Dispose();
			disposable.Verify(_ => _.Dispose(), Times.Once);
		}