AbsoluteLayoutTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. using Xunit;
  2. using Xunit.Abstractions;
  3. //using GraphViewTests = Terminal.Gui.Views.GraphViewTests;
  4. // Alias Console to MockConsole so we don't accidentally use Console
  5. namespace Terminal.Gui.ViewTests;
  6. public class AbsoluteLayoutTests {
  7. readonly ITestOutputHelper _output;
  8. public AbsoluteLayoutTests (ITestOutputHelper output) => this._output = output;
  9. [Fact] [TestRespondersDisposed]
  10. public void AbsoluteLayout_Constructor ()
  11. {
  12. var frame = new Rect (1, 2, 3, 4);
  13. var v = new View (frame);
  14. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  15. Assert.Equal (frame, v.Frame);
  16. Assert.Equal (new Rect (0, 0, frame.Width, frame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  17. Assert.Null (v.X);
  18. Assert.Null (v.Y);
  19. Assert.Null (v.Height);
  20. Assert.Null (v.Width);
  21. v.Dispose ();
  22. v = new View (frame, "v");
  23. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  24. Assert.Equal (frame, v.Frame);
  25. Assert.Equal (new Rect (0, 0, frame.Width, frame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  26. Assert.Null (v.X);
  27. Assert.Null (v.Y);
  28. Assert.Null (v.Height);
  29. Assert.Null (v.Width);
  30. v.Dispose ();
  31. v = new View (frame.X, frame.Y, "v");
  32. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  33. // BUGBUG: v2 - I think the default size should be 0,0
  34. Assert.Equal (new Rect (frame.X, frame.Y, 1, 1), v.Frame);
  35. Assert.Equal (new Rect (0, 0, 1, 1), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  36. Assert.Null (v.X);
  37. Assert.Null (v.Y);
  38. Assert.Null (v.Height);
  39. Assert.Null (v.Width);
  40. v.Dispose ();
  41. }
  42. [Fact] [TestRespondersDisposed]
  43. public void AbsoluteLayout_Change_Frame ()
  44. {
  45. var frame = new Rect (1, 2, 3, 4);
  46. var newFrame = new Rect (1, 2, 30, 40);
  47. var v = new View (frame);
  48. v.Frame = newFrame;
  49. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  50. Assert.Equal (newFrame, v.Frame);
  51. Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  52. Assert.Null (v.X);
  53. Assert.Null (v.Y);
  54. Assert.Null (v.Height);
  55. Assert.Null (v.Width);
  56. v.Dispose ();
  57. v = new View (frame.X, frame.Y, "v");
  58. v.Frame = newFrame;
  59. Assert.Equal (newFrame, v.Frame);
  60. Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  61. Assert.Null (v.X);
  62. Assert.Null (v.Y);
  63. Assert.Null (v.Height);
  64. Assert.Null (v.Width);
  65. v.Dispose ();
  66. newFrame = new Rect (10, 20, 30, 40);
  67. v = new View (frame);
  68. v.Frame = newFrame;
  69. Assert.Equal (newFrame, v.Frame);
  70. Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  71. Assert.Null (v.X);
  72. Assert.Null (v.Y);
  73. Assert.Null (v.Height);
  74. Assert.Null (v.Width);
  75. v.Dispose ();
  76. v = new View (frame.X, frame.Y, "v");
  77. v.Frame = newFrame;
  78. Assert.Equal (newFrame, v.Frame);
  79. Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  80. Assert.Null (v.X);
  81. Assert.Null (v.Y);
  82. Assert.Null (v.Height);
  83. Assert.Null (v.Width);
  84. v.Dispose ();
  85. }
  86. [Fact] [TestRespondersDisposed]
  87. public void AbsoluteLayout_Change_Height_or_Width_Absolute ()
  88. {
  89. var frame = new Rect (1, 2, 3, 4);
  90. var newFrame = new Rect (1, 2, 30, 40);
  91. var v = new View (frame);
  92. v.Height = newFrame.Height;
  93. v.Width = newFrame.Width;
  94. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  95. Assert.Equal (newFrame, v.Frame);
  96. Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  97. Assert.Null (v.X);
  98. Assert.Null (v.Y);
  99. Assert.Equal ($"Absolute({newFrame.Height})", v.Height.ToString ());
  100. Assert.Equal ($"Absolute({newFrame.Width})", v.Width.ToString ());
  101. v.Dispose ();
  102. }
  103. [Fact] [TestRespondersDisposed]
  104. public void AbsoluteLayout_Change_Height_or_Width_NotAbsolute ()
  105. {
  106. var v = new View (Rect.Empty);
  107. v.Height = Dim.Fill ();
  108. v.Width = Dim.Fill ();
  109. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle
  110. v.Dispose ();
  111. }
  112. [Fact] [TestRespondersDisposed]
  113. public void AbsoluteLayout_Change_Height_or_Width_Null ()
  114. {
  115. var v = new View (Rect.Empty);
  116. v.Height = null;
  117. v.Width = null;
  118. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  119. v.Dispose ();
  120. }
  121. [Fact] [TestRespondersDisposed]
  122. public void AbsoluteLayout_Change_X_or_Y_Absolute ()
  123. {
  124. var frame = new Rect (1, 2, 3, 4);
  125. var newFrame = new Rect (10, 20, 3, 4);
  126. var v = new View (frame);
  127. v.X = newFrame.X;
  128. v.Y = newFrame.Y;
  129. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  130. Assert.Equal (newFrame, v.Frame);
  131. Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  132. Assert.Equal ($"Absolute({newFrame.X})", v.X.ToString ());
  133. Assert.Equal ($"Absolute({newFrame.Y})", v.Y.ToString ());
  134. Assert.Null (v.Height);
  135. Assert.Null (v.Width);
  136. v.Dispose ();
  137. }
  138. [Fact] [TestRespondersDisposed]
  139. public void AbsoluteLayout_Change_X_or_Y_NotAbsolute ()
  140. {
  141. var v = new View (Rect.Empty);
  142. v.X = Pos.Center ();
  143. v.Y = Pos.Center ();
  144. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle
  145. v.Dispose ();
  146. }
  147. [Fact] [TestRespondersDisposed]
  148. public void AbsoluteLayout_Change_X_or_Y_Null ()
  149. {
  150. var v = new View (Rect.Empty);
  151. v.X = null;
  152. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  153. v.Dispose ();
  154. v = new View (Rect.Empty);
  155. v.X = Pos.Center ();
  156. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle
  157. v.X = null;
  158. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  159. v.Dispose ();
  160. v = new View (Rect.Empty);
  161. v.Y = null;
  162. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  163. v.Dispose ();
  164. v = new View (Rect.Empty);
  165. v.Y = Pos.Center ();
  166. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle
  167. v.Y = null;
  168. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  169. v.Dispose ();
  170. }
  171. [Fact] [TestRespondersDisposed]
  172. public void AbsoluteLayout_Change_X_Y_Height_Width_Absolute ()
  173. {
  174. var v = new View (Rect.Empty);
  175. v.X = 1;
  176. v.Y = 2;
  177. v.Height = 3;
  178. v.Width = 4;
  179. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  180. v.Dispose ();
  181. v = new View (Rect.Empty);
  182. v.X = Pos.Center ();
  183. v.Y = Pos.Center ();
  184. v.Width = Dim.Fill ();
  185. v.Height = Dim.Fill ();
  186. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle
  187. // BUGBUG: v2 - If all of X, Y, Width, and Height are null or Absolute(n), isn't that the same as LayoutStyle.Absoulte?
  188. v.X = null;
  189. v.Y = null;
  190. v.Height = null;
  191. v.Width = null;
  192. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // We never automatically change to Absolute from Computed??
  193. v.Dispose ();
  194. v = new View (Rect.Empty);
  195. v.X = Pos.Center ();
  196. v.Y = Pos.Center ();
  197. v.Width = Dim.Fill ();
  198. v.Height = Dim.Fill ();
  199. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle
  200. // BUGBUG: v2 - If all of X, Y, Width, and Height are null or Absolute(n), isn't that the same as LayoutStyle.Absoulte?
  201. v.X = 1;
  202. v.Y = null;
  203. v.Height = null;
  204. v.Width = null;
  205. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // We never automatically change to Absolute from Computed??
  206. v.Dispose ();
  207. v = new View (Rect.Empty);
  208. v.X = Pos.Center ();
  209. v.Y = Pos.Center ();
  210. v.Width = Dim.Fill ();
  211. v.Height = Dim.Fill ();
  212. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle
  213. // BUGBUG: v2 - If all of X, Y, Width, and Height are null or Absolute(n), isn't that the same as LayoutStyle.Absoulte?
  214. v.X = null;
  215. v.Y = 2;
  216. v.Height = null;
  217. v.Width = null;
  218. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // We never automatically change to Absolute from Computed??
  219. v.Dispose ();
  220. v = new View (Rect.Empty);
  221. v.X = Pos.Center ();
  222. v.Y = Pos.Center ();
  223. v.Width = Dim.Fill ();
  224. v.Height = Dim.Fill ();
  225. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle
  226. // BUGBUG: v2 - If all of X, Y, Width, and Height are null or Absolute(n), isn't that the same as LayoutStyle.Absoulte?
  227. v.X = null;
  228. v.Y = null;
  229. v.Height = 3;
  230. v.Width = null;
  231. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // We never automatically change to Absolute from Computed??
  232. v.Dispose ();
  233. v = new View (Rect.Empty);
  234. v.X = Pos.Center ();
  235. v.Y = Pos.Center ();
  236. v.Width = Dim.Fill ();
  237. v.Height = Dim.Fill ();
  238. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle
  239. // BUGBUG: v2 - If all of X, Y, Width, and Height are null or Absolute(n), isn't that the same as LayoutStyle.Absoulte?
  240. v.X = null;
  241. v.Y = null;
  242. v.Height = null;
  243. v.Width = 4;
  244. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // We never automatically change to Absolute from Computed??
  245. v.Dispose ();
  246. }
  247. [Fact] [TestRespondersDisposed]
  248. public void AbsoluteLayout_Change_X_Y_Height_Width_Null ()
  249. {
  250. var v = new View (Rect.Empty);
  251. v.X = null;
  252. v.Y = null;
  253. v.Height = null;
  254. v.Width = null;
  255. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  256. v.Dispose ();
  257. v = new View (Rect.Empty);
  258. v.X = Pos.Center ();
  259. v.Y = Pos.Center ();
  260. v.Width = Dim.Fill ();
  261. v.Height = Dim.Fill ();
  262. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle
  263. // BUGBUG: v2 - If all of X, Y, Width, and Height are null or Absolute(n), isn't that the same as LayoutStyle.Absoulte?
  264. v.X = null;
  265. v.Y = null;
  266. v.Height = null;
  267. v.Width = null;
  268. Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // We never automatically change to Absolute from Computed??
  269. v.Dispose ();
  270. }
  271. [Fact] [TestRespondersDisposed]
  272. public void AbsoluteLayout_Layout ()
  273. {
  274. var superRect = new Rect (0, 0, 100, 100);
  275. var super = new View (superRect, "super");
  276. Assert.True (super.LayoutStyle == LayoutStyle.Absolute);
  277. var v1 = new View () {
  278. X = 0,
  279. Y = 0,
  280. Width = 10,
  281. Height = 10
  282. };
  283. // BUGBUG: v2 - This should be LayoutStyle.Absolute
  284. Assert.True (v1.LayoutStyle == LayoutStyle.Computed);
  285. var v2 = new View () {
  286. X = 10,
  287. Y = 10,
  288. Width = 10,
  289. Height = 10
  290. };
  291. // BUGBUG: v2 - This should be LayoutStyle.Absolute
  292. Assert.True (v1.LayoutStyle == LayoutStyle.Computed);
  293. super.Add (v1, v2);
  294. super.LayoutSubviews ();
  295. Assert.Equal (new Rect (0, 0, 10, 10), v1.Frame);
  296. Assert.Equal (new Rect (10, 10, 10, 10), v2.Frame);
  297. super.Dispose ();
  298. }
  299. }