2
0

GuiTestContextMouseEventTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. using System.Drawing;
  2. using TerminalGuiFluentTesting;
  3. using TerminalGuiFluentTestingXunit;
  4. using Xunit.Abstractions;
  5. namespace IntegrationTests.FluentTests;
  6. /// <summary>
  7. /// Integration tests for GuiTestContext mouse event handling (LeftClick, RightClick).
  8. /// </summary>
  9. public class GuiTestContextMouseEventTests (ITestOutputHelper outputHelper)
  10. {
  11. private readonly TextWriter _out = new TestOutputWriter (outputHelper);
  12. [Theory]
  13. [ClassData (typeof (TestDrivers))]
  14. public void EnqueueMouseEvent_Click_RaisesAccepting (TestDriver d)
  15. {
  16. var clickedCount = 0;
  17. var button = new Button
  18. {
  19. X = 5,
  20. Y = 5,
  21. Text = "Click Me"
  22. };
  23. button.Accepting += (s, e) => clickedCount++;
  24. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  25. .Add (button)
  26. .LeftClick (6, 6) // Click inside button (accounting for Window's border)
  27. .AssertEqual (1, clickedCount);
  28. }
  29. [Theory]
  30. [ClassData (typeof (TestDrivers))]
  31. public void EnqueueMouseEvent_Click_TView_RaisesAccepting (TestDriver d)
  32. {
  33. var clickedCount = 0;
  34. var button = new Button
  35. {
  36. X = 5,
  37. Y = 5,
  38. Text = "Click Me"
  39. };
  40. button.Accepting += (s, e) => clickedCount++;
  41. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  42. .Add (button)
  43. .LeftClick<Button> (b => b.Text == "Click Me")
  44. .AssertEqual (1, clickedCount);
  45. }
  46. [Theory]
  47. [ClassData (typeof (TestDrivers))]
  48. public void EnqueueMouseEvent_Click_OnView_RaisesMouseEvent (TestDriver d)
  49. {
  50. var mouseReceived = false;
  51. Point receivedPosition = Point.Empty;
  52. var view = new View
  53. {
  54. X = 10,
  55. Y = 5,
  56. Width = 20,
  57. Height = 5
  58. };
  59. view.MouseEvent += (s, e) =>
  60. {
  61. mouseReceived = true;
  62. receivedPosition = e.Position;
  63. };
  64. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  65. .Add (view)
  66. .LeftClick (15, 7)
  67. .AssertTrue (mouseReceived);
  68. }
  69. [Theory]
  70. [ClassData (typeof (TestDrivers))]
  71. public void EnqueueMouseEvent_MultipleClicks_ProcessesInOrder (TestDriver d)
  72. {
  73. var clickCount = 0;
  74. var button = new Button
  75. {
  76. X = 5,
  77. Y = 5,
  78. Text = "Click Me"
  79. };
  80. button.Accepting += (s, e) => clickCount++;
  81. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  82. .Add (button)
  83. .LeftClick (6, 6)
  84. .LeftClick (6, 6)
  85. .LeftClick (6, 6)
  86. .AssertEqual (3, clickCount);
  87. }
  88. [Theory]
  89. [ClassData (typeof (TestDrivers))]
  90. public void EnqueueMouseEvent_RightClick_RaisesCorrectEvent (TestDriver d)
  91. {
  92. var rightClickCount = 0;
  93. var view = new View
  94. {
  95. X = 10,
  96. Y = 5,
  97. Width = 20,
  98. Height = 5
  99. };
  100. view.MouseEvent += (s, e) =>
  101. {
  102. if (e.Flags.HasFlag (MouseFlags.Button3Clicked))
  103. {
  104. rightClickCount++;
  105. }
  106. };
  107. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  108. .Add (view)
  109. .RightClick (15, 7)
  110. .AssertEqual (1, rightClickCount);
  111. }
  112. [Theory]
  113. [ClassData (typeof (TestDrivers))]
  114. public void EnqueueMouseEvent_Click_SetsFocusOnView (TestDriver d)
  115. {
  116. var view1 = new View
  117. {
  118. Id = "view1",
  119. X = 5,
  120. Y = 5,
  121. Width = 10,
  122. Height = 5,
  123. CanFocus = true
  124. };
  125. var view2 = new View
  126. {
  127. Id = "view2",
  128. X = 20,
  129. Y = 5,
  130. Width = 10,
  131. Height = 5,
  132. CanFocus = true
  133. };
  134. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  135. .Add (view1)
  136. .Add (view2)
  137. .Then ((_) => view1.SetFocus ())
  138. .AssertTrue (view1.HasFocus)
  139. .LeftClick (25, 7) // Click on view2
  140. .AssertFalse (view1.HasFocus)
  141. .AssertTrue (view2.HasFocus);
  142. }
  143. [Theory]
  144. [ClassData (typeof (TestDrivers))]
  145. public void EnqueueMouseEvent_ChainedWithKeyboard_WorksCorrectly (TestDriver d)
  146. {
  147. var clickCount = 0;
  148. var button = new Button
  149. {
  150. X = 5,
  151. Y = 5,
  152. Text = "Click Me"
  153. };
  154. button.Accepting += (s, e) => clickCount++;
  155. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  156. .Add (button)
  157. .LeftClick (6, 6) // Click button to focus it
  158. .AssertEqual (1, clickCount)
  159. .AssertTrue (button.HasFocus)
  160. .EnqueueKeyEvent (Key.Enter) // Press Enter
  161. .AssertEqual (2, clickCount); // Should trigger button again
  162. }
  163. [Theory]
  164. [ClassData (typeof (TestDrivers))]
  165. public void EnqueueMouseEvent_Click_OnTextField_SetsCaretPosition (TestDriver d)
  166. {
  167. var textField = new TextField
  168. {
  169. X = 5,
  170. Y = 5,
  171. Width = 20,
  172. Text = "Hello World"
  173. };
  174. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  175. .Add (textField)
  176. .LeftClick (11, 6) // Click in middle of text (accounting for border)
  177. .AssertTrue (textField.HasFocus);
  178. }
  179. [Theory]
  180. [ClassData (typeof (TestDrivers))]
  181. public void EnqueueMouseEvent_RapidClicks_AllProcessed (TestDriver d)
  182. {
  183. var clickCount = 0;
  184. var view = new View
  185. {
  186. X = 10,
  187. Y = 5,
  188. Width = 20,
  189. Height = 5
  190. };
  191. view.MouseEvent += (s, e) => clickCount++;
  192. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  193. .Add (view);
  194. // Rapid fire 10 clicks
  195. for (var i = 0; i < 10; i++)
  196. {
  197. context.LeftClick (15, 7);
  198. }
  199. context.AssertEqual (10, clickCount);
  200. }
  201. [Theory]
  202. [ClassData (typeof (TestDrivers))]
  203. public void EnqueueMouseEvent_Click_OutsideView_DoesNotRaiseEvent (TestDriver d)
  204. {
  205. var clickCount = 0;
  206. var view = new View
  207. {
  208. X = 10,
  209. Y = 5,
  210. Width = 10,
  211. Height = 5
  212. };
  213. view.MouseEvent += (s, e) => clickCount++;
  214. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  215. .Add (view)
  216. .LeftClick (5, 5) // Click outside view
  217. .AssertEqual (0, clickCount);
  218. }
  219. [Theory]
  220. [ClassData (typeof (TestDrivers))]
  221. public void EnqueueMouseEvent_ClickOnDisabledView_DoesNotTrigger (TestDriver d)
  222. {
  223. var clickCount = 0;
  224. var button = new Button
  225. {
  226. X = 5,
  227. Y = 5,
  228. Text = "Click Me",
  229. Enabled = false
  230. };
  231. button.Accepting += (s, e) => clickCount++;
  232. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  233. .Add (button)
  234. .LeftClick (6, 6)
  235. .AssertEqual (0, clickCount); // Should not increment because button is disabled
  236. }
  237. [Theory]
  238. [ClassData (typeof (TestDrivers))]
  239. public void EnqueueMouseEvent_AfterResize_StillWorks (TestDriver d)
  240. {
  241. var clickCount = 0;
  242. var button = new Button
  243. {
  244. X = 5,
  245. Y = 5,
  246. Text = "Click Me"
  247. };
  248. button.Accepting += (s, e) => clickCount++;
  249. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  250. .Add (button)
  251. .ResizeConsole (50, 20)
  252. .LeftClick (6, 6)
  253. .AssertEqual (1, clickCount);
  254. }
  255. [Theory]
  256. [ClassData (typeof (TestDrivers))]
  257. public void EnqueueMouseEvent_WithCheckBox_TogglesState (TestDriver d)
  258. {
  259. var checkBox = new CheckBox
  260. {
  261. X = 5,
  262. Y = 5,
  263. Text = "Check Me"
  264. };
  265. using GuiTestContext context = With.A<Window> (40, 10, d, _out)
  266. .Add (checkBox)
  267. .AssertEqual (CheckState.UnChecked, checkBox.CheckedState)
  268. .LeftClick (6, 6) // Click checkbox
  269. .AssertEqual (CheckState.Checked, checkBox.CheckedState)
  270. .LeftClick (6, 6) // Click again
  271. .AssertEqual (CheckState.UnChecked, checkBox.CheckedState);
  272. }
  273. [Theory]
  274. [ClassData (typeof (TestDrivers))]
  275. public void EnqueueMouseEvent_WithListView_SelectsItem (TestDriver d)
  276. {
  277. var listView = new ListView
  278. {
  279. X = 5,
  280. Y = 5,
  281. Width = 20,
  282. Height = 10
  283. };
  284. listView.SetSource (["Item1", "Item2", "Item3", "Item4", "Item5"]);
  285. listView.SelectedItem = 0;
  286. using GuiTestContext context = With.A<Window> (40, 20, d, _out)
  287. .Add (listView)
  288. .AssertEqual (0, listView.SelectedItem)
  289. .LeftClick (6, 7) // Click on Item2 (accounting for header/border)
  290. .AssertEqual (1, listView.SelectedItem);
  291. }
  292. }