using AcDream.Core.Items; using Xunit; namespace AcDream.Core.Tests.Items; public sealed class ItemRepositoryTests { private static ItemInstance MakeItem(uint id, string name = "Widget") => new ItemInstance { ObjectId = id, WeenieClassId = 1, Name = name, Type = ItemType.Misc, StackSize = 1, Burden = 10, Value = 5, }; [Fact] public void AddOrUpdate_FiresAddedEvent() { var repo = new ItemRepository(); ItemInstance? added = null; repo.ItemAdded += i => added = i; var item = MakeItem(100); repo.AddOrUpdate(item); Assert.Same(item, added); Assert.Equal(1, repo.ItemCount); Assert.Same(item, repo.GetItem(100)); } [Fact] public void AddOrUpdate_ExistingItem_FiresPropertiesUpdated() { var repo = new ItemRepository(); var item = MakeItem(100); repo.AddOrUpdate(item); int propUpdateCount = 0; repo.ItemPropertiesUpdated += _ => propUpdateCount++; repo.AddOrUpdate(item); // second call is an update Assert.Equal(1, propUpdateCount); } [Fact] public void MoveItem_UpdatesContainerAndFiresEvent() { var repo = new ItemRepository(); var item = MakeItem(100); repo.AddOrUpdate(item); uint seenOld = 999, seenNew = 999; repo.ItemMoved += (it, oldC, newC) => { seenOld = oldC; seenNew = newC; }; repo.MoveItem(100, 42, newSlot: 3); Assert.Equal(0u, seenOld); // was not in any container initially Assert.Equal(42u, seenNew); Assert.Equal(42u, item.ContainerId); Assert.Equal(3, item.ContainerSlot); } [Fact] public void MoveItem_Nonexistent_ReturnsFalse() { var repo = new ItemRepository(); Assert.False(repo.MoveItem(999, 42)); } [Fact] public void Remove_FiresEventAndRemoves() { var repo = new ItemRepository(); var item = MakeItem(100); repo.AddOrUpdate(item); ItemInstance? removed = null; repo.ItemRemoved += i => removed = i; Assert.True(repo.Remove(100)); Assert.Same(item, removed); Assert.Null(repo.GetItem(100)); } [Fact] public void UpdateProperties_MergesIncomingBundle() { var repo = new ItemRepository(); var item = MakeItem(100); item.Properties.Ints[1] = 10; repo.AddOrUpdate(item); var patch = new PropertyBundle(); patch.Ints[2] = 20; // new patch.Ints[1] = 15; // overrides patch.Strings[100] = "desc"; repo.UpdateProperties(100, patch); Assert.Equal(15, item.Properties.Ints[1]); Assert.Equal(20, item.Properties.Ints[2]); Assert.Equal("desc", item.Properties.Strings[100]); } [Fact] public void Clear_RemovesAllItems() { var repo = new ItemRepository(); repo.AddOrUpdate(MakeItem(1)); repo.AddOrUpdate(MakeItem(2)); repo.AddOrUpdate(MakeItem(3)); repo.Clear(); Assert.Equal(0, repo.ItemCount); } }