| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- using Xunit.Abstractions;
- namespace UnitTests.ViewBaseTests;
- public class ArrangementTests (ITestOutputHelper output)
- {
- private readonly ITestOutputHelper _output = output;
- [Fact]
- public void MouseGrabHandler_WorksWithMovableView_UsingNewMouseEvent ()
- {
- // This test proves that MouseGrabHandler works correctly with concurrent unit tests
- // using NewMouseEvent directly on views, without requiring Application.Init
- var superView = new View
- {
- Width = 80,
- Height = 25
- };
- superView.App = ApplicationImpl.Instance;
- var movableView = new View
- {
- Arrangement = ViewArrangement.Movable,
- BorderStyle = LineStyle.Single,
- X = 10,
- Y = 10,
- Width = 20,
- Height = 10
- };
- superView.Add (movableView);
- // Verify initial state
- Assert.NotNull (movableView.Border);
- Assert.Null (Application.Mouse.MouseGrabView);
- // Simulate mouse press on the border to start dragging
- var pressEvent = new MouseEventArgs
- {
- Position = new (1, 0), // Top border area
- Flags = MouseFlags.Button1Pressed
- };
- bool? result = movableView.Border.NewMouseEvent (pressEvent);
- // The border should have grabbed the mouse
- Assert.True (result);
- Assert.Equal (movableView.Border, superView.App.Mouse.MouseGrabView);
- // Simulate mouse drag
- var dragEvent = new MouseEventArgs
- {
- Position = new (5, 2),
- Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
- };
- result = movableView.Border.NewMouseEvent (dragEvent);
- Assert.True (result);
- // Mouse should still be grabbed
- Assert.Equal (movableView.Border, superView.App.Mouse.MouseGrabView);
- // Simulate mouse release to end dragging
- var releaseEvent = new MouseEventArgs
- {
- Position = new (5, 2),
- Flags = MouseFlags.Button1Released
- };
- result = movableView.Border.NewMouseEvent (releaseEvent);
- Assert.True (result);
- // Mouse should be released
- Assert.Null (superView.App.Mouse.MouseGrabView);
- }
- [Fact]
- public void MouseGrabHandler_WorksWithResizableView_UsingNewMouseEvent ()
- {
- // This test proves MouseGrabHandler works for resizing operations
- var superView = new View
- {
- App = ApplicationImpl.Instance,
- Width = 80,
- Height = 25
- };
- var resizableView = new View
- {
- Arrangement = ViewArrangement.RightResizable,
- BorderStyle = LineStyle.Single,
- X = 10,
- Y = 10,
- Width = 20,
- Height = 10
- };
- superView.Add (resizableView);
- // Verify initial state
- Assert.NotNull (resizableView.Border);
- Assert.Null (Application.Mouse.MouseGrabView);
- // Calculate position on right border (border is at right edge)
- // Border.Frame.X is relative to parent, so we use coordinates relative to the border
- var pressEvent = new MouseEventArgs
- {
- Position = new (resizableView.Border.Frame.Width - 1, 5), // Right border area
- Flags = MouseFlags.Button1Pressed
- };
- bool? result = resizableView.Border.NewMouseEvent (pressEvent);
- // The border should have grabbed the mouse for resizing
- Assert.True (result);
- Assert.Equal (resizableView.Border, superView.App.Mouse.MouseGrabView);
- // Simulate dragging to resize
- var dragEvent = new MouseEventArgs
- {
- Position = new (resizableView.Border.Frame.Width + 3, 5),
- Flags = MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition
- };
- result = resizableView.Border.NewMouseEvent (dragEvent);
- Assert.True (result);
- Assert.Equal (resizableView.Border, superView.App.Mouse.MouseGrabView);
- // Simulate mouse release
- var releaseEvent = new MouseEventArgs
- {
- Position = new (resizableView.Border.Frame.Width + 3, 5),
- Flags = MouseFlags.Button1Released
- };
- result = resizableView.Border.NewMouseEvent (releaseEvent);
- Assert.True (result);
- // Mouse should be released
- Assert.Null (superView.App.Mouse.MouseGrabView);
- }
- [Fact]
- public void MouseGrabHandler_ReleasesOnMultipleViews ()
- {
- // This test verifies MouseGrabHandler properly releases when switching between views
- var superView = new View { Width = 80, Height = 25 };
- superView.App = ApplicationImpl.Instance;
- var view1 = new View
- {
- Arrangement = ViewArrangement.Movable,
- BorderStyle = LineStyle.Single,
- X = 10,
- Y = 10,
- Width = 15,
- Height = 8
- };
- var view2 = new View
- {
- Arrangement = ViewArrangement.Movable,
- BorderStyle = LineStyle.Single,
- X = 30,
- Y = 10,
- Width = 15,
- Height = 8
- };
- superView.Add (view1, view2);
- superView.BeginInit ();
- superView.EndInit ();
- // Grab mouse on first view
- var pressEvent1 = new MouseEventArgs
- {
- Position = new (1, 0),
- Flags = MouseFlags.Button1Pressed
- };
- view1.Border!.NewMouseEvent (pressEvent1);
- Assert.Equal (view1.Border, superView.App.Mouse.MouseGrabView);
- // Release on first view
- var releaseEvent1 = new MouseEventArgs
- {
- Position = new (1, 0),
- Flags = MouseFlags.Button1Released
- };
- view1.Border.NewMouseEvent (releaseEvent1);
- Assert.Null (Application.Mouse.MouseGrabView);
- // Grab mouse on second view
- var pressEvent2 = new MouseEventArgs
- {
- Position = new (1, 0),
- Flags = MouseFlags.Button1Pressed
- };
- view2.Border!.NewMouseEvent (pressEvent2);
- Assert.Equal (view2.Border, superView.App.Mouse.MouseGrabView);
- // Release on second view
- var releaseEvent2 = new MouseEventArgs
- {
- Position = new (1, 0),
- Flags = MouseFlags.Button1Released
- };
- view2.Border.NewMouseEvent (releaseEvent2);
- Assert.Null (superView.App.Mouse.MouseGrabView);
- }
- }
|