public void MoveNext_NeverWithSingleProperty_CurrentThrows_HasNextIsTrue()
        {
            var classStub    = CreateClassStub();
            var propertyStub = CreatePropertyStub(classStub, "FirstProperty");

            var enumerator = new ResolvedBusinessObjectPropertyPathPropertyEnumerator(new[] { propertyStub });

            Assert.That(() => enumerator.Current, Throws.InvalidOperationException.With.Message.EqualTo("Enumeration has not started. Call MoveNext."));
            Assert.That(enumerator.HasNext, Is.True);
        }
        public void MoveNext_OnceWithSingleProperty_ReturnsTrue_CurrentIsSetToProperty_HasNextIsFalse()
        {
            var classStub    = CreateClassStub();
            var propertyStub = CreatePropertyStub(classStub, "FirstProperty");

            var enumerator = new ResolvedBusinessObjectPropertyPathPropertyEnumerator(new[] { propertyStub });

            Assert.That(enumerator.MoveNext(classStub), Is.True);
            Assert.That(enumerator.Current, Is.SameAs(propertyStub));
            Assert.That(enumerator.HasNext, Is.False);
        }
        public void MoveNext_TwiceWithSingleProperty_ReturnsFalse_CurrentThrows_HasNextIsFalse()
        {
            var classStub    = CreateClassStub();
            var propertyStub = CreatePropertyStub(classStub, "FirstProperty");

            var enumerator = new ResolvedBusinessObjectPropertyPathPropertyEnumerator(new[] { propertyStub });

            Assert.That(enumerator.MoveNext(classStub), Is.True);

            Assert.That(enumerator.MoveNext(MockRepository.GenerateStub <IBusinessObjectClass>()), Is.False);
            Assert.That(() => enumerator.Current, Throws.InvalidOperationException.With.Message.EqualTo("Enumeration already finished."));
            Assert.That(enumerator.HasNext, Is.False);
        }
        public void MoveNext_WithMultipleProperties_ReturnsFalseAfterLastProperty_CurrentThrows_HasNextIsFalse()
        {
            var firstClassStub     = CreateClassStub();
            var secondClassStub    = CreateClassStub();
            var firstPropertyStub  = CreateReferencePropertyStub(firstClassStub, "FirstProperty", secondClassStub);
            var secondPropertyStub = CreatePropertyStub(secondClassStub, "SecondProperty");

            var enumerator = new ResolvedBusinessObjectPropertyPathPropertyEnumerator(new[] { firstPropertyStub, secondPropertyStub });

            Assert.That(enumerator.MoveNext(firstClassStub), Is.True);
            Assert.That(enumerator.Current, Is.SameAs(firstPropertyStub));
            Assert.That(enumerator.HasNext, Is.True);

            Assert.That(enumerator.MoveNext(secondClassStub), Is.True);
            Assert.That(enumerator.Current, Is.SameAs(secondPropertyStub));
            Assert.That(enumerator.HasNext, Is.False);

            Assert.That(enumerator.MoveNext(MockRepository.GenerateStub <IBusinessObjectClass>()), Is.False);
            Assert.That(() => enumerator.Current, Throws.InvalidOperationException.With.Message.EqualTo("Enumeration already finished."));
            Assert.That(enumerator.HasNext, Is.False);
        }