Fixes #2836. RequestStop while a ContextMenu is open can throw an exception.

This commit is contained in:
BDisp
2023-08-30 19:50:01 +01:00
parent 7218f72d7f
commit b9f476a26d

View File

@@ -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);
}
}
}