From b65fe617bcd6b85784a5cbea67cc54d6b8a3e20d Mon Sep 17 00:00:00 2001 From: Alexis DRAI Date: Sun, 18 Sep 2022 22:27:53 +0200 Subject: [PATCH 1/4] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor=20repeated=20?= =?UTF-8?q?Fact=20test=20into=20a=20Theory=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/Tests/Model_UTs/PlayerTest.cs | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/Sources/Tests/Model_UTs/PlayerTest.cs b/Sources/Tests/Model_UTs/PlayerTest.cs index f0bfa96..089b50f 100644 --- a/Sources/Tests/Model_UTs/PlayerTest.cs +++ b/Sources/Tests/Model_UTs/PlayerTest.cs @@ -19,27 +19,16 @@ namespace Tests.Model_UTs Assert.Equal("Alice", player.Name); } - [Fact] - public void TestConstructorIfWhitespaceThenException() - { - // Arrange - Player player; - - // Act - void action() => player = new(" "); - - // Assert - Assert.Throws(action); - } - - [Fact] - public void TestConstructorIfBlankThenException() + [Theory] + [InlineData("")] + [InlineData(" ")] + public void TestConstructorIfWhitespaceOrBlankThenException(string name) { // Arrange Player player; // Act - void action() => player = new(""); + void action() => player = new(name); // Assert Assert.Throws(action); -- 2.36.3 From 33f390b07492fbd24677c49db7939382e6fd42c1 Mon Sep 17 00:00:00 2001 From: Alexis DRAI Date: Sun, 18 Sep 2022 22:56:36 +0200 Subject: [PATCH 2/4] =?UTF-8?q?=E2=9C=85=F0=9F=91=94=20Trim=20player=20nam?= =?UTF-8?q?es=20and=20update=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/Model/Player.cs | 2 +- Sources/Tests/Model_UTs/PlayerTest.cs | 34 +++++++++++++++++++++------ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Sources/Model/Player.cs b/Sources/Model/Player.cs index 9f73f01..a4a949e 100644 --- a/Sources/Model/Player.cs +++ b/Sources/Model/Player.cs @@ -15,7 +15,7 @@ namespace Model { if (!String.IsNullOrWhiteSpace(value)) { - name = value; + name = value.Trim(); } else throw new ArgumentException("player name may never be empty or null"); } diff --git a/Sources/Tests/Model_UTs/PlayerTest.cs b/Sources/Tests/Model_UTs/PlayerTest.cs index 089b50f..a323d3a 100644 --- a/Sources/Tests/Model_UTs/PlayerTest.cs +++ b/Sources/Tests/Model_UTs/PlayerTest.cs @@ -19,6 +19,19 @@ namespace Tests.Model_UTs Assert.Equal("Alice", player.Name); } + [Fact] + public void TestConstructorIfNameUntrimmedThenTrimmedName() + { + // Arrange + Player player; + + // Act + player = new("Alice "); + + // Assert + Assert.Equal("Alice", player.Name); + } + [Theory] [InlineData("")] [InlineData(" ")] @@ -89,7 +102,7 @@ namespace Tests.Model_UTs } [Fact] - public void TestGoesThruIfObjIsPlayer() + public void TestGoesThruToSecondMethodIfObjIsTypePlayer() { // Arrange Object p1; @@ -121,8 +134,11 @@ namespace Tests.Model_UTs Assert.False(p2.Equals(p1)); } - [Fact] - public void TestEqualsTrueIfSameNameDifferentCase() + [Theory] + [InlineData("devoN")] + [InlineData(" devon")] + [InlineData("deVon ")] + public void TestEqualsTrueIfSameNameDifferentCaseOrSpace(string name) { // Arrange Player p1; @@ -130,7 +146,7 @@ namespace Tests.Model_UTs // Act p1 = new("Devon"); - p2 = new("devoN"); + p2 = new(name); // Assert Assert.True(p1.Equals(p2)); @@ -169,8 +185,12 @@ namespace Tests.Model_UTs Assert.False(p2.GetHashCode().Equals(p1.GetHashCode())); } - [Fact] - public void TestSameHashTrueIfSameNameDifferentCase() + [Theory] + [InlineData("devoN")] + [InlineData(" devon")] + [InlineData("DevoN ")] + [InlineData(" dEvoN ")] + public void TestSameHashTrueIfSameNameDifferentCase(string name) { // Arrange Player p1; @@ -209,7 +229,7 @@ namespace Tests.Model_UTs Player p2; // Act - p1 = new("Elyse"); + p1 = new(" Elyse "); p2 = new(p1); // Assert -- 2.36.3 From 9994798c6f22d074410c41f9d0cfadcd364461ad Mon Sep 17 00:00:00 2001 From: Alexis DRAI Date: Sun, 18 Sep 2022 23:38:25 +0200 Subject: [PATCH 3/4] =?UTF-8?q?=E2=9C=85=20Design=20unit=20tests=20for=20P?= =?UTF-8?q?layerManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/Model/PlayerManager.cs | 8 +- Sources/Tests/Model_UTs/PlayerManagerTest.cs | 196 ++++++++++++++++++- 2 files changed, 197 insertions(+), 7 deletions(-) diff --git a/Sources/Model/PlayerManager.cs b/Sources/Model/PlayerManager.cs index f9b6417..93ab043 100644 --- a/Sources/Model/PlayerManager.cs +++ b/Sources/Model/PlayerManager.cs @@ -19,7 +19,7 @@ namespace Model public PlayerManager() { - players = new HashSet(); + players = new(); } /// /// add a new player @@ -57,9 +57,9 @@ namespace Model { if (!String.IsNullOrWhiteSpace(name)) { - Player result = players.FirstOrDefault(p => p.Name.Equals(name)); - return new Player(result); // THIS IS A COPY (using a copy constructor) - // will return null by default if no such player exists + Player result = players.FirstOrDefault(p => p.Name.ToUpper().Equals(name.Trim().ToUpper())); + if (result == null) return result; // 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 } diff --git a/Sources/Tests/Model_UTs/PlayerManagerTest.cs b/Sources/Tests/Model_UTs/PlayerManagerTest.cs index 909275d..85cb42d 100644 --- a/Sources/Tests/Model_UTs/PlayerManagerTest.cs +++ b/Sources/Tests/Model_UTs/PlayerManagerTest.cs @@ -1,13 +1,203 @@ -using System; +using Model; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Xml.Linq; +using Xunit; +using Xunit.Sdk; 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 expected; + HashSet actual; + + // Act + playerManager = new(); + expected = new(); + actual = (HashSet)playerManager.GetAll(); + + // Assert + Assert.Equal(expected, actual); + } + + [Fact] + public void TestAddIfPlayersThenDoAddAndReturnPlayers() + { + // Arrange + PlayerManager playerManager = new(); + Player alice = new("Alice"); + Player bob = new("Bob"); + HashSet expected = new() { alice, bob }; + + // Act + HashSet 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(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 expected = new() { player }; + + // Act + playerManager.Remove(ref notPlayer); + HashSet actual = (HashSet)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 expected = new() { player }; + + // Act + playerManager.Remove(ref notPlayer); + HashSet actual = (HashSet)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()); + } } } -- 2.36.3 From 923c42b9f256d66e3343e17d33703cae22d30944 Mon Sep 17 00:00:00 2001 From: Alexis DRAI Date: Sun, 18 Sep 2022 23:42:14 +0200 Subject: [PATCH 4/4] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/Tests/Model_UTs/PlayerTest.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/Tests/Model_UTs/PlayerTest.cs b/Sources/Tests/Model_UTs/PlayerTest.cs index a323d3a..efe8011 100644 --- a/Sources/Tests/Model_UTs/PlayerTest.cs +++ b/Sources/Tests/Model_UTs/PlayerTest.cs @@ -186,19 +186,19 @@ namespace Tests.Model_UTs } [Theory] - [InlineData("devoN")] - [InlineData(" devon")] - [InlineData("DevoN ")] - [InlineData(" dEvoN ")] - public void TestSameHashTrueIfSameNameDifferentCase(string name) + [InlineData("devoN", "devon")] + [InlineData(" devon", "devon")] + [InlineData("DevoN ", "devon")] + [InlineData(" dEvoN ", "devon")] + public void TestSameHashTrueIfSameNameDifferentCase(string name1, string name2) { // Arrange Player p1; Player p2; // Act - p1 = new("Devon"); - p2 = new("devoN"); + p1 = new(name1); + p2 = new(name2); // Assert Assert.True(p1.GetHashCode().Equals(p2.GetHashCode())); -- 2.36.3