Add video preview, source crop, find-videos, and render toasts
Bring the Video tab closer to Shorts with 4K preview stills and crop modes (none, auto, center, plus the visual editor). Settings store a default source folder so Find videos can collect output.avi sequences. Cap the FFmpeg log with auto-scroll, hide repeat spam, and show a Windows notification when a video or short finishes or fails.
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
using AmiReel.Services;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
|
||||
namespace AmiReel.Tests.Services;
|
||||
|
||||
[TestClass]
|
||||
public class SourceRecordingFinderTests
|
||||
{
|
||||
private readonly List<string> _tempDirectories = [];
|
||||
|
||||
[TestCleanup]
|
||||
public void Cleanup()
|
||||
{
|
||||
foreach (string directory in _tempDirectories)
|
||||
{
|
||||
try { Directory.Delete(directory, true); } catch { }
|
||||
}
|
||||
}
|
||||
|
||||
private string CreateTempDirectory()
|
||||
{
|
||||
string directory = Path.Combine(Path.GetTempPath(), "AmiReelTests", Guid.NewGuid().ToString("N"));
|
||||
Directory.CreateDirectory(directory);
|
||||
_tempDirectories.Add(directory);
|
||||
return directory;
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void FindSequentialOutputs_WithMissingFolder_ReturnsEmpty()
|
||||
{
|
||||
// Act
|
||||
IReadOnlyList<string> result = SourceRecordingFinder.FindSequentialOutputs(
|
||||
Path.Combine(Path.GetTempPath(), "AmiReelTests", "missing-" + Guid.NewGuid().ToString("N")));
|
||||
|
||||
// Assert
|
||||
Assert.AreEqual(0, result.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void FindSequentialOutputs_WithBlankFolder_ReturnsEmpty()
|
||||
{
|
||||
// Act
|
||||
IReadOnlyList<string> result = SourceRecordingFinder.FindSequentialOutputs(" ");
|
||||
|
||||
// Assert
|
||||
Assert.AreEqual(0, result.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void FindSequentialOutputs_WithOnlyOutputAvi_ReturnsSingleFile()
|
||||
{
|
||||
// Arrange
|
||||
string directory = CreateTempDirectory();
|
||||
string first = Path.Combine(directory, "output.avi");
|
||||
File.WriteAllText(first, "one");
|
||||
|
||||
// Act
|
||||
IReadOnlyList<string> result = SourceRecordingFinder.FindSequentialOutputs(directory);
|
||||
|
||||
// Assert
|
||||
Assert.AreEqual(1, result.Count);
|
||||
Assert.AreEqual(first, result[0]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void FindSequentialOutputs_WithNumberedSequence_ReturnsFilesUntilFirstGap()
|
||||
{
|
||||
// Arrange
|
||||
string directory = CreateTempDirectory();
|
||||
File.WriteAllText(Path.Combine(directory, "output.avi"), "0");
|
||||
File.WriteAllText(Path.Combine(directory, "output_1.avi"), "1");
|
||||
File.WriteAllText(Path.Combine(directory, "output_2.avi"), "2");
|
||||
File.WriteAllText(Path.Combine(directory, "output_4.avi"), "skipped");
|
||||
File.WriteAllText(Path.Combine(directory, "output.mp4"), "wrong-ext");
|
||||
|
||||
// Act
|
||||
IReadOnlyList<string> result = SourceRecordingFinder.FindSequentialOutputs(directory);
|
||||
|
||||
// Assert
|
||||
Assert.AreEqual(3, result.Count);
|
||||
Assert.AreEqual("output.avi", Path.GetFileName(result[0]));
|
||||
Assert.AreEqual("output_1.avi", Path.GetFileName(result[1]));
|
||||
Assert.AreEqual("output_2.avi", Path.GetFileName(result[2]));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void FindSequentialOutputs_WithoutBaseOutputAvi_ReturnsEmptyEvenIfNumberedExists()
|
||||
{
|
||||
// Arrange
|
||||
string directory = CreateTempDirectory();
|
||||
File.WriteAllText(Path.Combine(directory, "output_1.avi"), "1");
|
||||
|
||||
// Act
|
||||
IReadOnlyList<string> result = SourceRecordingFinder.FindSequentialOutputs(directory);
|
||||
|
||||
// Assert
|
||||
Assert.AreEqual(0, result.Count);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user