ClearViewportTests.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. #nullable enable
  2. using Moq;
  3. using UnitTests;
  4. using Xunit.Abstractions;
  5. namespace UnitTests.ViewBaseTests;
  6. [Trait ("Category", "Output")]
  7. public class ClearViewportTests (ITestOutputHelper output)
  8. {
  9. public class TestableView : View
  10. {
  11. public bool TestOnClearingViewport () { return OnClearingViewport (); }
  12. public int OnClearingViewportCalled { get; set; }
  13. public bool CancelOnClearingViewport { get; set; }
  14. protected override bool OnClearingViewport ()
  15. {
  16. OnClearingViewportCalled++;
  17. return CancelOnClearingViewport;
  18. }
  19. public int OnClearedViewportCalled { get; set; }
  20. protected override void OnClearedViewport () { OnClearedViewportCalled++; }
  21. }
  22. [Fact]
  23. public void DoClearViewport_ViewportIsTransparent_DoesNotClear ()
  24. {
  25. // Arrange
  26. Mock<TestableView> view = new () { CallBase = true };
  27. view.Object.ViewportSettings = ViewportSettingsFlags.Transparent;
  28. // Act
  29. view.Object.DoClearViewport ();
  30. // Assert
  31. Assert.Equal (0, view.Object.OnClearingViewportCalled);
  32. Assert.Equal (0, view.Object.OnClearedViewportCalled);
  33. }
  34. [Fact]
  35. public void DoClearViewport_OnClearingViewportReturnsTrue_DoesNotClear ()
  36. {
  37. // Arrange
  38. Mock<TestableView> view = new () { CallBase = true };
  39. view.Object.CancelOnClearingViewport = true;
  40. // Act
  41. view.Object.DoClearViewport ();
  42. // Assert
  43. Assert.Equal (0, view.Object.OnClearedViewportCalled);
  44. }
  45. [Fact]
  46. public void DoClearViewport_ClearingViewportEventCancelled_DoesNotClear ()
  47. {
  48. // Arrange
  49. Mock<TestableView> view = new () { CallBase = true };
  50. view.Object.ClearingViewport += (sender, e) => e.Cancel = true;
  51. // Act
  52. view.Object.DoClearViewport ();
  53. // Assert
  54. Assert.Equal (0, view.Object.OnClearedViewportCalled);
  55. }
  56. [Fact]
  57. public void DoClearViewport_ClearsViewport ()
  58. {
  59. // Arrange
  60. Mock<TestableView> view = new () { CallBase = true };
  61. // Act
  62. view.Object.DoClearViewport ();
  63. // Assert
  64. Assert.Equal (1, view.Object.OnClearedViewportCalled);
  65. }
  66. [Fact]
  67. public void DoClearViewport_RaisesClearingViewportEvent ()
  68. {
  69. // Arrange
  70. Mock<TestableView> view = new () { CallBase = true };
  71. var eventRaised = false;
  72. view.Object.ClearingViewport += (sender, e) => eventRaised = true;
  73. // Act
  74. view.Object.DoClearViewport ();
  75. // Assert
  76. Assert.True (eventRaised);
  77. }
  78. [Fact]
  79. [SetupFakeApplication]
  80. public void Clear_ClearsEntireViewport ()
  81. {
  82. var superView = new View
  83. {
  84. App = ApplicationImpl.Instance,
  85. Width = Dim.Fill (), Height = Dim.Fill ()
  86. };
  87. var view = new View
  88. {
  89. Text = "X",
  90. X = 1, Y = 1,
  91. Width = 3, Height = 3,
  92. BorderStyle = LineStyle.Single
  93. };
  94. superView.Add (view);
  95. superView.BeginInit ();
  96. superView.EndInit ();
  97. superView.LayoutSubViews ();
  98. superView.Draw ();
  99. DriverAssert.AssertDriverContentsWithFrameAre (
  100. @"
  101. ┌─┐
  102. │X│
  103. └─┘",
  104. output);
  105. // On Draw exit the view is excluded from the clip, so this will do nothing.
  106. view.ClearViewport ();
  107. DriverAssert.AssertDriverContentsWithFrameAre (
  108. @"
  109. ┌─┐
  110. │X│
  111. └─┘",
  112. output);
  113. view.SetClipToScreen ();
  114. view.ClearViewport ();
  115. DriverAssert.AssertDriverContentsWithFrameAre (
  116. @"
  117. ┌─┐
  118. │ │
  119. └─┘",
  120. output);
  121. }
  122. [Fact]
  123. [SetupFakeApplication]
  124. public void Clear_WithClearVisibleContentOnly_ClearsVisibleContentOnly ()
  125. {
  126. var superView = new View
  127. {
  128. App = ApplicationImpl.Instance,
  129. Width = Dim.Fill (), Height = Dim.Fill ()
  130. };
  131. var view = new View
  132. {
  133. Text = "X",
  134. X = 1, Y = 1,
  135. Width = 3, Height = 3,
  136. BorderStyle = LineStyle.Single,
  137. ViewportSettings = ViewportSettingsFlags.ClearContentOnly
  138. };
  139. superView.Add (view);
  140. superView.BeginInit ();
  141. superView.EndInit ();
  142. superView.LayoutSubViews ();
  143. superView.Draw ();
  144. DriverAssert.AssertDriverContentsWithFrameAre (
  145. @"
  146. ┌─┐
  147. │X│
  148. └─┘",
  149. output);
  150. view.SetClipToScreen ();
  151. view.ClearViewport ();
  152. DriverAssert.AssertDriverContentsWithFrameAre (
  153. @"
  154. ┌─┐
  155. │ │
  156. └─┘",
  157. output);
  158. }
  159. [Fact]
  160. [AutoInitShutdown]
  161. public void Clear_Viewport_Can_Use_Driver_AddRune_Or_AddStr_Methods ()
  162. {
  163. var view = new FrameView { Width = Dim.Fill (), Height = Dim.Fill (), BorderStyle = LineStyle.Single };
  164. view.DrawingContent += (s, e) =>
  165. {
  166. Region? savedClip = view.AddViewportToClip ();
  167. for (var row = 0; row < view.Viewport.Height; row++)
  168. {
  169. Application.Driver?.Move (1, row + 1);
  170. for (var col = 0; col < view.Viewport.Width; col++)
  171. {
  172. Application.Driver?.AddStr ($"{col}");
  173. }
  174. }
  175. view.SetClip (savedClip);
  176. e.Cancel = true;
  177. };
  178. var top = new Runnable ();
  179. top.Add (view);
  180. Application.Begin (top);
  181. Application.Driver!.SetScreenSize (20, 10);
  182. Application.LayoutAndDraw ();
  183. var expected = @"
  184. ┌──────────────────┐
  185. │012345678910111213│
  186. │012345678910111213│
  187. │012345678910111213│
  188. │012345678910111213│
  189. │012345678910111213│
  190. │012345678910111213│
  191. │012345678910111213│
  192. │012345678910111213│
  193. └──────────────────┘
  194. "
  195. ;
  196. Rectangle pos = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  197. Assert.Equal (new (0, 0, 20, 10), pos);
  198. view.FillRect (view.Viewport);
  199. expected = @"
  200. ┌──────────────────┐
  201. │ │
  202. │ │
  203. │ │
  204. │ │
  205. │ │
  206. │ │
  207. │ │
  208. │ │
  209. └──────────────────┘
  210. "
  211. ;
  212. pos = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  213. top.Dispose ();
  214. }
  215. [Fact]
  216. [AutoInitShutdown]
  217. public void Clear_Can_Use_Driver_AddRune_Or_AddStr_Methods ()
  218. {
  219. var view = new FrameView { Width = Dim.Fill (), Height = Dim.Fill (), BorderStyle = LineStyle.Single };
  220. view.DrawingContent += (s, e) =>
  221. {
  222. Region? savedClip = view.AddViewportToClip ();
  223. for (var row = 0; row < view.Viewport.Height; row++)
  224. {
  225. Application.Driver?.Move (1, row + 1);
  226. for (var col = 0; col < view.Viewport.Width; col++)
  227. {
  228. Application.Driver?.AddStr ($"{col}");
  229. }
  230. }
  231. view.SetClip (savedClip);
  232. e.Cancel = true;
  233. };
  234. var top = new Runnable ();
  235. top.Add (view);
  236. Application.Begin (top);
  237. Application.Driver!.SetScreenSize (20, 10);
  238. Application.LayoutAndDraw ();
  239. var expected = @"
  240. ┌──────────────────┐
  241. │012345678910111213│
  242. │012345678910111213│
  243. │012345678910111213│
  244. │012345678910111213│
  245. │012345678910111213│
  246. │012345678910111213│
  247. │012345678910111213│
  248. │012345678910111213│
  249. └──────────────────┘
  250. "
  251. ;
  252. Rectangle pos = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  253. Assert.Equal (new (0, 0, 20, 10), pos);
  254. view.FillRect (view.Viewport);
  255. expected = @"
  256. ┌──────────────────┐
  257. │ │
  258. │ │
  259. │ │
  260. │ │
  261. │ │
  262. │ │
  263. │ │
  264. │ │
  265. └──────────────────┘
  266. ";
  267. pos = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
  268. top.Dispose ();
  269. }
  270. }