AbsoluteLayoutTests.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  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) => _output = output;
  9. [Fact]
  10. [TestRespondersDisposed]
  11. public void AbsoluteLayout_Constructor ()
  12. {
  13. var v = new View ();
  14. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  15. v.Dispose ();
  16. var frame = Rect.Empty;
  17. v = new View (frame);
  18. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  19. Assert.Equal (frame, v.Frame);
  20. Assert.Equal (new Rect (0, 0, frame.Width, frame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  21. Assert.Equal (Pos.At (0), v.X);
  22. Assert.Equal (Pos.At (0), v.Y);
  23. Assert.Equal (Dim.Sized (0), v.Width);
  24. Assert.Equal (Dim.Sized (0), v.Height);
  25. v.Dispose ();
  26. frame = new Rect (1, 2, 3, 4);
  27. v = new View (frame);
  28. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  29. Assert.Equal (frame, v.Frame);
  30. Assert.Equal (new Rect (0, 0, frame.Width, frame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  31. Assert.Equal (Pos.At (1), v.X);
  32. Assert.Equal (Pos.At (2), v.Y);
  33. Assert.Equal (Dim.Sized (3), v.Width);
  34. Assert.Equal (Dim.Sized (4), v.Height);
  35. v.Dispose ();
  36. v = new View (frame, "v");
  37. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  38. Assert.Equal (frame, v.Frame);
  39. Assert.Equal (new Rect (0, 0, frame.Width, frame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  40. Assert.Equal (Pos.At (1), v.X);
  41. Assert.Equal (Pos.At (2), v.Y);
  42. Assert.Equal (Dim.Sized (3), v.Width);
  43. Assert.Equal (Dim.Sized (4), v.Height);
  44. v.Dispose ();
  45. v = new View (frame.X, frame.Y, "v");
  46. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  47. // BUGBUG: v2 - I think the default size should be 0,0 not 1,1
  48. Assert.Equal (new Rect (frame.X, frame.Y, 1, 1), v.Frame);
  49. Assert.Equal (new Rect (0, 0, 1, 1), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  50. Assert.Equal (Pos.At (1), v.X);
  51. Assert.Equal (Pos.At (2), v.Y);
  52. Assert.Equal (Dim.Sized (1), v.Width);
  53. Assert.Equal (Dim.Sized (1), v.Height);
  54. v.Dispose ();
  55. v = new View ();
  56. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  57. Assert.Equal (new Rect (0, 0, 0, 0), v.Frame);
  58. Assert.Equal (new Rect (0, 0, 0, 0), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  59. Assert.Equal (Pos.At (0), v.X);
  60. Assert.Equal (Pos.At (0), v.Y);
  61. Assert.Equal (Dim.Sized (0), v.Width);
  62. Assert.Equal (Dim.Sized (0), v.Height);
  63. v.Dispose ();
  64. v = new View {
  65. X = frame.X,
  66. Y = frame.Y,
  67. Width = frame.Width,
  68. Height = frame.Height
  69. };
  70. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  71. Assert.Equal (new Rect (frame.X, frame.Y, 3, 4), v.Frame);
  72. Assert.Equal (new Rect (0, 0, 3, 4), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  73. Assert.Equal (Pos.At (1), v.X);
  74. Assert.Equal (Pos.At (2), v.Y);
  75. Assert.Equal (Dim.Sized (3), v.Width);
  76. Assert.Equal (Dim.Sized (4), v.Height);
  77. v.Dispose ();
  78. }
  79. [Fact]
  80. [TestRespondersDisposed]
  81. public void AbsoluteLayout_Change_Frame ()
  82. {
  83. var frame = new Rect (1, 2, 3, 4);
  84. var newFrame = new Rect (1, 2, 30, 40);
  85. var v = new View ();
  86. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  87. v.Dispose ();
  88. v = new View (frame);
  89. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  90. v.Frame = newFrame;
  91. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  92. Assert.Equal (newFrame, v.Frame);
  93. Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  94. Assert.Equal (Pos.At (1), v.X);
  95. Assert.Equal (Pos.At (2), v.Y);
  96. Assert.Equal (Dim.Sized (30), v.Width);
  97. Assert.Equal (Dim.Sized (40), v.Height);
  98. v.Dispose ();
  99. v = new View (frame.X, frame.Y, "v");
  100. v.Frame = newFrame;
  101. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  102. Assert.Equal (newFrame, v.Frame);
  103. Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  104. Assert.Equal (Pos.At (1), v.X);
  105. Assert.Equal (Pos.At (2), v.Y);
  106. Assert.Equal (Dim.Sized (30), v.Width);
  107. Assert.Equal (Dim.Sized (40), v.Height);
  108. v.Dispose ();
  109. newFrame = new Rect (10, 20, 30, 40);
  110. v = new View (frame);
  111. v.Frame = newFrame;
  112. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  113. Assert.Equal (newFrame, v.Frame);
  114. Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  115. Assert.Equal (Pos.At (10), v.X);
  116. Assert.Equal (Pos.At (20), v.Y);
  117. Assert.Equal (Dim.Sized (30), v.Width);
  118. Assert.Equal (Dim.Sized (40), v.Height);
  119. v.Dispose ();
  120. v = new View (frame.X, frame.Y, "v");
  121. v.Frame = newFrame;
  122. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  123. Assert.Equal (newFrame, v.Frame);
  124. Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  125. Assert.Equal (Pos.At (10), v.X);
  126. Assert.Equal (Pos.At (20), v.Y);
  127. Assert.Equal (Dim.Sized (30), v.Width);
  128. Assert.Equal (Dim.Sized (40), v.Height);
  129. v.Dispose ();
  130. }
  131. [Fact]
  132. [TestRespondersDisposed]
  133. public void AbsoluteLayout_Change_Height_or_Width_Absolute ()
  134. {
  135. var frame = new Rect (1, 2, 3, 4);
  136. var newFrame = new Rect (1, 2, 30, 40);
  137. var v = new View (frame);
  138. v.Height = newFrame.Height;
  139. v.Width = newFrame.Width;
  140. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  141. Assert.Equal (newFrame, v.Frame);
  142. Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  143. Assert.Equal (Pos.At (1), v.X);
  144. Assert.Equal (Pos.At (2), v.Y);
  145. Assert.Equal ($"Absolute({newFrame.Height})", v.Height.ToString ());
  146. Assert.Equal ($"Absolute({newFrame.Width})", v.Width.ToString ());
  147. v.Dispose ();
  148. }
  149. [Fact]
  150. [TestRespondersDisposed]
  151. public void AbsoluteLayout_Change_Height_or_Width_MakesComputed ()
  152. {
  153. var v = new View (Rect.Empty);
  154. v.Height = Dim.Fill ();
  155. v.Width = Dim.Fill ();
  156. Assert.True (v.LayoutStyle == LayoutStyle.Computed);
  157. v.Dispose ();
  158. }
  159. [Fact]
  160. [TestRespondersDisposed]
  161. public void AbsoluteLayout_Change_X_or_Y_Absolute ()
  162. {
  163. var frame = new Rect (1, 2, 3, 4);
  164. var newFrame = new Rect (10, 20, 3, 4);
  165. var v = new View (frame);
  166. v.X = newFrame.X;
  167. v.Y = newFrame.Y;
  168. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  169. Assert.Equal (newFrame, v.Frame);
  170. Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout
  171. Assert.Equal ($"Absolute({newFrame.X})", v.X.ToString ());
  172. Assert.Equal ($"Absolute({newFrame.Y})", v.Y.ToString ());
  173. Assert.Equal (Dim.Sized (3), v.Width);
  174. Assert.Equal (Dim.Sized (4), v.Height);
  175. v.Dispose ();
  176. }
  177. [Fact]
  178. [TestRespondersDisposed]
  179. public void AbsoluteLayout_Change_X_or_Y_MakesComputed ()
  180. {
  181. var v = new View (Rect.Empty);
  182. v.X = Pos.Center ();
  183. v.Y = Pos.Center ();
  184. Assert.True (v.LayoutStyle == LayoutStyle.Computed);
  185. v.Dispose ();
  186. }
  187. [Fact]
  188. [TestRespondersDisposed]
  189. public void AbsoluteLayout_Change_X_Y_Height_Width_Absolute ()
  190. {
  191. var v = new View (Rect.Empty);
  192. v.X = 1;
  193. v.Y = 2;
  194. v.Height = 3;
  195. v.Width = 4;
  196. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  197. v.Dispose ();
  198. v = new View (Rect.Empty);
  199. v.X = Pos.Center ();
  200. v.Y = Pos.Center ();
  201. v.Width = Dim.Fill ();
  202. v.Height = Dim.Fill ();
  203. Assert.True (v.LayoutStyle == LayoutStyle.Computed);
  204. v.Dispose ();
  205. v = new View (Rect.Empty);
  206. v.X = Pos.Center ();
  207. v.Y = Pos.Center ();
  208. v.Width = Dim.Fill ();
  209. v.Height = Dim.Fill ();
  210. Assert.True (v.LayoutStyle == LayoutStyle.Computed);
  211. v.X = 1;
  212. Assert.True (v.LayoutStyle == LayoutStyle.Computed);
  213. v.Dispose ();
  214. v = new View (Rect.Empty);
  215. v.X = Pos.Center ();
  216. v.Y = Pos.Center ();
  217. v.Width = Dim.Fill ();
  218. v.Height = Dim.Fill ();
  219. Assert.True (v.LayoutStyle == LayoutStyle.Computed);
  220. v.Y = 2;
  221. Assert.True (v.LayoutStyle == LayoutStyle.Computed);
  222. v.Dispose ();
  223. v = new View (Rect.Empty);
  224. v.X = Pos.Center ();
  225. v.Y = Pos.Center ();
  226. v.Width = Dim.Fill ();
  227. v.Height = Dim.Fill ();
  228. Assert.True (v.LayoutStyle == LayoutStyle.Computed);
  229. v.Width = 3;
  230. Assert.True (v.LayoutStyle == LayoutStyle.Computed);
  231. v.Dispose ();
  232. v = new View (Rect.Empty);
  233. v.X = Pos.Center ();
  234. v.Y = Pos.Center ();
  235. v.Width = Dim.Fill ();
  236. v.Height = Dim.Fill ();
  237. Assert.True (v.LayoutStyle == LayoutStyle.Computed);
  238. v.Height = 3;
  239. Assert.True (v.LayoutStyle == LayoutStyle.Computed);
  240. v.Dispose ();
  241. v = new View (Rect.Empty);
  242. v.X = Pos.Center ();
  243. v.Y = Pos.Center ();
  244. v.Width = Dim.Fill ();
  245. v.Height = Dim.Fill ();
  246. Assert.True (v.LayoutStyle == LayoutStyle.Computed);
  247. v.X = 1;
  248. v.Y = 2;
  249. v.Height = 3;
  250. v.Width = 4;
  251. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  252. v.Dispose ();
  253. }
  254. [Fact]
  255. [TestRespondersDisposed]
  256. public void AbsoluteLayout_LayoutSubviews ()
  257. {
  258. var superRect = new Rect (0, 0, 100, 100);
  259. var super = new View (superRect, "super");
  260. Assert.True (super.LayoutStyle == LayoutStyle.Absolute);
  261. var v1 = new View {
  262. X = 0,
  263. Y = 0,
  264. Width = 10,
  265. Height = 10
  266. };
  267. Assert.True (v1.LayoutStyle == LayoutStyle.Absolute);
  268. var v2 = new View {
  269. X = 10,
  270. Y = 10,
  271. Width = 10,
  272. Height = 10
  273. };
  274. Assert.True (v2.LayoutStyle == LayoutStyle.Absolute);
  275. super.Add (v1, v2);
  276. Assert.True (v1.LayoutStyle == LayoutStyle.Absolute);
  277. Assert.True (v2.LayoutStyle == LayoutStyle.Absolute);
  278. super.LayoutSubviews ();
  279. Assert.Equal (new Rect (0, 0, 10, 10), v1.Frame);
  280. Assert.Equal (new Rect (10, 10, 10, 10), v2.Frame);
  281. super.Dispose ();
  282. }
  283. [Fact]
  284. public void AbsoluteLayout_Setting_Bounds_Location_NotEmpty ()
  285. {
  286. // TODO: Should we enforce Bounds.X/Y == 0? The code currently ignores value.X/Y which is
  287. // TODO: correct behavior, but is silent. Perhaps an exception?
  288. var frame = new Rect (1, 2, 3, 4);
  289. var newBounds = new Rect (10, 20, 30, 40);
  290. var view = new View (frame);
  291. view.Bounds = newBounds;
  292. Assert.Equal (new Rect (0, 0, 30, 40), view.Bounds);
  293. Assert.Equal (new Rect (1, 2, 30, 40), view.Frame);
  294. }
  295. [Fact]
  296. public void AbsoluteLayout_Setting_Bounds_Sets_Frame ()
  297. {
  298. var frame = new Rect (1, 2, 3, 4);
  299. var newBounds = new Rect (0, 0, 30, 40);
  300. var v = new View (frame);
  301. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  302. v.Bounds = newBounds;
  303. Assert.True (v.LayoutStyle == LayoutStyle.Absolute);
  304. Assert.Equal (newBounds, v.Bounds);
  305. Assert.Equal (new Rect (1, 2, newBounds.Width, newBounds.Height), v.Frame);
  306. Assert.Equal (new Rect (0, 0, newBounds.Width, newBounds.Height), v.Bounds);
  307. Assert.Equal (Pos.At (1), v.X);
  308. Assert.Equal (Pos.At (2), v.Y);
  309. Assert.Equal (Dim.Sized (30), v.Width);
  310. Assert.Equal (Dim.Sized (40), v.Height);
  311. newBounds = new Rect (0, 0, 3, 4);
  312. v.Bounds = newBounds;
  313. Assert.Equal (newBounds, v.Bounds);
  314. Assert.Equal (new Rect (1, 2, newBounds.Width, newBounds.Height), v.Frame);
  315. Assert.Equal (new Rect (0, 0, newBounds.Width, newBounds.Height), v.Bounds);
  316. Assert.Equal (Pos.At (1), v.X);
  317. Assert.Equal (Pos.At (2), v.Y);
  318. Assert.Equal (Dim.Sized (3), v.Width);
  319. Assert.Equal (Dim.Sized (4), v.Height);
  320. v.BorderStyle = LineStyle.Single;
  321. // Bounds should shrink
  322. Assert.Equal (new Rect (0, 0, 1, 2), v.Bounds);
  323. // Frame should not change
  324. Assert.Equal (new Rect (1, 2, 3, 4), v.Frame);
  325. Assert.Equal (Pos.At (1), v.X);
  326. Assert.Equal (Pos.At (2), v.Y);
  327. Assert.Equal (Dim.Sized (3), v.Width);
  328. Assert.Equal (Dim.Sized (4), v.Height);
  329. // Now set bounds bigger as before
  330. newBounds = new Rect (0, 0, 3, 4);
  331. v.Bounds = newBounds;
  332. Assert.Equal (newBounds, v.Bounds);
  333. // Frame grows because there's now a border
  334. Assert.Equal (new Rect (1, 2, 5, 6), v.Frame);
  335. Assert.Equal (new Rect (0, 0, newBounds.Width, newBounds.Height), v.Bounds);
  336. Assert.Equal (Pos.At (1), v.X);
  337. Assert.Equal (Pos.At (2), v.Y);
  338. Assert.Equal (Dim.Sized (5), v.Width);
  339. Assert.Equal (Dim.Sized (6), v.Height);
  340. }
  341. }