Removed GameService.AddPlayer and it's usages. Updated tests, added tests for IsGameStarted

This commit is contained in:
martin 2023-08-27 13:21:54 +02:00
parent d299176a1e
commit 8a3dfb058c
4 changed files with 73 additions and 85 deletions

View File

@ -3,6 +3,7 @@ using Microsoft.Extensions.Logging;
using NSubstitute;
using pacMan.Exceptions;
using pacMan.GameStuff;
using pacMan.GameStuff.Items;
using pacMan.Services;
namespace BackendTests.Services;
@ -60,7 +61,7 @@ public class GameServiceTests
public void JoinById_WhenIdNotExists()
{
var player = Players.Create("white");
_service.AddPlayer(player, _spawns); // TODO obsolete
_service.Games.Add(new pacMan.Services.Game(_spawns) { Players = new List<Player> { player } });
Assert.Throws<GameNotFoundException>(() => _service.JoinById(Guid.NewGuid(), player));
}
@ -69,58 +70,20 @@ public class GameServiceTests
public void JoinById_WhenIdExists()
{
var player = Players.Create("white");
var group = _service.AddPlayer(player, _spawns); // TODO obsolete
var game = new pacMan.Services.Game(_spawns) { Players = new List<Player> { player } };
_service.Games.Add(game);
var player2 = Players.Create("black");
var result = _service.JoinById(group.Id, player2);
var result = _service.JoinById(_service.Games[0].Id, player2);
Assert.Multiple(() =>
{
Assert.That(result, Is.EqualTo(group));
Assert.That(group.Players, Has.Count.EqualTo(2));
Assert.That(result, Is.EqualTo(game));
Assert.That(game.Players, Has.Count.EqualTo(2));
Assert.That(_service.Games, Has.Count.EqualTo(1));
});
}
#endregion
#region AddPlayer(IPlayer)
[Test]
public void AddPlayer_ToEmptyGroup()
{
var player = Players.Create("white");
var group = _service.AddPlayer(player, _spawns); // TODO obsolete
Assert.Multiple(() =>
{
Assert.That(group.Players, Has.Count.EqualTo(1));
Assert.That(group.NextPlayer, Is.EqualTo(player));
Assert.That(_service.Games, Has.Count.EqualTo(1));
});
}
[Test]
public void AddPlayer_ToFullGroup()
{
for (var i = 0; i < 4; i++)
{
var player = Players.Create(i.ToString());
_service.AddPlayer(player, _spawns); // TODO obsolete
}
var player5 = Players.Create("white");
var group = _service.AddPlayer(player5, new Queue<DirectionalPosition>(new[] { _spawn3By3Up }));
Assert.Multiple(() =>
{
Assert.That(group.Players, Has.Count.EqualTo(1));
Assert.That(group.NextPlayer, Is.EqualTo(player5));
Assert.That(_service.Games, Has.Count.EqualTo(2));
Assert.That(_service.Games.First(), Has.Count.EqualTo(Rules.MaxPlayers));
});
}
#endregion
}

View File

