mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-10-05 15:52:10 -04:00
TestAssemblySetup set the unhandled-exception mode and a ThreadException handler from a module initializer. WinForms stores both per thread (ThreadContext/NativeWindow thread statics), so they applied only to the runner thread that loaded the assembly, never to the STA threads the tests run on. There, an exception escaping a window message or a BeginInvoke/SynchronizationContext callback still opened a modal ThreadExceptionDialog in an interactive session, or was silently ignored otherwise; the handler would also have logged and swallowed it. Replace the fifteen copied RunSta helpers with StaTestThread.Run, which selects UnhandledExceptionMode.ThrowException on each STA thread before it creates a window, so the exception propagates to the test body and fails the test. Each class keeps its own timeout and message; all threads are now background threads. Remove TestAssemblySetup. StaTestThreadTests covers a throwing BeginInvoke callback through StaTestThread (fails with the original exception) and, as a control, the default mode on a plain STA thread (the exception goes to the thread's handler and never reaches the test body). Cross-compiled on Linux; Windows execution is the windows-desktop CI job.
45 lines
1.4 KiB
C#
45 lines
1.4 KiB
C#
using System.Windows.Forms;
|
|
using OpenNest.Forms;
|
|
|
|
namespace OpenNest.WinForms.Tests.Forms;
|
|
|
|
public class LeadInSidePanelTests
|
|
{
|
|
[Theory]
|
|
[InlineData(true)]
|
|
[InlineData(false)]
|
|
public void PanelClosesWithoutEscapeReopeningIt(bool useCloseButton) => RunSta(() =>
|
|
{
|
|
using var form = new EditNestForm(new Nest("lead-in panel"));
|
|
form.Show();
|
|
|
|
form.PlaceLeadIn_Click(null!, EventArgs.Empty);
|
|
Assert.True(form.IsSidePanelVisible);
|
|
Assert.Equal("Place Lead-in", form.PlateView.Status);
|
|
|
|
if (useCloseButton)
|
|
{
|
|
var close = Assert.IsType<Button>(
|
|
Assert.Single(form.Controls.Find("sidePanelCloseButton", true))
|
|
);
|
|
close.PerformClick();
|
|
}
|
|
else
|
|
{
|
|
form.PlateView.ProcessEscapeKey();
|
|
}
|
|
|
|
Assert.False(form.IsSidePanelVisible);
|
|
Assert.Equal("Select", form.PlateView.Status);
|
|
|
|
// Escape from Select normally resumes the previous action; it must not
|
|
// bring back a panel the user just closed.
|
|
form.PlateView.ProcessEscapeKey();
|
|
Assert.False(form.IsSidePanelVisible);
|
|
Assert.Equal("Select", form.PlateView.Status);
|
|
});
|
|
|
|
private static void RunSta(System.Action action) =>
|
|
StaTestThread.Run(action, TimeSpan.FromSeconds(60), "The STA test did not complete.");
|
|
}
|