/// <summary>
        /// Tests whether the <see cref="FileContentResult"/>
        /// has the same file contents as the provided byte array.
        /// </summary>
        /// <param name="fileTestBuilder">
        /// Instance of <see cref="IFileTestBuilder"/> type.
        /// </param>
        /// <param name="fileContents">File contents as byte array.</param>
        /// <returns>The same <see cref="IAndFileTestBuilder"/>.</returns>
        public static IAndFileTestBuilder WithContents(
            this IFileTestBuilder fileTestBuilder,
            byte[] fileContents)
        {
            var actualBuilder = GetFileTestBuilder <FileContentResult>(fileTestBuilder, FileContents);

            var fileContentResult = actualBuilder.ActionResult;

            if (!fileContents.SequenceEqual(fileContentResult.FileContents))
            {
                actualBuilder.ThrowNewFailedValidationException(
                    FileContents,
                    "to have values as the provided ones",
                    "instead received different result");
            }

            return(actualBuilder);
        }
        /// <summary>
        /// Tests whether the <see cref="VirtualFileResult"/>
        /// has the same file provider as the provided one.
        /// </summary>
        /// <param name="fileTestBuilder">
        /// Instance of <see cref="IFileTestBuilder"/> type.
        /// </param>
        /// <param name="fileProvider">File provider of type <see cref="IFileProvider"/>.</param>
        /// <returns>The same <see cref="IAndFileTestBuilder"/>.</returns>
        public static IAndFileTestBuilder WithFileProvider(
            this IFileTestBuilder fileTestBuilder,
            IFileProvider fileProvider)
        {
            var actualBuilder = GetFileTestBuilder <VirtualFileResult>(fileTestBuilder, FileProvider);

            var virtualFileResult = actualBuilder.ActionResult;

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

            return(actualBuilder);
        }
        /// <summary>
        /// Tests whether the <see cref="VirtualFileResult"/>
        /// has the same file name as the provided one.
        /// </summary>
        /// <param name="fileTestBuilder">
        /// Instance of <see cref="IFileTestBuilder"/> type.
        /// </param>
        /// <param name="fileName">File name as string.</param>
        /// <returns>The same <see cref="IAndFileTestBuilder"/>.</returns>
        public static IAndFileTestBuilder WithName(
            this IFileTestBuilder fileTestBuilder,
            string fileName)
        {
            var actualBuilder = GetFileTestBuilder <VirtualFileResult>(fileTestBuilder, FileName);

            var virtualFileResult = actualBuilder.ActionResult;
            var actualFileName    = virtualFileResult.FileName;

            if (fileName != virtualFileResult.FileName)
            {
                actualBuilder.ThrowNewFailedValidationException(
                    FileName,
                    $"to be '{fileName}'",
                    $"instead received '{actualFileName}'");
            }

            return(actualBuilder);
        }
        private static FileTestBuilder <TFileResult> GetFileTestBuilder <TFileResult>(
            IFileTestBuilder fileTestBuilder,
            string containment)
            where TFileResult : FileResult
        {
            var actualFileTestBuilder = fileTestBuilder as FileTestBuilder <TFileResult>;

            if (actualFileTestBuilder == null)
            {
                var fileTestBuilderBase = (BaseTestBuilderWithComponent)fileTestBuilder;

                throw new FileResultAssertionException(string.Format(
                                                           "{0} file result to contain {1}, but such could not be found.",
                                                           fileTestBuilderBase.TestContext.ExceptionMessagePrefix,
                                                           containment));
            }

            return(actualFileTestBuilder);
        }
        /// <summary>
        /// Tests whether the <see cref="VirtualFileResult"/>
        /// has the same file provider type as the provided one.
        /// </summary>
        /// <param name="fileTestBuilder">
        /// Instance of <see cref="IFileTestBuilder"/> type.
        /// </param>
        /// <param name="fileProviderType"></param>
        /// <returns>The same <see cref="IAndFileTestBuilder"/>.</returns>
        public static IAndFileTestBuilder WithFileProviderOfType(
            this IFileTestBuilder fileTestBuilder, Type fileProviderType)
        {
            var actualBuilder = GetFileTestBuilder <VirtualFileResult>(fileTestBuilder, FileProvider);

            var virtualFileResult  = actualBuilder.ActionResult;
            var actualFileProvider = virtualFileResult.FileProvider;

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

            return(actualBuilder);
        }
        /// <summary>
        /// Tests whether the <see cref="FileStreamResult"/>
        /// has the same file stream as the provided one.
        /// </summary>
        /// <param name="fileTestBuilder">
        /// Instance of <see cref="IFileTestBuilder"/> type.
        /// </param>
        /// <param name="stream">File stream.</param>
        /// <returns>The same <see cref="IAndFileTestBuilder"/>.</returns>
        public static IAndFileTestBuilder WithStream(
            this IFileTestBuilder fileTestBuilder,
            Stream stream)
        {
            var actualBuilder = GetFileTestBuilder <FileStreamResult>(fileTestBuilder, FileStream);

            var fileStreamResult = actualBuilder.ActionResult;
            var expectedContents = stream.ToByteArray();
            var actualContents   = fileStreamResult.FileStream.ToByteArray();

            if (!expectedContents.SequenceEqual(actualContents))
            {
                actualBuilder.ThrowNewFailedValidationException(
                    FileStream,
                    "to have value as the provided one",
                    "instead received different result");
            }

            return(actualBuilder);
        }
 /// <summary>
 /// Tests whether the <see cref="VirtualFileResult"/>
 /// has the same file provider type as the provided one.
 /// </summary>
 /// <param name="fileTestBuilder">
 /// Instance of <see cref="IFileTestBuilder"/> type.
 /// </param>
 /// <returns>The same <see cref="IAndFileTestBuilder"/>.</returns>
 public static IAndFileTestBuilder WithFileProviderOfType <TFileProvider>(
     this IFileTestBuilder fileTestBuilder)
     where TFileProvider : IFileProvider
 => WithFileProviderOfType(fileTestBuilder, typeof(TFileProvider));