// 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.Linq; using System.Collections.Generic; using Microsoft.AspNet.Mvc; using Xunit; namespace Microsoft.AspNet.Mvc.Xml { public class EnumerableWrapperProviderFactoryTest { public static TheoryData EnumerableOfTInterfaceData { get { var serializableError = new SerializableError(); serializableError.Add("key1", "key1-error"); return new TheoryData { { typeof(IEnumerable), new [] { "value1", "value2" }, typeof(DelegatingEnumerable) }, { typeof(IEnumerable), new [] { 10, 20 }, typeof(DelegatingEnumerable) }, { typeof(IEnumerable), new [] { new Person() { Id =10, Name = "John" } }, typeof(DelegatingEnumerable) }, { typeof(IEnumerable), new [] { serializableError }, typeof(DelegatingEnumerable) }, }; } } [Theory] [MemberData(nameof(EnumerableOfTInterfaceData))] public void Creates_WrapperProvider_EnumerableOfTInterface( Type declaredType, object objectToBeWrapped, Type expectedWrappingType) { // Arrange var wrapperProviderFactories = GetWrapperProviderFactories(); var enumerableWrapperProviderFactory = new EnumerableWrapperProviderFactory(wrapperProviderFactories); var wrapperProviderContext = new WrapperProviderContext(declaredType, isSerialization: true); // Act var wrapperProvider = enumerableWrapperProviderFactory.GetProvider(wrapperProviderContext); // Assert Assert.NotNull(wrapperProvider); Assert.Equal(expectedWrappingType, wrapperProvider.WrappingType); } public static TheoryData QueryableOfTInterfaceData { get { var serializableError = new SerializableError(); serializableError.Add("key1", "key1-error"); return new TheoryData { { typeof(IEnumerable), (new [] { "value1", "value2" }).AsQueryable(), typeof(DelegatingEnumerable) }, { typeof(IEnumerable), (new [] { 10, 20 }).AsQueryable(), typeof(DelegatingEnumerable) }, { typeof(IEnumerable), (new [] { new Person() { Id =10, Name = "John" } }).AsQueryable(), typeof(DelegatingEnumerable) }, { typeof(IEnumerable), (new [] { serializableError }).AsQueryable(), typeof(DelegatingEnumerable) }, }; } } [Theory] [MemberData(nameof(QueryableOfTInterfaceData))] public void Creates_WrapperProvider_QueryableOfTInterface( Type declaredType, object objectToBeWrapped, Type expectedWrappingType) { // Arrange var wrapperProviderFactories = GetWrapperProviderFactories(); var enumerableWrapperProviderFactory = new EnumerableWrapperProviderFactory(wrapperProviderFactories); var wrapperProviderContext = new WrapperProviderContext(declaredType, isSerialization: true); // Act var wrapperProvider = enumerableWrapperProviderFactory.GetProvider(wrapperProviderContext); // Assert Assert.NotNull(wrapperProvider); Assert.Equal(expectedWrappingType, wrapperProvider.WrappingType); } public static TheoryData ConcreteEnumerableOfTData { get { var serializableError = new SerializableError(); serializableError.Add("key1", "key1-error"); return new TheoryData { { typeof(string), // 'string' implements IEnumerable "value" }, { typeof(List), (new [] { 10, 20 }).ToList() }, { typeof(List), (new [] { new Person() { Id =10, Name = "John" } }).ToList() }, { typeof(List), (new [] { serializableError }).ToList() }, { typeof(PersonList), new PersonList() }, }; } } [Theory] [MemberData(nameof(ConcreteEnumerableOfTData))] public void DoesNot_CreateWrapperProvider_ForConcrete_EnumerableOfTImplementations( Type declaredType, object objectToBeWrapped) { // Arrange var wrapperProviderFactories = GetWrapperProviderFactories(); var enumerableWrapperProviderFactory = new EnumerableWrapperProviderFactory(wrapperProviderFactories); var wrapperProviderContext = new WrapperProviderContext(declaredType, isSerialization: true); // Act var wrapperProvider = enumerableWrapperProviderFactory.GetProvider(wrapperProviderContext); // Assert Assert.Null(wrapperProvider); } private IEnumerable GetWrapperProviderFactories() { var wrapperProviderFactories = new List(); wrapperProviderFactories.Add(new EnumerableWrapperProviderFactory(wrapperProviderFactories)); wrapperProviderFactories.Add(new SerializableErrorWrapperProviderFactory()); return wrapperProviderFactories; } internal class Person { public int Id { get; set; } public string Name { get; set; } } internal class PersonList : List { } } }