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 GameModel.Settings;
using Microsoft.Extensions.Logging;
@ -84,7 +85,7 @@ namespace GameData
StringContent content = null;
if (payload != null)
{
var payloadString = JsonConvert.SerializeObject(payload);
var payloadString = LowercaseJsonSerializer.SerializeObject(payload);
content = new StringContent(payloadString, Encoding.UTF8, "application/json");
}

View File

@ -15,12 +15,12 @@ namespace GameData.Dummy
return IExpenseRepository.TestData;
}
public void Save(MemberExpense data)
public void Save(PlayerExpense data)
{
throw new NotImplementedException();
}
Task IExpenseRepository.Save(MemberExpense data)
Task<PlayerExpense> IExpenseRepository.Save(PlayerExpense data)
{
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;
private ApiClient _client;
string Url => "items/expense";
List<MemberExpense> _memberExpenses = new List<MemberExpense>();
string UrlExpense => "items/expense";
string UrlPlayerExpense => "items/playerexpense";
List<PlayerExpense> _memberExpenses = new List<PlayerExpense>();
public ExpenseRepository(ILogger<ExpenseRepository> log, ApiClient apiClient)
{
@ -28,12 +29,12 @@ namespace GameData.Repository
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.Mocks;
using System;
using System.Collections.Generic;
using System.Linq;

View File

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

View File

@ -1,9 +1,10 @@
using Autofac;
using GameHandler.DeathGame;
using GameHandler.UnitTests.Mocks;
using GameModel;
using GameModel.Contract;
using GameModel.Contracts;
using GameModel.Exceptions;
using GameModel.Mocks;
using System;
using System.Collections.Generic;
using System.Linq;
@ -22,7 +23,8 @@ namespace GameHandler.UnitTests
{
var builder = new ContainerBuilder();
builder.RegisterType<FakeExpenseRepository>().As<IExpenseRepository>();
builder.RegisterType<FakeExpenseRepository>().As<IExpenseRepository>();
builder.RegisterType<FakeGameRepository>().As<IGameRepository>();
service = new GameService(builder.Build());
}
@ -55,13 +57,13 @@ namespace GameHandler.UnitTests
}
[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 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;

View File

@ -1,11 +1,12 @@
using GameModel.Contract;
using GameModel;
using GameModel.Contract;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameModel.Mocks
namespace GameHandler.UnitTests.Mocks
{
public class FakeExpenseRepository : IExpenseRepository
{
@ -15,5 +16,10 @@ namespace GameModel.Mocks
{
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");
}
List<MemberExpense> memberExpenses = PrepareResult(ref expenseModelToAppend);
List<PlayerExpense> memberExpenses = PrepareResult(ref expenseModelToAppend);
var triggers = gameExenseEventArgs.Triggers;
AssignExpenses(gameExenseEventArgs.PlayerId, gameExenseEventArgs.PlayerIds, memberExpenses, triggers);
@ -38,7 +38,7 @@ namespace GameHandler
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)));
@ -49,12 +49,12 @@ namespace GameHandler
{
foreach (var player in inversePlayers)
{
memberExpenses.Add(MemberExpense.Create(player, expense));
memberExpenses.Add(PlayerExpense.Create(player, expense));
}
}
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");
}
List<MemberExpense> memberExpenses = PrepareResult(ref expenseModelToAppend);
List<PlayerExpense> memberExpenses = PrepareResult(ref expenseModelToAppend);
var triggers = pinThrow.GetExpenseTriggers(currentState);
AssignExpenses(pinThrow.PlayerId, PlayerIds, memberExpenses, triggers);
@ -74,13 +74,13 @@ namespace GameHandler
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)
{
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;
}
}

View File

@ -27,7 +27,7 @@ namespace GameHandler
private Guid _gameStateId;
private List<GameStateHandlerItem<GameState>> gameStates = new List<GameStateHandlerItem<GameState>>();
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 IExpenseRepository _expenseRepository;
@ -71,20 +71,20 @@ namespace GameHandler
if (!expenseModel.Equals(ExpenseModel))
{
expenseModels.Add(new GameStateHandlerItem<ExpenseModel>(_gameStateId, expenseModel, false));
await Save();
}
}
else
{
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)
@ -92,7 +92,7 @@ namespace GameHandler
if (!newState.Equals(GameState))
{
_gameStateId = Guid.NewGuid();
gameStates.Add(new GameStateHandlerItem<GameState>(_gameStateId, newState, false));
gameStates.Add(new GameStateHandlerItem<GameState>(_gameStateId, newState with { Id = _gameStateId }, false));
await Save();
}
}

View File

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

View File

@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace GameModel
{
public record ExpenseModel(MemberExpense[] MemberExpenses)
public record ExpenseModel(PlayerExpense[] MemberExpenses)
{
public virtual bool Equals(ExpenseModel other)
{
@ -19,7 +19,7 @@ namespace GameModel
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);
}
}
}