Initial commit: Client Doc docs Server Tools

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ud18010
2026-07-10 10:24:29 +08:00
co-authored by Cursor
commit 7e35d8da31
3374 changed files with 680813 additions and 0 deletions
@@ -0,0 +1,46 @@
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<FormatException>(() => FrameCodec.Decode(new byte[] { 0x00 }));
}
}
}