using System; using Xunit; using XWorld.Framework.Protocol; namespace XWorld.Framework.Tests { public class DevDiscoveryCodecTests { [Fact] public void Query_RoundTrips() { var q = new DevDiscoveryQuery { ProtoVersion = DevDiscovery.ProtoVersion, Nonce = 0xABCDEF, Token = "dev-token" }; byte[] bytes = DevDiscoveryCodec.EncodeQuery(q); Assert.True(DevDiscoveryCodec.TryDecodeQuery(bytes, out var got)); Assert.Equal(q.ProtoVersion, got.ProtoVersion); Assert.Equal(q.Nonce, got.Nonce); Assert.Equal(q.Token, got.Token); } [Fact] public void Reply_RoundTrips() { var reply = new DevDiscoveryReply { ProtoVersion = DevDiscovery.ProtoVersion, Nonce = 42, ServerName = "dev-pc", GatewayUrl = "ws://192.168.1.23:5005/ws", ResourceBaseUrl = "http://192.168.1.23:15081/minigame/", Token = "dev-token", }; byte[] bytes = DevDiscoveryCodec.EncodeReply(reply); Assert.True(DevDiscoveryCodec.TryDecodeReply(bytes, out var got)); Assert.Equal(reply.GatewayUrl, got.GatewayUrl); Assert.Equal(reply.ResourceBaseUrl, got.ResourceBaseUrl); Assert.Equal(reply.ServerName, got.ServerName); Assert.Equal(reply.Nonce, got.Nonce); Assert.Equal(reply.Token, got.Token); } [Fact] public void BadMagic_Rejected() { byte[] bytes = { 0x00, 0x01, 0x02, 0x03, DevDiscovery.TypeQuery, 1 }; Assert.False(DevDiscoveryCodec.TryDecodeQuery(bytes, out _)); } [Fact] public void Truncated_Rejected() { Assert.False(DevDiscoveryCodec.TryDecodeQuery(new byte[] { 0x58, 0x57 }, out _)); Assert.False(DevDiscoveryCodec.TryDecodeReply(Array.Empty(), out _)); } [Fact] public void WrongType_Rejected() { var q = new DevDiscoveryQuery { ProtoVersion = 1, Nonce = 1, Token = "t" }; byte[] queryBytes = DevDiscoveryCodec.EncodeQuery(q); Assert.False(DevDiscoveryCodec.TryDecodeReply(queryBytes, out _)); } } }