🚨 fix code smells

pull/186/head
Alexis Drai 2 years ago committed by Gitea
parent a46d4b73a4
commit a319d7deb2

@ -45,7 +45,7 @@ namespace Data.EF.Players
/// <returns></returns> /// <returns></returns>
/// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentNullException"></exception>
/// <exception cref="ArgumentException"></exception> /// <exception cref="ArgumentException"></exception>
public async Task<PlayerEntity> Add(PlayerEntity toAdd) public Task<PlayerEntity> Add(PlayerEntity toAdd)
{ {
CleanPlayerEntity(toAdd); CleanPlayerEntity(toAdd);
@ -54,6 +54,11 @@ namespace Data.EF.Players
throw new ArgumentException("this username is already taken", nameof(toAdd)); throw new ArgumentException("this username is already taken", nameof(toAdd));
} }
return InternalAdd(toAdd);
}
private async Task<PlayerEntity> InternalAdd(PlayerEntity toAdd)
{
EntityEntry ee = await db.Players.AddAsync(toAdd); EntityEntry ee = await db.Players.AddAsync(toAdd);
await db.SaveChangesAsync(); await db.SaveChangesAsync();
return (PlayerEntity)ee.Entity; return (PlayerEntity)ee.Entity;
@ -74,17 +79,22 @@ namespace Data.EF.Players
/// <exception cref="ArgumentException"></exception> /// <exception cref="ArgumentException"></exception>
/// <exception cref="InvalidOperationException"></exception> /// <exception cref="InvalidOperationException"></exception>
/// <returns></returns> /// <returns></returns>
public async Task<PlayerEntity> GetOneByName(string name) public Task<PlayerEntity> GetOneByName(string name)
{ {
if (string.IsNullOrWhiteSpace(name)) if (string.IsNullOrWhiteSpace(name))
{ {
throw new ArgumentException("Name property should not be null or whitespace", nameof(name)); throw new ArgumentException("Name property should not be null or whitespace", nameof(name));
} }
name = name.Trim(); name = name.Trim();
return await db.Players.Where(p => p.Name == name).FirstAsync(); return InternalGetOneByName(name);
} }
private async Task<PlayerEntity> InternalGetOneByName(string name)
{
return await db.Players.Where(p => p.Name == name).FirstAsync();
}
public async Task<bool> IsPresentByName(string name) public async Task<bool> IsPresentByName(string name)
{ {
if (string.IsNullOrWhiteSpace(name)) if (string.IsNullOrWhiteSpace(name))
@ -119,7 +129,7 @@ namespace Data.EF.Players
/// <returns>the updated entity</returns> /// <returns>the updated entity</returns>
/// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentNullException"></exception>
/// <exception cref="ArgumentException"></exception> /// <exception cref="ArgumentException"></exception>
public async Task<PlayerEntity> Update(PlayerEntity before, PlayerEntity after) public Task<PlayerEntity> Update(PlayerEntity before, PlayerEntity after)
{ {
PlayerEntity[] args = { before, after }; PlayerEntity[] args = { before, after };
@ -133,9 +143,14 @@ namespace Data.EF.Players
throw new ArgumentException("ID cannot be updated", nameof(after)); throw new ArgumentException("ID cannot be updated", nameof(after));
} }
return InternalUpdate(before, after);
}
private async Task<PlayerEntity> InternalUpdate(PlayerEntity before, PlayerEntity after)
{
Remove(before); Remove(before);
return await Add(after); return await Add(after);
} }
/// <summary> /// <summary>

@ -45,7 +45,7 @@ namespace Data.EF.Players
/// <returns></returns> /// <returns></returns>
/// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentNullException"></exception>
/// <exception cref="ArgumentException"></exception> /// <exception cref="ArgumentException"></exception>
public async Task<PlayerEntity> Add(PlayerEntity toAdd) public Task<PlayerEntity> Add(PlayerEntity toAdd)
{ {
CleanPlayerEntity(toAdd); CleanPlayerEntity(toAdd);
@ -54,6 +54,11 @@ namespace Data.EF.Players
throw new ArgumentException("this username is already taken", nameof(toAdd)); throw new ArgumentException("this username is already taken", nameof(toAdd));
} }
return InternalAdd(toAdd);
}
private async Task<PlayerEntity> InternalAdd(PlayerEntity toAdd)
{
EntityEntry ee = await db.Players.AddAsync(toAdd); EntityEntry ee = await db.Players.AddAsync(toAdd);
await db.SaveChangesAsync(); await db.SaveChangesAsync();
return (PlayerEntity)ee.Entity; return (PlayerEntity)ee.Entity;
@ -74,17 +79,22 @@ namespace Data.EF.Players
/// <exception cref="ArgumentException"></exception> /// <exception cref="ArgumentException"></exception>
/// <exception cref="InvalidOperationException"></exception> /// <exception cref="InvalidOperationException"></exception>
/// <returns></returns> /// <returns></returns>
public async Task<PlayerEntity> GetOneByName(string name) public Task<PlayerEntity> GetOneByName(string name)
{ {
if (string.IsNullOrWhiteSpace(name)) if (string.IsNullOrWhiteSpace(name))
{ {
throw new ArgumentException("Name property should not be null or whitespace", nameof(name)); throw new ArgumentException("Name property should not be null or whitespace", nameof(name));
} }
name = name.Trim(); name = name.Trim();
return await db.Players.Where(p => p.Name == name).FirstAsync(); return InternalGetOneByName(name);
} }
private async Task<PlayerEntity> InternalGetOneByName(string name)
{
return await db.Players.Where(p => p.Name == name).FirstAsync();
}
public async Task<bool> IsPresentByName(string name) public async Task<bool> IsPresentByName(string name)
{ {
if (string.IsNullOrWhiteSpace(name)) if (string.IsNullOrWhiteSpace(name))
@ -119,7 +129,7 @@ namespace Data.EF.Players
/// <returns>the updated entity</returns> /// <returns>the updated entity</returns>
/// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentNullException"></exception>
/// <exception cref="ArgumentException"></exception> /// <exception cref="ArgumentException"></exception>
public async Task<PlayerEntity> Update(PlayerEntity before, PlayerEntity after) public Task<PlayerEntity> Update(PlayerEntity before, PlayerEntity after)
{ {
PlayerEntity[] args = { before, after }; PlayerEntity[] args = { before, after };
@ -133,9 +143,14 @@ namespace Data.EF.Players
throw new ArgumentException("ID cannot be updated", nameof(after)); throw new ArgumentException("ID cannot be updated", nameof(after));
} }
return InternalUpdate(before, after);
}
private async Task<PlayerEntity> InternalUpdate(PlayerEntity before, PlayerEntity after)
{
Remove(before); Remove(before);
return await Add(after); return await Add(after);
} }
/// <summary> /// <summary>

@ -82,7 +82,7 @@ namespace Data
await (await gr.GameManager.GetOneByName(game3)).PlayerManager.Add(player1); await (await gr.GameManager.GetOneByName(game3)).PlayerManager.Add(player1);
await (await gr.GameManager.GetOneByName(game3)).PlayerManager.Add(player3); await (await gr.GameManager.GetOneByName(game3)).PlayerManager.Add(player3);
foreach (Game game in gr.GameManager.GetAll().Result) foreach (Game game in gr.GameManager.GetAll()?.Result)
{ {
for (int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
{ {

@ -9,7 +9,7 @@ namespace Model.Dice
{ {
private readonly Dictionary<string, IEnumerable<Die>> diceGroups = new(); private readonly Dictionary<string, IEnumerable<Die>> diceGroups = new();
public async Task<KeyValuePair<string, IEnumerable<Die>>> Add(KeyValuePair<string, IEnumerable<Die>> toAdd) public Task<KeyValuePair<string, IEnumerable<Die>>> Add(KeyValuePair<string, IEnumerable<Die>> toAdd)
{ {
if (string.IsNullOrWhiteSpace(toAdd.Key)) if (string.IsNullOrWhiteSpace(toAdd.Key))
{ {
@ -21,12 +21,12 @@ namespace Model.Dice
throw new ArgumentException("this username is already taken", nameof(toAdd)); throw new ArgumentException("this username is already taken", nameof(toAdd));
} }
diceGroups.Add(toAdd.Key.Trim(), toAdd.Value); diceGroups.Add(toAdd.Key.Trim(), toAdd.Value);
return await Task.FromResult(toAdd); return Task.FromResult(toAdd);
} }
public async Task<IEnumerable<KeyValuePair<string, IEnumerable<Die>>>> GetAll() public Task<IEnumerable<KeyValuePair<string, IEnumerable<Die>>>> GetAll()
{ {
return await Task.FromResult(diceGroups.AsEnumerable()); return Task.FromResult(diceGroups.AsEnumerable());
} }
public Task<KeyValuePair<string, IEnumerable<Die>>> GetOneByID(Guid ID) public Task<KeyValuePair<string, IEnumerable<Die>>> GetOneByID(Guid ID)
@ -34,7 +34,7 @@ namespace Model.Dice
throw new NotImplementedException(); throw new NotImplementedException();
} }
public async Task<KeyValuePair<string, IEnumerable<Die>>> GetOneByName(string name) public Task<KeyValuePair<string, IEnumerable<Die>>> GetOneByName(string name)
{ {
// les groupes de dés nommés : // les groupes de dés nommés :
// ils sont case-sensistive, mais "mon jeu" == "mon jeu " == " mon jeu" // ils sont case-sensistive, mais "mon jeu" == "mon jeu " == " mon jeu"
@ -42,10 +42,7 @@ namespace Model.Dice
{ {
throw new ArgumentNullException(nameof(name), "param should not be null or empty"); throw new ArgumentNullException(nameof(name), "param should not be null or empty");
} }
else return Task.FromResult(new KeyValuePair<string, IEnumerable<Die>>(name, diceGroups[name]));
{
return await Task.FromResult(new KeyValuePair<string, IEnumerable<Die>>(name, diceGroups[name]));
}
} }
public void Remove(KeyValuePair<string, IEnumerable<Die>> toRemove) public void Remove(KeyValuePair<string, IEnumerable<Die>> toRemove)
@ -68,7 +65,7 @@ namespace Model.Dice
/// <returns></returns> /// <returns></returns>
/// <exception cref="ArgumentException"></exception> /// <exception cref="ArgumentException"></exception>
/// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentNullException"></exception>
public async Task<KeyValuePair<string, IEnumerable<Die>>> Update(KeyValuePair<string, IEnumerable<Die>> before, KeyValuePair<string, IEnumerable<Die>> after) public Task<KeyValuePair<string, IEnumerable<Die>>> Update(KeyValuePair<string, IEnumerable<Die>> before, KeyValuePair<string, IEnumerable<Die>> after)
{ {
// pas autorisé de changer les dés, juste le nom // pas autorisé de changer les dés, juste le nom
if (!before.Value.Equals(after.Value)) if (!before.Value.Equals(after.Value))
@ -80,8 +77,8 @@ namespace Model.Dice
throw new ArgumentNullException(nameof(before), "dice group name should not be null or empty"); throw new ArgumentNullException(nameof(before), "dice group name should not be null or empty");
} }
diceGroups.Remove(before.Key); diceGroups.Remove(before.Key);
await Add(after); Add(after);
return after; return Task.FromResult(after);
} }
} }

@ -180,7 +180,7 @@ namespace Model.Games
sb.Append($"Game: {Name}"); sb.Append($"Game: {Name}");
sb.Append("\nPlayers:"); sb.Append("\nPlayers:");
foreach (Player player in PlayerManager.GetAll().Result) foreach (Player player in PlayerManager.GetAll()?.Result)
{ {
sb.Append($" {player.ToString()}"); sb.Append($" {player.ToString()}");
} }

@ -21,7 +21,7 @@ namespace Model.Games
/// gets an unmodifiable collection of the games /// gets an unmodifiable collection of the games
/// </summary> /// </summary>
/// <returns>unmodifiable collection of the games</returns> /// <returns>unmodifiable collection of the games</returns>
public async Task<IEnumerable<Game>> GetAll() => await Task.FromResult(games.AsEnumerable()); public Task<IEnumerable<Game>> GetAll() => Task.FromResult(games.AsEnumerable());
/// <summary> /// <summary>
/// finds the game with that name and returns it /// finds the game with that name and returns it
@ -30,11 +30,11 @@ namespace Model.Games
/// </summary> /// </summary>
/// <param name="name">a games's name</param> /// <param name="name">a games's name</param>
/// <returns>game with said name, <em>or null</em> if no such game was found</returns> /// <returns>game with said name, <em>or null</em> if no such game was found</returns>
public async Task<Game> GetOneByName(string name) public Task<Game> GetOneByName(string name)
{ {
if (!string.IsNullOrWhiteSpace(name)) if (!string.IsNullOrWhiteSpace(name))
{ {
return await Task.FromResult(games.FirstOrDefault(g => g.Name == name)); // may return null return Task.FromResult(games.FirstOrDefault(g => g.Name == name)); // may return null
} }
throw new ArgumentException("param should not be null or blank", nameof(name)); throw new ArgumentException("param should not be null or blank", nameof(name));
} }
@ -54,7 +54,7 @@ namespace Model.Games
/// saves a given game -- does not allow copies yet: if a game with the same name exists, it is overwritten /// saves a given game -- does not allow copies yet: if a game with the same name exists, it is overwritten
/// </summary> /// </summary>
/// <param name="toAdd">a game to save</param> /// <param name="toAdd">a game to save</param>
public async Task<Game> Add(Game toAdd) public Task<Game> Add(Game toAdd)
{ {
if (toAdd is null) if (toAdd is null)
{ {
@ -64,7 +64,7 @@ namespace Model.Games
games.Remove(games.FirstOrDefault(g => g.Name == toAdd.Name)); games.Remove(games.FirstOrDefault(g => g.Name == toAdd.Name));
// will often be an update: if game with that name exists, it is removed, else, nothing happens above // will often be an update: if game with that name exists, it is removed, else, nothing happens above
games.Add(toAdd); games.Add(toAdd);
return await Task.FromResult(toAdd); return Task.FromResult(toAdd);
} }
/// <summary> /// <summary>
@ -88,7 +88,7 @@ namespace Model.Games
/// <param name="after">new game</param> /// <param name="after">new game</param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentNullException"></exception>
public async Task<Game> Update(Game before, Game after) public Task<Game> Update(Game before, Game after)
{ {
Game[] args = { before, after }; Game[] args = { before, after };
@ -103,7 +103,7 @@ namespace Model.Games
} }
} }
Remove(before); Remove(before);
return await Add(after); return (Add(after));
} }
} }
} }

