This commit is contained in:
Christian Kauer 2023-12-29 11:54:40 +01:00
parent b9ac801281
commit f41a373e25
6 changed files with 82 additions and 26 deletions

View File

@ -0,0 +1,25 @@
using GameModel;
using GameModel.Contracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameData.Dummy
{
public class DummyGameRepository : IGameRepository
{
List<GameState> gameStates = new List<GameState>();
public void Save(GameState gameState)
{
gameStates.Add(gameState);
}
public GameState Load(Guid gameId)
{
return gameStates.Last();
}
}
}

View File

@ -81,7 +81,7 @@ namespace GameHandler.UnitTests.DeathGame
failed = ((GameExenseEventArgs)arg).Triggers;
failedCoffinPlayerId = ((GameExenseEventArgs)arg).PlayerId;
};
var newGm = _gh.CalcNextModel(gm, 2, true, false);
var newGm = _gh.CalcNextModel(gm, 2, true, false, true);
Assert.That(failedCoffinPlayerId, Is.EqualTo(newGm.Coffins.Last().PlayerId));
}
@ -97,7 +97,7 @@ namespace GameHandler.UnitTests.DeathGame
failed = ((GameExenseEventArgs)arg).Triggers;
failedCoffinPlayerId = ((GameExenseEventArgs)arg).PlayerId;
};
var newGm = _gh.CalcNextModel(gm, 3, true, false);
var newGm = _gh.CalcNextModel(gm, 3, true, false, true);
Assert.That(failed, Is.Empty);
Assert.That(failedCoffinPlayerId, Is.Zero);
@ -109,7 +109,7 @@ namespace GameHandler.UnitTests.DeathGame
{
var gm = _gh.InitGameModel(_players, _settings);
var newGm = _gh.CalcNextModel(gm, 2, true, false);
var newGm = _gh.CalcNextModel(gm, 2, true, false, true);
Assert.That(newGm.Coffins.Last().XCount, Is.EqualTo(1));
}
@ -118,7 +118,7 @@ namespace GameHandler.UnitTests.DeathGame
{
var gm = _gh.InitGameModel(_players, _settings);
var newGm = _gh.CalcNextModel(gm, 2, true, true);
var newGm = _gh.CalcNextModel(gm, 2, true, true, true);
Assert.That(newGm.Coffins.Last().XCount, Is.EqualTo(1));
}
@ -127,7 +127,7 @@ namespace GameHandler.UnitTests.DeathGame
{
var gm = _gh.InitGameModel(_players, _settings);
var newGm = _gh.CalcNextModel(gm, 0, false, false);
var newGm = _gh.CalcNextModel(gm, 0, false, false, true);
Assert.That(newGm.Coffins.Last().LineCount, Is.EqualTo(1));
Assert.That(newGm.Coffins.Last().XCount, Is.EqualTo(0));
}
@ -142,7 +142,7 @@ namespace GameHandler.UnitTests.DeathGame
coffins.Insert(0, first);
var gm2 = gm with { Coffins = coffins.ToArray(), Id = 2 };
var newGm = _gh.CalcNextModel(gm2, 2, true, true);
var newGm = _gh.CalcNextModel(gm2, 2, true, true, true);
Assert.That(newGm.Coffins.Last().XCount, Is.EqualTo(0));
Assert.That(newGm.Coffins.Last().LineCount, Is.EqualTo(first.LineCount + 2)); // one for third x, one for failed throw
@ -156,7 +156,7 @@ namespace GameHandler.UnitTests.DeathGame
var first = gm.Coffins.First();
DeathGameModel? newGm = null;
Assert.That(() => { newGm = _gh.CalcNextModel(gm, 2, false, false); }, Throws.Nothing);
Assert.That(() => { newGm = _gh.CalcNextModel(gm, 2, false, false, true); }, Throws.Nothing);
Assert.That(first.PlayerId,Is.EqualTo(newGm.Coffins.Last().PlayerId));
Assert.That(gm.Coffins.Count, Is.EqualTo(newGm.Coffins.Count()));
@ -168,7 +168,7 @@ namespace GameHandler.UnitTests.DeathGame
var gm = _gh.InitGameModel(_players, _settings);
var prev = gm.Coffins.Last();
var newGm = _gh.CalcNextModel(gm, 2, false, true);
var newGm = _gh.CalcNextModel(gm, 2, false, true, true);
var prevNew = newGm.Coffins.First(_ => _.PlayerId == prev.PlayerId);
Assert.That(prevNew.LineCount, Is.EqualTo(prev.LineCount + 1));
@ -187,7 +187,7 @@ namespace GameHandler.UnitTests.DeathGame
coffins.Insert(0, first);
var gm2 = gm with { Coffins = coffins.ToArray(), Id = 2 };
var newGm = _gh.CalcNextModel(gm2, 0, false, false);
var newGm = _gh.CalcNextModel(gm2, 0, false, false, true);
@ -208,7 +208,7 @@ namespace GameHandler.UnitTests.DeathGame
coffins.Insert(gm.Coffins.Length - 1, last);
var gm2 = gm with { Coffins = coffins.ToArray(), Id = 2 };
var newGm = _gh.CalcNextModel(gm2, 2, false, true);
var newGm = _gh.CalcNextModel(gm2, 2, false, true, true);
Assert.That(deadCoffin.PlayerId, Is.EqualTo(last.PlayerId));
Assert.That(newGm.Coffins.FirstOrDefault(_ => _.PlayerId == deadCoffin.PlayerId), Is.Null);
@ -228,7 +228,7 @@ namespace GameHandler.UnitTests.DeathGame
var gm2 = gm with { Coffins = coffins.ToArray(), Id = 2 };
var newGm = _gh.CalcNextModel(gm2, 2, false, true);
var newGm = _gh.CalcNextModel(gm2, 2, false, true, true);
Assert.That(deadCoffin.PlayerId, Is.EqualTo(next.PlayerId));
Assert.That(newGm.Coffins.FirstOrDefault(_ => _.PlayerId == deadCoffin.PlayerId), Is.Null);
@ -256,7 +256,7 @@ namespace GameHandler.UnitTests.DeathGame
var gm2 = gm with { Coffins = coffins.ToArray(), Id = 2 };
var newGm = _gh.CalcNextModel(gm2, 2, false, true);
var newGm = _gh.CalcNextModel(gm2, 2, false, true, true);
Assert.That(bodies.Count, Is.EqualTo(2));
foreach (var body in bodies)

