Commit ac854593 authored by shrabbit's avatar shrabbit
Browse files

新增单元测试,修复了过滤器错误问题。

parent 90681687
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
using System.ComponentModel;
using System.ComponentModel;
using shRabbit.Base.IO.Directories;
using shRabbit.Base.IO.Files;
using Spectre.Console;
@@ -65,7 +65,7 @@ public class MainCommand : AsyncCommand<MainCommand.Settings>
                "-i", 
                f, 
                "-vf", 
                $"\"fps:1/{time.TotalSeconds}\"",
                $"\"fps=1/{time.TotalSeconds}\"",
                Path.Join(Path.Combine(settings.Directory, settings.Disc), $"{Path.GetFileName(f)}_%03d.{settings.Format}")
            ];
        }
@@ -83,8 +83,6 @@ public class MainCommand : AsyncCommand<MainCommand.Settings>
            {
                if (Path.GetExtension(f).TrimStart('.') == sp.TrimStart('.'))
                {
                    if (!settings.NoExecute)
                        AnsiConsole.WriteLine($"找到: {f}");
                    yield return f;
                }
            }
+152 −0
Original line number Diff line number Diff line
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using JetBrains.Annotations;
using shRabbit.Base.IO.Directories;
using shRabbit.Base.IO.Files;
using VideoSlice.Cli;
using Xunit;
using Assert = Xunit.Assert;

namespace VideoSlice.Tests;

[TestSubject(typeof(MainCommand))]
public class MainCommandTest
{
    [Fact]
    public void Should_GetFiles_Filter_By_Formats()
    {
        var settings = CreateSettings(s => s.VideoFormats = "mp4,mov");
        var dir = new TestDirectoryBridge(
            Path.Combine("videos", "a.mp4"),
            Path.Combine("videos", "b.mov"),
            Path.Combine("videos", "c.avi"),
            Path.Combine("videos", "d.MP4"));

        var result = MainCommand.GetFiles(settings, dir).ToArray();

        Assert.Equal(
        [
            Path.Combine("videos", "a.mp4"),
            Path.Combine("videos", "b.mov")
        ], result);
    }

    [Fact]
    public void Should_GetFiles_Support_Dotted_Formats()
    {
        var settings = CreateSettings(s => s.VideoFormats = ".mp4,.mov");
        var dir = new TestDirectoryBridge(
            Path.Combine("videos", "a.mp4"),
            Path.Combine("videos", "b.mov"));

        var result = MainCommand.GetFiles(settings, dir).ToArray();

        Assert.Equal(
        [
            Path.Combine("videos", "a.mp4"),
            Path.Combine("videos", "b.mov")
        ], result);
    }

    [Fact]
    public void Should_GetFiles_Empty_When_No_Match()
    {
        var settings = CreateSettings();
        var dir = new TestDirectoryBridge(Path.Combine("videos", "a.avi"));

        Assert.Empty(MainCommand.GetFiles(settings, dir));
    }

    [Fact]
    public void Should_GetFiles_Empty_When_File_Option_Set()
    {
        var settings = CreateSettings(s => s.File = Path.Combine("videos", "a.mp4"));
        var dir = new TestDirectoryBridge(Path.Combine("videos", "a.mp4"));

        Assert.Empty(MainCommand.GetFiles(settings, dir));
    }

    [Fact]
    public void Should_Generate_Command_Per_File()
    {
        var settings = CreateSettings();
        var dir = new TestDirectoryBridge(
            Path.Combine("videos", "a.mp4"),
            Path.Combine("videos", "b.mp4"));

        var commands = MainCommand.GenerateFfMpegCommand(settings, FileBridge.Default, dir).ToArray();

        Assert.Collection(commands,
            c => Assert.Equal(
            [
                "-i",
                Path.Combine("videos", "a.mp4"),
                "-vf",
                "\"fps=1/1800\"",
                Path.Join(Path.Combine("videos", "output"), "a.mp4_%03d.png")
            ], c),
            c => Assert.Equal(
            [
                "-i",
                Path.Combine("videos", "b.mp4"),
                "-vf",
                "\"fps=1/1800\"",
                Path.Join(Path.Combine("videos", "output"), "b.mp4_%03d.png")
            ], c));
    }

    [Fact]
    public void Should_Generate_Command_With_Custom_Slice_Disc_And_Format()
    {
        var settings = CreateSettings(s =>
        {
            s.SliceTime = "1m";
            s.Disc = "frames";
            s.Format = "jpg";
        });
        var dir = new TestDirectoryBridge(Path.Combine("videos", "a.mp4"));

        var command = Assert.Single(MainCommand.GenerateFfMpegCommand(settings, FileBridge.Default, dir));

        Assert.Equal(
        [
            "-i",
            Path.Combine("videos", "a.mp4"),
            "-vf",
            "\"fps=1/60\"",
            Path.Join(Path.Combine("videos", "frames"), "a.mp4_%03d.jpg")
        ], command);
    }

    [Fact]
    public void Should_Generate_Empty_When_No_Files()
    {
        var settings = CreateSettings(s => s.File = Path.Combine("videos", "a.mp4"));
        var dir = new TestDirectoryBridge(Path.Combine("videos", "a.mp4"));

        Assert.Empty(MainCommand.GenerateFfMpegCommand(settings, FileBridge.Default, dir));
    }

    private static MainCommand.Settings CreateSettings(Action<MainCommand.Settings> configure = null)
    {
        var settings = new MainCommand.Settings
        {
            NoExecute = true,
            Directory = "videos",
            Disc = "output",
            Format = "png",
            VideoFormats = "mp4",
            SliceTime = "30m"
        };

        configure?.Invoke(settings);
        return settings;
    }

    private sealed class TestDirectoryBridge(params string[] files) : DirectoryBridge
    {
        public override IEnumerable<string> EnumerateFiles(string path) => files;
    }
}