ArrangementTests.cs 6.2 KB

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