// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. using System.Collections.Generic; using System.Linq; using Moq; using Xunit; using Assert = Microsoft.TestCommon.AssertEx; namespace System.Web.Mvc.Test { public class MultiServiceResolverTest { [Fact] public void ConstructorWithNullThunkArgumentThrows() { // Act & Assert Assert.ThrowsArgumentNull( delegate { new MultiServiceResolver(null); }, "itemsThunk"); } [Fact] public void CurrentPrependsFromResolver() { // Arrange IEnumerable providersFromServiceLocation = GetProvidersFromService(); IEnumerable providersFromItemsThunk = GetProvidersFromItemsThunk(); IEnumerable expectedProviders = providersFromServiceLocation.Concat(providersFromItemsThunk); Mock resolver = new Mock(); resolver.Setup(r => r.GetServices(typeof(TestProvider))) .Returns(providersFromServiceLocation); MultiServiceResolver multiResolver = new MultiServiceResolver(() => providersFromItemsThunk, resolver.Object); // Act IEnumerable returnedProviders = multiResolver.Current; // Assert Assert.Equal(expectedProviders.ToList(), returnedProviders.ToList()); } [Fact] public void CurrentCachesResolverResult() { // Arrange IEnumerable providersFromServiceLocation = GetProvidersFromService(); IEnumerable providersFromItemsThunk = GetProvidersFromItemsThunk(); IEnumerable expectedProviders = providersFromServiceLocation.Concat(providersFromItemsThunk); Mock resolver = new Mock(); resolver.Setup(r => r.GetServices(typeof(TestProvider))) .Returns(providersFromServiceLocation); MultiServiceResolver multiResolver = new MultiServiceResolver(() => providersFromItemsThunk, resolver.Object); // Act IEnumerable returnedProviders = multiResolver.Current; IEnumerable 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)); } [Fact] public void CurrentReturnsCurrentItemsWhenResolverReturnsNoInstances() { // Arrange IEnumerable providersFromItemsThunk = GetProvidersFromItemsThunk(); MultiServiceResolver resolver = new MultiServiceResolver(() => providersFromItemsThunk); // Act IEnumerable returnedProviders = resolver.Current; // Assert Assert.Equal(providersFromItemsThunk.ToList(), returnedProviders.ToList()); } [Fact] public void CurrentDoesNotQueryResolverAfterNoInstancesAreReturned() { // Arrange IEnumerable providersFromItemsThunk = GetProvidersFromItemsThunk(); Mock resolver = new Mock(); resolver.Setup(r => r.GetServices(typeof(TestProvider))) .Returns(new TestProvider[0]); MultiServiceResolver multiResolver = new MultiServiceResolver(() => providersFromItemsThunk, resolver.Object); // Act IEnumerable returnedProviders = multiResolver.Current; IEnumerable cachedProviders = multiResolver.Current; // Assert Assert.Equal(providersFromItemsThunk.ToList(), returnedProviders.ToList()); Assert.Equal(providersFromItemsThunk.ToList(), cachedProviders.ToList()); resolver.Verify(r => r.GetServices(typeof(TestProvider)), Times.Exactly(1)); } [Fact] public void CurrentPropagatesExceptionWhenResolverThrowsNonActivationException() { // Arrange Mock resolver = new Mock(MockBehavior.Strict); MultiServiceResolver multiResolver = new MultiServiceResolver(() => null, resolver.Object); // Act & Assert Assert.Throws( () => multiResolver.Current, @"IDependencyResolver.GetServices(System.Web.Mvc.Test.MultiServiceResolverTest+TestProvider) invocation failed with mock behavior Strict. All invocations on the mock must have a corresponding setup." ); } private class TestProvider { } private IEnumerable GetProvidersFromService() { return new TestProvider[] { new TestProvider(), new TestProvider() }; } private IEnumerable GetProvidersFromItemsThunk() { return new TestProvider[] { new TestProvider(), new TestProvider() }; } } }