using AcDream.Core.Net.Messages;
using Xunit;
namespace AcDream.Core.Net.Tests.Messages;
///
/// Campaign FA slice FA1 (2026-08-11): the small fixed-shape allegiance
/// S→C events (everything except 0x0020 AllegianceUpdate and
/// 0x027C AllegianceInfoResponse, which reuse the extended
/// ClientCommandResponses profile reader — see
/// AllegianceProfileVersionGateTests). Field orders per
/// docs/research/2026-08-11-fa-allegiance-wire.md (lane C) §4.5. Unwired —
/// FA2 registers these against RuntimeAllegianceState.
///
public sealed class AllegianceSmallEventsTests
{
[Fact]
public void ParseAllegianceLoginNotification_RoundTrips_LoggedIn()
{
byte[] wire = new AceWireWriter().Write(0x50000042u).Write((uint)1).ToArray();
var notice = GameEvents.ParseAllegianceLoginNotification(wire);
Assert.NotNull(notice);
Assert.Equal(0x50000042u, notice.Value.CharacterGuid);
Assert.True(notice.Value.IsLoggedIn);
}
[Fact]
public void ParseAllegianceLoginNotification_RoundTrips_LoggedOut()
{
byte[] wire = new AceWireWriter().Write(0x50000042u).Write((uint)0).ToArray();
var notice = GameEvents.ParseAllegianceLoginNotification(wire);
Assert.NotNull(notice);
Assert.False(notice.Value.IsLoggedIn);
}
[Fact]
public void ParseAllegianceLoginNotification_TruncatedPayload_ReturnsNull()
{
Assert.Null(GameEvents.ParseAllegianceLoginNotification(new byte[4]));
}
[Fact]
public void ParseAllegianceUpdateDone_ReadsWeenieError()
{
byte[] wire = new AceWireWriter().Write(0u).ToArray();
Assert.Equal(0u, GameEvents.ParseAllegianceUpdateDone(wire));
}
[Fact]
public void ParseAllegianceUpdateDone_NonZeroErrorCode_RoundTrips()
{
byte[] wire = new AceWireWriter().Write(0x40Bu).ToArray(); // AlreadySworn-style code
Assert.Equal(0x40Bu, GameEvents.ParseAllegianceUpdateDone(wire));
}
[Fact]
public void ParseAllegianceUpdateAborted_ReadsWeenieError()
{
// Never actually sent by ACE (lane C §5.4) — parsed for
// forward-compat/completeness only.
byte[] wire = new AceWireWriter().Write(0x40Cu).ToArray();
Assert.Equal(0x40Cu, GameEvents.ParseAllegianceUpdateAborted(wire));
}
[Fact]
public void ParseAllegianceUpdateDone_TruncatedPayload_ReturnsNull()
{
Assert.Null(GameEvents.ParseAllegianceUpdateDone(System.ReadOnlySpan.Empty));
}
}