This commit is contained in:
Christian Kauer 2023-12-29 18:21:58 +01:00
parent a373efefbd
commit e8ecac57c1
15 changed files with 127 additions and 52 deletions

View File

@ -1,4 +1,5 @@
using GameData.Model; using GameData.Helper;
using GameData.Model;
using GameData.Repository; using GameData.Repository;
using GameModel.Settings; using GameModel.Settings;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -84,7 +85,7 @@ namespace GameData
StringContent content = null; StringContent content = null;
if (payload != null) if (payload != null)
{ {
var payloadString = JsonConvert.SerializeObject(payload); var payloadString = LowercaseJsonSerializer.SerializeObject(payload);
content = new StringContent(payloadString, Encoding.UTF8, "application/json"); content = new StringContent(payloadString, Encoding.UTF8, "application/json");
} }

View File

@ -15,12 +15,12 @@ namespace GameData.Dummy
return IExpenseRepository.TestData; return IExpenseRepository.TestData;
} }
public void Save(MemberExpense data) public void Save(PlayerExpense data)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
Task IExpenseRepository.Save(MemberExpense data) Task<PlayerExpense> IExpenseRepository.Save(PlayerExpense data)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -0,0 +1,31 @@
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameData.Helper
{
public class LowercaseJsonSerializer
{
private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
ContractResolver = new LowercaseContractResolver()
};
public static string SerializeObject(object o)
{
return JsonConvert.SerializeObject(o, Formatting.Indented, Settings);
}
public class LowercaseContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
return propertyName.ToLower();
}
}
}
}

View File

@ -15,8 +15,9 @@ namespace GameData.Repository
readonly ILogger<ExpenseRepository> _log; readonly ILogger<ExpenseRepository> _log;
private ApiClient _client; private ApiClient _client;
string Url => "items/expense"; string UrlExpense => "items/expense";
List<MemberExpense> _memberExpenses = new List<MemberExpense>(); string UrlPlayerExpense => "items/playerexpense";
List<PlayerExpense> _memberExpenses = new List<PlayerExpense>();
public ExpenseRepository(ILogger<ExpenseRepository> log, ApiClient apiClient) public ExpenseRepository(ILogger<ExpenseRepository> log, ApiClient apiClient)
{ {
@ -28,12 +29,12 @@ namespace GameData.Repository
public IEnumerable<Expense> GetAll() public IEnumerable<Expense> GetAll()
{ {
return _client.Get<Expense>(Url); return _client.Get<Expense>(UrlExpense).ToList();
} }
public async Task Save(MemberExpense memberExpense) public async Task<PlayerExpense> Save(PlayerExpense memberExpense)
{ {
_memberExpenses.Add(memberExpense); return await _client.Post<PlayerExpense>(memberExpense, UrlPlayerExpense);
} }
} }
} }

View File

@ -1,6 +1,6 @@
using GameModel; using GameHandler.UnitTests.Mocks;
using GameModel;
using GameModel.Exceptions; using GameModel.Exceptions;
using GameModel.Mocks;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;

View File

@ -1,6 +1,5 @@
using GameHandler.Extensions; using GameHandler.Extensions;
using GameModel; using GameModel;
using GameModel.Mocks;
using NUnit.Framework.Legacy; using NUnit.Framework.Legacy;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;

View File

