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

322 строки
9.5KB

  1. using EnvelopeRenderer.Desktop.Core.Design;
  2. namespace EnvelopeRenderer.Desktop.Tests;
  3. public class TextElementPropertiesEditorTests
  4. {
  5. [Fact]
  6. public void SetX_UpdatesSelectedElement()
  7. {
  8. var editor = new TextElementPropertiesEditor();
  9. var element = TextElementLayout.CreateStatic(0, 0, "a");
  10. editor.Select(element);
  11. editor.SetX(42.5);
  12. Assert.Equal(42.5, element.X, precision: 6);
  13. }
  14. [Fact]
  15. public void SetY_UpdatesSelectedElement()
  16. {
  17. var editor = new TextElementPropertiesEditor();
  18. var element = TextElementLayout.CreateStatic(0, 0, "a");
  19. editor.Select(element);
  20. editor.SetY(99.25);
  21. Assert.Equal(99.25, element.Y, precision: 6);
  22. }
  23. [Fact]
  24. public void SetFontFamily_UpdatesSelectedElement()
  25. {
  26. var editor = new TextElementPropertiesEditor();
  27. var element = TextElementLayout.CreateStatic(0, 0, "a", fontFamily: "Arial");
  28. editor.Select(element);
  29. editor.SetFontFamily("Times New Roman [Bold]");
  30. Assert.Equal("Times New Roman [Bold]", element.FontFamily);
  31. }
  32. [Theory]
  33. [InlineData(null)]
  34. [InlineData("")]
  35. [InlineData(" ")]
  36. public void SetFontFamily_BlankInput_IsIgnored(string? blank)
  37. {
  38. var editor = new TextElementPropertiesEditor();
  39. var element = TextElementLayout.CreateStatic(0, 0, "a", fontFamily: "Arial");
  40. editor.Select(element);
  41. editor.SetFontFamily(blank);
  42. Assert.Equal("Arial", element.FontFamily);
  43. }
  44. [Fact]
  45. public void SetFontSize_PositiveValue_UpdatesSelectedElement()
  46. {
  47. var editor = new TextElementPropertiesEditor();
  48. var element = TextElementLayout.CreateStatic(0, 0, "a", fontSize: 12);
  49. editor.Select(element);
  50. editor.SetFontSize(24);
  51. Assert.Equal(24, element.FontSize, precision: 6);
  52. }
  53. [Theory]
  54. [InlineData(0)]
  55. [InlineData(-5)]
  56. public void SetFontSize_NonPositiveValue_IsIgnored(double invalid)
  57. {
  58. var editor = new TextElementPropertiesEditor();
  59. var element = TextElementLayout.CreateStatic(0, 0, "a", fontSize: 12);
  60. editor.Select(element);
  61. editor.SetFontSize(invalid);
  62. Assert.Equal(12, element.FontSize, precision: 6);
  63. }
  64. [Fact]
  65. public void SetColor_UpdatesSelectedElement()
  66. {
  67. var editor = new TextElementPropertiesEditor();
  68. var element = TextElementLayout.CreateStatic(0, 0, "a");
  69. editor.Select(element);
  70. editor.SetColor(new RgbColor(10, 20, 30));
  71. Assert.Equal(new RgbColor(10, 20, 30), element.Color);
  72. }
  73. [Fact]
  74. public void SetColumnName_DynamicElement_RebindsColumnWithoutMovingIt()
  75. {
  76. var editor = new TextElementPropertiesEditor();
  77. var element = TextElementLayout.CreateDynamic(15, 25, "Full Name");
  78. editor.Select(element);
  79. editor.SetColumnName("Mailing Address");
  80. Assert.Equal("Mailing Address", element.ColumnName);
  81. // Sprint 3, Batch 4 acceptance criterion: rebinding must not require recreating or
  82. // repositioning the layout element.
  83. Assert.Equal(15, element.X, precision: 6);
  84. Assert.Equal(25, element.Y, precision: 6);
  85. }
  86. [Fact]
  87. public void SetColumnName_StaticElement_IsIgnored()
  88. {
  89. var editor = new TextElementPropertiesEditor();
  90. var element = TextElementLayout.CreateStatic(0, 0, "Static label");
  91. editor.Select(element);
  92. editor.SetColumnName("Full Name");
  93. Assert.False(element.IsDynamic);
  94. Assert.Null(element.ColumnName);
  95. Assert.Equal("Static label", element.StaticText);
  96. }
  97. [Theory]
  98. [InlineData(null)]
  99. [InlineData("")]
  100. [InlineData(" ")]
  101. public void SetColumnName_BlankInput_IsIgnored(string? blank)
  102. {
  103. var editor = new TextElementPropertiesEditor();
  104. var element = TextElementLayout.CreateDynamic(0, 0, "Full Name");
  105. editor.Select(element);
  106. editor.SetColumnName(blank);
  107. Assert.Equal("Full Name", element.ColumnName);
  108. }
  109. [Fact]
  110. public void SetColumnName_ArbitraryColumnName_RebindsExactly()
  111. {
  112. var editor = new TextElementPropertiesEditor();
  113. var element = TextElementLayout.CreateDynamic(0, 0, "Full Name");
  114. editor.Select(element);
  115. editor.SetColumnName("Bill To & Ship To's Address");
  116. Assert.Equal("Bill To & Ship To's Address", element.ColumnName);
  117. }
  118. [Fact]
  119. public void SetZOrder_NonNegativeValue_StoresAsGiven()
  120. {
  121. var editor = new TextElementPropertiesEditor();
  122. var element = TextElementLayout.CreateStatic(0, 0, "a");
  123. editor.Select(element);
  124. editor.SetZOrder(7);
  125. Assert.Equal(7, element.ZOrder);
  126. }
  127. [Fact]
  128. public void SetZOrder_NegativeValue_ClampsToZeroBottomMost()
  129. {
  130. var editor = new TextElementPropertiesEditor();
  131. var element = TextElementLayout.CreateStatic(0, 0, "a");
  132. editor.Select(element);
  133. editor.SetZOrder(-3);
  134. Assert.Equal(0, element.ZOrder);
  135. }
  136. [Fact]
  137. public void AllSetters_NoSelection_AreNoOpsAndDoNotThrow()
  138. {
  139. var editor = new TextElementPropertiesEditor();
  140. editor.SetX(1);
  141. editor.SetY(1);
  142. editor.SetFontFamily("Arial");
  143. editor.SetFontSize(10);
  144. editor.SetColor(RgbColor.Black);
  145. editor.SetZOrder(1);
  146. editor.SetColumnName("Full Name");
  147. editor.SetCollapseIfBlank(true);
  148. editor.SetRotationAngle(45);
  149. Assert.Null(editor.Selected);
  150. }
  151. [Fact]
  152. public void SetCollapseIfBlank_UpdatesSelectedElement()
  153. {
  154. var editor = new TextElementPropertiesEditor();
  155. var element = TextElementLayout.CreateDynamic(0, 0, "Address2");
  156. editor.Select(element);
  157. editor.SetCollapseIfBlank(true);
  158. Assert.True(element.CollapseIfBlank);
  159. editor.SetCollapseIfBlank(false);
  160. Assert.False(element.CollapseIfBlank);
  161. }
  162. [Fact]
  163. public void SetRotationAngle_UpdatesSelectedElement_PositiveAndNegative()
  164. {
  165. var editor = new TextElementPropertiesEditor();
  166. var element = TextElementLayout.CreateStatic(0, 0, "a");
  167. editor.Select(element);
  168. editor.SetRotationAngle(-135.5);
  169. Assert.Equal(-135.5, element.RotationAngle, precision: 6);
  170. editor.SetRotationAngle(720);
  171. Assert.Equal(720, element.RotationAngle, precision: 6);
  172. }
  173. [Theory]
  174. [InlineData(double.NaN)]
  175. [InlineData(double.PositiveInfinity)]
  176. [InlineData(double.NegativeInfinity)]
  177. public void SetRotationAngle_NonFiniteValue_IsIgnored(double invalid)
  178. {
  179. var editor = new TextElementPropertiesEditor();
  180. var element = TextElementLayout.CreateStatic(0, 0, "a");
  181. element.RotationAngle = 10;
  182. editor.Select(element);
  183. editor.SetRotationAngle(invalid);
  184. Assert.Equal(10, element.RotationAngle, precision: 6);
  185. }
  186. // Sprint 5, "Mix static text and CSV fields within a single text element".
  187. [Fact]
  188. public void SetContent_PlainLiteralText_ProducesSingleLiteralRun()
  189. {
  190. var editor = new TextElementPropertiesEditor();
  191. var element = TextElementLayout.CreateDynamic(0, 0, "Full Name"); // starts dynamic
  192. editor.Select(element);
  193. editor.SetContent("Plain label");
  194. var run = Assert.Single(element.Runs);
  195. Assert.False(run.IsField);
  196. Assert.Equal("Plain label", run.Literal);
  197. Assert.False(element.IsDynamic);
  198. }
  199. [Fact]
  200. public void SetContent_MixedBracketSyntax_ProducesRunSequence()
  201. {
  202. var editor = new TextElementPropertiesEditor();
  203. var element = TextElementLayout.CreateStatic(15, 25, "placeholder");
  204. editor.Select(element);
  205. editor.SetContent("Attn: {Full Name} - {Last Name}");
  206. Assert.Equal(4, element.Runs.Count);
  207. Assert.True(element.IsDynamic);
  208. Assert.Equal("Full Name", element.Runs[1].ColumnName);
  209. Assert.Equal("Last Name", element.Runs[3].ColumnName);
  210. // Sprint 5's own acceptance criterion: editing content must not reposition the element.
  211. Assert.Equal(15, element.X, precision: 6);
  212. Assert.Equal(25, element.Y, precision: 6);
  213. }
  214. [Fact]
  215. public void SetContent_NoSelection_IsNoOp()
  216. {
  217. var editor = new TextElementPropertiesEditor();
  218. editor.SetContent("Attn: {Full Name}"); // must not throw
  219. Assert.Null(editor.Selected);
  220. }
  221. [Fact]
  222. public void SetColumnName_MixedContentElement_IsIgnored()
  223. {
  224. // Rebind semantics don't generalize to "which of N field runs?" — SetContent is the
  225. // general editor for mixed content; SetColumnName stays scoped to the legacy single-run
  226. // dynamic shape only.
  227. var editor = new TextElementPropertiesEditor();
  228. var element = TextElementLayout.CreateStatic(0, 0, "placeholder");
  229. editor.Select(element);
  230. editor.SetContent("Attn: {Full Name}");
  231. editor.SetColumnName("Different Column");
  232. Assert.Equal(2, element.Runs.Count);
  233. Assert.Equal("Full Name", element.Runs[1].ColumnName);
  234. }
  235. [Fact]
  236. public void Select_ThenEdits_ThenSelectDifferentElement_EditsApplyToCorrectElement()
  237. {
  238. var editor = new TextElementPropertiesEditor();
  239. var first = TextElementLayout.CreateStatic(0, 0, "first");
  240. var second = TextElementLayout.CreateStatic(0, 0, "second");
  241. editor.Select(first);
  242. editor.SetX(10);
  243. editor.Select(second);
  244. editor.SetX(20);
  245. Assert.Equal(10, first.X, precision: 6);
  246. Assert.Equal(20, second.X, precision: 6);
  247. }
  248. }

Powered by TurnKey Linux.