2
0

MouseTests.cs 23 KB

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