Merge pull request ' Fix #29 ut-playermanager' (#49) from ut-playermanager into main
continuous-integration/drone/push Build is passing Details

Reviewed-on: #49
pull/50/head
Alexis Drai 3 years ago
commit bfc5a79fc0

@ -15,7 +15,7 @@ namespace Model
{ {
if (!String.IsNullOrWhiteSpace(value)) if (!String.IsNullOrWhiteSpace(value))
{ {
name = value; name = value.Trim();
} }
else throw new ArgumentException("player name may never be empty or null"); else throw new ArgumentException("player name may never be empty or null");
} }

@ -19,7 +19,7 @@ namespace Model
public PlayerManager() public PlayerManager()
{ {
players = new HashSet<Player>(); players = new();
} }
/// <summary> /// <summary>
/// add a new player /// add a new player
@ -57,9 +57,9 @@ namespace Model
{ {
if (!String.IsNullOrWhiteSpace(name)) if (!String.IsNullOrWhiteSpace(name))
{ {
Player result = players.FirstOrDefault(p => p.Name.Equals(name)); Player result = players.FirstOrDefault(p => p.Name.ToUpper().Equals(name.Trim().ToUpper()));
return new Player(result); // THIS IS A COPY (using a copy constructor) if (result == null) return result; // will return null by default if no such player exists
// will return null by default if no such player exists return new(result); // THIS IS A COPY (using a copy constructor)
} }
return null; // we also want ot return null if no name was provided return null; // we also want ot return null if no name was provided
} }

@ -1,13 +1,203 @@
using System; using Model;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml.Linq;
using Xunit;
using Xunit.Sdk;
namespace Tests.Model_UTs namespace Tests.Model_UTs
{ {
internal class PlayerManagerTest public class PlayerManagerTest
{ {
// TODO test that Player's copy constructer enables isolated changes [Fact]
public void TestConstructorReturnsEmptyHashSet()
{
// Arrange
PlayerManager playerManager;
HashSet<Player> expected;
HashSet<Player> actual;
// Act
playerManager = new();
expected = new();
actual = (HashSet<Player>)playerManager.GetAll();
// Assert
Assert.Equal(expected, actual);
}
[Fact]
public void TestAddIfPlayersThenDoAddAndReturnPlayers()
{
// Arrange
PlayerManager playerManager = new();
Player alice = new("Alice");
Player bob = new("Bob");
HashSet<Player> expected = new() { alice, bob };
// Act
HashSet<Player> actual = new()
{
playerManager.Add(ref alice),
playerManager.Add(ref bob)
};
// Assert
Assert.Equal(expected, actual);
}
[Fact]
public void TestAddIfNullThenDontAddAndReturnNull()
{
// Arrange
PlayerManager playerManager = new();
Player expected;
Player actual;
// Act
expected = null;
actual = playerManager.Add(ref expected);
// Assert
Assert.Equal(expected, actual);
Assert.DoesNotContain(expected, playerManager.GetAll());
}
// TODO update if we do implement it
[Fact]
public void TestGetOneByIdThrowsNotImplemented()
{
// Arrange
PlayerManager playerManager = new();
// Act
void action() => playerManager.GetOneById(1);
// Assert
Assert.Throws<NotImplementedException>(action);
}
[Theory]
[InlineData("")]
[InlineData(null)]
[InlineData(" ")]
public void TestGetOneByNameIfInvalidThenReturnNull(string name)
{
// Arrange
PlayerManager playerManager = new();
Player player = new("Bob");
playerManager.Add(ref player);
// Act
Player result = playerManager.GetOneByName(name);
// Assert
Assert.Null(result);
}
[Fact]
public void TestGetOneByNameIfValidButNotExistThenReturnNull()
{
// Arrange
PlayerManager playerManager = new();
Player player = new("Bob");
playerManager.Add(ref player);
// Act
Player result = playerManager.GetOneByName("Clyde");
// Assert
Assert.Null(result);
}
[Theory]
[InlineData("Bob")]
[InlineData("bob")]
[InlineData("bob ")]
[InlineData(" boB ")]
public void TestGetOneByNameIfValidThenReturnPlayer(string name)
{
// Arrange
PlayerManager playerManager = new();
Player expected = new("Bob");
playerManager.Add(ref expected);
// Act
Player actual = playerManager.GetOneByName(name);
// Assert
Assert.Equal(expected, actual);
}
[Fact]
public void TestRemoveWorksIfExists()
{
// Arrange
PlayerManager playerManager = new();
Player p1 = new("Dylan");
playerManager.Add(ref p1);
// Act
playerManager.Remove(ref p1);
// Assert
Assert.DoesNotContain(p1, playerManager.GetAll());
}
[Fact]
public void TestRemoveFailsSilentlyIfGivenNull()
{
// Arrange
PlayerManager playerManager = new();
Player player = new("Dylan");
playerManager.Add(ref player);
Player notPlayer = null;
HashSet<Player> expected = new() { player };
// Act
playerManager.Remove(ref notPlayer);
HashSet<Player> actual = (HashSet<Player>)playerManager.GetAll();
// Assert
Assert.Equal(actual, expected);
}
[Fact]
public void TestRemoveFailsSilentlyIfGivenNonExistent()
{
// Arrange
PlayerManager playerManager = new();
Player player = new("Dylan");
playerManager.Add(ref player);
Player notPlayer = new("Eric");
HashSet<Player> expected = new() { player };
// Act
playerManager.Remove(ref notPlayer);
HashSet<Player> actual = (HashSet<Player>)playerManager.GetAll();
// Assert
Assert.Equal(actual, expected);
}
[Fact]
public void TestUpdateWorksIfValid()
{
// Arrange
PlayerManager playerManager = new();
Player oldPlayer = new("Dylan");
playerManager.Add(ref oldPlayer);
Player newPlayer = new("Eric");
// Act
playerManager.Update(ref oldPlayer, ref newPlayer);
// Assert
Assert.DoesNotContain(oldPlayer, playerManager.GetAll());
Assert.Contains(newPlayer, playerManager.GetAll());
}
} }
} }

@ -20,26 +20,28 @@ namespace Tests.Model_UTs
} }
[Fact] [Fact]
public void TestConstructorIfWhitespaceThenException() public void TestConstructorIfNameUntrimmedThenTrimmedName()
{ {
// Arrange // Arrange
Player player; Player player;
// Act // Act
void action() => player = new(" "); player = new("Alice ");
// Assert // Assert
Assert.Throws<ArgumentException>(action); Assert.Equal("Alice", player.Name);
} }
[Fact] [Theory]
public void TestConstructorIfBlankThenException() [InlineData("")]
[InlineData(" ")]
public void TestConstructorIfWhitespaceOrBlankThenException(string name)
{ {
// Arrange // Arrange
Player player; Player player;
// Act // Act
void action() => player = new(""); void action() => player = new(name);
// Assert // Assert
Assert.Throws<ArgumentException>(action); Assert.Throws<ArgumentException>(action);
@ -100,7 +102,7 @@ namespace Tests.Model_UTs
} }
[Fact] [Fact]
public void TestGoesThruIfObjIsPlayer() public void TestGoesThruToSecondMethodIfObjIsTypePlayer()
{ {
// Arrange // Arrange
Object p1; Object p1;
@ -132,8 +134,11 @@ namespace Tests.Model_UTs
Assert.False(p2.Equals(p1)); Assert.False(p2.Equals(p1));
} }
[Fact] [Theory]
public void TestEqualsTrueIfSameNameDifferentCase() [InlineData("devoN")]
[InlineData(" devon")]
[InlineData("deVon ")]
public void TestEqualsTrueIfSameNameDifferentCaseOrSpace(string name)
{ {
// Arrange // Arrange
Player p1; Player p1;
@ -141,7 +146,7 @@ namespace Tests.Model_UTs
// Act // Act
p1 = new("Devon"); p1 = new("Devon");
p2 = new("devoN"); p2 = new(name);
// Assert // Assert
Assert.True(p1.Equals(p2)); Assert.True(p1.Equals(p2));
@ -180,16 +185,20 @@ namespace Tests.Model_UTs
Assert.False(p2.GetHashCode().Equals(p1.GetHashCode())); Assert.False(p2.GetHashCode().Equals(p1.GetHashCode()));
} }
[Fact] [Theory]
public void TestSameHashTrueIfSameNameDifferentCase() [InlineData("devoN", "devon")]
[InlineData(" devon", "devon")]
[InlineData("DevoN ", "devon")]
[InlineData(" dEvoN ", "devon")]
public void TestSameHashTrueIfSameNameDifferentCase(string name1, string name2)
{ {
// Arrange // Arrange
Player p1; Player p1;
Player p2; Player p2;
// Act // Act
p1 = new("Devon"); p1 = new(name1);
p2 = new("devoN"); p2 = new(name2);
// Assert // Assert
Assert.True(p1.GetHashCode().Equals(p2.GetHashCode())); Assert.True(p1.GetHashCode().Equals(p2.GetHashCode()));

Loading…
Cancel
Save