using AcDream.App.UI.Layout; namespace AcDream.App.Tests.UI.Layout; public sealed class RetailPanelUiControllerTests { [Fact] public void ShowingPanel_HidesCurrent_AndClosingLeavesHostEmpty() { var visible = new Dictionary(StringComparer.Ordinal) { ["inventory"] = false, ["helpful"] = false, }; var controller = Create(visible); controller.Register(7u, "inventory"); controller.Register(4u, "helpful"); Assert.True(controller.SetPanelVisibility(7u, true)); Assert.True(visible["inventory"]); Assert.Equal(7u, controller.ActivePanelId); Assert.True(controller.SetPanelVisibility(4u, true)); Assert.False(visible["inventory"]); Assert.True(visible["helpful"]); Assert.Equal(4u, controller.ActivePanelId); Assert.False(controller.TogglePanel(4u)); Assert.False(visible["helpful"]); Assert.Null(controller.ActivePanelId); } [Fact] public void RestorePreviousProperty_ReopensOnlyNonRestoringPreviousPanel() { var visible = new Dictionary(StringComparer.Ordinal) { ["ordinary"] = false, ["transient"] = false, }; var controller = Create(visible); controller.Register(1u, "ordinary", restorePrevious: false); controller.Register(2u, "transient", restorePrevious: true); controller.SetPanelVisibility(1u, true); controller.SetPanelVisibility(2u, true); Assert.False(visible["ordinary"]); Assert.True(visible["transient"]); controller.SetPanelVisibility(2u, false); Assert.True(visible["ordinary"]); Assert.False(visible["transient"]); Assert.Equal(1u, controller.ActivePanelId); } [Fact] public void ObservedPersistenceShow_UsesSameExclusiveLifecycle() { var visible = new Dictionary(StringComparer.Ordinal) { ["first"] = false, ["second"] = false, }; var controller = Create(visible); controller.Register(1u, "first"); controller.Register(2u, "second"); controller.SetPanelVisibility(1u, true); visible["second"] = true; controller.ObserveWindowVisibility("second", visible: true); Assert.False(visible["first"]); Assert.True(visible["second"]); Assert.Equal(2u, controller.ActivePanelId); } private static RetailPanelUiController Create(Dictionary visible) => new( name => visible[name], name => { visible[name] = true; return true; }, name => { visible[name] = false; return true; }); }