/// <summary>
        /// Tests whether the <see cref="Microsoft.AspNetCore.Mvc.ViewResult"/>
        /// or the <see cref="Microsoft.AspNetCore.Mvc.PartialViewResult"/>
        /// has the same view name as the provided one.
        /// </summary>
        /// <param name="baseTestBuilderWithViewResult">
        /// Instance of <see cref="IBaseTestBuilderWithViewResult{TViewResultTestBuilder}"/> type.
        /// </param>
        /// <param name="viewName">Expected view name.</param>
        /// <returns>The same <see cref="Microsoft.AspNetCore.Mvc.ActionResult"/> test builder.</returns>
        public static TViewResultTestBuilder WithName <TViewResultTestBuilder>(
            this IBaseTestBuilderWithViewResult <TViewResultTestBuilder> baseTestBuilderWithViewResult,
            string viewName)
            where TViewResultTestBuilder : IBaseTestBuilderWithActionResult
        {
            var actualBuilder = GetActualBuilder(baseTestBuilderWithViewResult);

            RuntimeBinderValidator.ValidateBinding(() =>
            {
                var actualViewName = actualBuilder
                                     .TestContext
                                     .MethodResult
                                     .AsDynamic()
                                     ?.ViewName as string;

                if (viewName != actualViewName)
                {
                    actualBuilder.ThrowNewFailedValidationException(
                        "to",
                        $"be {TestHelper.GetFriendlyName(viewName)}",
                        $"instead received {TestHelper.GetFriendlyName(actualViewName)}");
                }
            });

            return(actualBuilder.ResultTestBuilder);
        }
        internal static TViewResultTestBuilder WithDefaultName <TViewResultTestBuilder>(
            this IBaseTestBuilderWithViewResult <TViewResultTestBuilder> baseTestBuilderWithViewResult)
            where TViewResultTestBuilder : IBaseTestBuilderWithActionResult
        {
            var actualBuilder = GetActualBuilder(baseTestBuilderWithViewResult);

            RuntimeBinderValidator.ValidateBinding(() =>
            {
                var actualViewName = actualBuilder
                                     .TestContext
                                     .MethodResult
                                     .AsDynamic()
                                     .ViewName;

                if (actualViewName != null)
                {
                    actualBuilder.ThrowNewFailedValidationException(
                        "name",
                        $"to be {TestHelper.GetFriendlyName(null)}",
                        $"instead received {TestHelper.GetFriendlyName(actualViewName)}");
                }
            });

            return(actualBuilder.ResultTestBuilder);
        }
        /// <summary>
        /// Gets the view engine instance from a view result.
        /// </summary>
        /// <returns>Type of <see cref="IViewEngine"/>.</returns>
        private static IViewEngine GetViewEngine <TViewResultTestBuilder>(
            IBaseTestBuilderWithViewResult <TViewResultTestBuilder> baseTestBuilderWithViewResult)
            where TViewResultTestBuilder : IBaseTestBuilderWithActionResult
        {
            var actualBuilder = (BaseTestBuilderWithComponent)baseTestBuilderWithViewResult;

            IViewEngine viewEngine = null;

            RuntimeBinderValidator.ValidateBinding(() =>
            {
                viewEngine = actualBuilder.TestContext.MethodResult.AsDynamic()?.ViewEngine;
            });

            return(viewEngine);
        }
        /// <summary>
        /// Tests whether the <see cref="Microsoft.AspNetCore.Mvc.ViewResult"/>
        /// or the <see cref="Microsoft.AspNetCore.Mvc.PartialViewResult"/>
        /// has the same <see cref="IViewEngine"/> as the provided one.
        /// </summary>
        /// <param name="baseTestBuilderWithViewResult">
        /// Instance of <see cref="IBaseTestBuilderWithViewResult{TViewResultTestBuilder}"/> type.
        /// </param>
        /// <param name="viewEngine">Expected view engine of type <see cref="IViewEngine"/>.</param>
        /// <returns>The same <see cref="Microsoft.AspNetCore.Mvc.ActionResult"/> test builder.</returns>
        public static TViewResultTestBuilder WithViewEngine <TViewResultTestBuilder>(
            this IBaseTestBuilderWithViewResult <TViewResultTestBuilder> baseTestBuilderWithViewResult,
            IViewEngine viewEngine)
            where TViewResultTestBuilder : IBaseTestBuilderWithActionResult
        {
            var actualBuilder = GetActualBuilder(baseTestBuilderWithViewResult);

            var actualViewEngine = GetViewEngine(baseTestBuilderWithViewResult);

            if (viewEngine != actualViewEngine)
            {
                actualBuilder.ThrowNewFailedValidationException(
                    "engine",
                    "to be the same as the provided one",
                    "instead received different result");
            }

            return(actualBuilder.ResultTestBuilder);
        }
        /// <summary>
        /// Tests whether the <see cref="Microsoft.AspNetCore.Mvc.ViewResult"/> or
        /// the <see cref="Microsoft.AspNetCore.Mvc.PartialViewResult"/>
        /// has the same <see cref="IViewEngine"/> type as the provided one.
        /// </summary>
        /// <param name="baseTestBuilderWithViewResult">
        /// Instance of <see cref="IBaseTestBuilderWithViewResult{TViewResultTestBuilder}"/> type.
        /// </param>
        /// <param name="viewEngineType"></param>
        /// <returns>The same <see cref="Microsoft.AspNetCore.Mvc.ActionResult"/> test builder.</returns>
        public static TViewResultTestBuilder WithViewEngineOfType <TViewResultTestBuilder>(
            this IBaseTestBuilderWithViewResult <TViewResultTestBuilder> baseTestBuilderWithViewResult, Type viewEngineType)
            where TViewResultTestBuilder : IBaseTestBuilderWithActionResult
        {
            var actualBuilder = GetActualBuilder(baseTestBuilderWithViewResult);

            var actualViewEngine = GetViewEngine(baseTestBuilderWithViewResult);

            if (actualViewEngine == null ||
                Reflection.AreDifferentTypes(viewEngineType, actualViewEngine.GetType()))
            {
                actualBuilder.ThrowNewFailedValidationException(
                    "engine",
                    $"to be of {viewEngineType.Name} type",
                    $"instead received {actualViewEngine.GetName()}");
            }

            return(actualBuilder.ResultTestBuilder);
        }
 GetActualBuilder <TViewResultTestBuilder>(
     IBaseTestBuilderWithViewResult <TViewResultTestBuilder> baseTestBuilderWithViewResult)
     where TViewResultTestBuilder : IBaseTestBuilderWithActionResult
 => (IBaseTestBuilderWithViewFeatureResultInternal <TViewResultTestBuilder>)baseTestBuilderWithViewResult;
 /// <summary>
 /// Tests whether the <see cref="Microsoft.AspNetCore.Mvc.ViewResult"/>
 /// or the <see cref="Microsoft.AspNetCore.Mvc.PartialViewResult"/>
 /// has the default view name.
 /// </summary>
 /// <param name="baseTestBuilderWithViewResult">
 /// Instance of <see cref="IBaseTestBuilderWithViewResult{TViewResultTestBuilder}"/> type.
 /// </param>
 /// <returns>The same <see cref="Microsoft.AspNetCore.Mvc.ActionResult"/> test builder.</returns>
 public static TViewResultTestBuilder WithDefaultName <TViewResultTestBuilder>(
     this IBaseTestBuilderWithViewResult <TViewResultTestBuilder> baseTestBuilderWithViewResult)
     where TViewResultTestBuilder : IBaseTestBuilderWithActionResult
 => baseTestBuilderWithViewResult
 .WithName(null);
 /// <summary>
 /// Tests whether the <see cref="Microsoft.AspNetCore.Mvc.ViewResult"/> or
 /// the <see cref="Microsoft.AspNetCore.Mvc.PartialViewResult"/>
 /// has the same <see cref="IViewEngine"/> type as the provided one.
 /// </summary>
 /// <param name="baseTestBuilderWithViewResult">
 /// Instance of <see cref="IBaseTestBuilderWithViewResult{TViewResultTestBuilder}"/> type.
 /// </param>
 /// <returns>The same <see cref="Microsoft.AspNetCore.Mvc.ActionResult"/> test builder.</returns>
 public static TViewResultTestBuilder WithViewEngineOfType <TViewResultTestBuilder, TViewEngine>(
     this IBaseTestBuilderWithViewResult <TViewResultTestBuilder> baseTestBuilderWithViewResult)
     where TViewEngine : IViewEngine
     where TViewResultTestBuilder : IBaseTestBuilderWithActionResult
 => WithViewEngineOfType <TViewResultTestBuilder>(baseTestBuilderWithViewResult, typeof(TViewEngine));