public void CanCreateBindingDelegateFor_CalledWhenAllInnerBindersReturnFalse_ExpectFalseIsReturned(
			[WithinInclusiveRange(1, 10)] int numberOfInnerBinders, Type requestType)
		{
			var innerBinders = CreateNumberOfStubServiceRequestBindersUnableToCreateDelegate(numberOfInnerBinders, requestType);
			var chain = new ServiceRequestBinderChain(innerBinders);
			chain.CanCreateBindingDelegateFor(requestType).Should().BeFalse();
		}
        public void CanCreateBindingDelegateFor_CalledWhenAllInnerBindersReturnFalse_ExpectFalseIsReturned(
            [WithinInclusiveRange(1, 10)] int numberOfInnerBinders, Type requestType)
        {
            var innerBinders = CreateNumberOfStubServiceRequestBindersUnableToCreateDelegate(numberOfInnerBinders, requestType);
            var chain        = new ServiceRequestBinderChain(innerBinders);

            chain.CanCreateBindingDelegateFor(requestType).Should().BeFalse();
        }
		public void CanCreateBindingDelegateFor_CalledWhenAtLeastOneInnerBinderReturnsTrue_ExpectTrueIsReturned(
			[WithinInclusiveRange(0, 10)] int numberOfFalseInnerBinders,
			[WithinInclusiveRange(1, 10)] int numberOfTrueInnerBinders,
			Type requestType)
		{
			var falseBinders = CreateNumberOfStubServiceRequestBindersUnableToCreateDelegate(numberOfFalseInnerBinders, requestType);
			var trueBinders = CreateNumberOfStubServiceRequestBindersAbleToCreateDelegate(numberOfTrueInnerBinders, requestType);

			var chain = new ServiceRequestBinderChain(falseBinders.Concat(trueBinders).Shuffle());
			chain.CanCreateBindingDelegateFor(requestType).Should().BeTrue();
		}
        public void CanCreateBindingDelegateFor_CalledMultipleTimes_ExpectEnumerableOfInnerBindersIsOnlyEnumeratedOnce(
            Type requestType1, Type requestType2)
        {
            var innerBinders = Mock.Enumerable <IServiceRequestBinder>();
            var chain        = new ServiceRequestBinderChain(innerBinders);

            chain.CanCreateBindingDelegateFor(requestType1);
            chain.CanCreateBindingDelegateFor(requestType2);

            innerBinders.AssertWasCalled(x => x.GetEnumerator(), x => x.Repeat.Once());
        }
        public void CreateBindingDelegate_CalledMultipleTimes_ExpectEnumerableOfInnerBindersIsOnlyEnumeratedOnce(
            Type requestType1, ServiceRequestBinderContext context1, Type requestType2, ServiceRequestBinderContext context2)
        {
            var innerBinders = Mock.Enumerable <IServiceRequestBinder>();
            var chain        = new ServiceRequestBinderChain(innerBinders);

            chain.Invoking(x => x.CreateBindingDelegate(requestType1, context1)).ShouldThrow <Exception>();
            chain.Invoking(x => x.CreateBindingDelegate(requestType2, context2)).ShouldThrow <Exception>();

            innerBinders.AssertWasCalled(x => x.GetEnumerator(), x => x.Repeat.Once());
        }
        public void CanCreateBindingDelegateFor_CalledWhenAtLeastOneInnerBinderReturnsTrue_ExpectTrueIsReturned(
            [WithinInclusiveRange(0, 10)] int numberOfFalseInnerBinders,
            [WithinInclusiveRange(1, 10)] int numberOfTrueInnerBinders,
            Type requestType)
        {
            var falseBinders = CreateNumberOfStubServiceRequestBindersUnableToCreateDelegate(numberOfFalseInnerBinders, requestType);
            var trueBinders  = CreateNumberOfStubServiceRequestBindersAbleToCreateDelegate(numberOfTrueInnerBinders, requestType);

            var chain = new ServiceRequestBinderChain(falseBinders.Concat(trueBinders).Shuffle());

            chain.CanCreateBindingDelegateFor(requestType).Should().BeTrue();
        }
        public void CreateBindingDelegate_CalledWhenAtLeastOneInnerBinderCanCreateDelegate_ExpectReturnedDelegateIsFromInnerBinder(
            [WithinInclusiveRange(0, 10)] int numberOfFalseInnerBinders,
            [WithinInclusiveRange(1, 10)] int numberOfTrueInnerBinders,
            Type requestType,
            ServiceRequestBinderContext context)
        {
            Func <object, object> constructedDelegate = x => new object();
            var falseBinders = CreateNumberOfStubServiceRequestBindersUnableToCreateDelegate(numberOfFalseInnerBinders, requestType);
            var trueBinders  = CreateNumberOfStubServiceRequestBindersAbleToCreateDelegate(numberOfTrueInnerBinders, requestType);

            trueBinders.ForEach(inv => inv.Stub(
                                    x => x.CreateBindingDelegate(Arg <Type> .Is.Same(requestType), Arg <ServiceRequestBinderContext> .Is.Same(context)))
                                .Return(constructedDelegate));

            var chain = new ServiceRequestBinderChain(falseBinders.Concat(trueBinders).Shuffle());

            chain.CreateBindingDelegate(requestType, context).Should().BeSameAs(constructedDelegate);
        }
		public void CanCreateBindingDelegateFor_CalledMultipleTimes_ExpectEnumerableOfInnerBindersIsOnlyEnumeratedOnce(
			Type requestType1, Type requestType2)
		{
			var innerBinders = Mock.Enumerable<IServiceRequestBinder>();
			var chain = new ServiceRequestBinderChain(innerBinders);
			chain.CanCreateBindingDelegateFor(requestType1);
			chain.CanCreateBindingDelegateFor(requestType2);

			innerBinders.AssertWasCalled(x => x.GetEnumerator(), x => x.Repeat.Once());
		}
		public void CreateBindingDelegate_CalledMultipleTimes_ExpectEnumerableOfInnerBindersIsOnlyEnumeratedOnce(
			Type requestType1, ServiceRequestBinderContext context1, Type requestType2, ServiceRequestBinderContext context2)
		{
			var innerBinders = Mock.Enumerable<IServiceRequestBinder>();
			var chain = new ServiceRequestBinderChain(innerBinders);
			chain.Invoking(x => x.CreateBindingDelegate(requestType1, context1)).ShouldThrow<Exception>();
			chain.Invoking(x => x.CreateBindingDelegate(requestType2, context2)).ShouldThrow<Exception>();

			innerBinders.AssertWasCalled(x => x.GetEnumerator(), x => x.Repeat.Once());
		}
		public void CreateBindingDelegate_CalledWhenAtLeastOneInnerBinderCanCreateDelegate_ExpectReturnedDelegateIsFromInnerBinder(
			[WithinInclusiveRange(0, 10)] int numberOfFalseInnerBinders,
			[WithinInclusiveRange(1, 10)] int numberOfTrueInnerBinders,
			Type requestType,
			ServiceRequestBinderContext context)
		{
			Func<object, object> constructedDelegate = x => new object();
			var falseBinders = CreateNumberOfStubServiceRequestBindersUnableToCreateDelegate(numberOfFalseInnerBinders, requestType);
			var trueBinders = CreateNumberOfStubServiceRequestBindersAbleToCreateDelegate(numberOfTrueInnerBinders, requestType);
			trueBinders.ForEach(inv => inv.Stub(
				x => x.CreateBindingDelegate(Arg<Type>.Is.Same(requestType), Arg<ServiceRequestBinderContext>.Is.Same(context)))
					.Return(constructedDelegate));

			var chain = new ServiceRequestBinderChain(falseBinders.Concat(trueBinders).Shuffle());
			chain.CreateBindingDelegate(requestType, context).Should().BeSameAs(constructedDelegate);
		}