public void RefreshesAfterMoveNextReturnsFalse()
        {
            var refreshCount = 0;
            var list         = new List <int?> {
                1, 2
            };
            var refresher = new RefreshEnumerator <int?>(() =>
            {
                refreshCount++;
                return(list.GetEnumerator());
            });

            Assert.IsTrue(refresher.MoveNext());
            Assert.AreEqual(1, refreshCount);
            Assert.AreEqual(1, refresher.Current);

            Assert.IsTrue(refresher.MoveNext());
            Assert.AreEqual(1, refreshCount);
            Assert.AreEqual(2, refresher.Current);

            Assert.IsTrue(refresher.MoveNext());
            Assert.AreEqual(1, refreshCount);
            Assert.AreEqual(default(int?), refresher.Current);

            Assert.IsTrue(refresher.MoveNext());
            Assert.AreEqual(2, refreshCount);
            Assert.AreEqual(1, refresher.Current);

            Assert.IsTrue(refresher.MoveNext());
            Assert.AreEqual(2, refreshCount);
            Assert.AreEqual(2, refresher.Current);
        }
        public void CurrentIsDefault_T_WhenUnderlyingEnumeratorReturnsFalse()
        {
            var refresher = new RefreshEnumerator <int?>(() => new List <int?>().GetEnumerator());

            refresher.MoveNext();
            Assert.AreEqual(default(int?), refresher.Current);
        }
        public void MoveNextReturnsTrueWhenUnderlyingEnumeratorReturnsFalse()
        {
            var refresher = new RefreshEnumerator <int?>(() => new List <int?>().GetEnumerator());

            Assert.IsTrue(refresher.MoveNext());

            refresher.Dispose();
        }
        public void RefreshesEnumeratorOnFirstMoveNext()
        {
            var refreshed = false;
            var refresher = new RefreshEnumerator <int?>(() =>
            {
                refreshed = true;
                return(new List <int?>().GetEnumerator());
            });

            refresher.MoveNext();
            Assert.IsTrue(refreshed);
        }
        public void UnderlyingEnumeratorDisposed_WhenUnderlyingEnumeratorReturnsFalse()
        {
            var fakeEnumerator = new Mock <IEnumerator <int?> >();

            fakeEnumerator.Setup(e => e.MoveNext()).Returns(false);
            fakeEnumerator.Setup(e => e.Dispose()).Verifiable();
            var refresher = new RefreshEnumerator <int?>(() => fakeEnumerator.Object);

            refresher.MoveNext();

            fakeEnumerator.Verify(enumerator => enumerator.Dispose(), Times.Once);
        }
        public void ResetCallsUnderlyingReset()
        {
            var fakeEnumerator = new Mock <IEnumerator <int?> >();

            fakeEnumerator.Setup(e => e.MoveNext()).Returns(true);
            fakeEnumerator.Setup(e => e.Reset()).Verifiable();
            var refresher = new RefreshEnumerator <int?>(() => fakeEnumerator.Object);

            refresher.MoveNext();
            refresher.Reset();

            fakeEnumerator.Verify(enumerator => enumerator.Reset(), Times.Once);
        }