MouseTests.cs 22 KB

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