// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Linq; using System.Collections.Generic; using System.Collections.ObjectModel; using Microsoft.AspNet.Mvc; using Xunit; namespace Microsoft.AspNet.Mvc.Xml { public class EnumerableWrapperProviderTest { [Theory] [InlineData(typeof(IEnumerable), typeof(DelegatingEnumerable))] [InlineData(typeof(IQueryable), typeof(DelegatingEnumerable))] [InlineData(typeof(ICollection), typeof(DelegatingEnumerable))] [InlineData(typeof(IList), typeof(DelegatingEnumerable))] public void Gets_DelegatingWrappingType(Type declaredEnumerableOfT, Type expectedType) { // Arrange var wrapperProvider = new EnumerableWrapperProvider( declaredEnumerableOfT, new SerializableErrorWrapperProvider()); // Act var wrappingType = wrapperProvider.WrappingType; // Assert Assert.NotNull(wrappingType); Assert.Equal(expectedType, wrappingType); } [Fact] public void Wraps_EmptyCollections() { // Arrange var declaredEnumerableOfT = typeof(IEnumerable); var wrapperProvider = new EnumerableWrapperProvider( declaredEnumerableOfT, elementWrapperProvider: null); // Act var wrapped = wrapperProvider.Wrap(new int[] { }); // Assert Assert.Equal(typeof(DelegatingEnumerable), wrapperProvider.WrappingType); Assert.NotNull(wrapped); var delegatingEnumerable = wrapped as DelegatingEnumerable; Assert.NotNull(delegatingEnumerable); Assert.Equal(0, delegatingEnumerable.Count()); } [Fact] public void Ignores_NullInstances() { // Arrange var declaredEnumerableOfT = typeof(IEnumerable); var wrapperProvider = new EnumerableWrapperProvider( declaredEnumerableOfT, elementWrapperProvider: null); // Act var wrapped = wrapperProvider.Wrap(null); // Assert Assert.Equal(typeof(DelegatingEnumerable), wrapperProvider.WrappingType); Assert.Null(wrapped); } [Theory] [InlineData(typeof(string))] [InlineData(typeof(List))] [InlineData(typeof(List))] [InlineData(typeof(List))] [InlineData(typeof(PersonList))] public void ThrowsArugmentExceptionFor_ConcreteEnumerableOfT(Type declaredType) { // Arrange var expectedMessage = "The type must be an interface and must be or derive from 'IEnumerable`1'." + "\r\nParameter name: sourceEnumerableOfT"; // Act and Assert var ex = Assert.Throws(() => new EnumerableWrapperProvider( declaredType, elementWrapperProvider: null)); Assert.Equal(expectedMessage, ex.Message); } } }