MouseTests.cs 23 KB

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