Merge pull request '🩹 Complete #40 and #41 -- finish Turn' (#56) from finish-turn into main
continuous-integration/drone/push Build is passing Details

Reviewed-on: #56
pull/58/head
Alexis Drai 2 years ago
commit 16ab43af5a

@ -4,6 +4,6 @@ namespace Model.Dice
{
public class DieManager
{
private IEnumerable<Die> dice = new List<Die>();
private readonly IEnumerable<Die> dice = new List<Die>();
}
}

@ -38,7 +38,12 @@ namespace Model.Dice.Faces
{
// https://stackoverflow.com/questions/1139957/convert-integer-to-hexadecimal-and-back-again
// maybe prepend it with a "#"...
return Value.ToString("X");
return Value.ToString("X6").Insert(0, "#");
}
public override string ToString()
{
return GetPracticalValue().ToString();
}
}
}

@ -31,5 +31,10 @@ namespace Model.Dice.Faces
{
return string.Format("Assets/images/{0}", Value);
}
public override string ToString()
{
return GetPracticalValue().ToString();
}
}
}

@ -18,5 +18,10 @@ namespace Model.Dice.Faces
{
return Value;
}
public override string ToString()
{
return GetPracticalValue().ToString();
}
}
}

@ -6,7 +6,7 @@ namespace Model.Dice
{
private IEnumerable<FavGroup> favGroups;
private DieManager dieManager;
private readonly DieManager dieManager;
public FavGroupManager(DieManager dieManager)
{

@ -10,7 +10,7 @@ namespace Model.Games
{
public string Name { get; private set; }
private IEnumerable<Turn> turns = new List<Turn>();
private readonly IEnumerable<Turn> turns = new List<Turn>();
public Game(string name)
{

@ -10,9 +10,9 @@ namespace Model.Games
{
public class GameRunner
{
private PlayerManager globalPlayerManager;
private FavGroupManager favGroupManager;
private IEnumerable<Game> games;
private readonly PlayerManager globalPlayerManager;
private readonly FavGroupManager favGroupManager;
private readonly IEnumerable<Game> games;
public GameRunner(PlayerManager globalPlayerManager, FavGroupManager favGroupManager, IEnumerable<Game> games)
{

@ -1,4 +1,10 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using Model.Dice.Faces;
using Model.Players;
namespace Model.Games
@ -23,22 +29,22 @@ namespace Model.Games
/// </summary>
public readonly Player player;
// ... faces
/// <summary>
/// the collection of Face that were rolled
/// </summary>
private readonly IEnumerable<AbstractDieFace> faces;
/// <summary>
/// this private constructor is to be used only by factories
/// </summary>
/// <param name="when">date and time of the turn</param>
/// <param name="player">player who played the turn</param>
// ... faces
private Turn(DateTime when, Player player/*, IEnumerable<AbstractDieFace> faces*/)
/// <param name="faces">faces that were rolled</param>
private Turn(DateTime when, Player player, IEnumerable<AbstractDieFace> faces)
{
this.when = when;
this.player = player;
// ... faces
this.faces = faces;
}
/// <summary>
@ -49,14 +55,16 @@ namespace Model.Games
/// </summary>
/// <param name="when">date and time of the turn</param>
/// <param name="player">player who played the turn</param>
/// <param name="faces">faces that were rolled</param>
/// <returns>a new Turn object</returns>
// ... faces
public static Turn CreateWithSpecifiedTime(DateTime when, Player player/*, IEnumerable<AbstractDieFace> faces*/)
public static Turn CreateWithSpecifiedTime(DateTime when, Player player, IEnumerable<AbstractDieFace> faces)
{
// ... faces
if (player == null)
if (faces is null || !faces.Any())
{
throw new ArgumentException("param should not be null or empty", nameof(faces));
}
if (player is null)
{
throw new ArgumentNullException(nameof(player), "param should not be null");
}
@ -65,38 +73,43 @@ namespace Model.Games
when = when.ToUniversalTime();
}
return new Turn(when, player/*, faces*/);
return new Turn(when, player, faces);
}
/// <summary>
/// creates a Turn with a default time, which is "now" in UTC.
/// </summary>
/// <param name="player">player who played the turn</param>
/// <param name="faces">faces that were rolled</param>
/// <returns>a new Turn object</returns>
// ... faces
public static Turn CreateWithDefaultTime(Player player/*, IEnumerable<AbstractDieFace> faces*/)
public static Turn CreateWithDefaultTime(Player player, IEnumerable<AbstractDieFace> faces)
{
return CreateWithSpecifiedTime(DateTime.UtcNow, player/*, faces*/);
return CreateWithSpecifiedTime(DateTime.UtcNow, player, faces);
}
// ... faces
/// <summary>
/// represents a turn in string format
/// </summary>
/// <returns>a turn in string format</returns>
public override string ToString()
{
return string.Format("{0} -- {1} rolled {2}",
ToStringIsoWithZ(),
player.ToString(),
"<face>, <face>, <face>...");
}
string[] datetime = when.ToString("s", System.Globalization.CultureInfo.InvariantCulture).Split("T");
string date = datetime[0];
string time = datetime[1];
private string ToStringIsoWithZ()
{
return when.ToString("s", System.Globalization.CultureInfo.InvariantCulture) + "Z";
StringBuilder sb = new();
sb.AppendFormat("{0} {1} -- {2} rolled:",
date,
time,
player.ToString());
foreach (AbstractDieFace face in faces)
{
sb.Append(" " + face.ToString());
}
return sb.ToString();
}
}
}

@ -1,12 +1,35 @@
using Model.Games;
using Model.Dice.Faces;
using Model.Games;
using Model.Players;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using Xunit;
namespace Tests.Model_UTs
{
public class TurnTest
{
private readonly List<AbstractDieFace> FACES;
private readonly int FACE_ONE = 1;
private readonly int FACE_TWO = 12;
private readonly int FACE_THREE = 54;
private readonly int FACE_FOUR = 16548;
public TurnTest()
{
FACES = new List<AbstractDieFace>
{
new NumberDieFace(FACE_ONE),
new NumberDieFace(FACE_TWO),
new ImageDieFace(FACE_THREE),
new ColorDieFace(FACE_FOUR)
};
}
[Fact]
public void TestCreateWithSpecifiedTimeNotUTCThenValid()
{
@ -16,7 +39,7 @@ namespace Tests.Model_UTs
Assert.NotEqual(DateTimeKind.Utc, dateTime.Kind);
// Act
Turn turn = Turn.CreateWithSpecifiedTime(dateTime, player);
Turn turn = Turn.CreateWithSpecifiedTime(dateTime, player, FACES);
// Assert
Assert.Equal(DateTimeKind.Utc, turn.when.Kind);
@ -32,7 +55,7 @@ namespace Tests.Model_UTs
Assert.Equal(DateTimeKind.Utc, dateTime.Kind);
// Act
Turn turn = Turn.CreateWithSpecifiedTime(dateTime, player);
Turn turn = Turn.CreateWithSpecifiedTime(dateTime, player, FACES);
// Assert
Assert.Equal(DateTimeKind.Utc, turn.when.Kind);
@ -46,38 +69,54 @@ namespace Tests.Model_UTs
DateTime dateTime = new(year: 2018, month: 06, day: 15, hour: 16, minute: 30, second: 0, kind: DateTimeKind.Utc);
// Act
void action() => Turn.CreateWithSpecifiedTime(dateTime, null);
void action() => Turn.CreateWithSpecifiedTime(dateTime, null, FACES);
// Assert
Assert.Throws<ArgumentNullException>(action);
}
[Fact]
public void TestCreateWithDefaultTimeThenValid()
public void TestCreateWithSpecifiedTimeNullFacesThenException()
{
// Arrange
Player player = new("Chloe");
DateTime dateTime = new(year: 2018, month: 06, day: 15, hour: 16, minute: 30, second: 0, kind: DateTimeKind.Utc);
Player player = new("Chucky");
// Act
Turn turn = Turn.CreateWithDefaultTime(player);
void action() => Turn.CreateWithSpecifiedTime(dateTime, player, null);
// Assert
Assert.Equal(DateTimeKind.Utc, turn.when.Kind);
Assert.Equal(DateTime.Now.ToUniversalTime().Date, turn.when.Date);
/*** N.B.: might fail between 11:59:59PM and 00:00:00AM ***/
Assert.Throws<ArgumentException>(action);
}
[Fact]
public void TestCreateWithDefaultTimeNullPlayerThenException()
public void TestCreateWithSpecifiedTimeEmptyFacesThenException()
{
// Arrange
Player player = new("Devon");
DateTime dateTime = new(year: 2018, month: 06, day: 15, hour: 16, minute: 30, second: 0, kind: DateTimeKind.Utc);
Player player = new("Chucky");
FACES.Clear();
// Act
static void action() => Turn.CreateWithDefaultTime(null);
void action() => Turn.CreateWithSpecifiedTime(dateTime, player, FACES);
// Assert
Assert.Throws<ArgumentNullException>(action);
Assert.Throws<ArgumentException>(action);
}
[Fact]
public void TestCreateWithDefaultTimeThenValid()
{
// Arrange
Player player = new("Chloe");
// Act
Turn turn = Turn.CreateWithDefaultTime(player, FACES);
// Assert
Assert.Equal(DateTimeKind.Utc, turn.when.Kind);
Assert.Equal(DateTime.Now.ToUniversalTime().Date, turn.when.Date);
/*** N.B.: might fail between 11:59:59PM and 00:00:00AM ***/
}
[Fact]
@ -87,11 +126,17 @@ namespace Tests.Model_UTs
DateTime dateTime = new(year: 2018, month: 06, day: 15, hour: 16, minute: 30, second: 0, kind: DateTimeKind.Utc);
string name = "Bobby";
Player player = new(name);
string expected = $"2018-06-15T16:30:00Z -- {name} rolled <face>, <face>, <face>...";
Turn turn = Turn.CreateWithSpecifiedTime(dateTime, player);
string expected = $"2018-06-15 16:30:00 -- {name} rolled: "
+ FACE_ONE + " "
+ FACE_TWO
+ " Assets/images/" + FACE_THREE + " "
+ FACE_FOUR.ToString("X6").Insert(0, "#");
Turn turn = Turn.CreateWithSpecifiedTime(dateTime, player, FACES);
// Act
string actual = turn.ToString();
Debug.WriteLine(actual);
// Assert
Assert.Equal(expected, actual);

Loading…
Cancel
Save