MouseTests.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. using Moq;
  2. using UnitTests;
  3. namespace Terminal.Gui.ViewMouseTests;
  4. [Trait ("Category", "Input")]
  5. public class MouseTests : TestsAllViews
  6. {
  7. // TODO: Add more tests that ensure the above test works with positive adornments
  8. // Test drag to move
  9. [Theory]
  10. [InlineData (0, 0, 0, 0, false)]
  11. [InlineData (0, 0, 0, 4, false)]
  12. [InlineData (1, 0, 0, 4, false)]
  13. [InlineData (0, 1, 0, 4, true)]
  14. [InlineData (0, 0, 1, 4, false)]
  15. [InlineData (1, 1, 0, 3, false)]
  16. [InlineData (1, 1, 0, 4, false)]
  17. [InlineData (1, 1, 0, 5, true)]
  18. [InlineData (1, 1, 0, 6, false)]
  19. [InlineData (1, 1, 0, 11, false)]
  20. [InlineData (1, 1, 0, 12, true)]
  21. [InlineData (1, 1, 0, 13, false)]
  22. [InlineData (1, 1, 0, 14, false)]
  23. [AutoInitShutdown]
  24. public void ButtonPressed_In_Border_Starts_Drag (int marginThickness, int borderThickness, int paddingThickness, int xy, bool expectedMoved)
  25. {
  26. var testView = new View
  27. {
  28. CanFocus = true,
  29. X = 4,
  30. Y = 4,
  31. Width = 10,
  32. Height = 10,
  33. Arrangement = ViewArrangement.Movable
  34. };
  35. testView.Margin.Thickness = new (marginThickness);
  36. testView.Border.Thickness = new (borderThickness);
  37. testView.Padding.Thickness = new (paddingThickness);
  38. var top = new Toplevel ();
  39. top.Add (testView);
  40. RunState rs = Application.Begin (top);
  41. Assert.Equal (4, testView.Frame.X);
  42. Assert.Equal (new (4, 4), testView.Frame.Location);
  43. Application.RaiseMouseEvent (new () { ScreenPosition = new (xy, xy), Flags = MouseFlags.Button1Pressed });
  44. Application.RaiseMouseEvent (new () { ScreenPosition = new (xy + 1, xy + 1), Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition });
  45. AutoInitShutdownAttribute.RunIteration ();
  46. Assert.Equal (expectedMoved, new Point (5, 5) == testView.Frame.Location);
  47. top.Dispose ();
  48. }
  49. [Theory]
  50. [InlineData (MouseFlags.Button1Pressed, MouseFlags.Button1Released, MouseFlags.Button1Clicked)]
  51. [InlineData (MouseFlags.Button2Pressed, MouseFlags.Button2Released, MouseFlags.Button2Clicked)]
  52. [InlineData (MouseFlags.Button3Pressed, MouseFlags.Button3Released, MouseFlags.Button3Clicked)]
  53. [InlineData (MouseFlags.Button4Pressed, MouseFlags.Button4Released, MouseFlags.Button4Clicked)]
  54. public void WantContinuousButtonPressed_False_Button_Press_Release_DoesNotClick (MouseFlags pressed, MouseFlags released, MouseFlags clicked)
  55. {
  56. var me = new MouseEventArgs ();
  57. var view = new View
  58. {
  59. Width = 1,
  60. Height = 1,
  61. WantContinuousButtonPressed = false
  62. };
  63. var clickedCount = 0;
  64. view.MouseClick += (s, e) => clickedCount++;
  65. me.Flags = pressed;
  66. view.NewMouseEvent (me);
  67. Assert.Equal (0, clickedCount);
  68. me.Handled = false;
  69. me.Flags = pressed;
  70. view.NewMouseEvent (me);
  71. Assert.Equal (0, clickedCount);
  72. me.Handled = false;
  73. me.Flags = released;
  74. view.NewMouseEvent (me);
  75. Assert.Equal (0, clickedCount);
  76. me.Handled = false;
  77. me.Flags = clicked;
  78. view.NewMouseEvent (me);
  79. Assert.Equal (1, clickedCount);
  80. view.Dispose ();
  81. // Button1Pressed, Button1Released cause Application.MouseGrabHandler.MouseGrabView to be set
  82. Application.ResetState (true);
  83. }
  84. [Theory]
  85. [InlineData (MouseFlags.Button1Clicked)]
  86. [InlineData (MouseFlags.Button2Clicked)]
  87. [InlineData (MouseFlags.Button3Clicked)]
  88. [InlineData (MouseFlags.Button4Clicked)]
  89. public void WantContinuousButtonPressed_True_Button_Clicked_Raises_MouseClick (MouseFlags clicked)
  90. {
  91. var me = new MouseEventArgs ();
  92. var view = new View
  93. {
  94. Width = 1,
  95. Height = 1,
  96. WantContinuousButtonPressed = true
  97. };
  98. var clickedCount = 0;
  99. view.MouseClick += (s, e) => clickedCount++;
  100. me.Flags = clicked;
  101. view.NewMouseEvent (me);
  102. Assert.Equal (1, clickedCount);
  103. view.Dispose ();
  104. // Button1Pressed, Button1Released cause Application.MouseGrabHandler.MouseGrabView to be set
  105. Application.ResetState (true);
  106. }
  107. [Theory]
  108. [InlineData (MouseFlags.Button1Clicked)]
  109. [InlineData (MouseFlags.Button2Clicked)]
  110. [InlineData (MouseFlags.Button3Clicked)]
  111. [InlineData (MouseFlags.Button4Clicked)]
  112. public void WantContinuousButtonPressed_True_Button_Clicked_Raises_Selecting (MouseFlags clicked)
  113. {
  114. var me = new MouseEventArgs ();
  115. var view = new View
  116. {
  117. Width = 1,
  118. Height = 1,
  119. WantContinuousButtonPressed = true
  120. };
  121. var selectingCount = 0;
  122. view.Selecting += (s, e) => selectingCount++;
  123. me.Flags = clicked;
  124. view.NewMouseEvent (me);
  125. Assert.Equal (1, selectingCount);
  126. view.Dispose ();
  127. // Button1Pressed, Button1Released cause Application.MouseGrabHandler.MouseGrabView to be set
  128. Application.ResetState (true);
  129. }
  130. [Theory]
  131. [InlineData (MouseFlags.Button1Pressed, MouseFlags.Button1Released)]
  132. [InlineData (MouseFlags.Button2Pressed, MouseFlags.Button2Released)]
  133. [InlineData (MouseFlags.Button3Pressed, MouseFlags.Button3Released)]
  134. [InlineData (MouseFlags.Button4Pressed, MouseFlags.Button4Released)]
  135. public void WantContinuousButtonPressed_True_And_WantMousePositionReports_True_Button_Press_Release_Clicks (MouseFlags pressed, MouseFlags released)
  136. {
  137. var me = new MouseEventArgs ();
  138. var view = new View
  139. {
  140. Width = 1,
  141. Height = 1,
  142. WantContinuousButtonPressed = true,
  143. WantMousePositionReports = true
  144. };
  145. // Setup components for mouse held down
  146. var timed = new TimedEvents ();
  147. var grab = new MouseGrabHandler ();
  148. view.MouseHeldDown = new MouseHeldDown (view, timed, grab);
  149. // Register callback for what to do when the mouse is held down
  150. var clickedCount = 0;
  151. view.MouseHeldDown.MouseIsHeldDownTick += (_, _) => clickedCount++;
  152. // Mouse is currently not held down so should be no timers running
  153. Assert.Empty(timed.Timeouts);
  154. // When mouse is held down
  155. me.Flags = pressed;
  156. view.NewMouseEvent (me);
  157. Assert.Equal (0, clickedCount);
  158. me.Handled = false;
  159. // A timer should begin
  160. var t = Assert.Single (timed.Timeouts);
  161. // Invoke the timer
  162. t.Value.Callback.Invoke ();
  163. // Event should have been raised
  164. Assert.Equal (1, clickedCount);
  165. Assert.NotEmpty(timed.Timeouts);
  166. // When mouse is released
  167. me.Flags = released;
  168. view.NewMouseEvent (me);
  169. // timer should stop
  170. Assert.Empty (timed.Timeouts);
  171. Assert.Equal (1, clickedCount);
  172. view.Dispose ();
  173. }
  174. [Theory]
  175. [InlineData (MouseFlags.Button1Pressed, MouseFlags.Button1Released, MouseFlags.Button1Clicked)]
  176. [InlineData (MouseFlags.Button2Pressed, MouseFlags.Button2Released, MouseFlags.Button2Clicked)]
  177. [InlineData (MouseFlags.Button3Pressed, MouseFlags.Button3Released, MouseFlags.Button3Clicked)]
  178. [InlineData (MouseFlags.Button4Pressed, MouseFlags.Button4Released, MouseFlags.Button4Clicked)]
  179. public void WantContinuousButtonPressed_True_And_WantMousePositionReports_True_Button_Press_Release_Clicks_Repeatedly (
  180. MouseFlags pressed,
  181. MouseFlags released,
  182. MouseFlags clicked
  183. )
  184. {
  185. var me = new MouseEventArgs ();
  186. var view = new View
  187. {
  188. Width = 1,
  189. Height = 1,
  190. WantContinuousButtonPressed = true,
  191. WantMousePositionReports = true
  192. };
  193. // Setup components for mouse held down
  194. var timed = new TimedEvents ();
  195. var grab = new MouseGrabHandler ();
  196. view.MouseHeldDown = new MouseHeldDown (view, timed, grab);
  197. // Register callback for what to do when the mouse is held down
  198. var clickedCount = 0;
  199. view.MouseHeldDown.MouseIsHeldDownTick += (_, _) => clickedCount++;
  200. Assert.Empty (timed.Timeouts);
  201. me.Flags = pressed;
  202. view.NewMouseEvent (me);
  203. Assert.Equal (0, clickedCount);
  204. me.Handled = false;
  205. Assert.NotEmpty(timed.Timeouts);
  206. Assert.Single (timed.Timeouts).Value.Callback.Invoke ();
  207. me.Flags = pressed;
  208. view.NewMouseEvent (me);
  209. Assert.Equal (1, clickedCount);
  210. me.Handled = false;
  211. Assert.NotEmpty (timed.Timeouts);
  212. me.Flags = released;
  213. view.NewMouseEvent (me);
  214. Assert.Equal (1, clickedCount);
  215. me.Handled = false;
  216. Assert.Empty (timed.Timeouts);
  217. me.Flags = clicked;
  218. view.NewMouseEvent (me);
  219. Assert.Equal (1, clickedCount);
  220. view.Dispose ();
  221. }
  222. [Fact]
  223. public void WantContinuousButtonPressed_True_And_WantMousePositionReports_True_Move_InViewport_OutOfViewport_Keeps_Counting ()
  224. {
  225. var me = new MouseEventArgs ();
  226. var view = new View
  227. {
  228. Width = 1,
  229. Height = 1,
  230. WantContinuousButtonPressed = true,
  231. WantMousePositionReports = true
  232. };
  233. // Setup components for mouse held down
  234. var timed = new TimedEvents ();
  235. var grab = new MouseGrabHandler ();
  236. view.MouseHeldDown = new MouseHeldDown (view, timed, grab);
  237. // Register callback for what to do when the mouse is held down
  238. var clickedCount = 0;
  239. view.MouseHeldDown.MouseIsHeldDownTick += (_, _) => clickedCount++;
  240. // Start in Viewport
  241. me.Flags = MouseFlags.Button1Pressed;
  242. me.Position = me.Position with { X = 0 };
  243. view.NewMouseEvent (me);
  244. Assert.Equal (0, clickedCount);
  245. me.Handled = false;
  246. // Mouse is held down so timer should be ticking
  247. Assert.NotEmpty (timed.Timeouts);
  248. Assert.Equal (clickedCount,0);
  249. // Don't wait, just force it to expire
  250. Assert.Single (timed.Timeouts).Value.Callback.Invoke ();
  251. Assert.Equal (clickedCount, 1);
  252. // Move out of Viewport
  253. me.Flags = MouseFlags.Button1Pressed;
  254. me.Position = me.Position with { X = 1 };
  255. view.NewMouseEvent (me);
  256. Assert.Single (timed.Timeouts).Value.Callback.Invoke ();
  257. Assert.Equal (clickedCount, 2);
  258. me.Handled = false;
  259. // Move into Viewport
  260. me.Flags = MouseFlags.Button1Pressed;
  261. me.Position = me.Position with { X = 0 };
  262. view.NewMouseEvent (me);
  263. Assert.NotEmpty (timed.Timeouts);
  264. Assert.Equal (2, clickedCount);
  265. me.Handled = false;
  266. // Stay in Viewport
  267. me.Flags = MouseFlags.Button1Pressed;
  268. me.Position = me.Position with { X = 0 };
  269. view.NewMouseEvent (me);
  270. Assert.Single (timed.Timeouts).Value.Callback.Invoke ();
  271. Assert.Equal (3, clickedCount);
  272. me.Handled = false;
  273. view.Dispose ();
  274. }
  275. //[Theory]
  276. //[InlineData (true, MouseState.None, 0, 0, 0, 0)]
  277. //[InlineData (true, MouseState.In, 0, 0, 0, 0)]
  278. //[InlineData (true, MouseState.Pressed, 0, 0, 1, 0)]
  279. //[InlineData (true, MouseState.PressedOutside, 0, 0, 0, 1)]
  280. //public void MouseState_Button1_Pressed_Then_Released_Outside (bool inViewport, MouseState highlightFlags, int noneCount, int expectedInCount, int expectedPressedCount, int expectedPressedOutsideCount)
  281. //{
  282. // var testView = new MouseEventTestView
  283. // {
  284. // HighlightStates = highlightFlags
  285. // };
  286. // Assert.Equal (0, testView.MouseStateInCount);
  287. // Assert.Equal (0, testView.MouseStatePressedCount);
  288. // Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  289. // Assert.Equal (0, testView.MouseStateNoneCount);
  290. // testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed, Position = new (inViewport ? 0 : 1, 0) });
  291. // Assert.Equal (expectedInCount, testView.MouseStateInCount);
  292. // Assert.Equal (expectedPressedCount, testView.MouseStatePressedCount);
  293. // Assert.Equal (expectedPressedOutsideCount, testView.MouseStatePressedOutsideCount);
  294. // Assert.Equal (noneCount, testView.MouseStateNoneCount);
  295. // testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Released, Position = new (inViewport ? 0 : 1, 0) });
  296. // Assert.Equal (expectedInCount, testView.MouseStateInCount);
  297. // Assert.Equal (expectedPressedCount, testView.MouseStatePressedCount);
  298. // Assert.Equal (expectedPressedOutsideCount, testView.MouseStatePressedOutsideCount);
  299. // Assert.Equal (noneCount, testView.MouseStateNoneCount);
  300. // testView.Dispose ();
  301. // // Button1Pressed, Button1Released cause Application.MouseGrabHandler.MouseGrabView to be set
  302. // Application.ResetState (true);
  303. //}
  304. // TODO: Add tests for each combination of HighlightFlags
  305. [Theory]
  306. [InlineData (0)]
  307. [InlineData (1)]
  308. [InlineData (10)]
  309. public void MouseState_None_Button1_Pressed_Move_No_Changes (int x)
  310. {
  311. var testView = new MouseEventTestView
  312. {
  313. HighlightStates = MouseState.None
  314. };
  315. bool inViewport = testView.Viewport.Contains (x, 0);
  316. // Start at 0,0 ; in viewport
  317. testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed });
  318. Assert.Equal (0, testView.MouseStateInCount);
  319. Assert.Equal (0, testView.MouseStatePressedCount);
  320. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  321. Assert.Equal (0, testView.MouseStateNoneCount);
  322. // Move to x,0
  323. testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed, Position = new (x, 0) });
  324. if (inViewport)
  325. {
  326. Assert.Equal (0, testView.MouseStateInCount);
  327. Assert.Equal (0, testView.MouseStatePressedCount);
  328. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  329. Assert.Equal (0, testView.MouseStateNoneCount);
  330. }
  331. else
  332. {
  333. Assert.Equal (0, testView.MouseStateInCount);
  334. Assert.Equal (0, testView.MouseStatePressedCount);
  335. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  336. Assert.Equal (0, testView.MouseStateNoneCount);
  337. }
  338. // Move backto 0,0 ; in viewport
  339. testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed });
  340. if (inViewport)
  341. {
  342. Assert.Equal (0, testView.MouseStateInCount);
  343. Assert.Equal (0, testView.MouseStatePressedCount);
  344. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  345. Assert.Equal (0, testView.MouseStateNoneCount);
  346. }
  347. else
  348. {
  349. Assert.Equal (0, testView.MouseStateInCount);
  350. Assert.Equal (0, testView.MouseStatePressedCount);
  351. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  352. Assert.Equal (0, testView.MouseStateNoneCount);
  353. }
  354. testView.Dispose ();
  355. // Button1Pressed, Button1Released cause Application.MouseGrabHandler.MouseGrabView to be set
  356. Application.ResetState (true);
  357. }
  358. [Theory]
  359. [InlineData (0)]
  360. [InlineData (1)]
  361. [InlineData (10)]
  362. public void MouseState_Pressed_Button1_Pressed_Move_Keeps_Pressed (int x)
  363. {
  364. var testView = new MouseEventTestView
  365. {
  366. HighlightStates = MouseState.Pressed
  367. };
  368. bool inViewport = testView.Viewport.Contains (x, 0);
  369. // Start at 0,0 ; in viewport
  370. testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed });
  371. Assert.Equal (0, testView.MouseStateInCount);
  372. Assert.Equal (1, testView.MouseStatePressedCount);
  373. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  374. Assert.Equal (0, testView.MouseStateNoneCount);
  375. // Move to x,0
  376. testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed, Position = new (x, 0) });
  377. if (inViewport)
  378. {
  379. Assert.Equal (0, testView.MouseStateInCount);
  380. Assert.Equal (1, testView.MouseStatePressedCount);
  381. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  382. Assert.Equal (0, testView.MouseStateNoneCount);
  383. }
  384. else
  385. {
  386. Assert.Equal (0, testView.MouseStateInCount);
  387. Assert.Equal (1, testView.MouseStatePressedCount);
  388. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  389. Assert.Equal (0, testView.MouseStateNoneCount);
  390. }
  391. // Move backto 0,0 ; in viewport
  392. testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed });
  393. if (inViewport)
  394. {
  395. Assert.Equal (0, testView.MouseStateInCount);
  396. Assert.Equal (1, testView.MouseStatePressedCount);
  397. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  398. Assert.Equal (0, testView.MouseStateNoneCount);
  399. }
  400. else
  401. {
  402. Assert.Equal (0, testView.MouseStateInCount);
  403. Assert.Equal (1, testView.MouseStatePressedCount);
  404. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  405. Assert.Equal (0, testView.MouseStateNoneCount);
  406. }
  407. testView.Dispose ();
  408. // Button1Pressed, Button1Released cause Application.MouseGrabHandler.MouseGrabView to be set
  409. Application.ResetState (true);
  410. }
  411. [Theory]
  412. [InlineData (0)]
  413. [InlineData (1)]
  414. [InlineData (10)]
  415. public void MouseState_PressedOutside_Button1_Pressed_Move_Raises_PressedOutside (int x)
  416. {
  417. var testView = new MouseEventTestView
  418. {
  419. HighlightStates = MouseState.PressedOutside,
  420. WantContinuousButtonPressed = false
  421. };
  422. bool inViewport = testView.Viewport.Contains (x, 0);
  423. // Start at 0,0 ; in viewport
  424. testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed });
  425. Assert.Equal (0, testView.MouseStateInCount);
  426. Assert.Equal (0, testView.MouseStatePressedCount);
  427. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  428. Assert.Equal (0, testView.MouseStateNoneCount);
  429. // Move to x,0
  430. testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed, Position = new (x, 0) });
  431. if (inViewport)
  432. {
  433. Assert.Equal (0, testView.MouseStateInCount);
  434. Assert.Equal (0, testView.MouseStatePressedCount);
  435. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  436. Assert.Equal (0, testView.MouseStateNoneCount);
  437. }
  438. else
  439. {
  440. Assert.Equal (0, testView.MouseStateInCount);
  441. Assert.Equal (0, testView.MouseStatePressedCount);
  442. Assert.Equal (1, testView.MouseStatePressedOutsideCount);
  443. Assert.Equal (0, testView.MouseStateNoneCount);
  444. }
  445. // Move backto 0,0 ; in viewport
  446. testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed });
  447. if (inViewport)
  448. {
  449. Assert.Equal (0, testView.MouseStateInCount);
  450. Assert.Equal (0, testView.MouseStatePressedCount);
  451. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  452. Assert.Equal (0, testView.MouseStateNoneCount);
  453. }
  454. else
  455. {
  456. Assert.Equal (0, testView.MouseStateInCount);
  457. Assert.Equal (0, testView.MouseStatePressedCount);
  458. Assert.Equal (1, testView.MouseStatePressedOutsideCount);
  459. Assert.Equal (1, testView.MouseStateNoneCount);
  460. }
  461. testView.Dispose ();
  462. // Button1Pressed, Button1Released cause Application.MouseGrabHandler.MouseGrabView to be set
  463. Application.ResetState (true);
  464. }
  465. [Theory]
  466. [InlineData (0)]
  467. [InlineData (1)]
  468. [InlineData (10)]
  469. public void MouseState_PressedOutside_Button1_Pressed_Move_Raises_PressedOutside_WantContinuousButtonPressed (int x)
  470. {
  471. var testView = new MouseEventTestView
  472. {
  473. HighlightStates = MouseState.PressedOutside,
  474. WantContinuousButtonPressed = true
  475. };
  476. bool inViewport = testView.Viewport.Contains (x, 0);
  477. // Start at 0,0 ; in viewport
  478. testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed });
  479. Assert.Equal (0, testView.MouseStateInCount);
  480. Assert.Equal (0, testView.MouseStatePressedCount);
  481. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  482. Assert.Equal (0, testView.MouseStateNoneCount);
  483. // Move to x,0
  484. testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed, Position = new (x, 0) });
  485. if (inViewport)
  486. {
  487. Assert.Equal (0, testView.MouseStateInCount);
  488. Assert.Equal (0, testView.MouseStatePressedCount);
  489. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  490. Assert.Equal (0, testView.MouseStateNoneCount);
  491. }
  492. else
  493. {
  494. Assert.Equal (0, testView.MouseStateInCount);
  495. Assert.Equal (0, testView.MouseStatePressedCount);
  496. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  497. Assert.Equal (0, testView.MouseStateNoneCount);
  498. }
  499. // Move backto 0,0 ; in viewport
  500. testView.NewMouseEvent (new () { Flags = MouseFlags.Button1Pressed });
  501. if (inViewport)
  502. {
  503. Assert.Equal (0, testView.MouseStateInCount);
  504. Assert.Equal (0, testView.MouseStatePressedCount);
  505. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  506. Assert.Equal (0, testView.MouseStateNoneCount);
  507. }
  508. else
  509. {
  510. Assert.Equal (0, testView.MouseStateInCount);
  511. Assert.Equal (0, testView.MouseStatePressedCount);
  512. Assert.Equal (0, testView.MouseStatePressedOutsideCount);
  513. Assert.Equal (0, testView.MouseStateNoneCount);
  514. }
  515. testView.Dispose ();
  516. // Button1Pressed, Button1Released cause Application.MouseGrabHandler.MouseGrabView to be set
  517. Application.ResetState (true);
  518. }
  519. private class MouseEventTestView : View
  520. {
  521. public int MouseEnterCount { get; private set; }
  522. public int MouseLeaveCount { get; private set; }
  523. public int MouseStatePressedOutsideCount { get; private set; }
  524. public int MouseStateInCount { get; private set; }
  525. public int MouseStatePressedCount { get; private set; }
  526. public int MouseStateNoneCount { get; private set; }
  527. public MouseEventTestView ()
  528. {
  529. Height = 1;
  530. Width = 1;
  531. CanFocus = true;
  532. Id = "mouseEventTestView";
  533. MouseLeave += (s, e) => { MouseEnterCount++; };
  534. MouseEnter += (s, e) => { MouseLeaveCount++; };
  535. }
  536. /// <inheritdoc/>
  537. protected override void OnMouseStateChanged (EventArgs<MouseState> args)
  538. {
  539. switch (args.Value)
  540. {
  541. case MouseState.None:
  542. MouseStateNoneCount++;
  543. break;
  544. case MouseState.In:
  545. MouseStateInCount++;
  546. break;
  547. case MouseState.Pressed:
  548. MouseStatePressedCount++;
  549. break;
  550. case MouseState.PressedOutside:
  551. MouseStatePressedOutsideCount++;
  552. break;
  553. }
  554. base.OnMouseStateChanged (args);
  555. }
  556. }
  557. }