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:
/// reads
/// AutoTarget/AutoRepeatAttack/ViewCombatTarget from the canonical
/// instead of the client-local
/// GameplaySettings record used
/// to be the only implementation of.
///
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!));
}
}