using UnitTests; using Xunit.Abstractions; namespace Terminal.Gui.ViewMouseTests; [Trait ("Category", "Input")] public class MouseTests (ITestOutputHelper output) : TestsAllViews { [Theory] [InlineData (false, false, false)] [InlineData (true, false, true)] [InlineData (true, true, true)] public void MouseClick_SetsFocus_If_CanFocus (bool canFocus, bool setFocus, bool expectedHasFocus) { var superView = new View { CanFocus = true, Height = 1, Width = 15 }; var focusedView = new View { CanFocus = true, Width = 1, Height = 1 }; var testView = new View { CanFocus = canFocus, X = 4, Width = 4, Height = 1 }; superView.Add (focusedView, testView); focusedView.SetFocus (); Assert.True (superView.HasFocus); Assert.True (focusedView.HasFocus); Assert.False (testView.HasFocus); if (setFocus) { testView.SetFocus (); } testView.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }); Assert.True (superView.HasFocus); Assert.Equal (expectedHasFocus, testView.HasFocus); } [Theory] [InlineData (false, false, 1)] [InlineData (true, false, 1)] [InlineData (true, true, 1)] public void MouseClick_Raises_Selecting (bool canFocus, bool setFocus, int expectedSelectingCount) { var superView = new View { CanFocus = true, Height = 1, Width = 15 }; var focusedView = new View { CanFocus = true, Width = 1, Height = 1 }; var testView = new View { CanFocus = canFocus, X = 4, Width = 4, Height = 1 }; superView.Add (focusedView, testView); focusedView.SetFocus (); Assert.True (superView.HasFocus); Assert.True (focusedView.HasFocus); Assert.False (testView.HasFocus); if (setFocus) { testView.SetFocus (); } var selectingCount = 0; testView.Selecting += (sender, args) => selectingCount++; testView.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }); Assert.True (superView.HasFocus); Assert.Equal (expectedSelectingCount, selectingCount); } [Theory] [InlineData (MouseFlags.WheeledUp | MouseFlags.ButtonCtrl, MouseFlags.WheeledLeft)] [InlineData (MouseFlags.WheeledDown | MouseFlags.ButtonCtrl, MouseFlags.WheeledRight)] public void WheeledLeft_WheeledRight (MouseFlags mouseFlags, MouseFlags expectedMouseFlagsFromEvent) { var mouseFlagsFromEvent = MouseFlags.None; var view = new View (); view.MouseEvent += (s, e) => mouseFlagsFromEvent = e.Flags; view.NewMouseEvent (new () { Flags = mouseFlags }); Assert.Equal (mouseFlagsFromEvent, expectedMouseFlagsFromEvent); } [Fact] public void NewMouseEvent_Invokes_MouseEvent_Properly () { View view = new () { Width = 1, Height = 1 }; var mouseEventInvoked = false; view.MouseEvent += (s, e) => { mouseEventInvoked = true; e.Handled = true; }; MouseEventArgs me = new (); view.NewMouseEvent (me); Assert.True (mouseEventInvoked); Assert.True (me.Handled); view.Dispose (); } [Theory] [MemberData (nameof (AllViewTypes))] public void AllViews_NewMouseEvent_Enabled_False_Does_Not_Set_Handled (Type viewType) { View view = CreateInstanceIfNotGeneric (viewType); if (view == null) { output.WriteLine ($"Ignoring {viewType} - It's a Generic"); return; } view.Enabled = false; var me = new MouseEventArgs (); view.NewMouseEvent (me); Assert.False (me.Handled); view.Dispose (); } [Theory] [MemberData (nameof (AllViewTypes))] public void AllViews_NewMouseEvent_Clicked_Enabled_False_Does_Not_Set_Handled (Type viewType) { View view = CreateInstanceIfNotGeneric (viewType); if (view == null) { output.WriteLine ($"Ignoring {viewType} - It's a Generic"); return; } view.Enabled = false; var me = new MouseEventArgs { Flags = MouseFlags.Button1Clicked }; view.NewMouseEvent (me); Assert.False (me.Handled); view.Dispose (); } }