@ -1,9 +1,10 @@
using Autofac; using Autofac;
using GameHandler.DeathGame; using GameHandler.DeathGame;
using GameHandler.UnitTests.Mocks;
using GameModel; using GameModel;
using GameModel.Contract; using GameModel.Contract;
using GameModel.Contracts;
using GameModel.Exceptions; using GameModel.Exceptions;
using GameModel.Mocks;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -22,7 +23,8 @@ namespace GameHandler.UnitTests
{ {
var builder = new ContainerBuilder(); var builder = new ContainerBuilder();
builder.RegisterType<FakeExpenseRepository>().As<IExpenseRepository>(); builder.RegisterType<FakeExpenseRepository>().As<IExpenseRepository>();
builder.RegisterType<FakeGameRepository>().As<IGameRepository>();
service = new GameService(builder.Build()); service = new GameService(builder.Build());
} }
@ -55,13 +57,13 @@ namespace GameHandler.UnitTests
} }
[Test] [Test]
public void HandleThrow_UpdatesTheBoardState() public async Task HandleThrow_UpdatesTheBoardState()
{ {
var ts1 = service.Start(DeathGameHandler.GAMENAME_DEATHBOX); var ts1 = await service.Start(DeathGameHandler.GAMENAME_DEATHBOX);
var bs1 = ts1.ThrowState.BoardState; var bs1 = ts1.ThrowState.BoardState;
var pinThrow = PinThrow.Create(1,PinPicture.Create(1,PinState.Down), false, false); var pinThrow = PinThrow.Create(1,PinPicture.Create(1,PinState.Down), false, false);
var ts2 = service.HandleThrow(pinThrow); var ts2 = await service.HandleThrow(pinThrow);
var bs2 = ts2.ThrowState.BoardState; var bs2 = ts2.ThrowState.BoardState;

View File

@ -1,11 +1,12 @@
using GameModel.Contract; using GameModel;
using GameModel.Contract;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace GameModel.Mocks namespace GameHandler.UnitTests.Mocks
{ {
public class FakeExpenseRepository : IExpenseRepository public class FakeExpenseRepository : IExpenseRepository
{ {
@ -15,5 +16,10 @@ namespace GameModel.Mocks
{ {
return IExpenseRepository.TestData; return IExpenseRepository.TestData;
} }
public Task<PlayerExpense> Save(PlayerExpense data)
{
return Task.FromResult(data);
}
} }
} }

View File

@ -0,0 +1,33 @@
using GameModel;
using GameModel.Contracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameHandler.UnitTests.Mocks
{
internal class FakeGameRepository : IGameRepository
{
public Task<Game> Create(Game game)
{
return Task.FromResult(Game.Create());
}
public GameState Load(Guid gameId)
{
throw new NotImplementedException();
}
public Task Save(GameState gameState)
{
return Task.CompletedTask;
}
public Task Update(Game game)
{
return Task.CompletedTask;
}
}
}

View File

@ -30,7 +30,7 @@ namespace GameHandler
throw new InvalidPinThrowException($"Player {gameExenseEventArgs.PlayerId} not found"); throw new InvalidPinThrowException($"Player {gameExenseEventArgs.PlayerId} not found");
} }
List<MemberExpense> memberExpenses = PrepareResult(ref expenseModelToAppend); List<PlayerExpense> memberExpenses = PrepareResult(ref expenseModelToAppend);
var triggers = gameExenseEventArgs.Triggers; var triggers = gameExenseEventArgs.Triggers;
AssignExpenses(gameExenseEventArgs.PlayerId, gameExenseEventArgs.PlayerIds, memberExpenses, triggers); AssignExpenses(gameExenseEventArgs.PlayerId, gameExenseEventArgs.PlayerIds, memberExpenses, triggers);
@ -38,7 +38,7 @@ namespace GameHandler
return expenseModelToAppend with { MemberExpenses = memberExpenses.ToArray() }; return expenseModelToAppend with { MemberExpenses = memberExpenses.ToArray() };
} }
private void AssignExpenses(int playerId, int[] playerIds, List<MemberExpense> memberExpenses, ExpenseTrigger[] triggers) private void AssignExpenses(int playerId, int[] playerIds, List<PlayerExpense> memberExpenses, ExpenseTrigger[] triggers)
{ {
var destExpenses = _expenseRepository.GetAll().Where(_ => _.ExpenseTriggers.Any(et => triggers.Any(et2 => et2 == et))); var destExpenses = _expenseRepository.GetAll().Where(_ => _.ExpenseTriggers.Any(et => triggers.Any(et2 => et2 == et)));
@ -49,12 +49,12 @@ namespace GameHandler
{ {
foreach (var player in inversePlayers) foreach (var player in inversePlayers)
{ {
memberExpenses.Add(MemberExpense.Create(player, expense)); memberExpenses.Add(PlayerExpense.Create(player, expense));
} }
} }
else else
{ {
memberExpenses.Add(MemberExpense.Create(playerId, expense)); memberExpenses.Add(PlayerExpense.Create(playerId, expense));
} }
} }
} }
@ -66,7 +66,7 @@ namespace GameHandler
throw new InvalidPinThrowException($"Player {pinThrow.PlayerId} not found"); throw new InvalidPinThrowException($"Player {pinThrow.PlayerId} not found");
} }
List<MemberExpense> memberExpenses = PrepareResult(ref expenseModelToAppend); List<PlayerExpense> memberExpenses = PrepareResult(ref expenseModelToAppend);
var triggers = pinThrow.GetExpenseTriggers(currentState); var triggers = pinThrow.GetExpenseTriggers(currentState);
AssignExpenses(pinThrow.PlayerId, PlayerIds, memberExpenses, triggers); AssignExpenses(pinThrow.PlayerId, PlayerIds, memberExpenses, triggers);
@ -74,13 +74,13 @@ namespace GameHandler
return expenseModelToAppend with { MemberExpenses = memberExpenses.ToArray() }; return expenseModelToAppend with { MemberExpenses = memberExpenses.ToArray() };
} }
private static List<MemberExpense> PrepareResult(ref ExpenseModel expenseModelToAppend) private static List<PlayerExpense> PrepareResult(ref ExpenseModel expenseModelToAppend)
{ {
if (expenseModelToAppend == null) if (expenseModelToAppend == null)
{ {
expenseModelToAppend = new ExpenseModel(Array.Empty<MemberExpense>()); expenseModelToAppend = new ExpenseModel(Array.Empty<PlayerExpense>());
} }
var memberExpenses = new List<MemberExpense>(expenseModelToAppend.MemberExpenses); var memberExpenses = new List<PlayerExpense>(expenseModelToAppend.MemberExpenses);
return memberExpenses; return memberExpenses;
} }
} }