@ -61,13 +61,54 @@ public class GameTests
#endregion
#region IsGameStarted
[Test]
public void IsGameStarted_WhenEmpty()
{
Assert.That(_game.IsGameStarted, Is.False);
}
[Test]
public void IsGameStarted_WhenNotAllInGame()
{
AddFullParty();
Assert.That(_game.IsGameStarted, Is.False);
}
[Test]
public void IsGameStarted_WhenAllInGame()
{
AddFullParty();
_game.Players.ForEach(player => player.State = State.InGame);
Assert.That(_game.IsGameStarted, Is.True);
}
[Test]
public void IsGameStared_WhenAllDisconnected()
{
AddFullParty();
_game.Players.ForEach(player => player.State = State.Disconnected);
Assert.That(_game.IsGameStarted, Is.False);
}
[Test]
public void IsGameStarted_WhenHalfInGame()
{
AddFullParty();
_game.Players.ForEach(player =>
player.State = _game.Players.IndexOf(player) % 2 == 0 ? State.InGame : State.Disconnected);
Assert.That(_game.IsGameStarted, Is.True);
}
#endregion
#region AddPlayer(Player player)
[Test]
public void AddPlayer_WhenEmpty()
{
var added = _game.AddPlayer(_redPlayer);
Assert.That(added, Is.True);
Assert.DoesNotThrow(() => _game.AddPlayer(_redPlayer));
}
[Test]
@ -75,8 +116,8 @@ public class GameTests
Assert.Multiple(() =>
{
AddFullParty();
Assert.That(_game.Players.Count, Is.EqualTo(Rules.MaxPlayers));
Assert.That(_game.AddPlayer(_purplePlayer), Is.False);
Assert.That(_game.Players, Has.Count.EqualTo(Rules.MaxPlayers));
Assert.Throws<GameNotPlayableException>(() => _game.AddPlayer(_purplePlayer));
});
[Test]
@ -84,8 +125,7 @@ public class GameTests
{
var redClone = _redPlayer.Clone();
_game.AddPlayer(_redPlayer);
var added = _game.AddPlayer(redClone);
Assert.That(added, Is.True);
Assert.DoesNotThrow(() => _game.AddPlayer(redClone));
}
[Test]
@ -114,7 +154,7 @@ public class GameTests
_game.SetReady(_bluePlayer.Username);
_game.SetAllInGame();
Assert.That(_game.AddPlayer(_greenPlayer), Is.False);
Assert.Throws<GameNotPlayableException>(() => _game.AddPlayer(_greenPlayer));
}
#endregion

View File

@ -19,14 +19,19 @@ public class Game
public List<Player> Players
{
get => _players;
set =>
_players = _players.Select((player, index) =>
{
player.State = value[index].State;
player.PacMan = value[index].PacMan;
player.Box = value[index].Box;
return player;
}).ToList();
set
{
if (_players.Count > 0)
_players = _players.Select((player, index) =>
{
player.State = value[index].State;
player.PacMan = value[index].PacMan;
player.Box = value[index].Box;
return player;
}).ToList();
else
_players = value;
}
}
[JsonIgnore] public List<Character> Ghosts { get; set; } = new(); // TODO include
@ -37,6 +42,7 @@ public class Game
[JsonInclude] public int Count => Players.Count;
// TODO edge-case when game has started but all players have disconnected, Disconnected property?
[JsonInclude] public bool IsGameStarted => Count > 0 && Players.Any(player => player.State is State.InGame);
public Player NextPlayer()
@ -57,21 +63,18 @@ public class Game
public event Func<ArraySegment<byte>, Task>? Connections;
public bool AddPlayer(Player player)
public void AddPlayer(Player player)
{
if (Players.Count >= Rules.MaxPlayers || IsGameStarted) return false;
/* TODO remove above and uncomment below
if (Players.Count >= Rules.MaxPlayers)
if (Players.Count >= Rules.MaxPlayers)
throw new GameNotPlayableException("Game is full");
if (IsGameStarted)
throw new GameNotPlayableException("Game has already started");
*/
player.State = State.WaitingForPlayers;
if (Players.Exists(p => p.Username == player.Username)) return true; // TODO change to false
if (Players.Exists(p => p.Username == player.Username)) return;
Players.Add(player);
if (player.PacMan.SpawnPosition is null) SetSpawn(player);
return true;
}
public Player? RemovePlayer(string username)

View File

@ -19,24 +19,6 @@ public class GameService : WebSocketService
/// </summary>
public SynchronizedCollection<Game> Games { get; } = new();
[Obsolete("Use CreateAndJoin instead")]
public Game AddPlayer(Player player, Queue<DirectionalPosition> spawns)
{
var index = 0;
try
{
while (!Games[index].AddPlayer(player)) index++;
}
catch (ArgumentOutOfRangeException)
{
var game = new Game(spawns);
game.AddPlayer(player);
Games.Add(game);
}
return Games[index];
}
/// <summary>
/// This method tries to find a game with the specified id, add a player to it and return the updated game.
/// </summary>