using System; using Xunit; using XWorld.Framework.Protocol; namespace XWorld.Framework.Tests { public class FrameCodecTests { [Fact] public void Frame_RoundTrips() { var original = new Frame(Channel.Game, 7, new byte[] { 10, 20, 30 }); byte[] wire = FrameCodec.Encode(original); Frame decoded = FrameCodec.Decode(wire); Assert.Equal(Channel.Game, decoded.Channel); Assert.Equal((ushort)7, decoded.Opcode); Assert.Equal(new byte[] { 10, 20, 30 }, decoded.Payload); } [Fact] public void Frame_EmptyPayload_RoundTrips() { var original = new Frame(Channel.Framework, 1, null); Frame decoded = FrameCodec.Decode(FrameCodec.Encode(original)); Assert.Equal(Channel.Framework, decoded.Channel); Assert.Equal((ushort)1, decoded.Opcode); Assert.Empty(decoded.Payload); } [Fact] public void Encode_WireLayout_IsChannelOpcodeLenPayload() { var f = new Frame(Channel.Game, 0x0102, new byte[] { 0xAA }); byte[] wire = FrameCodec.Encode(f); // channel=1, opcode 小端 = 02 01, len varuint = 1, payload = AA Assert.Equal(new byte[] { 0x01, 0x02, 0x01, 0x01, 0xAA }, wire); } [Fact] public void Decode_Truncated_Throws() { Assert.Throws(() => FrameCodec.Decode(new byte[] { 0x00 })); } } }