using System.Buffers.Binary; using AcDream.Core.Net.Messages; using Xunit; namespace AcDream.Core.Net.Tests.Messages; public sealed class DeleteObjectTests { [Fact] public void RejectsWrongOpcode() { Span body = stackalloc byte[12]; BinaryPrimitives.WriteUInt32LittleEndian(body, 0xDEADBEEFu); Assert.Null(DeleteObject.TryParse(body)); } [Fact] public void RejectsTruncated() { Assert.Null(DeleteObject.TryParse(ReadOnlySpan.Empty)); Assert.Null(DeleteObject.TryParse(new byte[9])); } [Fact] public void ParsesGuidAndInstanceSequence() { Span body = stackalloc byte[12]; BinaryPrimitives.WriteUInt32LittleEndian(body, DeleteObject.Opcode); BinaryPrimitives.WriteUInt32LittleEndian(body.Slice(4), 0x80000439u); BinaryPrimitives.WriteUInt16LittleEndian(body.Slice(8), 0x1234); var parsed = DeleteObject.TryParse(body); Assert.NotNull(parsed); Assert.Equal(0x80000439u, parsed!.Value.Guid); Assert.Equal((ushort)0x1234, parsed.Value.InstanceSequence); } /// /// Regression guard: TryParse (0xF747 = true destroy) must always produce /// FromPickup = false. PickupEvent (0xF74A) is a different opcode and is /// the ONLY path that sets FromPickup = true (in WorldSession). /// [Fact] public void TryParse_AlwaysReturnsFromPickupFalse() { Span body = stackalloc byte[12]; BinaryPrimitives.WriteUInt32LittleEndian(body, DeleteObject.Opcode); BinaryPrimitives.WriteUInt32LittleEndian(body.Slice(4), 0x80000001u); BinaryPrimitives.WriteUInt16LittleEndian(body.Slice(8), 0x0001); var parsed = DeleteObject.TryParse(body); Assert.NotNull(parsed); Assert.False(parsed!.Value.FromPickup, "DeleteObject 0xF747 is a true destroy — FromPickup must be false."); } /// /// FromPickup = true can be constructed via the record directly (as /// WorldSession does for PickupEvent 0xF74A). Default is false. /// [Fact] public void Parsed_DefaultFromPickupIsFalse() { var p = new DeleteObject.Parsed(0x80000001u, 1); Assert.False(p.FromPickup); } [Fact] public void Parsed_FromPickupTrueCanBeSet() { var p = new DeleteObject.Parsed(0x80000001u, 1, FromPickup: true); Assert.True(p.FromPickup); } }