Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

155 строки
6.8KB

  1. using EnvelopeRenderer.Desktop.Core.Design;
  2. namespace EnvelopeRenderer.Desktop.Tests;
  3. public class AlignmentCalculatorTests
  4. {
  5. // Three boxes at varying positions/sizes, reused across several tests:
  6. // A: (0,0)-(10,10) B: (50,20)-(70,30) C: (100,-10)-(110,0)
  7. private static readonly (double MinX, double MinY, double MaxX, double MaxY)[] ThreeBoxes =
  8. {
  9. (0, 0, 10, 10),
  10. (50, 20, 70, 30),
  11. (100, -10, 110, 0),
  12. };
  13. [Fact]
  14. public void ComputeAlignmentDeltas_Left_MovesEveryBoxToTheLeftmostMinX()
  15. {
  16. var deltas = AlignmentCalculator.ComputeAlignmentDeltas(ThreeBoxes, AlignmentCalculator.Edge.Left);
  17. Assert.Equal(0.0, deltas[0].Dx, precision: 6); // A is already leftmost (MinX=0)
  18. Assert.Equal(-50.0, deltas[1].Dx, precision: 6); // B's MinX=50 -> 0
  19. Assert.Equal(-100.0, deltas[2].Dx, precision: 6); // C's MinX=100 -> 0
  20. Assert.All(deltas, d => Assert.Equal(0.0, d.Dy, precision: 6));
  21. }
  22. [Fact]
  23. public void ComputeAlignmentDeltas_Right_MovesEveryBoxToTheRightmostMaxX()
  24. {
  25. var deltas = AlignmentCalculator.ComputeAlignmentDeltas(ThreeBoxes, AlignmentCalculator.Edge.Right);
  26. // Rightmost MaxX across all three is 110 (box C).
  27. Assert.Equal(100.0, deltas[0].Dx, precision: 6); // A's MaxX=10 -> 110
  28. Assert.Equal(40.0, deltas[1].Dx, precision: 6); // B's MaxX=70 -> 110
  29. Assert.Equal(0.0, deltas[2].Dx, precision: 6); // C already rightmost
  30. }
  31. [Fact]
  32. public void ComputeAlignmentDeltas_Top_MovesEveryBoxToTheTopmostMaxY()
  33. {
  34. var deltas = AlignmentCalculator.ComputeAlignmentDeltas(ThreeBoxes, AlignmentCalculator.Edge.Top);
  35. // Topmost MaxY across all three is 30 (box B).
  36. Assert.Equal(20.0, deltas[0].Dy, precision: 6); // A's MaxY=10 -> 30
  37. Assert.Equal(0.0, deltas[1].Dy, precision: 6); // B already topmost
  38. Assert.Equal(30.0, deltas[2].Dy, precision: 6); // C's MaxY=0 -> 30
  39. Assert.All(deltas, d => Assert.Equal(0.0, d.Dx, precision: 6));
  40. }
  41. [Fact]
  42. public void ComputeAlignmentDeltas_Bottom_MovesEveryBoxToTheBottommostMinY()
  43. {
  44. var deltas = AlignmentCalculator.ComputeAlignmentDeltas(ThreeBoxes, AlignmentCalculator.Edge.Bottom);
  45. // Bottommost MinY across all three is -10 (box C).
  46. Assert.Equal(-10.0, deltas[0].Dy, precision: 6); // A's MinY=0 -> -10
  47. Assert.Equal(-30.0, deltas[1].Dy, precision: 6); // B's MinY=20 -> -10
  48. Assert.Equal(0.0, deltas[2].Dy, precision: 6); // C already bottommost
  49. }
  50. [Fact]
  51. public void ComputeAlignmentDeltas_HorizontalCenter_MovesEveryBoxToTheOverallHorizontalCenter()
  52. {
  53. // Overall bounds: MinX=0 (A), MaxX=110 (C) -> horizontal center = 55.
  54. var deltas = AlignmentCalculator.ComputeAlignmentDeltas(ThreeBoxes, AlignmentCalculator.Edge.HorizontalCenter);
  55. Assert.Equal(50.0, deltas[0].Dx, precision: 6); // A's center=5 -> 55
  56. Assert.Equal(-5.0, deltas[1].Dx, precision: 6); // B's center=60 -> 55
  57. Assert.Equal(-50.0, deltas[2].Dx, precision: 6); // C's center=105 -> 55
  58. }
  59. [Fact]
  60. public void ComputeAlignmentDeltas_VerticalCenter_MovesEveryBoxToTheOverallVerticalCenter()
  61. {
  62. // Overall bounds: MinY=-10 (C), MaxY=30 (B) -> vertical center = 10.
  63. var deltas = AlignmentCalculator.ComputeAlignmentDeltas(ThreeBoxes, AlignmentCalculator.Edge.VerticalCenter);
  64. Assert.Equal(5.0, deltas[0].Dy, precision: 6); // A's center=5 -> 10
  65. Assert.Equal(-15.0, deltas[1].Dy, precision: 6); // B's center=25 -> 10
  66. Assert.Equal(15.0, deltas[2].Dy, precision: 6); // C's center=-5 -> 10
  67. }
  68. [Fact]
  69. public void ComputeAlignmentDeltas_EmptyList_ReturnsEmpty()
  70. {
  71. var deltas = AlignmentCalculator.ComputeAlignmentDeltas(Array.Empty<(double, double, double, double)>(), AlignmentCalculator.Edge.Left);
  72. Assert.Empty(deltas);
  73. }
  74. [Fact]
  75. public void ComputeDistributionDeltas_ThreeItems_KeepsExtremesFixedAndCentersTheMiddleOne()
  76. {
  77. // Centers along X: A=5, B=60, C=105. Ordered: A(5), B(60), C(105).
  78. // Evenly spaced target centers between the extremes (5 and 105): 5, 55, 105.
  79. var deltas = AlignmentCalculator.ComputeDistributionDeltas(ThreeBoxes, AlignmentCalculator.Axis.Horizontal);
  80. Assert.Equal(0.0, deltas[0].Dx, precision: 6); // A (leftmost extreme) stays fixed
  81. Assert.Equal(-5.0, deltas[1].Dx, precision: 6); // B's center 60 -> 55
  82. Assert.Equal(0.0, deltas[2].Dx, precision: 6); // C (rightmost extreme) stays fixed
  83. Assert.All(deltas, d => Assert.Equal(0.0, d.Dy, precision: 6));
  84. }
  85. [Fact]
  86. public void ComputeDistributionDeltas_Vertical_UsesYCentersInstead()
  87. {
  88. // Centers along Y: A=5, B=25, C=-5. Ordered by Y center: C(-5), A(5), B(25).
  89. // Evenly spaced target centers between the extremes (-5 and 25): -5, 10, 25.
  90. var deltas = AlignmentCalculator.ComputeDistributionDeltas(ThreeBoxes, AlignmentCalculator.Axis.Vertical);
  91. Assert.Equal(5.0, deltas[0].Dy, precision: 6); // A's center 5 -> 10 (middle rank)
  92. Assert.Equal(0.0, deltas[1].Dy, precision: 6); // B (topmost extreme) stays fixed
  93. Assert.Equal(0.0, deltas[2].Dy, precision: 6); // C (bottommost extreme) stays fixed
  94. }
  95. [Fact]
  96. public void ComputeDistributionDeltas_FewerThanThreeItems_ReturnsAllZeroDeltas()
  97. {
  98. var twoBoxes = new[] { ThreeBoxes[0], ThreeBoxes[2] };
  99. var deltas = AlignmentCalculator.ComputeDistributionDeltas(twoBoxes, AlignmentCalculator.Axis.Horizontal);
  100. Assert.All(deltas, d => Assert.Equal((0.0, 0.0), d));
  101. }
  102. [Fact]
  103. public void ComputeDistributionDeltas_EmptyList_ReturnsEmpty()
  104. {
  105. var deltas = AlignmentCalculator.ComputeDistributionDeltas(Array.Empty<(double, double, double, double)>(), AlignmentCalculator.Axis.Horizontal);
  106. Assert.Empty(deltas);
  107. }
  108. [Fact]
  109. public void ComputeDistributionDeltas_FourItems_SpacesTheTwoMiddleOnesEvenly()
  110. {
  111. var boxes = new (double MinX, double MinY, double MaxX, double MaxY)[]
  112. {
  113. (0, 0, 2, 2), // center X = 1
  114. (10, 0, 12, 2), // center X = 11 (out of order on purpose)
  115. (30, 0, 32, 2), // center X = 31 (rightmost extreme)
  116. (5, 0, 7, 2), // center X = 6
  117. };
  118. var deltas = AlignmentCalculator.ComputeDistributionDeltas(boxes, AlignmentCalculator.Axis.Horizontal);
  119. // Order by center: box0(1), box3(6), box1(11), box2(31). Step = (31-1)/3 = 10.
  120. // Target centers by rank: 1, 11, 21, 31.
  121. Assert.Equal(0.0, deltas[0].Dx, precision: 6); // box0 stays at center 1
  122. Assert.Equal(10.0, deltas[1].Dx, precision: 6); // box1's center 11 -> 21
  123. Assert.Equal(0.0, deltas[2].Dx, precision: 6); // box2 (rightmost extreme) stays fixed
  124. Assert.Equal(5.0, deltas[3].Dx, precision: 6); // box3's center 6 -> 11
  125. }
  126. }

Powered by TurnKey Linux.