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 { 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 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 first = service.GetRoomPlayers(); first[0].Name = "Changed"; IReadOnlyList 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 _)); } } }