View File

@ -27,7 +27,7 @@ namespace GameHandler
private Guid _gameStateId; private Guid _gameStateId;
private List<GameStateHandlerItem<GameState>> gameStates = new List<GameStateHandlerItem<GameState>>(); private List<GameStateHandlerItem<GameState>> gameStates = new List<GameStateHandlerItem<GameState>>();
private List<GameStateHandlerItem<ExpenseModel>> expenseModels = new List<GameStateHandlerItem<ExpenseModel>>(); private List<GameStateHandlerItem<ExpenseModel>> expenseModels = new List<GameStateHandlerItem<ExpenseModel>>();
private List<GameStateHandlerItem<MemberExpense>> memberExpenses = new List<GameStateHandlerItem<MemberExpense>>(); private List<GameStateHandlerItem<PlayerExpense>> memberExpenses = new List<GameStateHandlerItem<PlayerExpense>>();
private IGameRepository _gameRepository; private IGameRepository _gameRepository;
private IExpenseRepository _expenseRepository; private IExpenseRepository _expenseRepository;
@ -71,20 +71,20 @@ namespace GameHandler
if (!expenseModel.Equals(ExpenseModel)) if (!expenseModel.Equals(ExpenseModel))
{ {
expenseModels.Add(new GameStateHandlerItem<ExpenseModel>(_gameStateId, expenseModel, false)); expenseModels.Add(new GameStateHandlerItem<ExpenseModel>(_gameStateId, expenseModel, false));
await Save();
} }
} }
else else
{ {
expenseModels.Add(new GameStateHandlerItem<ExpenseModel>(_gameStateId, expenseModel, false)); expenseModels.Add(new GameStateHandlerItem<ExpenseModel>(_gameStateId, expenseModel, false));
await Save();
} }
foreach(var memberExpense in expenseModel.MemberExpenses.Where(_ => memberExpenses.Any(me => me.Data.Id.Equals(_.Id)))) foreach(var memberExpense in expenseModel.MemberExpenses.Where(_ => !memberExpenses.Any(me => me.Data.Id.Equals(_.Id))))
{ {
memberExpenses.Add(new GameStateHandlerItem<MemberExpense>(_gameStateId,memberExpense,false)); memberExpenses.Add(new GameStateHandlerItem<PlayerExpense>(_gameStateId,memberExpense with { GamestateId = _gameStateId },false));
} }
await Save();
} }
internal async Task Add(GameState newState, Game game) internal async Task Add(GameState newState, Game game)
@ -92,7 +92,7 @@ namespace GameHandler
if (!newState.Equals(GameState)) if (!newState.Equals(GameState))
{ {
_gameStateId = Guid.NewGuid(); _gameStateId = Guid.NewGuid();
gameStates.Add(new GameStateHandlerItem<GameState>(_gameStateId, newState, false)); gameStates.Add(new GameStateHandlerItem<GameState>(_gameStateId, newState with { Id = _gameStateId }, false));
await Save(); await Save();
} }
} }

View File

@ -18,6 +18,6 @@ namespace GameModel.Contract
}; };
IEnumerable<Expense> GetAll(); IEnumerable<Expense> GetAll();
Task Save(MemberExpense data); Task<PlayerExpense> Save(PlayerExpense data);
} }
} }

View File

@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace GameModel namespace GameModel
{ {
public record ExpenseModel(MemberExpense[] MemberExpenses) public record ExpenseModel(PlayerExpense[] MemberExpenses)
{ {
public virtual bool Equals(ExpenseModel other) public virtual bool Equals(ExpenseModel other)
{ {
@ -19,7 +19,7 @@ namespace GameModel
public static ExpenseModel Create() public static ExpenseModel Create()
{ {
return new ExpenseModel(Array.Empty<MemberExpense>()); return new ExpenseModel(Array.Empty<PlayerExpense>());
} }
} }
} }

View File

@ -1,16 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameModel
{
public record MemberExpense(Guid Id, int MemberId, Guid ExpenseId, ExpenseType ExpenseType, DateTime Created, decimal Price, string Name)
{
public static MemberExpense Create(int MemberId, Expense Expense)
{
return new MemberExpense(Guid.NewGuid(), MemberId, Expense.Id, Expense.ExpenseType, DateTime.Now, Expense.Price, Expense.Name);
}
}
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameModel
{
public record PlayerExpense(Guid Id, int PlayerId, Guid ExpenseId, ExpenseType ExpenseType,
DateTime Created, decimal Price, string Name, Guid GamestateId)
{
public static PlayerExpense Create(int playerId, Expense expense)
{
return new PlayerExpense(Guid.NewGuid(), playerId, expense.Id, expense.ExpenseType,
DateTime.Now, expense.Price, expense.Name, Guid.Empty);
}
}
}