public void CurrentReturnsCurrentItemsWhenResolverReturnsNoInstances() {
            // Arrange
            IEnumerable<TestProvider> providersFromItemsThunk = GetProvidersFromItemsThunk();
            MultiServiceResolver<TestProvider> resolver = new MultiServiceResolver<TestProvider>(() => providersFromItemsThunk);

            // Act
            IEnumerable<TestProvider> returnedProviders = resolver.Current;

            // Assert
            CollectionAssert.AreEqual(providersFromItemsThunk.ToList(), returnedProviders.ToList());
        }
        public void CurrentDoesNotQueryResolverAfterNoInstancesAreReturned() {
            // Arrange
            IEnumerable<TestProvider> providersFromItemsThunk = GetProvidersFromItemsThunk();
            Mock<IDependencyResolver> resolver = new Mock<IDependencyResolver>();
            resolver.Setup(r => r.GetServices(typeof(TestProvider)))
                    .Returns(new TestProvider[0]);
            MultiServiceResolver<TestProvider> multiResolver = new MultiServiceResolver<TestProvider>(() => providersFromItemsThunk, resolver.Object);

            // Act
            IEnumerable<TestProvider> returnedProviders = multiResolver.Current;
            IEnumerable<TestProvider> cachedProviders = multiResolver.Current;

            // Assert
            CollectionAssert.AreEqual(providersFromItemsThunk.ToList(), returnedProviders.ToList());
            CollectionAssert.AreEqual(providersFromItemsThunk.ToList(), cachedProviders.ToList());
            resolver.Verify(r => r.GetServices(typeof(TestProvider)), Times.Exactly(1));
        }
        public void CurrentPrependsFromResolver() {
            // Arrange
            IEnumerable<TestProvider> providersFromServiceLocation = GetProvidersFromService();
            IEnumerable<TestProvider> providersFromItemsThunk = GetProvidersFromItemsThunk();
            IEnumerable<TestProvider> expectedProviders = providersFromServiceLocation.Concat(providersFromItemsThunk);

            Mock<IDependencyResolver> resolver = new Mock<IDependencyResolver>();
            resolver.Setup(r => r.GetServices(typeof(TestProvider)))
                    .Returns(providersFromServiceLocation);

            MultiServiceResolver<TestProvider> multiResolver = new MultiServiceResolver<TestProvider>(() => providersFromItemsThunk, resolver.Object);

            // Act
            IEnumerable<TestProvider> returnedProviders = multiResolver.Current;

            // Assert
            CollectionAssert.AreEqual(expectedProviders.ToList(), returnedProviders.ToList());
        }
        public void CurrentCachesResolverResult()
        {
            // Arrange
            IEnumerable<TestProvider> providersFromServiceLocation = GetProvidersFromService();
            IEnumerable<TestProvider> providersFromItemsThunk = GetProvidersFromItemsThunk();
            IEnumerable<TestProvider> expectedProviders = providersFromServiceLocation.Concat(providersFromItemsThunk);

            Mock<IDependencyResolver> resolver = new Mock<IDependencyResolver>();
            resolver.Setup(r => r.GetServices(typeof(TestProvider)))
                .Returns(providersFromServiceLocation);

            MultiServiceResolver<TestProvider> multiResolver = new MultiServiceResolver<TestProvider>(() => providersFromItemsThunk, resolver.Object);

            // Act
            IEnumerable<TestProvider> returnedProviders = multiResolver.Current;
            IEnumerable<TestProvider> cachedProviders = multiResolver.Current;

            // Assert
            Assert.Equal(expectedProviders.ToList(), returnedProviders.ToList());
            Assert.Equal(expectedProviders.ToList(), cachedProviders.ToList());
            resolver.Verify(r => r.GetServices(typeof(TestProvider)), Times.Exactly(1));
        }
        public void CurrentPropagatesExceptionWhenResolverThrowsNonActivationException()
        {
            // Arrange
            Mock<IDependencyResolver> resolver = new Mock<IDependencyResolver>(MockBehavior.Strict);
            MultiServiceResolver<TestProvider> multiResolver = new MultiServiceResolver<TestProvider>(() => null, resolver.Object);

            // Act & Assert
            Assert.Throws<MockException>(
                () => multiResolver.Current,
                "IDependencyResolver.GetServices(System.Web.Mvc.Test.MultiServiceResolverTest+TestProvider) invocation failed with mock behavior Strict." + Environment.NewLine
              + "All invocations on the mock must have a corresponding setup."
                );
        }