@ -21,7 +21,7 @@ namespace Model.Players
/// </summary> /// </summary>
/// <param name="toAdd">player to be added</param> /// <param name="toAdd">player to be added</param>
/// <returns>added player</returns> /// <returns>added player</returns>
public async Task<Player> Add(Player toAdd) public Task<Player> Add(Player toAdd)
{ {
if (toAdd is null) if (toAdd is null)
{ {
@ -32,29 +32,27 @@ namespace Model.Players
throw new ArgumentException("this username is already taken", nameof(toAdd)); throw new ArgumentException("this username is already taken", nameof(toAdd));
} }
players.Add(toAdd); players.Add(toAdd);
return await Task.FromResult(toAdd); return Task.FromResult(toAdd);
} }
/// <summary> /// <summary>
/// finds the player with that name and returns A COPY OF IT /// finds the player with that name and returns it
/// <br/>
/// that copy does not belong to this manager's players, so it should not be modified
/// </summary> /// </summary>
/// <param name="name">a player's unique name</param> /// <param name="name">a player's unique name</param>
/// <returns>player with said name, <em>or null</em> if no such player was found</returns> /// <returns>player with said name, <em>or null</em> if no such player was found</returns>
public async Task<Player> GetOneByName(string name) public Task<Player> GetOneByName(string name)
{ {
if (!string.IsNullOrWhiteSpace(name)) if (string.IsNullOrWhiteSpace(name))
{ {
Player wanted = new(name); throw new ArgumentException("param should not be null or blank", nameof(name));
Player result = players.FirstOrDefault(p => p.Equals(wanted)); }
if (result == null)
{ Player result = players.FirstOrDefault(p => p.Name.ToUpper().Equals(name.ToUpper().Trim()));
return null; if (result == null)
} {
return await Task.FromResult(new Player(result)); // THIS IS A COPY (using a copy constructor) return Task.FromResult<Player>(null);
} }
throw new ArgumentException("param should not be null or blank", nameof(name)); return Task.FromResult(result);
} }
/// </summary> /// </summary>
@ -62,7 +60,7 @@ namespace Model.Players
/// so that the only way to modify the collection of players is to use this class's methods /// so that the only way to modify the collection of players is to use this class's methods
/// </summary> /// </summary>
/// <returns>a readonly enumerable of all this manager's players</returns> /// <returns>a readonly enumerable of all this manager's players</returns>
public async Task<IEnumerable<Player>> GetAll() => await Task.FromResult(players.AsEnumerable()); public Task<IEnumerable<Player>> GetAll() => Task.FromResult(players.AsEnumerable());
/// <summary> /// <summary>
/// update a player from <paramref name="before"/> to <paramref name="after"/> /// update a player from <paramref name="before"/> to <paramref name="after"/>
@ -70,7 +68,7 @@ namespace Model.Players
/// <param name="before">player to be updated</param> /// <param name="before">player to be updated</param>
/// <param name="after">player in the state that it needs to be in after the update</param> /// <param name="after">player in the state that it needs to be in after the update</param>
/// <returns>updated player</returns> /// <returns>updated player</returns>
public async Task<Player> Update(Player before, Player after) public Task<Player> Update(Player before, Player after)
{ {
Player[] args = { before, after }; Player[] args = { before, after };
@ -84,7 +82,7 @@ namespace Model.Players
} }
} }
Remove(before); Remove(before);
return await Add(after); return Add(after);
} }
/// <summary> /// <summary>

