Files
OpenNest/OpenNest.WinForms.Tests/Forms/LeadInSidePanelTests.cs
T
aj a15c54fbaf test(desktop): fail WinForms tests on UI-callback exceptions per STA thread
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.
2026-10-04 18:40:48 -04:00

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.");
}