using System.Globalization; using TerminalGuiFluentTesting; using TerminalGuiFluentTestingXunit; using Xunit.Abstractions; namespace IntegrationTests.FluentTests; /// /// Tests for the PopoverMenu class /// public class PopoverMenuTests { private readonly TextWriter _out; public PopoverMenuTests (ITestOutputHelper outputHelper) { CultureInfo.CurrentUICulture = CultureInfo.InvariantCulture; _out = new TestOutputWriter (outputHelper); } [Theory] [ClassData (typeof (TestDrivers))] public void EnableForDesign_CreatesMenuItems (TestDriver d) { using GuiTestContext c = With.A (80, 25, d) .Then ( () => { var popoverMenu = new PopoverMenu (); Application.Top!.Add (popoverMenu); // Call EnableForDesign Toplevel top = Application.Top; bool result = popoverMenu.EnableForDesign (ref top); // Should return true Assert.True (result); // Should have created menu items Assert.NotNull (popoverMenu.Root); Assert.Equal (7, popoverMenu.Root.SubViews.Count); // Should have Cut menu item View? cutMenuItem = popoverMenu.GetMenuItemsOfAllSubMenus ().FirstOrDefault (v => v?.Title == "Cu_t"); Assert.NotNull (cutMenuItem); }) .Stop (); } private static object o = new (); [Theory] [ClassData (typeof (TestDrivers))] public void Activate_Sets_Application_Navigation_Correctly (TestDriver d) { lock (o) { using GuiTestContext c = With.A (50, 20, d) .Then ( () => { var popoverMenu = new PopoverMenu (); // Call EnableForDesign Toplevel top = Application.Top!; popoverMenu.EnableForDesign (ref top); View? view = new View () { CanFocus = true, Height = Dim.Auto (), Width = Dim.Auto (), Id = "focusableView", Text = "View", }; Application.Top!.Add (view); // EnableForDesign sets to true; undo that popoverMenu.Visible = false; Application.Popover!.Register (popoverMenu); view.SetFocus (); }) .WaitIteration () .AssertFalse (Application.Popover?.GetActivePopover () is PopoverMenu) .AssertIsNotType (Application.Navigation!.GetFocused ()) .ScreenShot ("PopoverMenu initial state", _out) .Then (() => Application.Popover!.Show (Application.Popover.Popovers.First ())) .WaitIteration () .ScreenShot ($"After Show", _out) .AssertTrue (Application.Popover?.GetActivePopover () is PopoverMenu) .AssertEqual ("Cu_t", Application.Navigation!.GetFocused ()!.Title) .WriteOutLogs (_out) .Stop (); } } [Theory] [ClassData (typeof (TestDrivers))] public void QuitKey_Hides (TestDriver d) { using GuiTestContext c = With.A (50, 20, d) .Then ( () => { var popoverMenu = new PopoverMenu (); // Call EnableForDesign Toplevel top = Application.Top!; bool result = popoverMenu.EnableForDesign (ref top); View? view = new View () { CanFocus = true, Height = Dim.Auto (), Width = Dim.Auto (), Id = "focusableView", Text = "View", }; Application.Top!.Add (view); // EnableForDesign sets to true; undo that popoverMenu.Visible = false; Application.Popover!.Register (popoverMenu); view.SetFocus (); }) .WaitIteration () .ScreenShot ("PopoverMenu initial state", _out) .AssertFalse (Application.Popover?.GetActivePopover () is PopoverMenu) .Then (() => Application.Popover!.Show (Application.Popover.Popovers.First ())) .WaitIteration () .ScreenShot ($"After Show", _out) .AssertTrue (Application.Popover?.GetActivePopover () is PopoverMenu) .RaiseKeyDownEvent (Application.QuitKey) .WaitIteration () .WriteOutLogs (_out) .ScreenShot ($"After {Application.QuitKey}", _out) .AssertFalse (Application.Popover!.Popovers.Cast ().FirstOrDefault()!.Visible) .AssertNull (Application.Popover!.GetActivePopover()) .AssertTrue (Application.Top!.Running) .WriteOutLogs (_out) .Stop (); } [Theory] [ClassData (typeof (TestDrivers))] public void QuitKey_Restores_Focus_Correctly (TestDriver d) { using GuiTestContext c = With.A (50, 20, d) .Then ( () => { var popoverMenu = new PopoverMenu (); // Call EnableForDesign Toplevel top = Application.Top!; bool result = popoverMenu.EnableForDesign (ref top); View? view = new View () { CanFocus = true, Height = Dim.Auto (), Width = Dim.Auto (), Id = "focusableView", Text = "View", }; Application.Top!.Add (view); // EnableForDesign sets to true; undo that popoverMenu.Visible = false; Application.Popover!.Register (popoverMenu); view.SetFocus (); }) .WaitIteration () .ScreenShot ("PopoverMenu initial state", _out) .AssertFalse (Application.Popover?.GetActivePopover () is PopoverMenu) .AssertIsNotType(Application.Navigation!.GetFocused()) .Then (() => Application.Popover!.Show (Application.Popover.Popovers.First ())) .WaitIteration () .ScreenShot ($"After Show", _out) .AssertTrue (Application.Popover?.GetActivePopover () is PopoverMenu) .AssertIsType(Application.Navigation!.GetFocused()) .RaiseKeyDownEvent (Application.QuitKey) .ScreenShot ($"After {Application.QuitKey}", _out) .AssertFalse (Application.Popover?.GetActivePopover () is PopoverMenu) .AssertIsNotType(Application.Navigation!.GetFocused()) .WriteOutLogs (_out) .Stop (); } [Theory] [ClassData (typeof (TestDrivers))] public void MenuBarItem_With_QuitKey_Open_QuitKey_Does_Not_Quit_App (TestDriver d) { using GuiTestContext c = With.A (50, 20, d) .Then ( () => { var popoverMenu = new PopoverMenu (); // Call EnableForDesign Toplevel top = Application.Top!; bool result = popoverMenu.EnableForDesign (ref top); View? view = new View () { CanFocus = true, Height = Dim.Auto (), Width = Dim.Auto (), Id = "focusableView", Text = "View", }; Application.Top!.Add (view); // EnableForDesign sets to true; undo that popoverMenu.Visible = false; Application.Popover!.Register (popoverMenu); view.SetFocus (); }) .WaitIteration () .AssertIsNotType(Application.Navigation!.GetFocused()) .ScreenShot ("PopoverMenu initial state", _out) .Then (() => Application.Popover!.Show (Application.Popover.Popovers.First ())) .WaitIteration () .ScreenShot ("PopoverMenu after Show", _out) .AssertEqual ("Cu_t", Application.Navigation!.GetFocused ()!.Title) .AssertTrue (Application.Top!.Running) .RaiseKeyDownEvent (Application.QuitKey) .WaitIteration () .ScreenShot ($"After {Application.QuitKey}", _out) .AssertFalse (Application.Popover?.GetActivePopover () is PopoverMenu) .AssertTrue (Application.Top!.Running) .WriteOutLogs (_out) .Stop (); } [Theory] [ClassData (typeof (TestDrivers))] public void Not_Active_DoesNotEat_Space (TestDriver d) { int spaceKeyDownCount = 0; View testView = new View () { CanFocus = true, Id = "testView", }; testView.KeyDown += (sender, key) => { if (key == Key.Space) { spaceKeyDownCount++; } }; using GuiTestContext c = With.A (50, 20, d) .Then ( () => { var popoverMenu = new PopoverMenu(); Toplevel top = Application.Top!; popoverMenu.EnableForDesign (ref top); Application.Popover!.Register (popoverMenu); }) .Add (testView) .WaitIteration () .Focus (testView) .RaiseKeyDownEvent (Key.Space) .AssertEqual (1, spaceKeyDownCount) .WriteOutLogs (_out) .Stop (); } [Theory] [ClassData (typeof (TestDrivers))] public void Not_Active_DoesNotEat_Enter (TestDriver d) { int enterKeyDownCount = 0; View testView = new View () { CanFocus = true, Id = "testView", }; testView.KeyDown += (sender, key) => { if (key == Key.Enter) { enterKeyDownCount++; } }; using GuiTestContext c = With.A (50, 20, d) .Then ( () => { var popoverMenu = new PopoverMenu (); Toplevel top = Application.Top!; popoverMenu.EnableForDesign (ref top); Application.Popover!.Register (popoverMenu); }) .Add (testView) .WaitIteration () .Focus (testView) .RaiseKeyDownEvent (Key.Enter) .AssertEqual (1, enterKeyDownCount) .WriteOutLogs (_out) .Stop (); } [Theory] [ClassData (typeof (TestDrivers))] public void Not_Active_DoesNotEat_QuitKey (TestDriver d) { int quitKeyDownCount = 0; View testView = new View () { CanFocus = true, Id = "testView", }; testView.KeyDown += (sender, key) => { if (key == Application.QuitKey) { quitKeyDownCount++; } }; using GuiTestContext c = With.A (50, 20, d) .Then ( () => { var popoverMenu = new PopoverMenu (); Toplevel top = Application.Top!; popoverMenu.EnableForDesign (ref top); Application.Popover!.Register (popoverMenu); }) .Add (testView) .WaitIteration () .Focus (testView) .RaiseKeyDownEvent (Application.QuitKey) .AssertEqual (1, quitKeyDownCount) .WriteOutLogs (_out) .Stop (); } }