ClearViewportTests.cs 10.0 KB

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