using AcDream.Core.CharGen; namespace AcDream.Core.Tests.CharGen; /// /// Tests for — the structural /// 55-slot shape ACE's CharacterCreateInfo.Unpack requires on the /// 0xF656 wire (numSkills must be exactly 55: reserved slot 0 plus /// Chorizite's 54 named SkillId values, 1..54). /// public sealed class ChargenSkillAdvancementSetTests { [Fact] public void ToWireClasses_AlwaysProducesExactlyFiftyFiveEntries() { var set = new ChargenSkillAdvancementSet(); Assert.Equal(55, set.ToWireClasses().Count); Assert.Equal(55, ChargenSkillAdvancementSet.SlotCount); } [Fact] public void DefaultState_EverySlotIsInactive() { var set = new ChargenSkillAdvancementSet(); IReadOnlyList wire = set.ToWireClasses(); Assert.All(wire, value => Assert.Equal(0u, value)); Assert.Equal(ChargenSkillAdvancementClass.Inactive, set[1u]); Assert.Equal(ChargenSkillAdvancementClass.Inactive, set[54u]); } [Fact] public void Indexer_RoundTripsAssignedSkillState() { var set = new ChargenSkillAdvancementSet { [1u] = ChargenSkillAdvancementClass.Trained, [54u] = ChargenSkillAdvancementClass.Specialized, }; Assert.Equal(ChargenSkillAdvancementClass.Trained, set[1u]); Assert.Equal(ChargenSkillAdvancementClass.Specialized, set[54u]); IReadOnlyList wire = set.ToWireClasses(); Assert.Equal(0u, wire[0]); // reserved slot never assignable Assert.Equal((uint)ChargenSkillAdvancementClass.Trained, wire[1]); Assert.Equal((uint)ChargenSkillAdvancementClass.Specialized, wire[54]); } [Fact] public void Indexer_ReservedSlotZero_ReadsInactiveAndCannotBeSet() { var set = new ChargenSkillAdvancementSet(); Assert.Equal(ChargenSkillAdvancementClass.Inactive, set[0u]); Assert.Throws( () => set[0u] = ChargenSkillAdvancementClass.Trained); } [Theory] [InlineData(55u)] [InlineData(1000u)] public void Indexer_SetOutOfRange_Throws(uint skillId) { var set = new ChargenSkillAdvancementSet(); Assert.Throws( () => set[skillId] = ChargenSkillAdvancementClass.Trained); } [Fact] public void Indexer_GetOutOfRange_ReadsInactiveWithoutThrowing() { var set = new ChargenSkillAdvancementSet(); Assert.Equal(ChargenSkillAdvancementClass.Inactive, set[55u]); Assert.Equal(ChargenSkillAdvancementClass.Inactive, set[uint.MaxValue]); } }