feat: port retail magic lifecycle and retained spell UI
Complete the retail cast-intent, target, component, enchantment, and busy-state paths; mount the DAT-authored spell bar, spellbook, component book, effects panels, and shared panel lifecycle; and add scoped input plus conformance coverage. Co-Authored-By: Codex <noreply@openai.com>
This commit is contained in:
parent
7b7ffcd278
commit
07be994d97
84 changed files with 17822 additions and 1051 deletions
|
|
@ -0,0 +1,90 @@
|
|||
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<string, bool>(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<string, bool>(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<string, bool>(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<string, bool> visible)
|
||||
=> new(
|
||||
name => visible[name],
|
||||
name =>
|
||||
{
|
||||
visible[name] = true;
|
||||
return true;
|
||||
},
|
||||
name =>
|
||||
{
|
||||
visible[name] = false;
|
||||
return true;
|
||||
});
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue