Initial commit: Client Doc docs Server Tools
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
using System;
|
||||
using Xunit;
|
||||
using XWorld.Framework.Protocol;
|
||||
|
||||
namespace XWorld.Framework.Tests
|
||||
{
|
||||
public class PacketCodecTests
|
||||
{
|
||||
[Theory]
|
||||
[InlineData(0u)]
|
||||
[InlineData(1u)]
|
||||
[InlineData(127u)]
|
||||
[InlineData(128u)]
|
||||
[InlineData(16384u)]
|
||||
[InlineData(uint.MaxValue)]
|
||||
public void VarUInt_RoundTrips(uint value)
|
||||
{
|
||||
var w = new PacketWriter();
|
||||
w.WriteVarUInt(value);
|
||||
var r = new PacketReader(w.ToArray());
|
||||
Assert.Equal(value, r.ReadVarUInt());
|
||||
Assert.False(r.HasMore);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(0)]
|
||||
[InlineData(1)]
|
||||
[InlineData(-1)]
|
||||
[InlineData(int.MaxValue)]
|
||||
[InlineData(int.MinValue)]
|
||||
public void VarInt_RoundTrips(int value)
|
||||
{
|
||||
var w = new PacketWriter();
|
||||
w.WriteVarInt(value);
|
||||
var r = new PacketReader(w.ToArray());
|
||||
Assert.Equal(value, r.ReadVarInt());
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(0L)]
|
||||
[InlineData(-1234567890123L)]
|
||||
[InlineData(long.MaxValue)]
|
||||
[InlineData(long.MinValue)]
|
||||
public void VarLong_RoundTrips(long value)
|
||||
{
|
||||
var w = new PacketWriter();
|
||||
w.WriteVarLong(value);
|
||||
var r = new PacketReader(w.ToArray());
|
||||
Assert.Equal(value, r.ReadVarLong());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MixedSequence_RoundTrips_InOrder()
|
||||
{
|
||||
var w = new PacketWriter();
|
||||
w.WriteBool(true);
|
||||
w.WriteByte(200);
|
||||
w.WriteUInt16(50000);
|
||||
w.WriteVarInt(-42);
|
||||
w.WriteSingle(3.14159f);
|
||||
w.WriteString("héllo 世界");
|
||||
w.WriteBytes(new byte[] { 1, 2, 3, 0, 255 });
|
||||
|
||||
var r = new PacketReader(w.ToArray());
|
||||
Assert.True(r.ReadBool());
|
||||
Assert.Equal((byte)200, r.ReadByte());
|
||||
Assert.Equal((ushort)50000, r.ReadUInt16());
|
||||
Assert.Equal(-42, r.ReadVarInt());
|
||||
Assert.Equal(3.14159f, r.ReadSingle(), 5);
|
||||
Assert.Equal("héllo 世界", r.ReadString());
|
||||
Assert.Equal(new byte[] { 1, 2, 3, 0, 255 }, r.ReadBytes());
|
||||
Assert.False(r.HasMore);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void EmptyAndNull_String_Bytes_RoundTripAsEmpty()
|
||||
{
|
||||
var w = new PacketWriter();
|
||||
w.WriteString(null);
|
||||
w.WriteString("");
|
||||
w.WriteBytes(null);
|
||||
w.WriteBytes(Array.Empty<byte>());
|
||||
|
||||
var r = new PacketReader(w.ToArray());
|
||||
Assert.Equal("", r.ReadString());
|
||||
Assert.Equal("", r.ReadString());
|
||||
Assert.Empty(r.ReadBytes());
|
||||
Assert.Empty(r.ReadBytes());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReadPastEnd_Throws()
|
||||
{
|
||||
var r = new PacketReader(Array.Empty<byte>());
|
||||
Assert.Throws<FormatException>(() => r.ReadByte());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReadBytes_WithBogusLength_Throws()
|
||||
{
|
||||
// 长度前缀声称 10 字节,实际无数据
|
||||
var w = new PacketWriter();
|
||||
w.WriteVarUInt(10);
|
||||
var r = new PacketReader(w.ToArray());
|
||||
Assert.Throws<FormatException>(() => r.ReadBytes());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReadVarUInt_SixthByte_Throws()
|
||||
{
|
||||
// 5 个延续字节后还有第 6 字节 → 过长,必须抛异常而非静默损坏
|
||||
var r = new PacketReader(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x00 });
|
||||
Assert.Throws<FormatException>(() => r.ReadVarUInt());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReadVarUInt_LastByteOverflow_Throws()
|
||||
{
|
||||
// 第 5 字节 0x10 表示值超过 uint.MaxValue
|
||||
var r = new PacketReader(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0x10 });
|
||||
Assert.Throws<FormatException>(() => r.ReadVarUInt());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReadVarLong_EleventhByte_Throws()
|
||||
{
|
||||
var r = new PacketReader(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0x00 });
|
||||
Assert.Throws<FormatException>(() => r.ReadVarLong());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReadVarLong_LastByteOverflow_Throws()
|
||||
{
|
||||
// 第 10 字节 0x02 表示值超过 ulong 的 64 位
|
||||
var r = new PacketReader(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02 });
|
||||
Assert.Throws<FormatException>(() => r.ReadVarLong());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user