@ -367,8 +367,8 @@ namespace Tests.Data_UTs.Players
} }
[Fact] [Fact]
public async Task TestRemoveWhenPreExistentThenRemoves() public void TestRemoveWhenPreExistentThenRemoves()
{ {// should be async Task
// Arrange // Arrange
PlayerDbManager mgr; PlayerDbManager mgr;
@ -393,6 +393,7 @@ namespace Tests.Data_UTs.Players
db.Database.EnsureCreated(); db.Database.EnsureCreated();
mgr = new(db); mgr = new(db);
// should check if toRemove is now absent
Assert.True(true); Assert.True(true);
} }
} }

@ -16,7 +16,7 @@ namespace Tests.Model_UTs.Games
{ {
public class GameManagerTest public class GameManagerTest
{ {
private readonly MasterOfCeremonies stubGameRunner = new Stub().LoadApp().Result; private readonly MasterOfCeremonies stubGameRunner = new Stub().LoadApp()?.Result;
[Fact] [Fact]
public async Task TestConstructorReturnsEmptyEnumerableAsync() public async Task TestConstructorReturnsEmptyEnumerableAsync()

@ -14,14 +14,14 @@ namespace Tests.Model_UTs.Games
{ {
public class GameTest public class GameTest
{ {
private readonly MasterOfCeremonies stubMasterOfCeremonies = new Stub().LoadApp().Result; private readonly MasterOfCeremonies stubMasterOfCeremonies = new Stub().LoadApp()?.Result;
private static readonly string GAME_NAME = "my game"; private static readonly string GAME_NAME = "my game";
private static readonly Player PLAYER_1 = new("Alice"), PLAYER_2 = new("Bob"), PLAYER_3 = new("Clyde"); private static readonly Player PLAYER_1 = new("Alice"), PLAYER_2 = new("Bob"), PLAYER_3 = new("Clyde");
private readonly IEnumerable<Die> DICE_1, DICE_2; private readonly IEnumerable<Die> DICE_1, DICE_2;
public GameTest() public GameTest()
{ {
IEnumerable<KeyValuePair<string, IEnumerable<Die>>> diceGroups = stubMasterOfCeremonies.DiceGroupManager.GetAll().Result; IEnumerable<KeyValuePair<string, IEnumerable<Die>>> diceGroups = stubMasterOfCeremonies.DiceGroupManager.GetAll()?.Result;
DICE_1 = diceGroups.First().Value; DICE_1 = diceGroups.First().Value;
DICE_2 = diceGroups.Last().Value; DICE_2 = diceGroups.Last().Value;
} }

@ -12,7 +12,7 @@ namespace Tests.Model_UTs.Games
{ {
public class MasterOfCeremoniesTest public class MasterOfCeremoniesTest
{ {
private readonly MasterOfCeremonies stubMasterOfCeremonies = new Stub().LoadApp().Result; private readonly MasterOfCeremonies stubMasterOfCeremonies = new Stub().LoadApp()?.Result;
[Fact] [Fact]
public async Task TestPlayGameWhenPlayThenAddNewTurnToHistoryAsync() public async Task TestPlayGameWhenPlayThenAddNewTurnToHistoryAsync()
@ -46,7 +46,7 @@ namespace Tests.Model_UTs.Games
await masterOfCeremonies.StartNewGame( await masterOfCeremonies.StartNewGame(
name, name,
new PlayerManager(), new PlayerManager(),
stubMasterOfCeremonies.GameManager.GetAll().Result.First().Dice stubMasterOfCeremonies.GameManager.GetAll()?.Result.First().Dice
); );
// Assert // Assert

@ -13,15 +13,15 @@ namespace Tests.Model_UTs.Games
public class TurnTest public class TurnTest
{ {
private readonly MasterOfCeremonies stubMasterOfCeremonies = new Stub().LoadApp().Result; private readonly MasterOfCeremonies stubMasterOfCeremonies = new Stub().LoadApp()?.Result;
Dictionary<Die, Face> DICE_N_FACES_1, DICE_N_FACES_2; Dictionary<Die, Face> DICE_N_FACES_1, DICE_N_FACES_2;
public TurnTest() public TurnTest()
{ {
DICE_N_FACES_1 = (Dictionary<Die, Face>)stubMasterOfCeremonies.GameManager.GetAll().Result.First().GetHistory().First().DiceNFaces; DICE_N_FACES_1 = (Dictionary<Die, Face>)stubMasterOfCeremonies.GameManager.GetAll()?.Result.First().GetHistory().First().DiceNFaces;
DICE_N_FACES_2 = (Dictionary<Die, Face>)stubMasterOfCeremonies.GameManager.GetAll().Result.Last().GetHistory().Last().DiceNFaces; DICE_N_FACES_2 = (Dictionary<Die, Face>)stubMasterOfCeremonies.GameManager.GetAll()?.Result.Last().GetHistory().Last().DiceNFaces;
} }
[Fact] [Fact]

@ -111,15 +111,15 @@ namespace Tests.Model_UTs.Players
} }
[Fact] [Fact]
public async Task TestGetOneByNameIfValidButNotExistThenReturnNull() public void TestGetOneByNameIfValidButNotExistThenReturnNull()
{ {
// Arrange // Arrange
PlayerManager playerManager = new(); PlayerManager playerManager = new();
Player player = new("Bob"); Player player = new("Bob");
await playerManager.Add(player); playerManager.Add(player);
// Act // Act
Player result = await playerManager.GetOneByName("Clyde"); Player result = playerManager.GetOneByName("Clyde")?.Result;
// Assert // Assert
Assert.Null(result); Assert.Null(result);
@ -130,15 +130,15 @@ namespace Tests.Model_UTs.Players
[InlineData("bob")] [InlineData("bob")]
[InlineData("bob ")] [InlineData("bob ")]
[InlineData(" boB ")] [InlineData(" boB ")]
public async Task TestGetOneByNameIfValidThenReturnPlayer(string name) public void TestGetOneByNameIfValidThenReturnPlayer(string name)
{ {
// Arrange // Arrange
PlayerManager playerManager = new(); PlayerManager playerManager = new();
Player expected = new("Bob"); Player expected = new("Bob");
await playerManager.Add(expected); playerManager.Add(expected);
// Act // Act
Player actual = await playerManager.GetOneByName(name); Player actual = playerManager.GetOneByName(name)?.Result;
// Assert // Assert
Assert.Equal(expected, actual); Assert.Equal(expected, actual);

Loading…
Cancel
Save