using AcDream.App.Combat; using AcDream.Core.Net.Messages; using AcDream.Runtime.Gameplay; namespace AcDream.App.Tests.Combat; /// /// Campaign OP slice OP4 (2026-08-11) — D7 Group-C re-point, widened at the /// OP4 review-fix round (2026-08-11, MUST-FIX 3): /// reads AutoTarget/AutoRepeatAttack/ViewCombatTarget from the canonical /// — the ONLY implementation of /// ICombatGameplaySettingsSource now, since the dead client-local /// GameplaySettingsState adapter was retired the same round. /// public sealed class CharacterOptionCombatSettingsSourceTests { [Fact] public void ReadsLiveBits_NotAConstructionTimeSnapshot() { var options = new RuntimeCharacterOptionsState(); options.SetOptionBit((uint)CharacterOptionId.AutoTarget, false); options.SetOptionBit((uint)CharacterOptionId.AutoRepeatAttack, false); options.SetOptionBit((uint)CharacterOptionId.ViewCombatTarget, false); var source = new CharacterOptionCombatSettingsSource(options); Assert.False(source.AutoTarget); Assert.False(source.AutoRepeatAttack); Assert.False(source.ViewCombatTarget); // Live: a later write is observed with no re-construction, matching // ICombatGameplaySettingsSource's poll-per-call contract. options.SetOptionBit((uint)CharacterOptionId.AutoTarget, true); Assert.True(source.AutoTarget); Assert.False(source.AutoRepeatAttack); Assert.False(source.ViewCombatTarget); options.SetOptionBit((uint)CharacterOptionId.AutoRepeatAttack, true); options.SetOptionBit((uint)CharacterOptionId.ViewCombatTarget, true); Assert.True(source.AutoRepeatAttack); Assert.True(source.ViewCombatTarget); } [Fact] public void ReflectsClientDefaults_ForAFreshCharacterOptionsState() { // CharacterOptionTable's byte-verified client-Defaults column: // AutoTarget/AutoRepeatAttack ON, ViewCombatTarget OFF. var options = new RuntimeCharacterOptionsState(); var source = new CharacterOptionCombatSettingsSource(options); Assert.True(source.AutoTarget); Assert.True(source.AutoRepeatAttack); Assert.False(source.ViewCombatTarget); } [Fact] public void Constructor_RejectsNull() { Assert.Throws( static () => new CharacterOptionCombatSettingsSource(null!)); } }