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.
216 lines
5.8 KiB
C#
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);
|
|
}
|
|
}
|