using System.Net; using AcDream.Core.Net; using AcDream.Core.Net.Messages; namespace AcDream.Core.Net.Tests; /// /// Phase I.3 — verifies that , /// , and /// produce the same wire bytes that builders do, /// using a sequence number drawn from . /// /// /// Uses the internal GameActionCapture test seam to intercept the /// game-action body before it hits the (unseeded) ISAAC-encrypted wire path. /// /// public sealed class WorldSessionChatTests { private static WorldSession NewSession() { // Bind to a throwaway loopback endpoint; we never actually // exchange packets — the capture hook intercepts the body. var ep = new IPEndPoint(IPAddress.Loopback, 65000); return new WorldSession(ep); } [Fact] public void SendTalk_EmitsBytesIdenticalToChatRequestsBuildTalk() { using var session = NewSession(); byte[]? captured = null; session.GameActionCapture = body => captured = body; session.SendTalk("hello"); // After SendTalk, the sequence counter has been incremented to 1. // ChatRequests.BuildTalk(seq=1, "hello") should match exactly. byte[] expected = ChatRequests.BuildTalk(1, "hello"); Assert.NotNull(captured); Assert.Equal(expected, captured); } [Fact] public void SendTell_EmitsBytesIdenticalToChatRequestsBuildTell() { using var session = NewSession(); byte[]? captured = null; session.GameActionCapture = body => captured = body; session.SendTell("Alice", "hey"); byte[] expected = ChatRequests.BuildTell(1, "Alice", "hey"); Assert.NotNull(captured); Assert.Equal(expected, captured); } [Fact] public void SendChannel_IncrementsSequence_AndMatchesBuildChatChannel() { using var session = NewSession(); var captured = new System.Collections.Generic.List(); session.GameActionCapture = body => captured.Add(body); session.SendChannel(channelId: 0x00000800u, "raid plan"); session.SendChannel(channelId: 0x02000000u, "allegiance ping"); Assert.Equal(2, captured.Count); Assert.Equal(ChatRequests.BuildChatChannel(1, 0x00000800u, "raid plan"), captured[0]); Assert.Equal(ChatRequests.BuildChatChannel(2, 0x02000000u, "allegiance ping"), captured[1]); } [Fact] public void SendTalk_NullText_Throws() { using var session = NewSession(); Assert.Throws(() => session.SendTalk(null!)); } }