// Copyright (c) .NET Foundation. 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.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Testing; using Xunit; namespace Microsoft.AspNetCore.Mvc.Formatters.Xml.Internal { 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.Empty(delegatingEnumerable); } [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'."; // Act and Assert ExceptionAssert.ThrowsArgument(() => new EnumerableWrapperProvider( declaredType, elementWrapperProvider: null), "sourceEnumerableOfT", expectedMessage); } } }