Fixes #4125 - Decouple ApplicationImpl from static Application references (#4324)

* Initial plan

* Add instance fields to ApplicationImpl and update static Application properties to delegate to ApplicationImpl.Instance

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix code review issues: use instance fields in Run() and improve Shutdown() logic

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Final code review fix: use _initialized directly in Shutdown

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Fix Shutdown order: call ResetState before clearing instance fields

Co-authored-by: tig <585482+tig@users.noreply.github.com>

* Add MainThreadId as instance field in ApplicationImpl

Co-authored-by: tig <585482+tig@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tig <585482+tig@users.noreply.github.com>
Co-authored-by: Tig <tig@users.noreply.github.com>
This commit is contained in:
Copilot
2025-10-25 12:20:03 -06:00
committed by GitHub
parent 2d84ab4f01
commit 5199663551
7 changed files with 374 additions and 288 deletions

View File

@@ -583,4 +583,52 @@ public class ApplicationImplTests
Assert.True (result);
}
[Fact]
public void ApplicationImpl_UsesInstanceFields_NotStaticReferences()
{
// This test verifies that ApplicationImpl uses instance fields instead of static Application references
var orig = ApplicationImpl.Instance;
var v2 = NewApplicationImpl();
ApplicationImpl.ChangeInstance(v2);
// Before Init, all fields should be null/default
Assert.Null(v2.Driver);
Assert.False(v2.Initialized);
Assert.Null(v2.Popover);
Assert.Null(v2.Navigation);
Assert.Null(v2.Top);
Assert.Empty(v2.TopLevels);
// Init should populate instance fields
v2.Init();
// After Init, Driver, Navigation, and Popover should be populated
Assert.NotNull(v2.Driver);
Assert.True(v2.Initialized);
Assert.NotNull(v2.Popover);
Assert.NotNull(v2.Navigation);
Assert.Null(v2.Top); // Top is still null until Run
// Verify that static Application properties delegate to instance
Assert.Equal(v2.Driver, Application.Driver);
Assert.Equal(v2.Initialized, Application.Initialized);
Assert.Equal(v2.Popover, Application.Popover);
Assert.Equal(v2.Navigation, Application.Navigation);
Assert.Equal(v2.Top, Application.Top);
Assert.Same(v2.TopLevels, Application.TopLevels);
// Shutdown should clean up instance fields
v2.Shutdown();
Assert.Null(v2.Driver);
Assert.False(v2.Initialized);
Assert.Null(v2.Popover);
Assert.Null(v2.Navigation);
Assert.Null(v2.Top);
Assert.Empty(v2.TopLevels);
ApplicationImpl.ChangeInstance(orig);
}
}