diff --git a/GameData.UnitTests/UnitTest1.cs b/GameData.UnitTests/UnitTest1.cs index 06ff236..f23eba1 100644 --- a/GameData.UnitTests/UnitTest1.cs +++ b/GameData.UnitTests/UnitTest1.cs @@ -1,9 +1,13 @@ using GameData.Repository; using GameModel; +using GameModel.DeathGame; +using Newtonsoft.Json; using System.Data.Common; namespace GameData.UnitTests { + record TestRecord(PinState PinState); + public class Tests { [SetUp] @@ -11,9 +15,38 @@ namespace GameData.UnitTests { } + [Test] + public void Serialize_PinPicture() + { + var r = new TestRecord(PinState.Down); + var p = PinPicture.Create(); + + string s = JsonConvert.SerializeObject(p); + string s2 = JsonConvert.SerializeObject(r); + + var p2 = JsonConvert.DeserializeObject(s); + } + [Test] public void Test1() { + var setting = new DeathGameSettings(77); + var gm = new DeathGameModel(1, new[] { new Coffin(1, 0, 0) }, setting, new[] { 1, 2, 3 }); + var gameState = GameState.Create(Guid.NewGuid(), "test", ThrowState.Create(ThrowMode.Reposition,99), 1, gm); + + string test = JsonConvert.SerializeObject( + gameState, + new JsonSerializerSettings() + { + TypeNameHandling = TypeNameHandling.Auto + }); + + var obj = JsonConvert.DeserializeObject(test, new JsonSerializerSettings() + { + TypeNameHandling = TypeNameHandling.Auto + }); + + //var client = new ExpenseRepository(null, null, null); //var test = client.GetAll(); } diff --git a/GameData/Dummy/DummyGameRepository.cs b/GameData/Dummy/DummyGameRepository.cs index 2dcc793..ffa0903 100644 --- a/GameData/Dummy/DummyGameRepository.cs +++ b/GameData/Dummy/DummyGameRepository.cs @@ -12,10 +12,10 @@ namespace GameData.Dummy { List gameStates = new List(); - public Task Save(GameState gameState) + public Task Save(GameState gameState) { gameStates.Add(gameState); - return Task.CompletedTask; + return Task.FromResult(gameState); } public GameState Load(Guid gameId) diff --git a/GameData/Model/GameStateDo.cs b/GameData/Model/GameStateDo.cs index b08b01a..9b4aea7 100644 --- a/GameData/Model/GameStateDo.cs +++ b/GameData/Model/GameStateDo.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace GameData.Model { - public record GameStateDo(Guid Id, Guid GameId, string GameName, GameState GameState) + public record GameStateDo(Guid Id, Guid GameId, string GameName, string GameState) { } } diff --git a/GameData/Repository/GameRepository.cs b/GameData/Repository/GameRepository.cs index b3adbcc..c5edc6c 100644 --- a/GameData/Repository/GameRepository.cs +++ b/GameData/Repository/GameRepository.cs @@ -2,11 +2,13 @@ using GameModel; using GameModel.Contracts; using Microsoft.Extensions.Logging; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using static System.Net.Mime.MediaTypeNames; namespace GameData.Repository { @@ -29,10 +31,22 @@ namespace GameData.Repository throw new NotImplementedException(); } - public async Task Save(GameState gameState) + public async Task Save(GameState gameState) { - var gameStateDo = new GameStateDo(gameState.Id, gameState.GameId, gameState.GameName, gameState); + var str = JsonConvert.SerializeObject(gameState, new JsonSerializerSettings() + { + TypeNameHandling = TypeNameHandling.Auto + }); + var gameStateDo = new GameStateDo(gameState.Id, gameState.GameId, gameState.GameName, str); var res = await _client.Post(gameStateDo,UrlGameState); + + + var obj = JsonConvert.DeserializeObject(res.GameState, new JsonSerializerSettings() + { + TypeNameHandling = TypeNameHandling.Auto + }); + + return obj; } public async Task Update(Game game) diff --git a/GameHandler.UnitTests/Mocks/FakeGameRepository.cs b/GameHandler.UnitTests/Mocks/FakeGameRepository.cs index 4eb7016..a48c552 100644 --- a/GameHandler.UnitTests/Mocks/FakeGameRepository.cs +++ b/GameHandler.UnitTests/Mocks/FakeGameRepository.cs @@ -20,9 +20,9 @@ namespace GameHandler.UnitTests.Mocks throw new NotImplementedException(); } - public Task Save(GameState gameState) + public Task Save(GameState gameState) { - return Task.CompletedTask; + return Task.FromResult(gameState); } public Task Update(Game game) diff --git a/GameModel/Contracts/IGameRepository.cs b/GameModel/Contracts/IGameRepository.cs index ce1feef..421e81b 100644 --- a/GameModel/Contracts/IGameRepository.cs +++ b/GameModel/Contracts/IGameRepository.cs @@ -10,7 +10,7 @@ namespace GameModel.Contracts { Task Create(Game game); GameState Load(Guid gameId); - Task Save(GameState gameState); + Task Save(GameState gameState); Task Update(Game game); } } diff --git a/GameModel/GameModel.csproj b/GameModel/GameModel.csproj index a1ed5b3..873cd66 100644 --- a/GameModel/GameModel.csproj +++ b/GameModel/GameModel.csproj @@ -6,4 +6,8 @@ enable + + + + diff --git a/GameModel/PinPicture.cs b/GameModel/PinPicture.cs index 0cf730a..4a582ba 100644 --- a/GameModel/PinPicture.cs +++ b/GameModel/PinPicture.cs @@ -1,4 +1,5 @@ using GameModel.Exceptions; +using Newtonsoft.Json; using System; using System.Collections; using System.Collections.Generic; @@ -6,34 +7,156 @@ using System.Linq; using System.Net.NetworkInformation; using System.Numerics; using System.Reflection.Metadata.Ecma335; -using System.Text; using System.Threading.Tasks; namespace GameModel { public record PinPicture(PinState PinState1, PinState PinState2, PinState PinState3, PinState PinState4, PinState PinState5, PinState PinState6, PinState PinState7, PinState PinState8, PinState PinState9) - : IEnumerable, IEnumerable { + public static PinPicture Create() + { + return PinPicture.Create(PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up); + + } + public static PinPicture Create(PinState pinState1, PinState pinState2, PinState pinState3, PinState pinState4, PinState pinState5, PinState pinState6, PinState pinState7, PinState pinState8, PinState pinState9) { return new PinPicture(pinState1, pinState2, pinState3, pinState4, pinState5, pinState6, pinState7, pinState8, pinState9); } - public static PinPicture Create() + public static PinPicture Create(int pinNumber, PinState pinState) { - return PinPicture.Create(PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up); - //pins.Add(PinState1); - //pins.Add(pinState2); - //pins.Add(pinState3); - //pins.Add(pinState4); - //pins.Add(pinState5); - //pins.Add(pinState6); - //pins.Add(pinState7); - //pins.Add(pinState8); - //pins.Add(pinState9); - //ValidatePinPicture(pins); + if (pinNumber < 1 || pinNumber > 9) + { + throw new InvalidPinPictureException(); + } + + var states = new List(new[] { PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up }).ToArray(); + states[pinNumber - 1] = pinState; + return PinPicture.Create(states); } + private static PinPicture Create(PinState[] states) + { + return PinPicture.Create(states[0], states[1], states[2], states[3], states[4], states[5], states[6], states[7], states[8]); + } + + public static PinPicture CreateAllPins() + { + var states = new List(new[] { PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down }).ToArray(); + return PinPicture.Create(states); + } + + public static PinPicture CreateCircle() + { + var states = new List(new[] { PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Up, PinState.Down, PinState.Down, PinState.Down, PinState.Down }).ToArray(); + return PinPicture.Create(states); + } + + internal static PinPicture Create(string pindata) + { + if (!string.IsNullOrEmpty(pindata)) + { + if (!int.TryParse(pindata, out int dummy)) + { + throw new InvalidDataException($"{pindata} cannot be parsed as throw"); + } + } + + var states = new[] { + pindata.Contains("1") ? PinState.Down : PinState.Up, + pindata.Contains("2") ? PinState.Down : PinState.Up, + pindata.Contains("3") ? PinState.Down : PinState.Up, + pindata.Contains("4") ? PinState.Down : PinState.Up, + pindata.Contains("5") ? PinState.Down : PinState.Up, + pindata.Contains("6") ? PinState.Down : PinState.Up, + pindata.Contains("7") ? PinState.Down : PinState.Up, + pindata.Contains("8") ? PinState.Down : PinState.Up, + pindata.Contains("9") ? PinState.Down : PinState.Up, + }; + + return PinPicture.Create(states); + } + + public static PinPicture operator +(PinPicture pic, PinThrow pinThrow) + { + if (pinThrow.IsSink) + return pic with { }; + + //if (pic.PinState1 == PinState.Down && pinThrow.PicPicture.PinState1 == PinState.Down) + //{ + // throw new InvalidPinCalcExcetion(); + //} + + return pic with + { + PinState1 = pinThrow.PicPicture.PinState1 == PinState.Down ? PinState.Down : pic.PinState1, + PinState2 = pinThrow.PicPicture.PinState2 == PinState.Down ? PinState.Down : pic.PinState2, + PinState3 = pinThrow.PicPicture.PinState3 == PinState.Down ? PinState.Down : pic.PinState3, + PinState4 = pinThrow.PicPicture.PinState4 == PinState.Down ? PinState.Down : pic.PinState4, + PinState5 = pinThrow.PicPicture.PinState5 == PinState.Down ? PinState.Down : pic.PinState5, + PinState6 = pinThrow.PicPicture.PinState6 == PinState.Down ? PinState.Down : pic.PinState6, + PinState7 = pinThrow.PicPicture.PinState7 == PinState.Down ? PinState.Down : pic.PinState7, + PinState8 = pinThrow.PicPicture.PinState8 == PinState.Down ? PinState.Down : pic.PinState8, + PinState9 = pinThrow.PicPicture.PinState9 == PinState.Down ? PinState.Down : pic.PinState9 + }; + } + + public int UpCount + { + get + { + var res = 0; + res += Convert.ToInt32((PinState1 == PinState.Up)); + res += Convert.ToInt32((PinState2 == PinState.Up)); + res += Convert.ToInt32((PinState3 == PinState.Up)); + res += Convert.ToInt32((PinState4 == PinState.Up)); + res += Convert.ToInt32((PinState5 == PinState.Up)); + res += Convert.ToInt32((PinState6 == PinState.Up)); + res += Convert.ToInt32((PinState7 == PinState.Up)); + res += Convert.ToInt32((PinState8 == PinState.Up)); + res += Convert.ToInt32((PinState9 == PinState.Up)); + return res; + } + } + + public int DownCount + { + get + { + var res = 0; + res += Convert.ToInt32((PinState1 == PinState.Down)); + res += Convert.ToInt32((PinState2 == PinState.Down)); + res += Convert.ToInt32((PinState3 == PinState.Down)); + res += Convert.ToInt32((PinState4 == PinState.Down)); + res += Convert.ToInt32((PinState5 == PinState.Down)); + res += Convert.ToInt32((PinState6 == PinState.Down)); + res += Convert.ToInt32((PinState7 == PinState.Down)); + res += Convert.ToInt32((PinState8 == PinState.Down)); + res += Convert.ToInt32((PinState9 == PinState.Down)); + return res; + } + } + + public bool AllUp + { + get + { + return DownCount == 0; + } + } + } + + public record PinPictureEnum : PinPicture, IEnumerable, IEnumerable + { + public PinPictureEnum(PinState PinState1, PinState PinState2, PinState PinState3, PinState PinState4, PinState PinState5, PinState PinState6, PinState PinState7, PinState PinState8, PinState PinState9) : base(PinState1, PinState2, PinState3, PinState4, PinState5, PinState6, PinState7, PinState8, PinState9) + { + } + + + + + //private PinPicture(IEnumerable pins) //{ // this.pins = pins.Select(_ => _).ToList(); @@ -62,7 +185,8 @@ namespace GameModel // throw new InvalidPinPictureException(); //} //} - + + [JsonIgnore] private List pins { get @@ -71,6 +195,7 @@ namespace GameModel } } + [JsonIgnore] public PinState this[int index] { get @@ -112,47 +237,9 @@ namespace GameModel //public PinState PinState8 { get { return this[8]; } set { this[8] = value; } } //public PinState PinState9 { get { return this[9]; } set { this[9] = value; } } - public int UpCount - { - get { return pins.Count(_ => _ == PinState.Up); } - } - public int DownCount - { - get { return pins.Count(_ => _ == PinState.Down); } - } - public bool AllUp - { - get - { - return DownCount == 0; - } - } - - public static PinPicture operator +(PinPicture pic, PinThrow pinThrow) - { - if (pinThrow.IsSink) - return pic with { }; - - //if (pic.PinState1 == PinState.Down && pinThrow.PicPicture.PinState1 == PinState.Down) - //{ - // throw new InvalidPinCalcExcetion(); - //} - - return pic with - { - PinState1 = pinThrow.PicPicture.PinState1 == PinState.Down ? PinState.Down : pic.PinState1, - PinState2 = pinThrow.PicPicture.PinState2 == PinState.Down ? PinState.Down : pic.PinState2, - PinState3 = pinThrow.PicPicture.PinState3 == PinState.Down ? PinState.Down : pic.PinState3, - PinState4 = pinThrow.PicPicture.PinState4 == PinState.Down ? PinState.Down : pic.PinState4, - PinState5 = pinThrow.PicPicture.PinState5 == PinState.Down ? PinState.Down : pic.PinState5, - PinState6 = pinThrow.PicPicture.PinState6 == PinState.Down ? PinState.Down : pic.PinState6, - PinState7 = pinThrow.PicPicture.PinState7 == PinState.Down ? PinState.Down : pic.PinState7, - PinState8 = pinThrow.PicPicture.PinState8 == PinState.Down ? PinState.Down : pic.PinState8, - PinState9 = pinThrow.PicPicture.PinState9 == PinState.Down ? PinState.Down : pic.PinState9 - }; - } + public IEnumerator GetEnumerator() { @@ -167,58 +254,6 @@ namespace GameModel return this.GetEnumerator(); } - public static PinPicture Create(int pinNumber, PinState pinState) - { - if (pinNumber < 1 || pinNumber > 9) - { - throw new InvalidPinPictureException(); - } - - var states = new List(new[] { PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up, PinState.Up }).ToArray(); - states[pinNumber - 1] = pinState; - return PinPicture.Create(states); - } - - private static PinPicture Create(PinState[] states) - { - return PinPicture.Create(states[0], states[1], states[2], states[3], states[4], states[5], states[6], states[7], states[8]); - } - - public static PinPicture CreateAllPins() - { - var states = new List(new[] { PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Down }).ToArray(); - return PinPicture.Create(states); - } - - public static PinPicture CreateCircle() - { - var states = new List(new[] { PinState.Down, PinState.Down, PinState.Down, PinState.Down, PinState.Up, PinState.Down, PinState.Down, PinState.Down, PinState.Down }).ToArray(); - return PinPicture.Create(states); - } - - internal static PinPicture Create(string pindata) - { - if (!string.IsNullOrEmpty(pindata)) - { - if (!int.TryParse(pindata, out int dummy)) - { - throw new InvalidDataException($"{pindata} cannot be parsed as throw"); - } - } - - var states = new[] { - pindata.Contains("1") ? PinState.Down : PinState.Up, - pindata.Contains("2") ? PinState.Down : PinState.Up, - pindata.Contains("3") ? PinState.Down : PinState.Up, - pindata.Contains("4") ? PinState.Down : PinState.Up, - pindata.Contains("5") ? PinState.Down : PinState.Up, - pindata.Contains("6") ? PinState.Down : PinState.Up, - pindata.Contains("7") ? PinState.Down : PinState.Up, - pindata.Contains("8") ? PinState.Down : PinState.Up, - pindata.Contains("9") ? PinState.Down : PinState.Up, - }; - - return PinPicture.Create(states); - } + } } diff --git a/GameModel/PinThrow.cs b/GameModel/PinThrow.cs index 638b1d3..4f8f7f5 100644 --- a/GameModel/PinThrow.cs +++ b/GameModel/PinThrow.cs @@ -8,7 +8,7 @@ namespace GameModel { public record PinThrow(int PlayerId, PinPicture PicPicture, bool IsBell, bool IsSink) { - public bool IsCircle => !IsSink && PicPicture.DownCount == 8 && (PicPicture[5] == PinState.Up); + public bool IsCircle => !IsSink && PicPicture.DownCount == 8 && (PicPicture.PinState5 == PinState.Up); public bool IsNinePins => !IsSink && PinCount == 9;