💬 Include AbstractDieFace in Turn, update ToString(), pass tests
continuous-integration/drone/push Build is passing Details

pull/56/head
Alexis Drai 3 years ago
parent 011db706e0
commit 7389ee8756

@ -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();
}
} }
} }

@ -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,18 @@ namespace Model.Games
/// </summary> /// </summary>
public readonly Player player; public readonly Player player;
// ... faces private 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>
private Turn(DateTime when, Player player, IEnumerable<AbstractDieFace> faces)
// ... 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>
@ -50,13 +52,14 @@ namespace Model.Games
/// <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>
/// <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,7 +68,7 @@ namespace Model.Games
when = when.ToUniversalTime(); when = when.ToUniversalTime();
} }
return new Turn(when, player/*, faces*/); return new Turn(when, player, faces);
} }
/// <summary> /// <summary>
@ -73,30 +76,34 @@ namespace Model.Games
/// </summary> /// </summary>
/// <param name="player">player who played the turn</param> /// <param name="player">player who played the turn</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