ArrangementTests.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. using Xunit.Abstractions;
  2. namespace UnitTests.ViewBaseTests;
  3. public class ArrangementTests (ITestOutputHelper output)
  4. {
  5. private readonly ITestOutputHelper _output = output;
  6. [Fact]
  7. public void MouseGrabHandler_WorksWithMovableView_UsingNewMouseEvent ()
  8. {
  9. // This test proves that MouseGrabHandler works correctly with concurrent unit tests
  10. // using NewMouseEvent directly on views, without requiring Application.Init
  11. var superView = new View
  12. {
  13. Width = 80,
  14. Height = 25
  15. };
  16. superView.App = ApplicationImpl.Instance;
  17. var movableView = new View
  18. {
  19. Arrangement = ViewArrangement.Movable,
  20. BorderStyle = LineStyle.Single,
  21. X = 10,
  22. Y = 10,
  23. Width = 20,
  24. Height = 10
  25. };
  26. superView.Add (movableView);
  27. // Verify initial state
  28. Assert.NotNull (movableView.Border);
  29. Assert.Null (Application.Mouse.MouseGrabView);
  30. // Simulate mouse press on the border to start dragging
  31. var pressEvent = new MouseEventArgs
  32. {
  33. Position = new (1, 0), // Top border area
  34. Flags = MouseFlags.Button1Pressed
  35. };
  36. bool? result = movableView.Border.NewMouseEvent (pressEvent);
  37. // The border should have grabbed the mouse
  38. Assert.True (result);
  39. Assert.Equal (movableView.Border, superView.App.Mouse.MouseGrabView);
  40. // Simulate mouse drag
  41. var dragEvent = new MouseEventArgs
  42. {
  43. Position = new (5, 2),
  44. Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  45. };
  46. result = movableView.Border.NewMouseEvent (dragEvent);
  47. Assert.True (result);
  48. // Mouse should still be grabbed
  49. Assert.Equal (movableView.Border, superView.App.Mouse.MouseGrabView);
  50. // Simulate mouse release to end dragging
  51. var releaseEvent = new MouseEventArgs
  52. {
  53. Position = new (5, 2),
  54. Flags = MouseFlags.Button1Released
  55. };
  56. result = movableView.Border.NewMouseEvent (releaseEvent);
  57. Assert.True (result);
  58. // Mouse should be released
  59. Assert.Null (superView.App.Mouse.MouseGrabView);
  60. }
  61. [Fact]
  62. public void MouseGrabHandler_WorksWithResizableView_UsingNewMouseEvent ()
  63. {
  64. // This test proves MouseGrabHandler works for resizing operations
  65. var superView = new View
  66. {
  67. App = ApplicationImpl.Instance,
  68. Width = 80,
  69. Height = 25
  70. };
  71. var resizableView = new View
  72. {
  73. Arrangement = ViewArrangement.RightResizable,
  74. BorderStyle = LineStyle.Single,
  75. X = 10,
  76. Y = 10,
  77. Width = 20,
  78. Height = 10
  79. };
  80. superView.Add (resizableView);
  81. // Verify initial state
  82. Assert.NotNull (resizableView.Border);
  83. Assert.Null (Application.Mouse.MouseGrabView);
  84. // Calculate position on right border (border is at right edge)
  85. // Border.Frame.X is relative to parent, so we use coordinates relative to the border
  86. var pressEvent = new MouseEventArgs
  87. {
  88. Position = new (resizableView.Border.Frame.Width - 1, 5), // Right border area
  89. Flags = MouseFlags.Button1Pressed
  90. };
  91. bool? result = resizableView.Border.NewMouseEvent (pressEvent);
  92. // The border should have grabbed the mouse for resizing
  93. Assert.True (result);
  94. Assert.Equal (resizableView.Border, superView.App.Mouse.MouseGrabView);
  95. // Simulate dragging to resize
  96. var dragEvent = new MouseEventArgs
  97. {
  98. Position = new (resizableView.Border.Frame.Width + 3, 5),
  99. Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
  100. };
  101. result = resizableView.Border.NewMouseEvent (dragEvent);
  102. Assert.True (result);
  103. Assert.Equal (resizableView.Border, superView.App.Mouse.MouseGrabView);
  104. // Simulate mouse release
  105. var releaseEvent = new MouseEventArgs
  106. {
  107. Position = new (resizableView.Border.Frame.Width + 3, 5),
  108. Flags = MouseFlags.Button1Released
  109. };
  110. result = resizableView.Border.NewMouseEvent (releaseEvent);
  111. Assert.True (result);
  112. // Mouse should be released
  113. Assert.Null (superView.App.Mouse.MouseGrabView);
  114. }
  115. [Fact]
  116. public void MouseGrabHandler_ReleasesOnMultipleViews ()
  117. {
  118. // This test verifies MouseGrabHandler properly releases when switching between views
  119. var superView = new View { Width = 80, Height = 25 };
  120. superView.App = ApplicationImpl.Instance;
  121. var view1 = new View
  122. {
  123. Arrangement = ViewArrangement.Movable,
  124. BorderStyle = LineStyle.Single,
  125. X = 10,
  126. Y = 10,
  127. Width = 15,
  128. Height = 8
  129. };
  130. var view2 = new View
  131. {
  132. Arrangement = ViewArrangement.Movable,
  133. BorderStyle = LineStyle.Single,
  134. X = 30,
  135. Y = 10,
  136. Width = 15,
  137. Height = 8
  138. };
  139. superView.Add (view1, view2);
  140. superView.BeginInit ();
  141. superView.EndInit ();
  142. // Grab mouse on first view
  143. var pressEvent1 = new MouseEventArgs
  144. {
  145. Position = new (1, 0),
  146. Flags = MouseFlags.Button1Pressed
  147. };
  148. view1.Border!.NewMouseEvent (pressEvent1);
  149. Assert.Equal (view1.Border, superView.App.Mouse.MouseGrabView);
  150. // Release on first view
  151. var releaseEvent1 = new MouseEventArgs
  152. {
  153. Position = new (1, 0),
  154. Flags = MouseFlags.Button1Released
  155. };
  156. view1.Border.NewMouseEvent (releaseEvent1);
  157. Assert.Null (Application.Mouse.MouseGrabView);
  158. // Grab mouse on second view
  159. var pressEvent2 = new MouseEventArgs
  160. {
  161. Position = new (1, 0),
  162. Flags = MouseFlags.Button1Pressed
  163. };
  164. view2.Border!.NewMouseEvent (pressEvent2);
  165. Assert.Equal (view2.Border, superView.App.Mouse.MouseGrabView);
  166. // Release on second view
  167. var releaseEvent2 = new MouseEventArgs
  168. {
  169. Position = new (1, 0),
  170. Flags = MouseFlags.Button1Released
  171. };
  172. view2.Border.NewMouseEvent (releaseEvent2);
  173. Assert.Null (superView.App.Mouse.MouseGrabView);
  174. }
  175. }