fix(net): conform character entry and session shutdown
This commit is contained in:
parent
bacc7e45a9
commit
aea957f845
12 changed files with 1016 additions and 95 deletions
|
|
@ -1,4 +1,5 @@
|
|||
using System.Buffers.Binary;
|
||||
using AcDream.Core.Net;
|
||||
using AcDream.Core.Net.Messages;
|
||||
using AcDream.Core.Net.Packets;
|
||||
|
||||
|
|
@ -41,6 +42,67 @@ public class CharacterEnterWorldTests
|
|||
Assert.Equal(0, body[pos++]);
|
||||
Assert.Equal(4 + 4 + 16, body.Length); // opcode + guid + padded string
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SessionSelection_UsesCanonicalCharacterListAccountInF657()
|
||||
{
|
||||
CharacterList.Parsed characters = MakeCharacters(
|
||||
[new CharacterList.Character(0x50000001u, "Ready", 0)],
|
||||
accountName: "CanonicalCase");
|
||||
|
||||
WorldSession.EnterWorldSelection selection =
|
||||
WorldSession.SelectCharacterForEnterWorld(characters, 0);
|
||||
|
||||
ReadOnlySpan<byte> body = selection.EnterWorldBody;
|
||||
Assert.Equal(CharacterEnterWorld.EnterWorldOpcode,
|
||||
BinaryPrimitives.ReadUInt32LittleEndian(body));
|
||||
Assert.Equal(0x50000001u,
|
||||
BinaryPrimitives.ReadUInt32LittleEndian(body[4..]));
|
||||
ushort length = BinaryPrimitives.ReadUInt16LittleEndian(body[8..]);
|
||||
Assert.Equal("CanonicalCase",
|
||||
System.Text.Encoding.ASCII.GetString(body.Slice(10, length)));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(0u, 0u)]
|
||||
[InlineData(0x50000001u, 1u)]
|
||||
[InlineData(0x50000001u, 30u)]
|
||||
public void SessionSelection_RejectsUnavailableActiveIdentity(
|
||||
uint guid,
|
||||
uint secondsGreyedOut)
|
||||
{
|
||||
CharacterList.Parsed characters = MakeCharacters(
|
||||
[new CharacterList.Character(guid, "Unavailable", secondsGreyedOut)],
|
||||
accountName: "Account");
|
||||
|
||||
Assert.Throws<InvalidOperationException>(() =>
|
||||
WorldSession.SelectCharacterForEnterWorld(characters, 0));
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(-1)]
|
||||
[InlineData(1)]
|
||||
public void SessionSelection_RejectsIndexOutsideActiveCollection(int index)
|
||||
{
|
||||
CharacterList.Parsed characters = MakeCharacters(
|
||||
[new CharacterList.Character(0x50000001u, "Ready", 0)],
|
||||
accountName: "Account");
|
||||
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() =>
|
||||
WorldSession.SelectCharacterForEnterWorld(characters, index));
|
||||
}
|
||||
|
||||
private static CharacterList.Parsed MakeCharacters(
|
||||
IReadOnlyList<CharacterList.Character> active,
|
||||
string accountName) =>
|
||||
new(
|
||||
Status: 0,
|
||||
Characters: active,
|
||||
DeletedCharacters: [],
|
||||
SlotCount: 11,
|
||||
AccountName: accountName,
|
||||
UseTurbineChat: true,
|
||||
HasThroneOfDestiny: true);
|
||||
}
|
||||
|
||||
public class GameMessageFragmentTests
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue