Files
AIC-Project/Server/Framework.Shared.Tests/RoomPlayerServiceTests.cs
T
2026-07-29 12:24:58 +08:00

108 lines
3.4 KiB
C#

using System.Collections.Generic;
using Xunit;
using XWorld.Framework;
namespace XWorld.Framework.Tests
{
public class RoomPlayerServiceTests
{
[Fact]
public void SetRoomPlayers_StoresSnapshotAndSupportsLookup()
{
var service = new RoomPlayerService();
var source = new List<PlayerInfo>
{
new PlayerInfo
{
PlayerId = 10,
Name = "Alice",
IsAI = false,
Level = 7,
AppearanceType = 2,
AvatarId = 100,
},
new PlayerInfo
{
PlayerId = -1,
Name = "AI",
IsAI = true,
Level = 1,
AppearanceType = 0,
AvatarId = 0,
},
};
service.SetRoomPlayers(source);
source[0].Name = "Mutated";
IReadOnlyList<PlayerInfo> players = service.GetRoomPlayers();
Assert.Equal(2, players.Count);
Assert.Equal("Alice", players[0].Name);
Assert.True(service.TryGetRoomPlayer(10, out PlayerInfo alice));
Assert.Equal(7, alice.Level);
Assert.Equal(2, alice.AppearanceType);
Assert.Equal(100, alice.AvatarId);
Assert.True(service.TryGetRoomPlayer(-1, out PlayerInfo ai));
Assert.True(ai.IsAI);
}
[Fact]
public void ReturnedPlayers_AreDefensiveCopies()
{
var service = new RoomPlayerService();
service.SetRoomPlayers(new[]
{
new PlayerInfo { PlayerId = 10, Name = "Alice", IsAI = false },
});
IReadOnlyList<PlayerInfo> first = service.GetRoomPlayers();
first[0].Name = "Changed";
IReadOnlyList<PlayerInfo> second = service.GetRoomPlayers();
Assert.Equal("Alice", second[0].Name);
Assert.True(service.TryGetRoomPlayer(10, out PlayerInfo lookup));
lookup.Name = "ChangedAgain";
Assert.True(service.TryGetRoomPlayer(10, out PlayerInfo lookupAgain));
Assert.Equal("Alice", lookupAgain.Name);
}
[Fact]
public void RequestPlayerInfo_ReturnsCachedPlayerOrNull()
{
var service = new RoomPlayerService();
service.SetRoomPlayers(new[]
{
new PlayerInfo { PlayerId = 10, Name = "Alice", IsAI = false, Level = 5 },
});
PlayerInfo? loaded = null;
service.RequestPlayerInfo(10, p => loaded = p);
Assert.NotNull(loaded);
Assert.Equal("Alice", loaded.Name);
Assert.Equal(5, loaded.Level);
PlayerInfo? missing = new PlayerInfo { PlayerId = 99, Name = "should be replaced" };
service.RequestPlayerInfo(99, p => missing = p);
Assert.Null(missing);
}
[Fact]
public void SetRoomPlayers_NullClearsTheRoom()
{
var service = new RoomPlayerService();
service.SetRoomPlayers(new[]
{
new PlayerInfo { PlayerId = 10, Name = "Alice", IsAI = false },
});
service.SetRoomPlayers(null);
Assert.Empty(service.GetRoomPlayers());
Assert.False(service.TryGetRoomPlayer(10, out _));
}
}
}