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

171 строка
7.4KB

  1. using EnvelopeRenderer.Desktop.Core.Design;
  2. namespace EnvelopeRenderer.Desktop.Tests;
  3. /// <summary>Address Control text case / vertical anchor and the template page background: preview
  4. /// parity with the CLI scenarios (BackgroundAndAddressOptionsTests), geometry, XML round trip.</summary>
  5. public class AddressOptionsAndBackgroundTests
  6. {
  7. private static IReadOnlyDictionary<string, string> Record(params (string Key, string Value)[] pairs) =>
  8. pairs.ToDictionary(p => p.Key, p => p.Value, StringComparer.OrdinalIgnoreCase);
  9. private static AddressControlLayout Control(
  10. AddressTextCase textCase = AddressTextCase.None,
  11. AddressVerticalAnchor anchor = AddressVerticalAnchor.Top)
  12. {
  13. var control = AddressControlLayout.CreateDefault(120, 500);
  14. control.Lines.Clear();
  15. control.Lines.Add(AddressControlLineLayout.CreateField("Name", fontSize: 12));
  16. control.Lines.Add(AddressControlLineLayout.CreateField("Line2", fontSize: 12));
  17. var literal = new AddressControlLineLayout("Arial", 12);
  18. literal.Runs.Clear();
  19. literal.Runs.Add(TextRun.ForLiteral("Mixed Case"));
  20. control.Lines.Add(literal);
  21. control.TextCase = textCase;
  22. control.VerticalAnchor = anchor;
  23. return control;
  24. }
  25. private static IReadOnlyList<PreviewTextDraw> Preview(AddressControlLayout control, string line2)
  26. {
  27. var document = new TemplateLayoutDocument(new CanvasSettings(297, 684, CanvasUnit.Points));
  28. document.AddressControls.Add(control);
  29. var result = TemplatePreviewBuilder.Build(
  30. document, new[] { "Name", "Line2" }, Record(("Name", "Alice Smith"), ("Line2", line2)));
  31. Assert.True(result.Success, result.Message);
  32. return result.Draws;
  33. }
  34. [Theory]
  35. [InlineData(AddressTextCase.None, "Alice Smith", "Mixed Case")]
  36. [InlineData(AddressTextCase.Upper, "ALICE SMITH", "MIXED CASE")]
  37. [InlineData(AddressTextCase.Lower, "alice smith", "mixed case")]
  38. public void Preview_TextCase_AppliesToFieldAndLiteralText(AddressTextCase textCase, string name, string literal)
  39. {
  40. var draws = Preview(Control(textCase), "x");
  41. Assert.Equal(name, draws[0].Text);
  42. Assert.Equal(literal, draws[2].Text);
  43. }
  44. [Fact]
  45. public void Preview_TopAnchor_BlockGrowsDownFromAnchor()
  46. => Assert.Equal(new[] { 500.0, 485.0, 470.0 }, Preview(Control(), "s").Select(d => d.Y).ToArray());
  47. [Fact]
  48. public void Preview_BottomAnchor_LastLineOnAnchorAndBlockGrowsUp()
  49. => Assert.Equal(
  50. new[] { 530.0, 515.0, 500.0 },
  51. Preview(Control(anchor: AddressVerticalAnchor.Bottom), "s").Select(d => d.Y).ToArray());
  52. [Fact]
  53. public void Preview_BottomAnchor_CollapsedMiddleLine_KeepsLastVisibleLineOnAnchor()
  54. => Assert.Equal(
  55. new[] { 515.0, 500.0 },
  56. Preview(Control(anchor: AddressVerticalAnchor.Bottom), "").Select(d => d.Y).ToArray());
  57. [Fact]
  58. public void BottomAnchor_BoxGeometry_ExtendsUpwardFromAnchor()
  59. {
  60. var top = Control();
  61. var bottom = Control(anchor: AddressVerticalAnchor.Bottom);
  62. Assert.Equal(500, top.TopBaselineY, precision: 6);
  63. Assert.Equal(530, bottom.TopBaselineY, precision: 6);
  64. Assert.Equal(top.BoxCenter.Y + 30, bottom.BoxCenter.Y, precision: 6);
  65. Assert.Equal(500, bottom.BaselineYForLine(2), precision: 6);
  66. }
  67. private static string TempFile() => Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xml");
  68. [Fact]
  69. public void Xml_RoundTrip_PreservesCaseAnchorAndBackground()
  70. {
  71. var document = new TemplateLayoutDocument(new CanvasSettings(297, 684, CanvasUnit.Points));
  72. document.AddressControls.Add(Control(AddressTextCase.Upper, AddressVerticalAnchor.Bottom));
  73. document.Background = new PageBackgroundLayout { FileColumn = "Form", PageColumn = "Pg" };
  74. var path = TempFile();
  75. TemplateLayoutXmlSerializer.Save(document, path);
  76. var loaded = TemplateLayoutXmlSerializer.TryLoad(path, out var doc, out var errors);
  77. Assert.True(loaded, string.Join("; ", errors));
  78. var control = Assert.Single(doc!.AddressControls);
  79. Assert.Equal(AddressTextCase.Upper, control.TextCase);
  80. Assert.Equal(AddressVerticalAnchor.Bottom, control.VerticalAnchor);
  81. Assert.Equal("Form", doc.Background!.FileColumn);
  82. Assert.Equal("Pg", doc.Background.PageColumn);
  83. Assert.Null(doc.Background.File);
  84. }
  85. [Fact]
  86. public void Xml_Defaults_WriteNoNewAttributesOrBackground()
  87. {
  88. var document = new TemplateLayoutDocument(new CanvasSettings(297, 684, CanvasUnit.Points));
  89. document.AddressControls.Add(Control());
  90. var path = TempFile();
  91. TemplateLayoutXmlSerializer.Save(document, path);
  92. var xml = File.ReadAllText(path);
  93. Assert.DoesNotContain("case=", xml);
  94. Assert.DoesNotContain("verticalAnchor", xml);
  95. Assert.DoesNotContain("<background", xml);
  96. }
  97. [Fact]
  98. public void Xml_StaticBackgroundFileAndPage_RoundTrip()
  99. {
  100. var document = new TemplateLayoutDocument(new CanvasSettings(297, 684, CanvasUnit.Points));
  101. document.Elements.Add(TextElementLayout.CreateStatic(1, 2, "Hi"));
  102. document.Background = new PageBackgroundLayout { File = @"C:\forms\bg.pdf", Page = 3 };
  103. var path = TempFile();
  104. TemplateLayoutXmlSerializer.Save(document, path);
  105. Assert.True(TemplateLayoutXmlSerializer.TryLoad(path, out var doc, out var errors), string.Join("; ", errors));
  106. Assert.Equal(@"C:\forms\bg.pdf", doc!.Background!.File);
  107. Assert.Equal(3, doc.Background.Page);
  108. }
  109. [Theory]
  110. [InlineData("<background />")]
  111. [InlineData("<background file=\"a.txt\" />")]
  112. [InlineData("<background file=\"a.pdf\" fileColumn=\"X\" />")]
  113. [InlineData("<background file=\"a.pdf\" page=\"0\" />")]
  114. public void Xml_InvalidBackground_FailsToLoad(string backgroundXml)
  115. {
  116. var path = TempFile();
  117. File.WriteAllText(path,
  118. $"<envelopeTemplate pageWidth=\"297\" pageHeight=\"684\">{backgroundXml}<text x=\"1\" y=\"2\" font=\"Arial\" size=\"12\">Hi</text></envelopeTemplate>");
  119. Assert.False(TemplateLayoutXmlSerializer.TryLoad(path, out _, out var errors));
  120. Assert.Contains(errors, e => e.Contains("<background>"));
  121. }
  122. [Fact]
  123. public void Xml_InvalidCase_FailsToLoad()
  124. {
  125. var path = TempFile();
  126. File.WriteAllText(path,
  127. "<envelopeTemplate pageWidth=\"297\" pageHeight=\"684\"><addressControl x=\"1\" y=\"2\" width=\"180\" case=\"title\">"
  128. + "<line font=\"Arial\" size=\"12\"><run column=\"Name\" /></line></addressControl></envelopeTemplate>");
  129. Assert.False(TemplateLayoutXmlSerializer.TryLoad(path, out _, out var errors));
  130. Assert.Contains(errors, e => e.Contains("'case'"));
  131. }
  132. [Fact]
  133. public void Background_ResolvesFileAndPagePerRecord()
  134. {
  135. var background = new PageBackgroundLayout { FileColumn = "Form", PageColumn = "Pg" };
  136. var record = Record(("Form", " a.pdf "), ("Pg", " 2 "));
  137. Assert.Equal(Path.Combine(@"C:\t", "a.pdf"), background.ResolveFile(record, @"C:\t"));
  138. Assert.Equal(2, background.ResolvePage(record));
  139. Assert.Null(background.ResolveFile(Record(("Form", "")), @"C:\t"));
  140. Assert.Null(background.ResolvePage(Record(("Pg", "zero"))));
  141. Assert.Equal(@"D:\x\b.png", new PageBackgroundLayout { File = @"D:\x\b.png" }.ResolveFile(null, @"C:\t"));
  142. }
  143. }

Powered by TurnKey Linux.