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 ─────────────── /// /// 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. /// [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); } /// /// Task G1 change 5: when DefaultStateName is set (e.g. "Minimized"), /// it takes priority over the "Normal" implicit default. /// [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); } /// /// 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. /// [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); } }