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

pull/56/head
Alexis Drai 2 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
// 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();
}
}
}

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