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); } }