AdornmentTests.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. using Xunit.Abstractions;
  2. namespace Terminal.Gui.ViewTests;
  3. public class AdornmentTests
  4. {
  5. private readonly ITestOutputHelper _output;
  6. public AdornmentTests (ITestOutputHelper output) { _output = output; }
  7. [Fact]
  8. public void Bounds_Location_Always_Empty_Size_Correct ()
  9. {
  10. var view = new View
  11. {
  12. X = 1,
  13. Y = 2,
  14. Width = 20,
  15. Height = 31
  16. };
  17. var marginThickness = 1;
  18. view.Margin.Thickness = new Thickness (marginThickness);
  19. var borderThickness = 2;
  20. view.Border.Thickness = new Thickness (borderThickness);
  21. var paddingThickness = 3;
  22. view.Padding.Thickness = new Thickness (paddingThickness);
  23. view.BeginInit ();
  24. view.EndInit ();
  25. Assert.Equal (new Rectangle (1, 2, 20, 31), view.Frame);
  26. Assert.Equal (new Rectangle (0, 0, 8, 19), view.Bounds);
  27. Assert.Equal (new Rectangle (0, 0, view.Margin.Frame.Width - marginThickness * 2, view.Margin.Frame.Height - marginThickness * 2), view.Margin.Bounds);
  28. Assert.Equal (new Rectangle (0, 0, view.Border.Frame.Width - borderThickness * 2, view.Border.Frame.Height - borderThickness * 2), view.Border.Bounds);
  29. Assert.Equal (
  30. new Rectangle (
  31. 0,
  32. 0,
  33. view.Padding.Frame.Width - (marginThickness + borderThickness) * 2,
  34. view.Padding.Frame.Height - (marginThickness + borderThickness) * 2),
  35. view.Padding.Bounds);
  36. }
  37. // Test that Adornment.Bounds_get override uses Parent not SuperView
  38. [Fact]
  39. public void BoundsToScreen_Uses_Parent_Not_SuperView ()
  40. {
  41. var parent = new View { X = 1, Y = 2, Width = 10, Height = 10 };
  42. parent.BeginInit ();
  43. parent.EndInit ();
  44. Assert.Equal (new Rectangle (1, 2, 10, 10), parent.Frame);
  45. Assert.Equal (new Rectangle (0, 0, 10, 10), parent.Bounds);
  46. Assert.Equal (new Rectangle (0, 0, 10, 10), parent.Margin.Frame);
  47. Assert.Equal (new Rectangle (0, 0, 10, 10), parent.Margin.Bounds);
  48. Assert.Null (parent.Margin.SuperView);
  49. Rectangle boundsAsScreen = parent.Margin.BoundsToScreen (new Rectangle (1, 2, 5, 5));
  50. Assert.Equal (new Rectangle (2, 4, 5, 5), boundsAsScreen);
  51. }
  52. [Fact]
  53. public void Frames_are_Parent_SuperView_Relative ()
  54. {
  55. var view = new View
  56. {
  57. X = 1,
  58. Y = 2,
  59. Width = 20,
  60. Height = 31
  61. };
  62. var marginThickness = 1;
  63. view.Margin.Thickness = new Thickness (marginThickness);
  64. var borderThickness = 2;
  65. view.Border.Thickness = new Thickness (borderThickness);
  66. var paddingThickness = 3;
  67. view.Padding.Thickness = new Thickness (paddingThickness);
  68. view.BeginInit ();
  69. view.EndInit ();
  70. Assert.Equal (new Rectangle (1, 2, 20, 31), view.Frame);
  71. Assert.Equal (new Rectangle (0, 0, 8, 19), view.Bounds);
  72. // Margin.Frame is always the same as the view frame
  73. Assert.Equal (new Rectangle (0, 0, 20, 31), view.Margin.Frame);
  74. // Border.Frame is View.Frame minus the Margin thickness
  75. Assert.Equal (
  76. new Rectangle (marginThickness, marginThickness, view.Frame.Width - marginThickness * 2, view.Frame.Height - marginThickness * 2),
  77. view.Border.Frame);
  78. // Padding.Frame is View.Frame minus the Border thickness plus Margin thickness
  79. Assert.Equal (
  80. new Rectangle (
  81. marginThickness + borderThickness,
  82. marginThickness + borderThickness,
  83. view.Frame.Width - (marginThickness + borderThickness) * 2,
  84. view.Frame.Height - (marginThickness + borderThickness) * 2),
  85. view.Padding.Frame);
  86. }
  87. // Test that Adornment.FrameToScreen override retains Frame.Size
  88. [Theory]
  89. [InlineData (0, 0, 0)]
  90. [InlineData (0, 1, 1)]
  91. [InlineData (0, 10, 10)]
  92. [InlineData (1, 0, 0)]
  93. [InlineData (1, 1, 1)]
  94. [InlineData (1, 10, 10)]
  95. public void FrameToScreen_Retains_Frame_Size (int marginThickness, int w, int h)
  96. {
  97. var parent = new View { X = 1, Y = 2, Width = w, Height = h };
  98. parent.Margin.Thickness = new Thickness (marginThickness);
  99. parent.BeginInit ();
  100. parent.EndInit ();
  101. Assert.Equal (new Rectangle (1, 2, w, h), parent.Frame);
  102. Assert.Equal (new Rectangle (0, 0, w, h), parent.Margin.Frame);
  103. Assert.Equal (parent.Frame, parent.Margin.FrameToScreen ());
  104. }
  105. // Test that Adornment.FrameToScreen override returns Frame if Parent is null
  106. [Fact]
  107. public void FrameToScreen_Returns_Frame_If_Parent_Is_Null ()
  108. {
  109. var a = new Adornment
  110. {
  111. X = 1,
  112. Y = 2,
  113. Width = 3,
  114. Height = 4
  115. };
  116. Assert.Null (a.Parent);
  117. Assert.Equal (a.Frame, a.FrameToScreen ());
  118. }
  119. // Test that Adornment.FrameToScreen override returns correct location
  120. [Theory]
  121. [InlineData (0, 0, 0, 0)]
  122. [InlineData (0, 0, 1, 1)]
  123. [InlineData (0, 0, 10, 10)]
  124. [InlineData (1, 0, 0, 0)]
  125. [InlineData (1, 0, 1, 1)]
  126. [InlineData (1, 0, 10, 10)]
  127. [InlineData (0, 1, 0, 0)]
  128. [InlineData (0, 1, 1, 1)]
  129. [InlineData (0, 1, 10, 10)]
  130. [InlineData (1, 1, 0, 0)]
  131. [InlineData (1, 1, 1, 1)]
  132. [InlineData (1, 1, 10, 10)]
  133. public void FrameToScreen_Returns_Screen_Location (int marginThickness, int borderThickness, int x, int y)
  134. {
  135. var superView = new View
  136. {
  137. X = 1,
  138. Y = 1,
  139. Width = 20,
  140. Height = 20
  141. };
  142. superView.Margin.Thickness = new Thickness (marginThickness);
  143. superView.Border.Thickness = new Thickness (borderThickness);
  144. var view = new View { X = x, Y = y, Width = 1, Height = 1 };
  145. superView.Add (view);
  146. superView.BeginInit ();
  147. superView.EndInit ();
  148. Assert.Equal (new Rectangle (x, y, 1, 1), view.Frame);
  149. Assert.Equal (new Rectangle (0, 0, 20, 20), superView.Margin.Frame);
  150. Assert.Equal (
  151. new Rectangle (marginThickness, marginThickness, 20 - marginThickness * 2, 20 - marginThickness * 2),
  152. superView.Border.Frame
  153. );
  154. Assert.Equal (
  155. new Rectangle (superView.Frame.X + marginThickness, superView.Frame.Y + marginThickness, 20 - marginThickness * 2, 20 - marginThickness * 2),
  156. superView.Border.FrameToScreen ()
  157. );
  158. }
  159. // Test that Adornment.FrameToScreen override uses Parent not SuperView
  160. [Fact]
  161. public void FrameToScreen_Uses_Parent_Not_SuperView ()
  162. {
  163. var parent = new View { X = 1, Y = 2, Width = 10, Height = 10 };
  164. parent.BeginInit ();
  165. parent.EndInit ();
  166. Assert.Equal (new Rectangle (1, 2, 10, 10), parent.Frame);
  167. Assert.Equal (new Rectangle (0, 0, 10, 10), parent.Bounds);
  168. Assert.Equal (new Rectangle (0, 0, 10, 10), parent.Margin.Frame);
  169. Assert.Equal (new Rectangle (0, 0, 10, 10), parent.Margin.Bounds);
  170. Assert.Null (parent.Margin.SuperView);
  171. Assert.Equal (new Rectangle (1, 2, 10, 10), parent.Margin.FrameToScreen ());
  172. }
  173. [Fact]
  174. public void GetAdornmentsThickness ()
  175. {
  176. var view = new View ();
  177. Assert.Equal (Thickness.Empty, view.GetAdornmentsThickness ());
  178. view.Margin.Thickness = new Thickness (1);
  179. Assert.Equal (new Thickness (1), view.GetAdornmentsThickness ());
  180. view.Border.Thickness = new Thickness (1);
  181. Assert.Equal (new Thickness (2), view.GetAdornmentsThickness ());
  182. view.Padding.Thickness = new Thickness (1);
  183. Assert.Equal (new Thickness (3), view.GetAdornmentsThickness ());
  184. view.Padding.Thickness = new Thickness (2);
  185. Assert.Equal (new Thickness (4), view.GetAdornmentsThickness ());
  186. view.Padding.Thickness = new Thickness (1, 2, 3, 4);
  187. Assert.Equal (new Thickness (3, 4, 5, 6), view.GetAdornmentsThickness ());
  188. view.Margin.Thickness = new Thickness (1, 2, 3, 4);
  189. Assert.Equal (new Thickness (3, 5, 7, 9), view.GetAdornmentsThickness ());
  190. view.Dispose ();
  191. }
  192. [Fact]
  193. public void Setting_Bounds_Throws ()
  194. {
  195. var adornment = new Adornment (null);
  196. Assert.Throws<InvalidOperationException> (() => adornment.Bounds = new Rectangle (1, 2, 3, 4));
  197. }
  198. [Fact]
  199. public void Setting_SuperView_Throws ()
  200. {
  201. var adornment = new Adornment (null);
  202. Assert.Throws<NotImplementedException> (() => adornment.SuperView = new View ());
  203. }
  204. [Fact]
  205. public void Setting_SuperViewRendersLineCanvas_Throws ()
  206. {
  207. var adornment = new Adornment (null);
  208. Assert.Throws<NotImplementedException> (() => adornment.SuperViewRendersLineCanvas = true);
  209. }
  210. [Fact]
  211. public void Setting_Thickness_Changes_Parent_Bounds ()
  212. {
  213. var parent = new View { Width = 10, Height = 10 };
  214. parent.BeginInit ();
  215. parent.EndInit ();
  216. Assert.Equal (new Rectangle (0, 0, 10, 10), parent.Frame);
  217. Assert.Equal (new Rectangle (0, 0, 10, 10), parent.Bounds);
  218. parent.Margin.Thickness = new Thickness (1);
  219. Assert.Equal (new Rectangle (0, 0, 10, 10), parent.Frame);
  220. Assert.Equal (new Rectangle (0, 0, 8, 8), parent.Bounds);
  221. }
  222. [Fact]
  223. public void Setting_Thickness_Raises_ThicknessChanged ()
  224. {
  225. var adornment = new Adornment (null);
  226. var super = new View ();
  227. var raised = false;
  228. adornment.ThicknessChanged += (s, e) =>
  229. {
  230. raised = true;
  231. Assert.Equal (Thickness.Empty, e.PreviousThickness);
  232. Assert.Equal (new Thickness (1, 2, 3, 4), e.Thickness);
  233. Assert.Equal (new Thickness (1, 2, 3, 4), adornment.Thickness);
  234. };
  235. adornment.Thickness = new Thickness (1, 2, 3, 4);
  236. Assert.True (raised);
  237. }
  238. }