// 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.AspNet.Mvc.Rendering; using Moq; using Xunit; namespace Microsoft.AspNet.Mvc { public class ViewEngineDescriptorExtensionsTest { [Theory] [InlineData(-1)] [InlineData(5)] public void Insert_WithType_ThrowsIfIndexIsOutOfBounds(int index) { // Arrange var collection = new List { new ViewEngineDescriptor(Mock.Of()), new ViewEngineDescriptor(Mock.Of()) }; // Act & Assert Assert.Throws("index", () => collection.Insert(index, typeof(IViewEngine))); } [Theory] [InlineData(-2)] [InlineData(3)] public void Insert_WithInstance_ThrowsIfIndexIsOutOfBounds(int index) { // Arrange var collection = new List { new ViewEngineDescriptor(Mock.Of()), new ViewEngineDescriptor(Mock.Of()) }; var viewEngine = Mock.Of(); // Act & Assert Assert.Throws("index", () => collection.Insert(index, viewEngine)); } [InlineData] public void ViewEngineDescriptors_AddsTypesAndInstances() { // Arrange var viewEngine = Mock.Of(); var type = typeof(TestViewEngine); var collection = new List(); // Act collection.Add(viewEngine); collection.Insert(0, type); // Assert Assert.Equal(2, collection.Count); Assert.IsType(collection[0].ViewEngine); Assert.Same(viewEngine, collection[0].ViewEngineType); } [Fact] public void InputviewEngines_InstanceOf_ThrowsInvalidOperationExceptionIfMoreThanOnceInstance() { // Arrange var viewEngines = new MvcViewOptions().ViewEngines; viewEngines.Add(new TestViewEngine()); viewEngines.Add(Mock.Of()); viewEngines.Add(new TestViewEngine()); // Act & Assert Assert.Throws(() => viewEngines.InstanceOf()); } [Fact] public void InputviewEngines_InstanceOf_ThrowsInvalidOperationExceptionIfNoInstance() { // Arrange var viewEngines = new MvcViewOptions().ViewEngines; viewEngines.Add(Mock.Of()); viewEngines.Add(typeof(TestViewEngine)); // Act & Assert Assert.Throws(() => viewEngines.InstanceOf()); } [Fact] public void InputviewEngines_InstanceOf_ReturnsInstanceOfIInputFormatterIfOneExists() { // Arrange var viewEngines = new MvcViewOptions().ViewEngines; viewEngines.Add(Mock.Of()); var testEngine = new TestViewEngine(); viewEngines.Add(testEngine); viewEngines.Add(typeof(TestViewEngine)); // Act var formatter = viewEngines.InstanceOf(); // Assert Assert.NotNull(formatter); Assert.IsType(formatter); Assert.Same(testEngine, formatter); } [Fact] public void InputviewEngines_InstanceOfOrDefault_ThrowsInvalidOperationExceptionIfMoreThanOnceInstance() { // Arrange var viewEngines = new MvcViewOptions().ViewEngines; viewEngines.Add(new TestViewEngine()); viewEngines.Add(Mock.Of()); viewEngines.Add(new TestViewEngine()); // Act & Assert Assert.Throws(() => viewEngines.InstanceOfOrDefault()); } [Fact] public void InputviewEngines_InstanceOfOrDefault_ReturnsNullIfNoInstance() { // Arrange var viewEngines = new MvcViewOptions().ViewEngines; viewEngines.Add(Mock.Of()); viewEngines.Add(typeof(TestViewEngine)); // Act var formatter = viewEngines.InstanceOfOrDefault(); // Assert Assert.Null(formatter); } [Fact] public void InputviewEngines_InstanceOfOrDefault_ReturnsInstanceOfIInputFormatterIfOneExists() { // Arrange var viewEngines = new MvcViewOptions().ViewEngines; viewEngines.Add(Mock.Of()); viewEngines.Add(typeof(TestViewEngine)); var testEngine = new TestViewEngine(); viewEngines.Add(testEngine); // Act var formatter = viewEngines.InstanceOfOrDefault(); // Assert Assert.NotNull(formatter); Assert.IsType(formatter); Assert.Same(testEngine, formatter); } [Fact] public void InputviewEngines_InstancesOf_ReturnsEmptyCollectionIfNoneExist() { // Arrange var viewEngines = new MvcViewOptions().ViewEngines; viewEngines.Add(Mock.Of()); viewEngines.Add(typeof(TestViewEngine)); // Act var result = viewEngines.InstancesOf(); // Assert Assert.Empty(result); } [Fact] public void InputviewEngines_InstancesOf_ReturnsNonEmptyCollectionIfSomeExist() { // Arrange var viewEngines = new MvcViewOptions().ViewEngines; viewEngines.Add(typeof(TestViewEngine)); var viewEngine1 = new TestViewEngine(); var viewEngine2 = Mock.Of(); var viewEngine3 = new TestViewEngine(); var viewEngine4 = Mock.Of(); viewEngines.Add(viewEngine1); viewEngines.Add(viewEngine2); viewEngines.Add(viewEngine3); viewEngines.Add(viewEngine4); var expectedviewEngines = new List { viewEngine1, viewEngine3 }; // Act var result = viewEngines.InstancesOf().ToList(); // Assert Assert.NotEmpty(result); Assert.Equal(result, expectedviewEngines); } private class TestViewEngine : IViewEngine { public ViewEngineResult FindPartialView(ActionContext context, string partialViewName) { throw new NotImplementedException(); } public ViewEngineResult FindView(ActionContext context, string viewName) { throw new NotImplementedException(); } } } }