View File

@ -32,13 +32,23 @@ namespace GameHandler.UnitTests.GameHandler
[Test]
public void Update_ThrowsExceptionWhenModelIsNull()
{
Assert.That(() => _gh.Update(PinThrow.Create(2, false, true), null, BoardState.Create()), Throws.TypeOf<ArgumentNullException>());
Assert.That(() => _gh.Update(
PinThrow.Create(2, false, true),
null,
BoardState.Create(),
null)
, Throws.TypeOf<ArgumentNullException>());
}
[Test]
public void Update_ThrowsExceptionWhenModelIsNotInitialized()
{
Assert.That(() => _gh.Update(PinThrow.Create(2, false, true), new FreeGameModel(null,0,Array.Empty<FreeGameThrow>()), BoardState.Create()), Throws.TypeOf<FreeGameThrowExcepetion>());
Assert.That(() => _gh.Update(
PinThrow.Create(2, false, true),
new FreeGameModel(null,0,Array.Empty<FreeGameThrow>()),
BoardState.Create(),
null)
, Throws.TypeOf<FreeGameThrowExcepetion>());
}
}
}

View File

@ -56,7 +56,7 @@ namespace GameHandler
return Start(defaultPlayerIds, new DeathGameSettings(6), gameName);
}
public GameState Start(int[] playerIds, IGameSettings gameSettings, string gameName = FreeGameHandler.GAMENAME_FREETRAINING)
public GameState Start(int[] playerIds, IGameSettings gameSettings, string gameName = FreeGameHandler.GAMENAME_FREETRAINING)
{
if (_isStarted)
{
@ -64,19 +64,26 @@ namespace GameHandler
}
_isStarted = true;
InitGameServiceBehaviour(gameName);
_lastState = InitGameState(playerIds, gameSettings, gameName);
return _lastState;
}
private GameState InitGameState(int[] playerIds, IGameSettings gameSettings, string gameName)
{
var gm = _gh.InitGameModel(playerIds, gameSettings);
var throwState = ThrowState.Create(_gh.ThrowMode(), _gh.ThrowsPerRount());
return GameState.Create(gameName, throwState, _gh.GetCurrentPlayerId(gm), gm, ExpenseModel.Create());
}
private void InitGameServiceBehaviour(string gameName)
{
_scope = _rootContainer?.BeginLifetimeScope();
_gh = this.GetGameHandler(gameName);
_gh.GameExpenseOccured += _gh_GameExpenseOccured;
var gm = _gh.InitGameModel(playerIds, gameSettings);
_th = new ThrowHandler();
_eh = new ExpenseHandler(_expenseRepository);
var throwState = ThrowState.Create(_gh.ThrowMode(), _gh.ThrowsPerRount());
_lastState = GameState.Create(throwState, _gh.GetCurrentPlayerId(gm), gm, ExpenseModel.Create());
return _lastState;
}
private void _gh_GameExpenseOccured(object? sender, EventArgs e)

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameModel.Contracts
{
public interface IGameRepository
{
GameState Load(Guid gameId);
void Save(GameState gameState);
}
}

View File

@ -7,11 +7,11 @@ using System.Threading.Tasks;
namespace GameModel
{
public record GameState(ThrowState ThrowState, int NextPlayerId, IGameModel GameModel, ExpenseModel ExpenseModel)
public record GameState(Guid GameId, string GameName, ThrowState ThrowState, int NextPlayerId, IGameModel GameModel, ExpenseModel ExpenseModel)
{
public static GameState Create(ThrowState throwState, int nextPlayerId, IGameModel gameModel, ExpenseModel expenseModel)
public static GameState Create(string gameName, ThrowState throwState, int nextPlayerId, IGameModel gameModel, ExpenseModel expenseModel)
{
return new GameState(throwState, nextPlayerId, gameModel, expenseModel);
return new GameState(Guid.NewGuid(), gameName, throwState, nextPlayerId, gameModel, expenseModel);
}
}
}