diff --git a/UnitTests/Views/ContextMenuTests.cs b/UnitTests/Views/ContextMenuTests.cs index 7d5d04408..8b5f38498 100644 --- a/UnitTests/Views/ContextMenuTests.cs +++ b/UnitTests/Views/ContextMenuTests.cs @@ -50,16 +50,21 @@ namespace Terminal.Gui.ViewsTests { Assert.NotNull (cm.Host); } - [Fact] - [AutoInitShutdown] - public void Show_Hide_IsShow () + private ContextMenu Create_ContextMenu_With_Two_MenuItem (int x, int y) { - var cm = new ContextMenu (10, 5, + return new ContextMenu (x, y, new MenuBarItem (new MenuItem [] { new MenuItem ("One", "", null), new MenuItem ("Two", "", null) }) ); + } + + [Fact] + [AutoInitShutdown] + public void Show_Hide_IsShow () + { + var cm = Create_ContextMenu_With_Two_MenuItem (10, 5); cm.Show (); Assert.True (ContextMenu.IsShow); @@ -1140,5 +1145,59 @@ namespace Terminal.Gui.ViewsTests { Application.End (rs); } + + [Fact, AutoInitShutdown] + public void RequestStop_While_ContextMenu_Is_Open_Does_Not_Throws () + { + var cm = Create_ContextMenu_With_Two_MenuItem (10, 5); + var top = Application.Top; + var isMenuAllClosed = false; + MenuBarItem mi = null; + var iterations = -1; + Application.Iteration += () => { + iterations++; + if (iterations == 0) { + cm.Show (); + Assert.True (ContextMenu.IsShow); + mi = cm.MenuBar.Menus [0]; + mi.Action = () => { + var dialog1 = new Dialog (); + Application.Run (dialog1); + Assert.False (ContextMenu.IsShow); + Assert.True (isMenuAllClosed); + }; + cm.MenuBar.MenuAllClosed += (_, _) => isMenuAllClosed = true; + } else if (iterations == 1) { + mi.Action (); + } else if (iterations == 2) { + Application.RequestStop (); + } else if (iterations == 3) { + isMenuAllClosed = false; + cm.Show (); + Assert.True (ContextMenu.IsShow); + cm.MenuBar.MenuAllClosed += (_, _) => isMenuAllClosed = true; + } else if (iterations == 4) { + var exception = Record.Exception (() => Application.RequestStop ()); + Assert.Null (exception); + } else { + Application.RequestStop (); + } + }; + + var isTopClosed = false; + top.Closing += (_, _) => { + var dialog2 = new Dialog (); + Application.Run (dialog2); + Assert.False (ContextMenu.IsShow); + Assert.True (isMenuAllClosed); + isTopClosed = true; + }; + + Application.Run (); + + Assert.True (isTopClosed); + Assert.False (ContextMenu.IsShow); + Assert.True (isMenuAllClosed); + } } }