public void GetSupportedImages_AnyBaseItem_ReturnsExpected(Type type, params ImageType[] expected)
        {
            BaseItem item = (BaseItem)Activator.CreateInstance(type) !;
            var      embeddedImageProvider = new EmbeddedImageProvider(Mock.Of <IMediaSourceManager>(), Mock.Of <IMediaEncoder>(), new NullLogger <EmbeddedImageProvider>());
            var      actual = embeddedImageProvider.GetSupportedImages(item);

            Assert.Equal(expected.OrderBy(i => i.ToString()), actual.OrderBy(i => i.ToString()));
        }
        public async void GetImage_NoStreams_ReturnsNoImage()
        {
            var input = new Movie();

            var mediaSourceManager    = GetMediaSourceManager(input, new List <MediaAttachment>(), new List <MediaStream>());
            var embeddedImageProvider = new EmbeddedImageProvider(mediaSourceManager, null, new NullLogger <EmbeddedImageProvider>());

            var actual = await embeddedImageProvider.GetImage(input, ImageType.Primary, CancellationToken.None);

            Assert.NotNull(actual);
            Assert.False(actual.HasImage);
        }
        public async void GetImage_Embedded_ReturnsCorrectSelection(string label, string?codec, int targetIndex, ImageType type, ImageFormat?expectedFormat)
        {
            var streams = new List <MediaStream>();

            for (int i = 1; i <= targetIndex; i++)
            {
                var comment = i == targetIndex ? label : "unmatched";
                streams.Add(new ()
                {
                    Type    = MediaStreamType.EmbeddedImage,
                    Index   = i,
                    Comment = comment,
                    Codec   = codec
                });
            }

            var input = new Movie();

            var pathPrefix   = "path";
            var mediaEncoder = new Mock <IMediaEncoder>(MockBehavior.Strict);

            mediaEncoder.Setup(encoder => encoder.ExtractVideoImage(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <MediaSourceInfo>(), It.IsAny <MediaStream>(), It.IsAny <int>(), It.IsAny <ImageFormat>(), It.IsAny <CancellationToken>()))
            .Returns <string, string, MediaSourceInfo, MediaStream, int, ImageFormat, CancellationToken>((_, _, _, stream, index, ext, _) =>
            {
                Assert.Equal(streams[index - 1], stream);
                return(Task.FromResult(pathPrefix + index + "." + ext));
            });
            var mediaSourceManager    = GetMediaSourceManager(input, new List <MediaAttachment>(), streams);
            var embeddedImageProvider = new EmbeddedImageProvider(mediaSourceManager, mediaEncoder.Object, new NullLogger <EmbeddedImageProvider>());

            var actual = await embeddedImageProvider.GetImage(input, type, CancellationToken.None);

            Assert.NotNull(actual);
            if (expectedFormat == null)
            {
                Assert.False(actual.HasImage);
            }
            else
            {
                Assert.True(actual.HasImage);
                Assert.Equal(pathPrefix + targetIndex + "." + expectedFormat, actual.Path, StringComparer.OrdinalIgnoreCase);
                Assert.Equal(expectedFormat, actual.Format);
            }
        }
        [InlineData("poster", null, 3, ImageType.Primary, ImageFormat.Jpg)]           // default extension to jpg
        public async void GetImage_Attachment_ReturnsCorrectSelection(string filename, string mimetype, int targetIndex, ImageType type, ImageFormat?expectedFormat)
        {
            var    attachments = new List <MediaAttachment>();
            string pathPrefix  = "path";

            for (int i = 1; i <= targetIndex; i++)
            {
                var name = i == targetIndex ? filename : "unmatched";
                attachments.Add(new ()
                {
                    FileName = name,
                    MimeType = mimetype,
                    Index    = i
                });
            }

            var input = new Movie();

            var mediaEncoder = new Mock <IMediaEncoder>(MockBehavior.Strict);

            mediaEncoder.Setup(encoder => encoder.ExtractVideoImage(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <MediaSourceInfo>(), It.IsAny <MediaStream>(), It.IsAny <int>(), It.IsAny <ImageFormat>(), It.IsAny <CancellationToken>()))
            .Returns <string, string, MediaSourceInfo, MediaStream, int, ImageFormat, CancellationToken>((_, _, _, _, index, ext, _) => Task.FromResult(pathPrefix + index + "." + ext));
            var mediaSourceManager    = GetMediaSourceManager(input, attachments, new List <MediaStream>());
            var embeddedImageProvider = new EmbeddedImageProvider(mediaSourceManager, mediaEncoder.Object, new NullLogger <EmbeddedImageProvider>());

            var actual = await embeddedImageProvider.GetImage(input, type, CancellationToken.None);

            Assert.NotNull(actual);
            if (expectedFormat == null)
            {
                Assert.False(actual.HasImage);
            }
            else
            {
                Assert.True(actual.HasImage);
                Assert.Equal(pathPrefix + targetIndex + "." + expectedFormat, actual.Path, StringComparer.OrdinalIgnoreCase);
                Assert.Equal(expectedFormat, actual.Format);
            }
        }