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 3 years ago
commit 16ab43af5a

@ -4,6 +4,6 @@ namespace Model.Dice
{ {
public class DieManager 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 // https://stackoverflow.com/questions/1139957/convert-integer-to-hexadecimal-and-back-again
// maybe prepend it with a "#"... // 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); return string.Format("Assets/images/{0}", Value);
} }
public override string ToString()
{
return GetPracticalValue().ToString();
}
} }
} }

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

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

@ -10,7 +10,7 @@ namespace Model.Games
{ {
public string Name { get; private set; } 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) public Game(string name)
{ {

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

@ -1,4 +1,10 @@
using System; 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; using Model.Players;
namespace Model.Games namespace Model.Games
@ -23,22 +29,22 @@ namespace Model.Games
/// </summary> /// </summary>
public readonly Player player; public readonly Player player;
// ... faces /// <summary>
/// the collection of Face that were rolled
/// </summary>
private readonly IEnumerable<AbstractDieFace> faces;
/// <summary> /// <summary>
/// this private constructor is to be used only by factories /// this private constructor is to be used only by factories
/// </summary> /// </summary>
/// <param name="when">date and time of the turn</param> /// <param name="when">date and time of the turn</param>
/// <param name="player">player who played the turn</param> /// <param name="player">player who played the turn</param>
/// <param name="faces">faces that were rolled</param>
// ... faces private Turn(DateTime when, Player player, IEnumerable<AbstractDieFace> faces)
private Turn(DateTime when, Player player/*, IEnumerable<AbstractDieFace> faces*/)
{ {
this.when = when; this.when = when;
this.player = player; this.player = player;
// ... faces this.faces = faces;
} }
/// <summary> /// <summary>
@ -49,14 +55,16 @@ namespace Model.Games
/// </summary> /// </summary>
/// <param name="when">date and time of the turn</param> /// <param name="when">date and time of the turn</param>
/// <param name="player">player who played 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> /// <returns>a new Turn object</returns>
public static Turn CreateWithSpecifiedTime(DateTime when, Player player, IEnumerable<AbstractDieFace> faces)
// ... faces
public static Turn CreateWithSpecifiedTime(DateTime when, Player player/*, IEnumerable<AbstractDieFace> faces*/)
{ {
// ... faces if (faces is null || !faces.Any())
if (player == null) {
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"); throw new ArgumentNullException(nameof(player), "param should not be null");
} }
@ -65,38 +73,43 @@ namespace Model.Games
when = when.ToUniversalTime(); when = when.ToUniversalTime();
} }
return new Turn(when, player/*, faces*/); return new Turn(when, player, faces);
} }
/// <summary> /// <summary>
/// creates a Turn with a default time, which is "now" in UTC. /// creates a Turn with a default time, which is "now" in UTC.
/// </summary> /// </summary>
/// <param name="player">player who played 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> /// <returns>a new Turn object</returns>
public static Turn CreateWithDefaultTime(Player player, IEnumerable<AbstractDieFace> faces)
// ... faces
public static Turn CreateWithDefaultTime(Player player/*, IEnumerable<AbstractDieFace> faces*/)
{ {
return CreateWithSpecifiedTime(DateTime.UtcNow, player/*, faces*/); return CreateWithSpecifiedTime(DateTime.UtcNow, player, faces);
} }
// ... faces
/// <summary> /// <summary>
/// represents a turn in string format /// represents a turn in string format
/// </summary> /// </summary>
/// <returns>a turn in string format</returns> /// <returns>a turn in string format</returns>
public override string ToString() public override string ToString()
{ {
return string.Format("{0} -- {1} rolled {2}", string[] datetime = when.ToString("s", System.Globalization.CultureInfo.InvariantCulture).Split("T");
ToStringIsoWithZ(), string date = datetime[0];
player.ToString(), string time = datetime[1];
"<face>, <face>, <face>...");
} StringBuilder sb = new();
private string ToStringIsoWithZ() sb.AppendFormat("{0} {1} -- {2} rolled:",
date,
time,
player.ToString());
foreach (AbstractDieFace face in faces)
{ {
return when.ToString("s", System.Globalization.CultureInfo.InvariantCulture) + "Z"; 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 Model.Players;
using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using Xunit; using Xunit;
namespace Tests.Model_UTs namespace Tests.Model_UTs
{ {
public class TurnTest 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] [Fact]
public void TestCreateWithSpecifiedTimeNotUTCThenValid() public void TestCreateWithSpecifiedTimeNotUTCThenValid()
{ {
@ -16,7 +39,7 @@ namespace Tests.Model_UTs
Assert.NotEqual(DateTimeKind.Utc, dateTime.Kind); Assert.NotEqual(DateTimeKind.Utc, dateTime.Kind);
// Act // Act
Turn turn = Turn.CreateWithSpecifiedTime(dateTime, player); Turn turn = Turn.CreateWithSpecifiedTime(dateTime, player, FACES);
// Assert // Assert
Assert.Equal(DateTimeKind.Utc, turn.when.Kind); Assert.Equal(DateTimeKind.Utc, turn.when.Kind);
@ -32,7 +55,7 @@ namespace Tests.Model_UTs
Assert.Equal(DateTimeKind.Utc, dateTime.Kind); Assert.Equal(DateTimeKind.Utc, dateTime.Kind);
// Act // Act
Turn turn = Turn.CreateWithSpecifiedTime(dateTime, player); Turn turn = Turn.CreateWithSpecifiedTime(dateTime, player, FACES);
// Assert // Assert
Assert.Equal(DateTimeKind.Utc, turn.when.Kind); 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); DateTime dateTime = new(year: 2018, month: 06, day: 15, hour: 16, minute: 30, second: 0, kind: DateTimeKind.Utc);
// Act // Act
void action() => Turn.CreateWithSpecifiedTime(dateTime, null); void action() => Turn.CreateWithSpecifiedTime(dateTime, null, FACES);
// Assert // Assert
Assert.Throws<ArgumentNullException>(action); Assert.Throws<ArgumentNullException>(action);
} }
[Fact] [Fact]
public void TestCreateWithDefaultTimeThenValid() public void TestCreateWithSpecifiedTimeNullFacesThenException()
{ {
// Arrange // 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 // Act
Turn turn = Turn.CreateWithDefaultTime(player); void action() => Turn.CreateWithSpecifiedTime(dateTime, player, null);
// Assert // Assert
Assert.Equal(DateTimeKind.Utc, turn.when.Kind); Assert.Throws<ArgumentException>(action);
Assert.Equal(DateTime.Now.ToUniversalTime().Date, turn.when.Date);
/*** N.B.: might fail between 11:59:59PM and 00:00:00AM ***/
} }
[Fact] [Fact]
public void TestCreateWithDefaultTimeNullPlayerThenException() public void TestCreateWithSpecifiedTimeEmptyFacesThenException()
{ {
// Arrange // 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 // Act
static void action() => Turn.CreateWithDefaultTime(null); void action() => Turn.CreateWithSpecifiedTime(dateTime, player, FACES);
// Assert // 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] [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); DateTime dateTime = new(year: 2018, month: 06, day: 15, hour: 16, minute: 30, second: 0, kind: DateTimeKind.Utc);
string name = "Bobby"; string name = "Bobby";
Player player = new(name); Player player = new(name);
string expected = $"2018-06-15T16:30:00Z -- {name} rolled <face>, <face>, <face>..."; string expected = $"2018-06-15 16:30:00 -- {name} rolled: "
Turn turn = Turn.CreateWithSpecifiedTime(dateTime, player); + FACE_ONE + " "
+ FACE_TWO
+ " Assets/images/" + FACE_THREE + " "
+ FACE_FOUR.ToString("X6").Insert(0, "#");
Turn turn = Turn.CreateWithSpecifiedTime(dateTime, player, FACES);
// Act // Act
string actual = turn.ToString(); string actual = turn.ToString();
Debug.WriteLine(actual);
// Assert // Assert
Assert.Equal(expected, actual); Assert.Equal(expected, actual);

Loading…
Cancel
Save