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

177 строки
5.3KB

  1. using EnvelopeRenderer.Desktop.Core.Design;
  2. namespace EnvelopeRenderer.Desktop.Tests;
  3. public class CanvasElementEditorTests
  4. {
  5. // Fixed 20x10-point bounding box for every element, regardless of content — keeps hit-test
  6. // math deterministic without depending on real GDI text measurement.
  7. private static (double Width, double Height) FixedSize(TextElementLayout _) => (20.0, 10.0);
  8. private static CanvasElementEditor CreateEditor(out TemplateLayoutDocument document)
  9. {
  10. document = TemplateLayoutDocument.CreateDefault();
  11. return new CanvasElementEditor(document, FixedSize);
  12. }
  13. [Fact]
  14. public void AddStaticText_AddsToDocumentAndSelectsIt()
  15. {
  16. var editor = CreateEditor(out var document);
  17. var element = editor.AddStaticText(10, 20, "Hello");
  18. Assert.Single(document.Elements);
  19. Assert.Same(element, document.Elements[0]);
  20. Assert.Same(element, editor.Selected);
  21. Assert.Equal("Hello", element.StaticText);
  22. Assert.False(element.IsDynamic);
  23. }
  24. [Fact]
  25. public void AddDynamicPlaceholder_AddsToDocumentAndSelectsIt()
  26. {
  27. var editor = CreateEditor(out var document);
  28. var element = editor.AddDynamicPlaceholder(10, 20, "Full Name");
  29. Assert.Single(document.Elements);
  30. Assert.True(element.IsDynamic);
  31. Assert.Equal("Full Name", element.ColumnName);
  32. Assert.Same(element, editor.Selected);
  33. }
  34. [Fact]
  35. public void AddMultipleElements_AssignsIncreasingZOrder()
  36. {
  37. var editor = CreateEditor(out _);
  38. var first = editor.AddStaticText(0, 0, "A");
  39. var second = editor.AddDynamicPlaceholder(0, 0, "B");
  40. var third = editor.AddStaticText(0, 0, "C");
  41. Assert.Equal(0, first.ZOrder);
  42. Assert.Equal(1, second.ZOrder);
  43. Assert.Equal(2, third.ZOrder);
  44. }
  45. [Fact]
  46. public void HitTest_PointInsideElementBounds_ReturnsElement()
  47. {
  48. var editor = CreateEditor(out _);
  49. var element = editor.AddStaticText(100, 100, "Hello");
  50. var hit = editor.HitTest(105, 105); // inside [100,120] x [100,110]
  51. Assert.Same(element, hit);
  52. }
  53. [Fact]
  54. public void HitTest_PointOutsideElementBounds_ReturnsNull()
  55. {
  56. var editor = CreateEditor(out _);
  57. editor.AddStaticText(100, 100, "Hello");
  58. var hit = editor.HitTest(0, 0);
  59. Assert.Null(hit);
  60. }
  61. [Fact]
  62. public void HitTest_OverlappingElements_ReturnsTopmostZOrder()
  63. {
  64. var editor = CreateEditor(out _);
  65. var bottom = editor.AddStaticText(100, 100, "Bottom");
  66. var top = editor.AddStaticText(100, 100, "Top"); // same bounds, added later -> higher z-order
  67. var hit = editor.HitTest(105, 105);
  68. Assert.Same(top, hit);
  69. Assert.NotSame(bottom, hit);
  70. }
  71. [Fact]
  72. public void TrySelectAt_Hit_SelectsAndReturnsTrue()
  73. {
  74. var editor = CreateEditor(out _);
  75. var element = editor.AddStaticText(100, 100, "Hello");
  76. editor.Select(null);
  77. var result = editor.TrySelectAt(105, 105);
  78. Assert.True(result);
  79. Assert.Same(element, editor.Selected);
  80. }
  81. [Fact]
  82. public void TrySelectAt_Miss_ClearsSelectionAndReturnsFalse()
  83. {
  84. var editor = CreateEditor(out _);
  85. editor.AddStaticText(100, 100, "Hello");
  86. var result = editor.TrySelectAt(0, 0);
  87. Assert.False(result);
  88. Assert.Null(editor.Selected);
  89. }
  90. [Fact]
  91. public void DragTo_MovesSelectedElementPreservingGrabOffset()
  92. {
  93. var editor = CreateEditor(out _);
  94. var element = editor.AddStaticText(100, 100, "Hello");
  95. editor.TrySelectAt(105, 105); // grab 5pt into the element from its origin
  96. editor.BeginDrag(105, 105);
  97. editor.DragTo(205, 155); // moved 100 right, 50 up
  98. Assert.Equal(200.0, element.X, precision: 6);
  99. Assert.Equal(150.0, element.Y, precision: 6);
  100. Assert.True(editor.IsDragging);
  101. }
  102. [Fact]
  103. public void EndDrag_StopsFurtherMovementFromDragTo()
  104. {
  105. var editor = CreateEditor(out _);
  106. var element = editor.AddStaticText(100, 100, "Hello");
  107. editor.TrySelectAt(105, 105);
  108. editor.BeginDrag(105, 105);
  109. editor.EndDrag();
  110. editor.DragTo(500, 500);
  111. Assert.Equal(100.0, element.X, precision: 6);
  112. Assert.Equal(100.0, element.Y, precision: 6);
  113. Assert.False(editor.IsDragging);
  114. }
  115. [Fact]
  116. public void DragTo_WithoutSelection_IsNoOp()
  117. {
  118. var editor = CreateEditor(out _);
  119. editor.DragTo(50, 50); // nothing selected, nothing dragging — should not throw
  120. Assert.Null(editor.Selected);
  121. }
  122. [Fact]
  123. public void Move_UpdatesTemplateLayoutDocumentInPlace_SoCanvasAndStoredStateAgree()
  124. {
  125. var editor = CreateEditor(out var document);
  126. var element = editor.AddStaticText(0, 0, "Hello");
  127. editor.TrySelectAt(10, 5);
  128. editor.BeginDrag(10, 5);
  129. editor.DragTo(60, 45);
  130. // The document's element list holds the same instance that was moved — no separate
  131. // "committed" copy step, so the canvas (reading from `document.Elements`) and this
  132. // editor's own state can never disagree.
  133. Assert.Same(element, document.Elements[0]);
  134. Assert.Equal(50.0, document.Elements[0].X, precision: 6);
  135. Assert.Equal(40.0, document.Elements[0].Y, precision: 6);
  136. }
  137. }

Powered by TurnKey Linux.