StackTests.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. using NUnit.Framework;
  2. using QuestPDF.Drawing.SpacePlan;
  3. using QuestPDF.Elements;
  4. using QuestPDF.Infrastructure;
  5. using QuestPDF.UnitTests.TestEngine;
  6. namespace QuestPDF.UnitTests
  7. {
  8. [TestFixture]
  9. public class StackTests
  10. {
  11. [Test]
  12. public void Measure_NoChildren_Empty()
  13. {
  14. TestPlan
  15. .For(x => new Stack
  16. {
  17. Spacing = 100
  18. })
  19. .MeasureElement(new Size(500, 1000))
  20. .CheckMeasureResult(new FullRender(Size.Zero));
  21. }
  22. [Test]
  23. public void Measure_ReturnsWrap_WhenPageable_AndAnyChildReturnsWrap()
  24. {
  25. TestPlan
  26. .For(x => new Stack
  27. {
  28. Spacing = 100,
  29. Pageable = true,
  30. Children = new []
  31. {
  32. x.CreateChild("a"),
  33. x.CreateChild("b"),
  34. x.CreateChild("c"),
  35. x.CreateChild("d")
  36. }
  37. })
  38. .MeasureElement(new Size(500, 1000))
  39. .ExpectChildMeasure("a", expectedInput: new Size(500, 1000), returns: new FullRender(500, 200))
  40. .ExpectChildMeasure("b", expectedInput: new Size(500, 700), returns: new FullRender(500, 300))
  41. .ExpectChildMeasure("c", expectedInput: new Size(500, 300), returns: new Wrap())
  42. .CheckMeasureResult(new PartialRender(500, 600));
  43. }
  44. [Test]
  45. public void Measure_ReturnsWrap_WhenPageable_AndFirstChildReturnsWrap()
  46. {
  47. TestPlan
  48. .For(x => new Stack
  49. {
  50. Spacing = 100,
  51. Pageable = true,
  52. Children = new []
  53. {
  54. x.CreateChild("a"),
  55. x.CreateChild("b"),
  56. x.CreateChild("c")
  57. }
  58. })
  59. .MeasureElement(new Size(500, 1000))
  60. .ExpectChildMeasure("a", expectedInput: new Size(500, 1000), returns: new Wrap())
  61. .CheckMeasureResult(new Wrap());
  62. }
  63. [Test]
  64. public void Measure_ReturnsWrap_WhenNotPageable_AndAnyChildReturnsPartialRender()
  65. {
  66. TestPlan
  67. .For(x => new Stack
  68. {
  69. Spacing = 50,
  70. Pageable = false,
  71. Children = new []
  72. {
  73. x.CreateChild("a"),
  74. x.CreateChild("b"),
  75. x.CreateChild("d"),
  76. x.CreateChild("e")
  77. }
  78. })
  79. .MeasureElement(new Size(500, 1000))
  80. .ExpectChildMeasure("a", expectedInput: new Size(500, 1000), returns: new FullRender(400, 200))
  81. .ExpectChildMeasure("b", expectedInput: new Size(500, 750), returns: new PartialRender(300, 500))
  82. .CheckMeasureResult(new Wrap());
  83. }
  84. [Test]
  85. public void Measure_DoNotApplySpacing_WhenNotPageable_AndChildReturnsNoContent()
  86. {
  87. TestPlan
  88. .For(x => new Stack
  89. {
  90. Spacing = 50,
  91. Pageable = false,
  92. Children = new []
  93. {
  94. x.CreateChild("a"),
  95. x.CreateChild("b"),
  96. x.CreateChild("c"),
  97. x.CreateChild("d"),
  98. x.CreateChild("e")
  99. }
  100. })
  101. .MeasureElement(new Size(500, 1000))
  102. .ExpectChildMeasure("a", expectedInput: new Size(500, 1000), returns: new FullRender(400, 200))
  103. .ExpectChildMeasure("b", expectedInput: new Size(500, 750), returns: new FullRender(Size.Zero))
  104. .ExpectChildMeasure("c", expectedInput: new Size(500, 750), returns: new FullRender(Size.Zero))
  105. .ExpectChildMeasure("d", expectedInput: new Size(500, 750), returns: new FullRender(300, 300))
  106. .ExpectChildMeasure("e", expectedInput: new Size(500, 400), returns: new FullRender(300, 100))
  107. .CheckMeasureResult(new FullRender(500, 700));
  108. }
  109. [Test]
  110. public void MultipleDraw_WhenNotPageable()
  111. {
  112. TestPlan
  113. .For(x => new Stack
  114. {
  115. Spacing = 50,
  116. Pageable = false,
  117. Children = new []
  118. {
  119. x.CreateChild("a")
  120. }
  121. })
  122. .MeasureElement(new Size(500, 1000))
  123. .ExpectChildMeasure("a", expectedInput: new Size(500, 1000), returns: new FullRender(400, 200))
  124. .CheckMeasureResult(new FullRender(500, 200))
  125. // second measure resets element state
  126. .MeasureElement(new Size(500, 1000))
  127. .ExpectChildMeasure("a", expectedInput: new Size(500, 1000), returns: new FullRender(400, 200))
  128. .CheckMeasureResult(new FullRender(500, 200));
  129. }
  130. [Test]
  131. public void WhenPageable_AndChildReturnsWrap()
  132. {
  133. TestPlan
  134. .For(x => new Stack
  135. {
  136. Spacing = 50,
  137. Pageable = true,
  138. Children = new[]
  139. {
  140. x.CreateChild("a"),
  141. x.CreateChild("b"),
  142. x.CreateChild("c")
  143. }
  144. })
  145. // page 1: measure
  146. .MeasureElement(new Size(500, 1000))
  147. .ExpectChildMeasure("a", expectedInput: new Size(500, 1000), returns: new FullRender(400, 200))
  148. .ExpectChildMeasure("b", expectedInput: new Size(500, 750), returns: new Wrap())
  149. .CheckMeasureResult(new PartialRender(500, 200))
  150. // page 1: draw
  151. .DrawElement(new Size(500, 1000))
  152. .ExpectChildMeasure("a", expectedInput: new Size(500, 1000), returns: new FullRender(400, 200))
  153. .ExpectCanvasTranslate(0, 0)
  154. .ExpectChildDraw("a", new Size(500, 200))
  155. .ExpectCanvasTranslate(0, 0)
  156. .ExpectChildMeasure("b", expectedInput: new Size(500, 750), returns: new Wrap())
  157. .CheckDrawResult()
  158. // // page 2: measure
  159. .MeasureElement(new Size(500, 900))
  160. .ExpectChildMeasure("b", expectedInput: new Size(500, 900), returns: new FullRender(300, 100))
  161. .ExpectChildMeasure("c", expectedInput: new Size(500, 750), returns: new FullRender(300, 250))
  162. .CheckMeasureResult(new FullRender(500, 400))
  163. // page 2: draw
  164. .DrawElement(new Size(500, 900))
  165. .ExpectChildMeasure("b", expectedInput: new Size(500, 900), returns: new FullRender(300, 100))
  166. .ExpectCanvasTranslate(0, 0)
  167. .ExpectChildDraw("b", new Size(500, 100))
  168. .ExpectCanvasTranslate(0, 0)
  169. .ExpectChildMeasure("c", expectedInput: new Size(500, 750), returns: new FullRender(300, 250))
  170. .ExpectCanvasTranslate(0, 150)
  171. .ExpectChildDraw("c", new Size(500, 250))
  172. .ExpectCanvasTranslate(0, -150)
  173. .CheckDrawResult();
  174. }
  175. [Test]
  176. public void Draw_ChildrenArePlacedCorrectly_WhenNotPageable()
  177. {
  178. TestPlan
  179. .For(x => new Stack
  180. {
  181. Spacing = 50,
  182. Pageable = false,
  183. Children = new[]
  184. {
  185. x.CreateChild("a"),
  186. x.CreateChild("b"),
  187. x.CreateChild("c"),
  188. x.CreateChild("d")
  189. }
  190. })
  191. .DrawElement(new Size(500, 1000))
  192. .ExpectChildMeasure("a", expectedInput: new Size(500, 1000), returns: new FullRender(400, 200))
  193. .ExpectCanvasTranslate(0, 0)
  194. .ExpectChildDraw("a", new Size(500, 200))
  195. .ExpectCanvasTranslate(0, 0)
  196. .ExpectChildMeasure("b", expectedInput: new Size(500, 750), returns: new FullRender(300, 300))
  197. .ExpectCanvasTranslate(0, 250)
  198. .ExpectChildDraw("b", new Size(500, 300))
  199. .ExpectCanvasTranslate(0, -250)
  200. .ExpectChildMeasure("c", expectedInput: new Size(500, 400), returns: new FullRender(Size.Zero))
  201. .ExpectCanvasTranslate(0, 600)
  202. .ExpectChildDraw("c", new Size(500, 0))
  203. .ExpectCanvasTranslate(0, -600)
  204. .ExpectChildMeasure("d", expectedInput: new Size(500, 400), returns: new FullRender(200, 400))
  205. .ExpectCanvasTranslate(0, 600)
  206. .ExpectChildDraw("d", new Size(500, 400))
  207. .ExpectCanvasTranslate(0, -600)
  208. .CheckDrawResult();
  209. }
  210. [Test]
  211. public void WhenPageable_AndChildReturnsPartialRender()
  212. {
  213. TestPlan
  214. .For(x => new Stack
  215. {
  216. Spacing = 50,
  217. Pageable = true,
  218. Children = new[]
  219. {
  220. x.CreateChild("a"),
  221. x.CreateChild("b"),
  222. x.CreateChild("c")
  223. }
  224. })
  225. // page 1: measure
  226. .MeasureElement(new Size(500, 1000))
  227. .ExpectChildMeasure("a", expectedInput: new Size(500, 1000), returns: new FullRender(400, 200))
  228. .ExpectChildMeasure("b", expectedInput: new Size(500, 750), returns: new PartialRender(300, 300))
  229. .CheckMeasureResult(new PartialRender(500, 550))
  230. // page 1: draw
  231. .DrawElement(new Size(500, 1000))
  232. .ExpectChildMeasure("a", expectedInput: new Size(500, 1000), returns: new FullRender(400, 200))
  233. .ExpectCanvasTranslate(0, 0)
  234. .ExpectChildDraw("a", new Size(500, 200))
  235. .ExpectCanvasTranslate(0, 0)
  236. .ExpectChildMeasure("b", expectedInput: new Size(500, 750), returns: new PartialRender(300, 300))
  237. .ExpectCanvasTranslate(0, 250)
  238. .ExpectChildDraw("b", new Size(500, 300))
  239. .ExpectCanvasTranslate(0, -250)
  240. .CheckDrawResult()
  241. // // page 2: measure
  242. .MeasureElement(new Size(500, 900))
  243. .ExpectChildMeasure("b", expectedInput: new Size(500, 900), returns: new FullRender(300, 100))
  244. .ExpectChildMeasure("c", expectedInput: new Size(500, 750), returns: new FullRender(300, 250))
  245. .CheckMeasureResult(new FullRender(500, 400))
  246. // page 2: draw
  247. .DrawElement(new Size(500, 900))
  248. .ExpectChildMeasure("b", expectedInput: new Size(500, 900), returns: new FullRender(300, 100))
  249. .ExpectCanvasTranslate(0, 0)
  250. .ExpectChildDraw("b", new Size(500, 100))
  251. .ExpectCanvasTranslate(0, 0)
  252. .ExpectChildMeasure("c", expectedInput: new Size(500, 750), returns: new FullRender(300, 250))
  253. .ExpectCanvasTranslate(0, 150)
  254. .ExpectChildDraw("c", new Size(500, 250))
  255. .ExpectCanvasTranslate(0, -150)
  256. .CheckDrawResult();
  257. }
  258. }
  259. }