using AcDream.App.UI; namespace AcDream.App.Tests.UI; public class UiItemSlotTests { [Fact] public void IsLeafWidget() => Assert.True(new UiItemSlot().ConsumesDatChildren); [Fact] public void DefaultEmptySprite_isToolbarBorder() => Assert.Equal(0x060074CFu, new UiItemSlot().EmptySprite); [Fact] public void Empty_whenNoItem() { var s = new UiItemSlot(); Assert.Equal(0u, s.ItemId); Assert.Equal(0u, s.IconTexture); } [Fact] public void SetItem_setsIdAndTexture() { var s = new UiItemSlot(); s.SetItem(0x5001u, 0x99u); Assert.Equal(0x5001u, s.ItemId); Assert.Equal(0x99u, s.IconTexture); } [Fact] public void Clear_afterSetItem_resetsToEmpty() { var s = new UiItemSlot(); s.SetItem(0x5001u, 0x99u); s.Clear(); Assert.Equal(0u, s.ItemId); Assert.Equal(0u, s.IconTexture); } // ── Shortcut number tests ──────────────────────────────────────────────── // Port of UIElement_UIItem::SetShortcutNum (acclient_2013_pseudo_c.txt:229465). [Fact] public void ShortcutNum_defaultIsMinusOne() { var s = new UiItemSlot(); Assert.Equal(-1, s.ShortcutNum); } [Fact] public void ShortcutPeace_defaultIsTrue() { var s = new UiItemSlot(); Assert.True(s.ShortcutPeace); } [Fact] public void SetShortcutNum_setsIndexAndPeace() { var s = new UiItemSlot(); s.SetShortcutNum(3, peace: false); Assert.Equal(3, s.ShortcutNum); Assert.False(s.ShortcutPeace); } [Fact] public void SetShortcutNum_peaceTrue() { var s = new UiItemSlot(); s.SetShortcutNum(0, peace: true); Assert.Equal(0, s.ShortcutNum); Assert.True(s.ShortcutPeace); } [Fact] public void ClearShortcutNum_setsMinusOne() { var s = new UiItemSlot(); s.SetShortcutNum(5, peace: true); s.ClearShortcutNum(); Assert.Equal(-1, s.ShortcutNum); } // ── ActiveDigitArray occupancy gating (decomp UIElement_UIItem::SetShortcutNum:229481) ── private static readonly uint[] Peace = { 0x10u, 0x11u, 0x12u }; private static readonly uint[] War = { 0x20u, 0x21u, 0x22u }; private static readonly uint[] Empty = { 0x30u, 0x31u, 0x32u }; /// /// When ItemId == 0 (empty slot), ActiveDigitArray returns EmptyDigits regardless /// of ShortcutPeace. Retail ref: UIElement_UIItem::SetShortcutNum (decomp 229481) — /// else branch when m_elem_Icon->m_state == 0x1000001c (empty). /// [Fact] public void ActiveDigitArray_emptySlot_returnsEmptyDigits() { var s = new UiItemSlot { PeaceDigits = Peace, WarDigits = War, EmptyDigits = Empty }; s.SetShortcutNum(0, peace: true); // ItemId == 0 → EmptyDigits Assert.Same(Empty, s.ActiveDigitArray()); } [Fact] public void ActiveDigitArray_emptySlot_warStance_stillReturnsEmptyDigits() { var s = new UiItemSlot { PeaceDigits = Peace, WarDigits = War, EmptyDigits = Empty }; s.SetShortcutNum(0, peace: false); // ItemId == 0 → EmptyDigits regardless of stance Assert.Same(Empty, s.ActiveDigitArray()); } /// /// When ItemId != 0 (occupied), ActiveDigitArray returns PeaceDigits or WarDigits /// depending on ShortcutPeace. Retail ref: UIElement_UIItem::SetShortcutNum (decomp 229481/229493). /// [Fact] public void ActiveDigitArray_occupiedSlot_peaceStance_returnsPeaceDigits() { var s = new UiItemSlot { PeaceDigits = Peace, WarDigits = War, EmptyDigits = Empty }; s.SetItem(0x5001u, 0x99u); s.SetShortcutNum(0, peace: true); Assert.Same(Peace, s.ActiveDigitArray()); } [Fact] public void ActiveDigitArray_occupiedSlot_warStance_returnsWarDigits() { var s = new UiItemSlot { PeaceDigits = Peace, WarDigits = War, EmptyDigits = Empty }; s.SetItem(0x5001u, 0x99u); s.SetShortcutNum(0, peace: false); Assert.Same(War, s.ActiveDigitArray()); } [Fact] public void ActiveDigitArray_emptySlot_nullEmptyDigits_returnsNull() { var s = new UiItemSlot { PeaceDigits = Peace, WarDigits = War, EmptyDigits = null }; s.SetShortcutNum(0, peace: true); Assert.Null(s.ActiveDigitArray()); } }