public void _Prefetch_MovingIteratorWithEnumeratorBehavesCorrectly(Func <IEnumerable <int> > trackedIterationFactory)
        {
            var iter   = new PreFetchFirstElementEnumerable <int>(trackedIterationFactory()); StateShouldBe(0, 1, 0);
            var itEnum = iter.GetEnumerator();       StateShouldBe(0, 1, 0);

            itEnum.MoveNext().Should().BeTrue();     StateShouldBe(0, 1, 0);
            itEnum.Current.Should().Be(10);          StateShouldBe(0, 1, 0);
            itEnum.Current.Should().Be(10);          StateShouldBe(0, 1, 0);
            itEnum.Current.Should().Be(10);          StateShouldBe(0, 1, 0);
            itEnum.MoveNext().Should().BeTrue();     StateShouldBe(1, 1, 1);
            itEnum.Current.Should().Be(20);          StateShouldBe(1, 1, 1);
            itEnum.MoveNext().Should().BeTrue();     StateShouldBe(2, 1, 1);
            itEnum.Current.Should().Be(30);          StateShouldBe(2, 1, 1);
            itEnum.MoveNext().Should().BeTrue();     StateShouldBe(3, 1, 1);
            itEnum.MoveNext().Should().BeFalse();    StateShouldBe(-2, 1, 1);

            ResetState();

            itEnum = iter.GetEnumerator();           StateShouldBe(0, 1, 0);
            itEnum.MoveNext().Should().BeTrue();     StateShouldBe(0, 1, 0);
            itEnum.MoveNext().Should().BeTrue();     StateShouldBe(1, 1, 1);
            itEnum.Current.Should().Be(20);          StateShouldBe(1, 1, 1);
            itEnum.MoveNext().Should().BeTrue();     StateShouldBe(2, 1, 1);
            itEnum.Current.Should().Be(30);          StateShouldBe(2, 1, 1);

            ResetState();

            iter   = new PreFetchFirstElementEnumerable <int>(trackedIterationFactory()); StateShouldBe(0, 1, 0);
            itEnum = iter.GetEnumerator();           StateShouldBe(0, 1, 0);
            itEnum.MoveNext().Should().BeTrue();     StateShouldBe(0, 1, 0);
            itEnum.MoveNext().Should().BeTrue();     StateShouldBe(1, 1, 1);
            itEnum.Current.Should().Be(20);          StateShouldBe(1, 1, 1);
            itEnum.MoveNext().Should().BeTrue();     StateShouldBe(2, 1, 1);
            itEnum.Current.Should().Be(30);          StateShouldBe(2, 1, 1);
        }
        public void _Prefetch_InvokingAPrefetchedIteratorDoesChangePositionAndDoesExecuteFirstStep(Func <IEnumerable <int> > trackedIterationFactory)
        {
            _iteratorPosition.Should().Be(-1);
            var iter = new PreFetchFirstElementEnumerable <int>(trackedIterationFactory());

            _iteratorPosition.Should().Be(0);
            _executeFirstStep.Should().Be(1);
            _executeSecondStep.Should().Be(0);
        }