129 lines
4.8 KiB
C#
129 lines
4.8 KiB
C#
using AcDream.App.UI;
|
|
using AcDream.App.UI.Layout;
|
|
namespace AcDream.App.Tests.UI.Layout;
|
|
|
|
public class UiDatElementTests
|
|
{
|
|
[Fact]
|
|
public void ActiveMedia_PrefersNamedStateOverDirect()
|
|
{
|
|
var info = new ElementInfo();
|
|
info.StateMedia[""] = (0x06000001, 1); // DirectState (DrawMode Normal=1)
|
|
info.StateMedia["ShowDetail"] = (0x06000002, 3); // named (Alphablend=3)
|
|
var e = new UiDatElement(info, _ => (0, 0, 0)) { ActiveState = "ShowDetail" };
|
|
Assert.Equal(0x06000002u, e.ActiveMedia().File);
|
|
Assert.Equal(3, e.ActiveMedia().DrawMode);
|
|
e.ActiveState = "";
|
|
Assert.Equal(0x06000001u, e.ActiveMedia().File);
|
|
Assert.Equal(1, e.ActiveMedia().DrawMode);
|
|
}
|
|
|
|
[Fact]
|
|
public void ActiveMedia_NoMedia_ReturnsZero()
|
|
{
|
|
var e = new UiDatElement(new ElementInfo(), _ => (0, 0, 0));
|
|
Assert.Equal(0u, e.ActiveMedia().File);
|
|
Assert.Equal(0, e.ActiveMedia().DrawMode);
|
|
}
|
|
|
|
[Fact]
|
|
public void ActiveMedia_MissingNamedState_FallsBackToDirect()
|
|
{
|
|
var info = new ElementInfo();
|
|
info.StateMedia[""] = (0x06000005, 1);
|
|
var e = new UiDatElement(info, _ => (0, 0, 0)) { ActiveState = "NoSuchState" };
|
|
Assert.Equal(0x06000005u, e.ActiveMedia().File);
|
|
}
|
|
|
|
// ── G1 tests: DefaultStateName + "Normal" implicit default ───────────────
|
|
|
|
/// <summary>
|
|
/// Task G1 change 5: when an element has no DefaultStateName but does have a "Normal"
|
|
/// state sprite, the ctor should default ActiveState to "Normal" so the element
|
|
/// renders its normal-state sprite without requiring explicit state assignment.
|
|
/// </summary>
|
|
[Fact]
|
|
public void UiDatElement_DefaultsActiveStateToNormal_WhenNormalPresent()
|
|
{
|
|
var info = new ElementInfo();
|
|
info.StateMedia["Normal"] = (0x0000AAAAu, 1);
|
|
info.StateMedia["Hover"] = (0x0000BBBBu, 1);
|
|
|
|
var e = new UiDatElement(info, _ => (0, 0, 0));
|
|
|
|
// Should have defaulted to "Normal" state.
|
|
Assert.Equal(0x0000AAAAu, e.ActiveMedia().File);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Task G1 change 5: when DefaultStateName is set (e.g. "Minimized"),
|
|
/// it takes priority over the "Normal" implicit default.
|
|
/// </summary>
|
|
[Fact]
|
|
public void UiDatElement_DefaultsActiveStateToDefaultStateName_WhenSet()
|
|
{
|
|
var info = new ElementInfo { DefaultStateName = "Minimized" };
|
|
info.StateMedia["Minimized"] = (0x0000BBBBu, 1);
|
|
info.StateMedia["Maximized"] = (0x0000CCCCu, 1);
|
|
info.StateMedia["Normal"] = (0x0000DDDDu, 1);
|
|
|
|
var e = new UiDatElement(info, _ => (0, 0, 0));
|
|
|
|
// DefaultStateName "Minimized" wins over "Normal" implicit default.
|
|
Assert.Equal(0x0000BBBBu, e.ActiveMedia().File);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Task G1 change 5: elements with only a DirectState sprite and no "Normal" state
|
|
/// should still default to "" (DirectState) — no regression for chrome/grip elements.
|
|
/// </summary>
|
|
[Fact]
|
|
public void UiDatElement_NoDefaultStateName_NoNormal_DefaultsToDirectState()
|
|
{
|
|
var info = new ElementInfo();
|
|
info.StateMedia[""] = (0x06007777u, 1); // DirectState only (e.g. vitals chrome corner)
|
|
|
|
var e = new UiDatElement(info, _ => (0, 0, 0));
|
|
|
|
// No DefaultStateName, no "Normal" state → ActiveState stays "" (DirectState).
|
|
Assert.Equal(0x06007777u, e.ActiveMedia().File);
|
|
}
|
|
|
|
[Fact]
|
|
public void NumericStateBridge_SetsNamedStateWithoutChangingGeometry()
|
|
{
|
|
var info = new ElementInfo { X = 4, Y = 5, Width = 30, Height = 40 };
|
|
info.States[RetailUiStateIds.ShowDetail] = new UiStateInfo
|
|
{
|
|
Id = RetailUiStateIds.ShowDetail,
|
|
Name = "ShowDetail",
|
|
Image = new UiImageMedia(0x06000009u, 3),
|
|
};
|
|
info.StateMedia["ShowDetail"] = (0x06000009u, 3);
|
|
var element = new UiDatElement(info, _ => (0u, 0, 0))
|
|
{
|
|
Left = info.X,
|
|
Top = info.Y,
|
|
Width = info.Width,
|
|
Height = info.Height,
|
|
};
|
|
|
|
Assert.True(element.TrySetRetailState(RetailUiStateIds.ShowDetail));
|
|
|
|
Assert.Equal(RetailUiStateIds.ShowDetail, element.ActiveRetailStateId);
|
|
Assert.Equal((0x06000009u, 3), element.ActiveMedia());
|
|
Assert.Equal((4f, 5f, 30f, 40f),
|
|
(element.Left, element.Top, element.Width, element.Height));
|
|
}
|
|
|
|
[Fact]
|
|
public void NumericStateBridge_MissingStatePreservesCurrentState()
|
|
{
|
|
var info = new ElementInfo { DefaultStateName = "Normal" };
|
|
info.StateMedia["Normal"] = (0x06000001u, 1);
|
|
var element = new UiDatElement(info, _ => (0u, 0, 0));
|
|
|
|
Assert.False(element.TrySetRetailState(RetailUiStateIds.ShowDetail));
|
|
Assert.Equal("Normal", element.ActiveState);
|
|
}
|
|
}
|