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