Files
AmiReel/AmiReel.Tests/Models/SourceCropSelectionTests.cs
T
klevze e635b708a2 Improve crop editor and copy publish output to dist
Add resize handles, zoom, view brightness, and a multi-frame still
strip. Keep the crop box on mouse-up, and copy AmiReel.exe to dist.
2026-08-15 22:59:20 +02:00

216 lines
5.8 KiB
C#

using AmiReel.Models;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace AmiReel.Tests.Models;
[TestClass]
public class SourceCropSelectionTests
{
[TestMethod]
public void FitUniform_WiderContainer_LetterboxesHorizontally()
{
// Act
(double offsetX, double offsetY, double width, double height) =
SourceCropSelection.FitUniform(400, 200, 100, 100);
// Assert
Assert.AreEqual(100, offsetX);
Assert.AreEqual(0, offsetY);
Assert.AreEqual(200, width);
Assert.AreEqual(200, height);
}
[TestMethod]
public void FitUniform_TallerContainer_LetterboxesVertically()
{
// Act
(double offsetX, double offsetY, double width, double height) =
SourceCropSelection.FitUniform(200, 400, 100, 100);
// Assert
Assert.AreEqual(0, offsetX);
Assert.AreEqual(100, offsetY);
Assert.AreEqual(200, width);
Assert.AreEqual(200, height);
}
[TestMethod]
public void ToInsets_FullFrameSelection_ReturnsEmptyInsets()
{
// Act
PixelInsets insets = SourceCropSelection.ToInsets(640, 512, 640, 512, 0, 0, 640, 512);
// Assert
Assert.IsTrue(insets.IsEmpty);
}
[TestMethod]
public void ToInsets_CenteredSelection_ComputesAllFourEdges()
{
// Act
PixelInsets insets = SourceCropSelection.ToInsets(100, 100, 100, 100, 10, 20, 70, 50);
// Assert
Assert.AreEqual(10, insets.Left);
Assert.AreEqual(20, insets.Right);
Assert.AreEqual(20, insets.Top);
Assert.AreEqual(30, insets.Bottom);
}
[TestMethod]
public void ToInsets_KeepsTheDraggedWidthAndHeight()
{
// Act
PixelInsets insets = SourceCropSelection.ToInsets(3840, 2160, 768, 432, 100, 50, 200, 120);
// Assert
Assert.AreEqual(500, insets.Left);
Assert.AreEqual(250, insets.Top);
Assert.AreEqual(1000, 3840 - insets.Left - insets.Right);
Assert.AreEqual(600, 2160 - insets.Top - insets.Bottom);
}
[TestMethod]
public void ToInsets_DraggedUpAndLeft_NormalizesTheRectangle()
{
// Act
PixelInsets insets = SourceCropSelection.ToInsets(100, 100, 100, 100, 80, 70, -70, -50);
// Assert
Assert.AreEqual(10, insets.Left);
Assert.AreEqual(20, insets.Right);
Assert.AreEqual(20, insets.Top);
Assert.AreEqual(30, insets.Bottom);
}
[TestMethod]
public void ToDisplayRect_RoundTripsKnownInsets()
{
// Arrange
PixelInsets insets = new(20, 20, 10, 10);
// Act
(double x, double y, double width, double height) =
SourceCropSelection.ToDisplayRect(100, 100, 200, 200, insets);
// Assert
Assert.AreEqual(40, x);
Assert.AreEqual(20, y);
Assert.AreEqual(120, width);
Assert.AreEqual(160, height);
}
[TestMethod]
public void ClampToDisplay_OutsideBounds_ClampsToEdges()
{
// Act
(double x, double y) = SourceCropSelection.ClampToDisplay(-8, 90, 80, 60);
// Assert
Assert.AreEqual(0, x);
Assert.AreEqual(60, y);
}
[TestMethod]
public void HitTest_OnNorthWestHandle_ReturnsNorthWest()
{
// Act
CropHit hit = SourceCropSelection.HitTest(20, 30, 80, 40, 20, 30, 12);
// Assert
Assert.AreEqual(CropHit.NorthWest, hit);
}
[TestMethod]
public void HitTest_InsideRectangle_ReturnsMove()
{
// Act
CropHit hit = SourceCropSelection.HitTest(20, 30, 80, 40, 50, 50, 12);
// Assert
Assert.AreEqual(CropHit.Move, hit);
}
[TestMethod]
public void HitTest_OutsideRectangle_ReturnsNone()
{
// Act
CropHit hit = SourceCropSelection.HitTest(20, 30, 80, 40, 2, 2, 12);
// Assert
Assert.AreEqual(CropHit.None, hit);
}
[TestMethod]
public void AdjustRect_Move_KeepsSizeAndClamps()
{
// Act
(double x, double y, double width, double height) =
SourceCropSelection.AdjustRect(10, 10, 40, 20, CropHit.Move, 100, -4, 80, 60);
// Assert
Assert.AreEqual(40, x);
Assert.AreEqual(6, y);
Assert.AreEqual(40, width);
Assert.AreEqual(20, height);
}
[TestMethod]
public void AdjustRect_EastHandle_ChangesWidthOnly()
{
// Act
(double x, double y, double width, double height) =
SourceCropSelection.AdjustRect(10, 10, 40, 20, CropHit.East, 8, 5, 80, 60);
// Assert
Assert.AreEqual(10, x);
Assert.AreEqual(10, y);
Assert.AreEqual(48, width);
Assert.AreEqual(20, height);
}
[TestMethod]
public void AdjustRect_WestHandle_MovesLeftEdge()
{
// Act
(double x, _, double width, _) =
SourceCropSelection.AdjustRect(20, 10, 40, 20, CropHit.West, 6, 0, 80, 60);
// Assert
Assert.AreEqual(26, x);
Assert.AreEqual(34, width);
}
[TestMethod]
public void Nudge_MovesBoxWithoutChangingSize()
{
// Arrange
PixelInsets start = new(10, 20, 8, 12);
// Act
PixelInsets moved = SourceCropSelection.Nudge(start, 100, 80, 4, 0);
// Assert
Assert.AreEqual(14, moved.Left);
Assert.AreEqual(16, moved.Right);
Assert.AreEqual(8, moved.Top);
Assert.AreEqual(12, moved.Bottom);
}
[TestMethod]
public void NudgeEdge_GrowsRightSide()
{
// Arrange
PixelInsets start = new(10, 20, 8, 12);
// Act
PixelInsets grown = SourceCropSelection.NudgeEdge(start, 100, 80, 0, 0, -4, 0);
// Assert
Assert.AreEqual(10, grown.Left);
Assert.AreEqual(16, grown.Right);
Assert.AreEqual(8, grown.Top);
Assert.AreEqual(12, grown.Bottom);
}
}