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!));
}
}