From ceb53fb08a936dae2630e63a32e905ff4f6e794e Mon Sep 17 00:00:00 2001 From: "pauline.prady" Date: Sat, 25 May 2024 11:39:21 +0200 Subject: [PATCH 01/12] =?UTF-8?q?d=C3=A9but=20nouvelle=20version=20partie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CoreLibrary/Events/JouerCodeEventArgs.cs | 17 ++++++++ .../Events/NouveauJoueurEventArgs.cs | 12 ++++++ Sources/CoreLibrary/Joueurs/Joueur.cs | 12 ++++++ Sources/CoreLibrary/Joueurs/JoueurBuilder.cs | 21 +++++++++ Sources/CoreLibrary/Partie.cs | 43 +++++++++++-------- 5 files changed, 88 insertions(+), 17 deletions(-) create mode 100644 Sources/CoreLibrary/Events/JouerCodeEventArgs.cs create mode 100644 Sources/CoreLibrary/Events/NouveauJoueurEventArgs.cs create mode 100644 Sources/CoreLibrary/Joueurs/JoueurBuilder.cs diff --git a/Sources/CoreLibrary/Events/JouerCodeEventArgs.cs b/Sources/CoreLibrary/Events/JouerCodeEventArgs.cs new file mode 100644 index 0000000..61e292c --- /dev/null +++ b/Sources/CoreLibrary/Events/JouerCodeEventArgs.cs @@ -0,0 +1,17 @@ +using CoreLibrary.Core; + +namespace CoreLibrary.Events +{ + /// + /// Classe contenant les arguments passées en paramètre lors de l'événement NouveauTour. + /// + public class JouerCodeEventArgs : EventArgs + { + public Code Code { get; private set; } + + public JouerCodeEventArgs(Code code) + { + Code = code; + } + } +} diff --git a/Sources/CoreLibrary/Events/NouveauJoueurEventArgs.cs b/Sources/CoreLibrary/Events/NouveauJoueurEventArgs.cs new file mode 100644 index 0000000..f9a0828 --- /dev/null +++ b/Sources/CoreLibrary/Events/NouveauJoueurEventArgs.cs @@ -0,0 +1,12 @@ +namespace CoreLibrary.Events +{ + public class NouveauJoueurEventArgs : EventArgs + { + public string Nom { get; private set; } + + public NouveauJoueurEventArgs(string nom) + { + Nom = nom; + } + } +} diff --git a/Sources/CoreLibrary/Joueurs/Joueur.cs b/Sources/CoreLibrary/Joueurs/Joueur.cs index 7d8e484..336a6ac 100644 --- a/Sources/CoreLibrary/Joueurs/Joueur.cs +++ b/Sources/CoreLibrary/Joueurs/Joueur.cs @@ -1,4 +1,5 @@ using CoreLibrary.Core; +using CoreLibrary.Events; namespace CoreLibrary.Joueurs { @@ -11,11 +12,22 @@ namespace CoreLibrary.Joueurs /// Le nom du joueur. /// public string Nom { get; private init; } + /// /// Le plateau du joueur. /// public Plateau Plateau { get; private init; } + /// + /// Evénement appelé pour jouer un code. + /// + public event EventHandler? JouerCode; + + /// + /// Appel de l'événement JouerCode. + /// + private void QuandJouerCode(Code code) => JouerCode?.Invoke(this, new JouerCodeEventArgs(code)); + /// /// Crée une nouvelle instance de joueur avec un nom et un plateau spécifié. /// diff --git a/Sources/CoreLibrary/Joueurs/JoueurBuilder.cs b/Sources/CoreLibrary/Joueurs/JoueurBuilder.cs new file mode 100644 index 0000000..6ce2d1f --- /dev/null +++ b/Sources/CoreLibrary/Joueurs/JoueurBuilder.cs @@ -0,0 +1,21 @@ +namespace CoreLibrary.Joueurs +{ + public class JoueurBuilder + { + private string nom; + + public JoueurBuilder Nom(string nom) + { + this.nom = nom; + return this; + } + + public Joueur Build() + { + return new Joueur() + } + + + + } +} diff --git a/Sources/CoreLibrary/Partie.cs b/Sources/CoreLibrary/Partie.cs index 3ea6cfe..b883db4 100644 --- a/Sources/CoreLibrary/Partie.cs +++ b/Sources/CoreLibrary/Partie.cs @@ -143,7 +143,7 @@ namespace CoreLibrary /// Les règles de la partie. public Partie(IRegles regles) { - this.regles = regles; + this.regles = regles; } /// @@ -153,35 +153,44 @@ namespace CoreLibrary { /// Ajout des joueurs jusqu'à atteindre le nombre maximum de joueurs défini par les règles AjouterJoueurs(); - regles.CommencerLaPartie(); QuandDebutPartie(); - // Boucle principale du jeu qui dure jusqu'à qu'une condition de fin soit déclenchée - while (!regles.EstTerminee()) - { - Joueur joueurCourant = regles.JoueurCourant(); - Plateau plateauCourant = joueurCourant.Plateau; + Joueur joueurCourant = regles.JoueurCourant(); + Plateau plateauCourant = joueurCourant.Plateau; + + QuandNouveauTour(joueurCourant, plateauCourant.Tour, plateauCourant.Grille(), plateauCourant.Indicateurs()); + + } - QuandNouveauTour(joueurCourant, plateauCourant.Tour, plateauCourant.Grille(), plateauCourant.Indicateurs()); + public void Joueur(Object? sender, ) + { - Code code = regles.GenererCode(); + } - CreerCode(code); + private void Tour() + { + Code code = regles.GenererCode(); - // Phase de saisie du code par le joueur jusqu'à que le code soit complet. + CreerCode(code); - plateauCourant.AjouterCode(code); - QuandNouveauCode(code); + plateauCourant.AjouterCode(code); + QuandNouveauCode(code); + if(regles.EstTerminee()) + { + Terminee(); + } + else + { regles.PasserLaMain(); QuandPasserMain(); } + + } - - regles.Gagnants(); - regles.Perdants(); - + private void Terminee() + { QuandPartieTerminee(regles.Gagnants(), regles.Perdants()); } From aafccfae1b35d796ced320125eafba047c0467d3 Mon Sep 17 00:00:00 2001 From: "pauline.prady" Date: Sat, 25 May 2024 12:07:42 +0200 Subject: [PATCH 02/12] Fin de boucle Partie. --- Sources/ConsoleApp/Evenements.cs | 8 +- Sources/ConsoleApp/Program.cs | 4 +- .../Events/ConstruireJoueurEventArgs.cs | 14 +++ .../Events/DemanderJetonEventArgs.cs | 22 ----- .../Events/DemanderJoueurEventArgs.cs | 23 ----- .../Events/DemanderNomEventArgs.cs | 16 ++++ Sources/CoreLibrary/Joueurs/Joueur.cs | 5 +- Sources/CoreLibrary/Joueurs/JoueurBuilder.cs | 19 ++-- Sources/CoreLibrary/Partie.cs | 95 ++++++------------- 9 files changed, 78 insertions(+), 128 deletions(-) create mode 100644 Sources/CoreLibrary/Events/ConstruireJoueurEventArgs.cs delete mode 100644 Sources/CoreLibrary/Events/DemanderJetonEventArgs.cs delete mode 100644 Sources/CoreLibrary/Events/DemanderJoueurEventArgs.cs create mode 100644 Sources/CoreLibrary/Events/DemanderNomEventArgs.cs diff --git a/Sources/ConsoleApp/Evenements.cs b/Sources/ConsoleApp/Evenements.cs index 2d96edc..596ad52 100644 --- a/Sources/ConsoleApp/Evenements.cs +++ b/Sources/ConsoleApp/Evenements.cs @@ -17,7 +17,7 @@ namespace ConsoleApp /// L'instance de l'événement DemanderJoueurEventArgs créée par Partie. /// Le nom du joueur. /// - public static string? DemanderJoueur(Object? sender, DemanderJoueurEventArgs e) + /*public static string? DemanderJoueur(Object? sender, DemanderJoueurEventArgs e) { Console.WriteLine($"Joueur {e.Numero}"); Console.Write(">>> "); @@ -27,7 +27,7 @@ namespace ConsoleApp Console.WriteLine(); return nom; - } + }*/ /// @@ -65,7 +65,7 @@ namespace ConsoleApp /// L'instance de l'événement DemanderJetonEventArgs créée par Partie. /// Le jeton choisi par le joueur. /// - public static Jeton? DemanderJeton(Object? sender, DemanderJetonEventArgs e) + /*public static Jeton? DemanderJeton(Object? sender, DemanderJetonEventArgs e) { Console.TreatControlCAsInput = true; Console.CursorVisible = false; @@ -115,7 +115,7 @@ namespace ConsoleApp Console.CursorVisible = true; return indice != -2 ? new Jeton(couleurs[indice]) : null; - } + }*/ /// /// Ecoute l'événement en rapport avec l'ajout d'un jeton dans le code. diff --git a/Sources/ConsoleApp/Program.cs b/Sources/ConsoleApp/Program.cs index 1ee6d17..d454895 100644 --- a/Sources/ConsoleApp/Program.cs +++ b/Sources/ConsoleApp/Program.cs @@ -17,10 +17,10 @@ namespace ConsoleApp Partie maPartie = new Partie(new ReglesClassiques()); - maPartie.DemanderJoueur += Evenements.DemanderJoueur; + //maPartie.DemanderJoueur += Evenements.DemanderJoueur; maPartie.DebutPartie += Evenements.CommencerLaPartie; maPartie.NouveauTour += Evenements.NouveauTour; - maPartie.DemanderJeton += Evenements.DemanderJeton; + //maPartie.DemanderJeton += Evenements.DemanderJeton; maPartie.AjouterJeton += Evenements.AjouterJeton; maPartie.SupprimerDernierJeton += Evenements.SupprimerDernierJeton; maPartie.AjouterCode += Evenements.AjouterCode; diff --git a/Sources/CoreLibrary/Events/ConstruireJoueurEventArgs.cs b/Sources/CoreLibrary/Events/ConstruireJoueurEventArgs.cs new file mode 100644 index 0000000..8540f8e --- /dev/null +++ b/Sources/CoreLibrary/Events/ConstruireJoueurEventArgs.cs @@ -0,0 +1,14 @@ +using CoreLibrary.Joueurs; + +namespace CoreLibrary.Events +{ + public class ConstruireJoueurEventArgs : EventArgs + { + public string Nom { get; private set; } + + public ConstruireJoueurEventArgs(string nom) + { + Nom = nom; + } + } +} diff --git a/Sources/CoreLibrary/Events/DemanderJetonEventArgs.cs b/Sources/CoreLibrary/Events/DemanderJetonEventArgs.cs deleted file mode 100644 index a8f3bae..0000000 --- a/Sources/CoreLibrary/Events/DemanderJetonEventArgs.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace CoreLibrary.Events -{ - /// - /// Classe contenant les arguments passées en paramètre lors de l'événement DemanderJeton. - /// - public class DemanderJetonEventArgs : EventArgs - { - /// - /// L'indice du code où le jeton va être ajouté. - /// - public int Indice { get; private set; } - - /// - /// Initialise une nouvelle instance de la classe avec l'indice spécifié. - /// - /// L'indice du jeton qui va été ajouté. - public DemanderJetonEventArgs(int indice) - { - Indice = indice; - } - } -} diff --git a/Sources/CoreLibrary/Events/DemanderJoueurEventArgs.cs b/Sources/CoreLibrary/Events/DemanderJoueurEventArgs.cs deleted file mode 100644 index f297f25..0000000 --- a/Sources/CoreLibrary/Events/DemanderJoueurEventArgs.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace CoreLibrary.Events -{ - /// - /// Classe contenant les arguments passées en paramètre lors de l'événement DemanderJoueur. - /// - public class DemanderJoueurEventArgs : EventArgs - { - /// - /// Le numéro du joueur (Joueur 1 ou 2, 3..). - /// - public int Numero { get; private set; } - - - /// - /// Initialise une nouvelle instance de la classe avec le numéro du joueur spécifié. - /// - /// Le numéro du joueur qui va être ajouté. - public DemanderJoueurEventArgs(int numero) - { - Numero = numero; - } - } -} diff --git a/Sources/CoreLibrary/Events/DemanderNomEventArgs.cs b/Sources/CoreLibrary/Events/DemanderNomEventArgs.cs new file mode 100644 index 0000000..e099772 --- /dev/null +++ b/Sources/CoreLibrary/Events/DemanderNomEventArgs.cs @@ -0,0 +1,16 @@ +using CoreLibrary.Joueurs; + +namespace CoreLibrary.Events +{ + public class DemanderNomEventArgs : EventArgs + { + public int Indice { get; private set; } + public JoueurBuilder JoueurBuilder { get; private set; } + + public DemanderNomEventArgs(int indice, JoueurBuilder joueurBuilder) + { + Indice = indice; + JoueurBuilder = joueurBuilder; + } + } +} diff --git a/Sources/CoreLibrary/Joueurs/Joueur.cs b/Sources/CoreLibrary/Joueurs/Joueur.cs index e3f9635..0dc4cfc 100644 --- a/Sources/CoreLibrary/Joueurs/Joueur.cs +++ b/Sources/CoreLibrary/Joueurs/Joueur.cs @@ -1,4 +1,7 @@ -namespace CoreLibrary.Joueurs +using CoreLibrary.Core; +using CoreLibrary.Events; + +namespace CoreLibrary.Joueurs { /// /// Classe représentant un joueur. diff --git a/Sources/CoreLibrary/Joueurs/JoueurBuilder.cs b/Sources/CoreLibrary/Joueurs/JoueurBuilder.cs index 6ce2d1f..66236ff 100644 --- a/Sources/CoreLibrary/Joueurs/JoueurBuilder.cs +++ b/Sources/CoreLibrary/Joueurs/JoueurBuilder.cs @@ -1,21 +1,16 @@ -namespace CoreLibrary.Joueurs +using CoreLibrary.Events; + +namespace CoreLibrary.Joueurs { public class JoueurBuilder { - private string nom; + public event EventHandler? ConstruireJoueur; - public JoueurBuilder Nom(string nom) - { - this.nom = nom; - return this; - } + private void QuandConstruireJoueur(string nom) => ConstruireJoueur?.Invoke(this, new ConstruireJoueurEventArgs(nom)); - public Joueur Build() + public void Nom(string nom) { - return new Joueur() + QuandConstruireJoueur(nom); } - - - } } diff --git a/Sources/CoreLibrary/Partie.cs b/Sources/CoreLibrary/Partie.cs index b883db4..70a073a 100644 --- a/Sources/CoreLibrary/Partie.cs +++ b/Sources/CoreLibrary/Partie.cs @@ -26,12 +26,7 @@ namespace CoreLibrary /// /// Événement déclenché lorsqu'il est nécessaire de d'ajouter un joueur. /// - public event StringEventHandler? DemanderJoueur; - - /// - /// Événement déclenché lorsqu'il est nécessaire d'ajouter un jeton. - /// - public event JetonEventHandler? DemanderJeton; + public event StringEventHandler? DemanderNom; /// /// Événement déclenché lorsqu'il est nécessaire d'ajouter un joueur. @@ -79,13 +74,7 @@ namespace CoreLibrary /// /// Le numéro du joueur à ajouter /// Le nom du joueur demandé - private string? QuandDemanderJoueur(int numero) => DemanderJoueur?.Invoke(this, new DemanderJoueurEventArgs(numero)); - - /// - /// Méthode pour déclencher l'événement de demande d'ajout d'un jeton. - /// - /// Le jeton demandé - private Jeton? QuandDemanderJeton(int indice) => DemanderJeton?.Invoke(this, new DemanderJetonEventArgs(indice)); + private string? QuandDemanderNom(int numero, JoueurBuilder joueurBuilder) => DemanderNom?.Invoke(this, new DemanderNomEventArgs(numero, joueurBuilder)); /// /// Méthode pour déclencher l'événement d'ajout d'un joueur. @@ -143,7 +132,7 @@ namespace CoreLibrary /// Les règles de la partie. public Partie(IRegles regles) { - this.regles = regles; + this.regles = regles; } /// @@ -151,31 +140,44 @@ namespace CoreLibrary /// public void Jouer() { - /// Ajout des joueurs jusqu'à atteindre le nombre maximum de joueurs défini par les règles - AjouterJoueurs(); - regles.CommencerLaPartie(); - QuandDebutPartie(); - - Joueur joueurCourant = regles.JoueurCourant(); - Plateau plateauCourant = joueurCourant.Plateau; - - QuandNouveauTour(joueurCourant, plateauCourant.Tour, plateauCourant.Grille(), plateauCourant.Indicateurs()); + JoueurBuilder joueurBuilder = new JoueurBuilder(); + joueurBuilder.ConstruireJoueur += Joueur; + QuandDemanderNom(regles.NbJoueurs + 1, joueurBuilder); } - public void Joueur(Object? sender, ) + public void Joueur(Object? sender, ConstruireJoueurEventArgs e) { + Joueur joueur = regles.AjouterJoueur(e.Nom); + QuandAjouterJoueur(joueur); + joueur.JouerCode += Tour; + if (regles.NbJoueurs != regles.NbJoueursMaximum) + { + JoueurBuilder joueurBuilder = new JoueurBuilder(); + joueurBuilder.ConstruireJoueur += Joueur; + QuandDemanderNom(regles.NbJoueurs + 1, joueurBuilder); + } + else + { + Commencer(); + } } - private void Tour() + public void Commencer() { - Code code = regles.GenererCode(); + regles.CommencerLaPartie(); + QuandDebutPartie(); - CreerCode(code); + (Joueur joueurCourant, Plateau plateauCourant) = regles.JoueurCourant(); + QuandNouveauTour(joueurCourant, plateauCourant.Tour, plateauCourant.Grille(), plateauCourant.Indicateurs()); + } - plateauCourant.AjouterCode(code); - QuandNouveauCode(code); + private void Tour(Object? sender, JouerCodeEventArgs e) + { + (Joueur joueurCourant, Plateau plateauCourant) = regles.JoueurCourant(); + plateauCourant.AjouterCode(e.Code); + QuandNouveauCode(e.Code); if(regles.EstTerminee()) { @@ -186,46 +188,11 @@ namespace CoreLibrary regles.PasserLaMain(); QuandPasserMain(); } - } private void Terminee() { QuandPartieTerminee(regles.Gagnants(), regles.Perdants()); } - - private void AjouterJoueurs() - { - while (regles.NbJoueurs != regles.NbJoueursMaximum) - { - string nom = QuandDemanderJoueur(regles.NbJoueurs + 1) ?? $"Joueur {regles.NbJoueurs + 1}"; - Joueur joueur = regles.AjouterJoueur(nom); - QuandAjouterJoueur(joueur); - } - } - - private void CreerCode(Code code) - { - while (!code.EstComplet()) - { - Jeton? jeton = QuandDemanderJeton(code.NbJetons); - - if (DemanderJeton == null) - { - jeton = new Jeton(); - } - - if(!jeton.HasValue) - { - code.SupprimerDernierJeton(); - QuandSupprimerDernierJeton(); - } - else - { - code.AjouterJeton(jeton.Value); - QuandNouveauJeton(jeton.Value); - } - } - } } } From 526223827759ac7377dd7f1a3da84150ad272f5b Mon Sep 17 00:00:00 2001 From: "nicolas.barbosa" Date: Sat, 25 May 2024 16:03:36 +0200 Subject: [PATCH 03/12] Fin de partie et correction jeux de tests, documentation, et consoleapp --- Sources/ConsoleApp/Evenements.cs | 95 ++------ Sources/ConsoleApp/Program.cs | 5 +- Sources/ConsoleApp/Utils.cs | 66 ++++++ .../Events/AjouterJetonEventArgs.cs | 24 -- ...EventArgs.cs => AjouterJoueurEventArgs.cs} | 48 ++-- .../Events/ConstruireJoueurEventArgs.cs | 18 +- .../Events/DemanderNomEventArgs.cs | 15 ++ .../CoreLibrary/Events/JouerCodeEventArgs.cs | 9 +- .../Events/NouveauJoueurEventArgs.cs | 10 + .../Events/NouveauTourEventArgs.cs | 8 +- .../Events/SupprimerDernierJetonEventArgs.cs | 9 - Sources/CoreLibrary/Joueurs/Joueur.cs | 5 + Sources/CoreLibrary/Joueurs/JoueurBuilder.cs | 4 +- Sources/CoreLibrary/Partie.cs | 78 +++---- Sources/MauiSpark/MauiSpark.csproj | 194 ++++++++-------- .../UnitTesting/AjouterJetonEventArgsUT.cs | 20 -- Sources/UnitTesting/AjouterJoueurEventArgs.cs | 2 +- .../UnitTesting/DemanderJoueurEventArgsUT.cs | 16 -- Sources/UnitTesting/NouveauTourEventArgsUT.cs | 26 --- Sources/UnitTesting/PartieUT.cs | 207 ------------------ 20 files changed, 296 insertions(+), 563 deletions(-) delete mode 100644 Sources/CoreLibrary/Events/AjouterJetonEventArgs.cs rename Sources/CoreLibrary/Events/{AjouterJoueursEventArgs.cs => AjouterJoueurEventArgs.cs} (74%) delete mode 100644 Sources/CoreLibrary/Events/SupprimerDernierJetonEventArgs.cs delete mode 100644 Sources/UnitTesting/AjouterJetonEventArgsUT.cs delete mode 100644 Sources/UnitTesting/DemanderJoueurEventArgsUT.cs delete mode 100644 Sources/UnitTesting/NouveauTourEventArgsUT.cs delete mode 100644 Sources/UnitTesting/PartieUT.cs diff --git a/Sources/ConsoleApp/Evenements.cs b/Sources/ConsoleApp/Evenements.cs index 596ad52..a8e073c 100644 --- a/Sources/ConsoleApp/Evenements.cs +++ b/Sources/ConsoleApp/Evenements.cs @@ -14,20 +14,20 @@ namespace ConsoleApp /// /// Ecoute l'événement en rapport avec la demande du nom d'un joueur. /// La classe qui appelle l'événement; ici Partie. - /// L'instance de l'événement DemanderJoueurEventArgs créée par Partie. + /// L'instance de l'événement DemanderNomEventArgs créée par Partie. /// Le nom du joueur. /// - /*public static string? DemanderJoueur(Object? sender, DemanderJoueurEventArgs e) + public static void DemanderNom(Object? sender, DemanderNomEventArgs e) { - Console.WriteLine($"Joueur {e.Numero}"); + Console.WriteLine($"Joueur {e.Indice}"); Console.Write(">>> "); string? nom = Console.ReadLine(); Console.WriteLine(); - return nom; - }*/ + e.JoueurBuilder.Nom(nom); + } /// @@ -57,84 +57,23 @@ namespace ConsoleApp Console.WriteLine(); - } - - /// - /// Ecoute l'événement en rapport avec la demande d'un jeton. - /// La classe qui appelle l'événement; ici Partie. - /// L'instance de l'événement DemanderJetonEventArgs créée par Partie. - /// Le jeton choisi par le joueur. - /// - /*public static Jeton? DemanderJeton(Object? sender, DemanderJetonEventArgs e) - { - Console.TreatControlCAsInput = true; - Console.CursorVisible = false; - - bool aChoisi = false; - int indice = 0; - Couleur[] couleurs = (Couleur[])Enum.GetValues(typeof(Couleur)); - - while (!aChoisi) + Code code = e.Code; + while(!code.EstComplet()) { - Utils.DessinerPion(couleurs[indice]); - Console.Write("\b\b\b"); - - switch (Console.ReadKey(true).Key) + Jeton? jeton = Utils.SaisirJeton(code.NbJetons); + if (jeton.HasValue) { - case ConsoleKey.Enter: - aChoisi = true; - break; - - case ConsoleKey.LeftArrow: - --indice; - break; - - case ConsoleKey.RightArrow: - ++indice; - break; - - case ConsoleKey.Escape: - if (e.Indice != 0) - { - aChoisi = true; - indice = -2; - } - break; - - default: - break; + Utils.DessinerPion(jeton.Value.Couleur); + code.AjouterJeton(jeton.Value); + } + else + { + Utils.SupprimerDernierJeton(); + code.SupprimerDernierJeton(); } - - if (indice == -1) - indice = couleurs.Length - 1; - else if (indice == couleurs.Length) - indice = 0; } - Console.TreatControlCAsInput = false; - Console.CursorVisible = true; - - return indice != -2 ? new Jeton(couleurs[indice]) : null; - }*/ - - /// - /// Ecoute l'événement en rapport avec l'ajout d'un jeton dans le code. - /// La classe qui appelle l'événement; ici Partie. - /// L'instance de l'événement AjouterJetonEventArgs créée par Partie. - /// - public static void AjouterJeton(Object? sender, AjouterJetonEventArgs e) - { - Utils.DessinerPion(e.Jeton.Couleur); - } - - /// - /// Ecoute l'événement en rapport avec la suppression du dernier jeton ajouté dans le code. - /// La classe qui appelle l'événement; ici Partie. - /// L'instance de l'événement SupprimerDernierJetonEventArgs créée par Partie. - /// - public static void SupprimerDernierJeton(Object? sender, SupprimerDernierJetonEventArgs e) - { - Console.Write("\b\b\b \b\b\b\b\b\b"); + e.Joueur.Code(code); } /// diff --git a/Sources/ConsoleApp/Program.cs b/Sources/ConsoleApp/Program.cs index d454895..5bfe329 100644 --- a/Sources/ConsoleApp/Program.cs +++ b/Sources/ConsoleApp/Program.cs @@ -17,12 +17,9 @@ namespace ConsoleApp Partie maPartie = new Partie(new ReglesClassiques()); - //maPartie.DemanderJoueur += Evenements.DemanderJoueur; + maPartie.DemanderNom += Evenements.DemanderNom; maPartie.DebutPartie += Evenements.CommencerLaPartie; maPartie.NouveauTour += Evenements.NouveauTour; - //maPartie.DemanderJeton += Evenements.DemanderJeton; - maPartie.AjouterJeton += Evenements.AjouterJeton; - maPartie.SupprimerDernierJeton += Evenements.SupprimerDernierJeton; maPartie.AjouterCode += Evenements.AjouterCode; maPartie.PartieTerminee += Evenements.PartieTerminee; diff --git a/Sources/ConsoleApp/Utils.cs b/Sources/ConsoleApp/Utils.cs index be5c0ea..788b9bd 100644 --- a/Sources/ConsoleApp/Utils.cs +++ b/Sources/ConsoleApp/Utils.cs @@ -137,5 +137,71 @@ namespace ConsoleApp Console.WriteLine("│ │ │ │"); Console.WriteLine("──────────────── ────────────────"); } + + /// + /// Permet à l'utilisateur de choisir un jeton + /// L'indice du jeton à ajouter dans le code. + /// Le jeton choisi par le joueur. + /// + public static Jeton? SaisirJeton(int indiceCode) + { + Console.TreatControlCAsInput = true; + Console.CursorVisible = false; + + bool aChoisi = false; + int indice = 0; + Couleur[] couleurs = (Couleur[])Enum.GetValues(typeof(Couleur)); + + while (!aChoisi) + { + DessinerPion(couleurs[indice]); + Console.Write("\b\b\b"); + + switch (Console.ReadKey(true).Key) + { + case ConsoleKey.Enter: + aChoisi = true; + break; + + case ConsoleKey.LeftArrow: + --indice; + break; + + case ConsoleKey.RightArrow: + ++indice; + break; + + case ConsoleKey.Escape: + if (indiceCode != 0) + { + aChoisi = true; + indice = -2; + } + break; + + default: + break; + } + + if (indice == -1) + indice = couleurs.Length - 1; + else if (indice == couleurs.Length) + indice = 0; + } + + Console.TreatControlCAsInput = false; + Console.CursorVisible = true; + + return indice != -2 ? new Jeton(couleurs[indice]) : null; + } + + + /// + /// Permet de supprimer le dernier jeton saisi + /// + public static void SupprimerDernierJeton() + { + Console.Write("\b\b\b \b\b\b\b\b\b"); + } } } diff --git a/Sources/CoreLibrary/Events/AjouterJetonEventArgs.cs b/Sources/CoreLibrary/Events/AjouterJetonEventArgs.cs deleted file mode 100644 index b9624e4..0000000 --- a/Sources/CoreLibrary/Events/AjouterJetonEventArgs.cs +++ /dev/null @@ -1,24 +0,0 @@ -using CoreLibrary.Core; - -namespace CoreLibrary.Events -{ - /// - /// Classe contenant les arguments passées en paramètre lors de l'événement AjouterJeton. - /// - public class AjouterJetonEventArgs : EventArgs - { - /// - /// Le jeton ajouté. - /// - public Jeton Jeton { get; private set; } - - /// - /// Initialise une nouvelle instance de la classe avec le jeton spécifié. - /// - /// Le jeton qui a été ajouté. - public AjouterJetonEventArgs(Jeton jeton) - { - Jeton = jeton; - } - } -} diff --git a/Sources/CoreLibrary/Events/AjouterJoueursEventArgs.cs b/Sources/CoreLibrary/Events/AjouterJoueurEventArgs.cs similarity index 74% rename from Sources/CoreLibrary/Events/AjouterJoueursEventArgs.cs rename to Sources/CoreLibrary/Events/AjouterJoueurEventArgs.cs index 0788931..b0efe7d 100644 --- a/Sources/CoreLibrary/Events/AjouterJoueursEventArgs.cs +++ b/Sources/CoreLibrary/Events/AjouterJoueurEventArgs.cs @@ -1,24 +1,24 @@ -using CoreLibrary.Joueurs; - -namespace CoreLibrary.Events -{ - /// - /// Classe contenant les arguments passées en paramètre lors de l'événement AjouterJoueur. - /// - public class AjouterJoueursEventArgs : EventArgs - { - /// - /// Le joueur ajouté. - /// - public Joueur Joueur { get; private set; } - - /// - /// Initialise une nouvelle instance de la classe avec le joueur spécifié. - /// - /// Le joueur qui a été ajouté. - public AjouterJoueursEventArgs(Joueur joueur) - { - Joueur = joueur; - } - } -} +using CoreLibrary.Joueurs; + +namespace CoreLibrary.Events +{ + /// + /// Classe contenant les arguments passées en paramètre lors de l'événement AjouterJoueur. + /// + public class AjouterJoueurEventArgs : EventArgs + { + /// + /// Le joueur ajouté. + /// + public Joueur Joueur { get; private set; } + + /// + /// Initialise une nouvelle instance de la classe avec le joueur spécifié. + /// + /// Le joueur qui a été ajouté. + public AjouterJoueurEventArgs(Joueur joueur) + { + Joueur = joueur; + } + } +} diff --git a/Sources/CoreLibrary/Events/ConstruireJoueurEventArgs.cs b/Sources/CoreLibrary/Events/ConstruireJoueurEventArgs.cs index 8540f8e..ce7f62b 100644 --- a/Sources/CoreLibrary/Events/ConstruireJoueurEventArgs.cs +++ b/Sources/CoreLibrary/Events/ConstruireJoueurEventArgs.cs @@ -1,12 +1,20 @@ -using CoreLibrary.Joueurs; - -namespace CoreLibrary.Events +namespace CoreLibrary.Events { + /// + /// Classe contenant les arguments passées en paramètre lors de l'événement ConstruireJoueurEventArgs. + /// public class ConstruireJoueurEventArgs : EventArgs { - public string Nom { get; private set; } + /// + /// Le nom du joueur à ajouter. + /// + public string? Nom { get; private set; } - public ConstruireJoueurEventArgs(string nom) + /// + /// Initialise une nouvelle instance de la classe avec les informations spécifiées. + /// + /// Le nom du joueur à ajouter. + public ConstruireJoueurEventArgs(string? nom) { Nom = nom; } diff --git a/Sources/CoreLibrary/Events/DemanderNomEventArgs.cs b/Sources/CoreLibrary/Events/DemanderNomEventArgs.cs index e099772..d014733 100644 --- a/Sources/CoreLibrary/Events/DemanderNomEventArgs.cs +++ b/Sources/CoreLibrary/Events/DemanderNomEventArgs.cs @@ -2,11 +2,26 @@ namespace CoreLibrary.Events { + /// + /// Classe contenant les arguments passées en paramètre lors de l'événement DemanderNom. + /// public class DemanderNomEventArgs : EventArgs { + /// + /// L'indice du joueur + /// public int Indice { get; private set; } + + /// + /// Le constructeur de joueur dans lequel il faut renseigner le nom du joueur + /// public JoueurBuilder JoueurBuilder { get; private set; } + /// + /// Initialise une nouvelle instance de la classe avec les informations spécifiées. + /// + /// L'indice du joueur. + /// La classe dans laquelle on attend la réponse du joueur. public DemanderNomEventArgs(int indice, JoueurBuilder joueurBuilder) { Indice = indice; diff --git a/Sources/CoreLibrary/Events/JouerCodeEventArgs.cs b/Sources/CoreLibrary/Events/JouerCodeEventArgs.cs index 61e292c..fb6f41b 100644 --- a/Sources/CoreLibrary/Events/JouerCodeEventArgs.cs +++ b/Sources/CoreLibrary/Events/JouerCodeEventArgs.cs @@ -3,12 +3,19 @@ namespace CoreLibrary.Events { /// - /// Classe contenant les arguments passées en paramètre lors de l'événement NouveauTour. + /// Classe contenant les arguments passées en paramètre lors de l'événement JouerCode. /// public class JouerCodeEventArgs : EventArgs { + /// + /// Le code joué par le joueur + /// public Code Code { get; private set; } + /// + /// Initialise une nouvelle instance de la classe avec les informations spécifiées. + /// + /// Le code joué par le joueur dont c'est le tour. public JouerCodeEventArgs(Code code) { Code = code; diff --git a/Sources/CoreLibrary/Events/NouveauJoueurEventArgs.cs b/Sources/CoreLibrary/Events/NouveauJoueurEventArgs.cs index f9a0828..a646a8a 100644 --- a/Sources/CoreLibrary/Events/NouveauJoueurEventArgs.cs +++ b/Sources/CoreLibrary/Events/NouveauJoueurEventArgs.cs @@ -1,9 +1,19 @@ namespace CoreLibrary.Events { + /// + /// Classe contenant les arguments passées en paramètre lors de l'événement NouveauJoueur. + /// public class NouveauJoueurEventArgs : EventArgs { + /// + /// Le nom du joueur + /// public string Nom { get; private set; } + /// + /// Initialise une nouvelle instance de la classe avec les informations spécifiées. + /// + /// Le nom du joueur. public NouveauJoueurEventArgs(string nom) { Nom = nom; diff --git a/Sources/CoreLibrary/Events/NouveauTourEventArgs.cs b/Sources/CoreLibrary/Events/NouveauTourEventArgs.cs index c1024de..30ac6e2 100644 --- a/Sources/CoreLibrary/Events/NouveauTourEventArgs.cs +++ b/Sources/CoreLibrary/Events/NouveauTourEventArgs.cs @@ -18,6 +18,11 @@ namespace CoreLibrary.Events /// public int Tour { get; private set; } + /// + /// Le code où ajouter les jetons + /// + public Code Code { get; private set; } + /// /// La grille du joueur actuelle. /// @@ -35,10 +40,11 @@ namespace CoreLibrary.Events /// Le numéro du tour. /// La grille du joueur actuelle. /// Les indicateurs de la grille de jeu. - public NouveauTourEventArgs(Joueur joueur, int tour, IEnumerable> grille, IEnumerable> indicateurs) + public NouveauTourEventArgs(Joueur joueur, int tour, Code code, IEnumerable> grille, IEnumerable> indicateurs) { Joueur = joueur; Tour = tour; + Code = code; Grille = grille; Indicateurs = indicateurs; } diff --git a/Sources/CoreLibrary/Events/SupprimerDernierJetonEventArgs.cs b/Sources/CoreLibrary/Events/SupprimerDernierJetonEventArgs.cs deleted file mode 100644 index ddf9cc4..0000000 --- a/Sources/CoreLibrary/Events/SupprimerDernierJetonEventArgs.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace CoreLibrary.Events -{ - /// - /// Classe contenant les arguments passées en paramètre lors de l'événement SupprimerDernierJeton. - /// - public class SupprimerDernierJetonEventArgs : EventArgs - { - } -} diff --git a/Sources/CoreLibrary/Joueurs/Joueur.cs b/Sources/CoreLibrary/Joueurs/Joueur.cs index 0dc4cfc..201b9f8 100644 --- a/Sources/CoreLibrary/Joueurs/Joueur.cs +++ b/Sources/CoreLibrary/Joueurs/Joueur.cs @@ -50,5 +50,10 @@ namespace CoreLibrary.Joueurs NbPartieEgalite = nbPartieEgalite; NbPartiePerdue = nbPartiePerdue; } + + public void Code(Code code) + { + QuandJouerCode(code); + } } } diff --git a/Sources/CoreLibrary/Joueurs/JoueurBuilder.cs b/Sources/CoreLibrary/Joueurs/JoueurBuilder.cs index 66236ff..b136b7b 100644 --- a/Sources/CoreLibrary/Joueurs/JoueurBuilder.cs +++ b/Sources/CoreLibrary/Joueurs/JoueurBuilder.cs @@ -6,9 +6,9 @@ namespace CoreLibrary.Joueurs { public event EventHandler? ConstruireJoueur; - private void QuandConstruireJoueur(string nom) => ConstruireJoueur?.Invoke(this, new ConstruireJoueurEventArgs(nom)); + private void QuandConstruireJoueur(string? nom) => ConstruireJoueur?.Invoke(this, new ConstruireJoueurEventArgs(nom)); - public void Nom(string nom) + public void Nom(string? nom) { QuandConstruireJoueur(nom); } diff --git a/Sources/CoreLibrary/Partie.cs b/Sources/CoreLibrary/Partie.cs index 70a073a..8378db6 100644 --- a/Sources/CoreLibrary/Partie.cs +++ b/Sources/CoreLibrary/Partie.cs @@ -12,26 +12,15 @@ namespace CoreLibrary { private readonly IRegles regles; - - /// - /// Définit le délégué pour gérer les événements avec des arguments de type string. - /// - public delegate string? StringEventHandler(Object? sender, TEventArgs e); - - /// - /// Définit le délégué pour gérer les événements avec des arguments de type Jeton. - /// - public delegate Jeton? JetonEventHandler(Object? sender, TEventArgs e); - /// /// Événement déclenché lorsqu'il est nécessaire de d'ajouter un joueur. /// - public event StringEventHandler? DemanderNom; + public event EventHandler? DemanderNom; /// /// Événement déclenché lorsqu'il est nécessaire d'ajouter un joueur. /// - public event EventHandler? AjouterJoueur; + public event EventHandler? AjouterJoueur; /// /// Événement déclenché lorsqu'une partie commence. @@ -43,17 +32,6 @@ namespace CoreLibrary /// public event EventHandler? NouveauTour; - /// - /// Événement déclenché lorsqu'il est nécessaire d'ajouter un jeton. - /// - public event EventHandler? AjouterJeton; - - - /// - /// Événement déclenché lorsqu'un jeton est supprimé. - /// - public event EventHandler? SupprimerDernierJeton; - /// /// Événement déclenché lorsqu'un code est ajouté. /// @@ -70,49 +48,38 @@ namespace CoreLibrary public event EventHandler? PartieTerminee; /// - /// Méthode pour déclencher l'événement de demande d'ajout d'un joueur. + /// Méthode pour déclencher l'événement de demande du nom d'un joueur. /// /// Le numéro du joueur à ajouter - /// Le nom du joueur demandé - private string? QuandDemanderNom(int numero, JoueurBuilder joueurBuilder) => DemanderNom?.Invoke(this, new DemanderNomEventArgs(numero, joueurBuilder)); + /// La classe dans laquelle le nom doit être défini + private void QuandDemanderNom(int numero, JoueurBuilder joueurBuilder) => DemanderNom?.Invoke(this, new DemanderNomEventArgs(numero, joueurBuilder)); /// /// Méthode pour déclencher l'événement d'ajout d'un joueur. /// /// Le joueur à ajouter. - private void QuandAjouterJoueur(Joueur joueur) => AjouterJoueur?.Invoke(this, new AjouterJoueursEventArgs(joueur)); + private void QuandAjouterJoueur(Joueur joueur) => AjouterJoueur?.Invoke(this, new AjouterJoueurEventArgs(joueur)); /// /// Méthode pour déclencher l'événement du début d'un partie. /// private void QuandDebutPartie() => DebutPartie?.Invoke(this, new DebutPartieEventArgs()); - /// /// Méthode pour déclencher l'événement d'un nouveau tour. /// /// Le joueur dont c'est le tour. /// Le numéro du tour. + /// Le code dans lequel il faut ajouter les jetons. /// La grille de jeu. /// Les indicateurs de jeu. - private void QuandNouveauTour(Joueur joueur, int tour, IEnumerable> grille, IEnumerable> indicateurs) => NouveauTour?.Invoke(this, new NouveauTourEventArgs(joueur, tour, grille, indicateurs)); - - /// - /// Méthode pour déclencher l'événement d'ajout d'un nouveau jeton. - /// - /// Le jeton à ajouter. - private void QuandNouveauJeton(Jeton jeton) => AjouterJeton?.Invoke(this, new AjouterJetonEventArgs(jeton)); - - /// - /// Méthode pour déclencher l'événement de suppression du dernier jeton du code. - /// - private void QuandSupprimerDernierJeton() => SupprimerDernierJeton?.Invoke(this, new SupprimerDernierJetonEventArgs()); + private void QuandNouveauTour(Joueur joueur, int tour, Code code, IEnumerable> grille, IEnumerable> indicateurs) => NouveauTour?.Invoke(this, new NouveauTourEventArgs(joueur, tour, code, grille, indicateurs)); /// /// Méthode pour déclencher l'événement d'ajout d'un nouveau code. /// - /// Le code à ajouter. - private void QuandNouveauCode(Code code) => AjouterCode?.Invoke(this, new AjouterCodeEventArgs(code)); + /// Le code ajouté. + private void QuandAjouterCode(Code code) => AjouterCode?.Invoke(this, new AjouterCodeEventArgs(code)); /// /// Méthode pour déclencher l'événement de passage de la main au joueur suivant. @@ -146,9 +113,12 @@ namespace CoreLibrary QuandDemanderNom(regles.NbJoueurs + 1, joueurBuilder); } - public void Joueur(Object? sender, ConstruireJoueurEventArgs e) + /// + /// Un joueur a saisi son nom + /// + private void Joueur(Object? sender, ConstruireJoueurEventArgs e) { - Joueur joueur = regles.AjouterJoueur(e.Nom); + Joueur joueur = regles.AjouterJoueur(e.Nom ?? $"Joueur {regles.NbJoueurs + 1}"); QuandAjouterJoueur(joueur); joueur.JouerCode += Tour; @@ -164,20 +134,26 @@ namespace CoreLibrary } } - public void Commencer() + /// + /// La partie démarre + /// + private void Commencer() { regles.CommencerLaPartie(); QuandDebutPartie(); (Joueur joueurCourant, Plateau plateauCourant) = regles.JoueurCourant(); - QuandNouveauTour(joueurCourant, plateauCourant.Tour, plateauCourant.Grille(), plateauCourant.Indicateurs()); + QuandNouveauTour(joueurCourant, plateauCourant.Tour, regles.GenererCode(), plateauCourant.Grille(), plateauCourant.Indicateurs()); } + /// + /// Un joueur a joué son tour + /// private void Tour(Object? sender, JouerCodeEventArgs e) { (Joueur joueurCourant, Plateau plateauCourant) = regles.JoueurCourant(); plateauCourant.AjouterCode(e.Code); - QuandNouveauCode(e.Code); + QuandAjouterCode(e.Code); if(regles.EstTerminee()) { @@ -187,9 +163,15 @@ namespace CoreLibrary { regles.PasserLaMain(); QuandPasserMain(); + + (joueurCourant, plateauCourant) = regles.JoueurCourant(); + QuandNouveauTour(joueurCourant, plateauCourant.Tour, regles.GenererCode(), plateauCourant.Grille(), plateauCourant.Indicateurs()); } } + /// + /// La partie est terminée + /// private void Terminee() { QuandPartieTerminee(regles.Gagnants(), regles.Perdants()); diff --git a/Sources/MauiSpark/MauiSpark.csproj b/Sources/MauiSpark/MauiSpark.csproj index 01cba09..f26917a 100644 --- a/Sources/MauiSpark/MauiSpark.csproj +++ b/Sources/MauiSpark/MauiSpark.csproj @@ -1,99 +1,99 @@ - - - - net8.0-android; - $(TargetFrameworks);net8.0-windows10.0.19041.0 - - - - - - - Exe - MauiSpark - true - true - enable - enable - - - MauiSpark - - - fr.mastermind.mauispark - - - 1.0 - 1 - - 11.0 - 13.1 - 21.0 - 10.0.17763.0 - 10.0.17763.0 - 6.5 - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + net8.0-android; + $(TargetFrameworks);net8.0-windows10.0.19041.0 + + + + + + + Exe + MauiSpark + true + true + enable + enable + + + MauiSpark + + + fr.mastermind.mauispark + + + 1.0 + 1 + + 11.0 + 13.1 + 21.0 + 10.0.17763.0 + 10.0.17763.0 + 6.5 + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - MSBuild:Compile - - - - + + + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + + diff --git a/Sources/UnitTesting/AjouterJetonEventArgsUT.cs b/Sources/UnitTesting/AjouterJetonEventArgsUT.cs deleted file mode 100644 index f621091..0000000 --- a/Sources/UnitTesting/AjouterJetonEventArgsUT.cs +++ /dev/null @@ -1,20 +0,0 @@ -using CoreLibrary.Core; -using CoreLibrary.Events; -using Xunit; - -namespace UnitTesting -{ - public class AjouterJetonEventArgsUT - { - [Fact] - public void TestConstructeurValide() - { - Jeton monJeton = new Jeton(Couleur.JAUNE); - - AjouterJetonEventArgs evenement = new AjouterJetonEventArgs(monJeton); - - Assert.Equal(monJeton, evenement.Jeton); - } - - } -} diff --git a/Sources/UnitTesting/AjouterJoueurEventArgs.cs b/Sources/UnitTesting/AjouterJoueurEventArgs.cs index f614d6b..740f0c6 100644 --- a/Sources/UnitTesting/AjouterJoueurEventArgs.cs +++ b/Sources/UnitTesting/AjouterJoueurEventArgs.cs @@ -12,7 +12,7 @@ namespace UnitTesting { Joueur monJoueur = new Joueur("Céleste"); - AjouterJoueursEventArgs evenement = new AjouterJoueursEventArgs(monJoueur); + AjouterJoueurEventArgs evenement = new AjouterJoueurEventArgs(monJoueur); Assert.Equal(monJoueur, evenement.Joueur); } diff --git a/Sources/UnitTesting/DemanderJoueurEventArgsUT.cs b/Sources/UnitTesting/DemanderJoueurEventArgsUT.cs deleted file mode 100644 index 0aca2be..0000000 --- a/Sources/UnitTesting/DemanderJoueurEventArgsUT.cs +++ /dev/null @@ -1,16 +0,0 @@ -using CoreLibrary.Events; -using Xunit; - -namespace UnitTesting -{ - public class DemanderJoueurEventArgsUT - { - [Fact] - public void TestConstructeurValide() - { - DemanderJoueurEventArgs evenement = new DemanderJoueurEventArgs(3); - - Assert.Equal(3, evenement.Numero); - } - } -} diff --git a/Sources/UnitTesting/NouveauTourEventArgsUT.cs b/Sources/UnitTesting/NouveauTourEventArgsUT.cs deleted file mode 100644 index d1f877a..0000000 --- a/Sources/UnitTesting/NouveauTourEventArgsUT.cs +++ /dev/null @@ -1,26 +0,0 @@ -using CoreLibrary.Joueurs; -using CoreLibrary.Core; -using CoreLibrary.Events; -using Xunit; - -namespace UnitTesting -{ - public class NouveauTourEventArgsUT - { - [Fact] - public void TestConstructeurValide() - { - Plateau monPlateau = new Plateau(4, 12); - Joueur monJoueur = new Joueur("Céleste"); - - NouveauTourEventArgs evenement = - new NouveauTourEventArgs(monJoueur, 5, monPlateau.Grille(), monPlateau.Indicateurs()); - - Assert.Equal(monJoueur, evenement.Joueur); - Assert.Equal(5, evenement.Tour); - Assert.Equal(monPlateau.Grille(), evenement.Grille); - Assert.Equal(monPlateau.Indicateurs(), evenement.Indicateurs); - } - - } -} diff --git a/Sources/UnitTesting/PartieUT.cs b/Sources/UnitTesting/PartieUT.cs deleted file mode 100644 index 3a2c993..0000000 --- a/Sources/UnitTesting/PartieUT.cs +++ /dev/null @@ -1,207 +0,0 @@ -using CoreLibrary; -using CoreLibrary.Regles; -using CoreLibrary.Core; -using Xunit; -using System.Reflection; -using CoreLibrary.Events; - -namespace UnitTesting -{ - public class PartieUT - { - [Fact] - public void TestPartieInitialiseCorrectement() - { - - IRegles regles = new ReglesClassiques(); - Partie partie = new Partie(regles); - - Assert.NotNull(partie); - } - - [Fact] - public void TestJouerAppelleDemanderJoueurEvent() - { - IRegles regles = new ReglesClassiques(); - Partie partie = new Partie(regles); - bool eventAppelle = false; - - - partie.DemanderJoueur += (sender, e) => - { - eventAppelle = true; - return $"Joueur {e.Numero}"; - }; - - partie.Jouer(); - Assert.True(eventAppelle); - } - - - [Fact] - public void TestJouerAppelleDemanderJetonEvent() - { - IRegles regles = new ReglesClassiques(); - Partie partie = new Partie(regles); - bool eventAppelle = false; - - partie.DemanderJeton += (sender, e) => - { - eventAppelle = true; - return new Jeton(); - }; - - partie.Jouer(); - Assert.True(eventAppelle); - } - - [Fact] - public void TestJouerAppelleAjouterJoueurEvent() - { - IRegles regles = new ReglesClassiques(); - Partie partie = new Partie(regles); - bool eventAppelle = false; - - partie.AjouterJoueur += (sender, e) => - { - eventAppelle = true; - - }; - partie.Jouer(); - Assert.True(eventAppelle); - - } - - [Fact] - public void TestJouerAppelleDebutPartieEvent() - { - IRegles regles = new ReglesClassiques(); - Partie partie = new Partie(regles); - bool eventAppelle = false; - - partie.DebutPartie += (sender, e) => - { - eventAppelle = true; - }; - partie.Jouer(); - Assert.True(eventAppelle); - } - - [Fact] - public void TestJouerAppelleNouveauTourEvent() - { - IRegles regles = new ReglesClassiques(); - Partie partie = new Partie(regles); - bool eventAppelle = false; - - partie.NouveauTour += (sender, e) => - { - eventAppelle = true; - }; - - partie.Jouer(); - Assert.True(eventAppelle); - } - - [Fact] - public void TestJouerAppelleNouveauJetonEvent() - { - IRegles regles = new ReglesClassiques(); - Partie partie = new Partie(regles); - bool eventAppelle = false; - - partie.AjouterJeton += (sender, e) => - { - eventAppelle = true; - }; - - partie.Jouer(); - Assert.True(eventAppelle); - } - - [Fact] - public void TestJouerAppelleNouveauCodeEvent() - { - IRegles regles = new ReglesClassiques(); - Partie partie = new Partie(regles); - bool eventAppelle = false; - - partie.AjouterCode += (sender, e) => - { - eventAppelle = true; - }; - - partie.Jouer(); - Assert.True(eventAppelle); - } - - [Fact] - public void TestJouerAppellePasserMainEvent() - { - IRegles regles = new ReglesClassiques(); - Partie partie = new Partie(regles); - bool eventAppelle = false; - - partie.PasserMain += (sender, e) => - { - eventAppelle = true; - }; - - partie.Jouer(); - Assert.True(eventAppelle); - } - - [Fact] - public void TestJouerAppellePartieTermineeEvent() - { - IRegles regles = new ReglesClassiques(); - Partie partie = new Partie(regles); - bool eventAppelle = false; - - partie.PartieTerminee += (sender, e) => - { - eventAppelle = true; - }; - - partie.Jouer(); - Assert.True(eventAppelle); - } - - - [Fact] - public void TestSupprimerDernierJeton() - { - IRegles regles = new ReglesClassiques(); - Partie partie = new Partie(regles); - bool appele = false; - - partie.DemanderJeton += (sender, e) => - { - if (e.Indice == 0 || appele) - return new Jeton(); - return null; - }; - - partie.SupprimerDernierJeton += (sender, e) => - { - appele = true; - }; - - partie.Jouer(); - - Assert.True(appele); - } - - [Fact] - public void TestSupprimerDernierJetonNull() - { - Partie partie = new Partie(new ReglesClassiques()); - - MethodInfo? methode = typeof(Partie).GetMethod("QuandSupprimerDernierJeton", BindingFlags.NonPublic | BindingFlags.Instance); - - Assert.NotNull(methode); - - methode.Invoke(partie, null); - } - } -} From 573664d41670380191e370cc142b7f0b09b7c9a1 Mon Sep 17 00:00:00 2001 From: "nicolas.barbosa" Date: Sat, 25 May 2024 16:17:27 +0200 Subject: [PATCH 04/12] Tests sur les eventargs --- .../ConstruireJoueurEventArgsUT.cs | 20 +++++++++++++ Sources/UnitTesting/DemanderNomEventArgsUT.cs | 22 ++++++++++++++ Sources/UnitTesting/JouerCodeEventArgsUT.cs | 19 ++++++++++++ .../UnitTesting/NouveauJoueurEventArgsUT.cs | 16 ++++++++++ Sources/UnitTesting/NouveauTourEventArgsUT.cs | 29 +++++++++++++++++++ 5 files changed, 106 insertions(+) create mode 100644 Sources/UnitTesting/ConstruireJoueurEventArgsUT.cs create mode 100644 Sources/UnitTesting/DemanderNomEventArgsUT.cs create mode 100644 Sources/UnitTesting/JouerCodeEventArgsUT.cs create mode 100644 Sources/UnitTesting/NouveauJoueurEventArgsUT.cs create mode 100644 Sources/UnitTesting/NouveauTourEventArgsUT.cs diff --git a/Sources/UnitTesting/ConstruireJoueurEventArgsUT.cs b/Sources/UnitTesting/ConstruireJoueurEventArgsUT.cs new file mode 100644 index 0000000..909e8a9 --- /dev/null +++ b/Sources/UnitTesting/ConstruireJoueurEventArgsUT.cs @@ -0,0 +1,20 @@ +using CoreLibrary.Core; +using CoreLibrary.Events; +using Xunit; + +namespace UnitTesting +{ + public class ConstruireJoueurEventArgsUT + { + [Fact] + public void TestConstructeurValide() + { + ConstruireJoueurEventArgs evenement = new ConstruireJoueurEventArgs("Bonjour"); + ConstruireJoueurEventArgs evenement2 = new ConstruireJoueurEventArgs(null); + + Assert.Equal("Bonjour", evenement.Nom); + Assert.Null(evenement2.Nom); + } + + } +} diff --git a/Sources/UnitTesting/DemanderNomEventArgsUT.cs b/Sources/UnitTesting/DemanderNomEventArgsUT.cs new file mode 100644 index 0000000..272b79e --- /dev/null +++ b/Sources/UnitTesting/DemanderNomEventArgsUT.cs @@ -0,0 +1,22 @@ +using CoreLibrary.Events; +using CoreLibrary.Joueurs; +using Xunit; + +namespace UnitTesting +{ + public class DemanderNomEventArgsUT + { + [Fact] + public void TestConstructeurValide() + { + JoueurBuilder joueurBuilder = new JoueurBuilder(); + int indice = 15; + + DemanderNomEventArgs evenement = new DemanderNomEventArgs(indice, joueurBuilder); + + Assert.Equal(joueurBuilder, evenement.JoueurBuilder); + Assert.Equal(indice, evenement.Indice); + } + + } +} diff --git a/Sources/UnitTesting/JouerCodeEventArgsUT.cs b/Sources/UnitTesting/JouerCodeEventArgsUT.cs new file mode 100644 index 0000000..bde4742 --- /dev/null +++ b/Sources/UnitTesting/JouerCodeEventArgsUT.cs @@ -0,0 +1,19 @@ +using CoreLibrary.Core; +using CoreLibrary.Events; +using Xunit; + +namespace UnitTesting +{ + public class JouerCodeEventArgsUT + { + [Fact] + public void TestConstructeurValide() + { + Code monCode = new Code([new Jeton(Couleur.VERT), new Jeton(Couleur.BLEU)]); + + JouerCodeEventArgs evenement = new JouerCodeEventArgs(monCode); + + Assert.Equal(monCode, evenement.Code); + } + } +} diff --git a/Sources/UnitTesting/NouveauJoueurEventArgsUT.cs b/Sources/UnitTesting/NouveauJoueurEventArgsUT.cs new file mode 100644 index 0000000..edc81a9 --- /dev/null +++ b/Sources/UnitTesting/NouveauJoueurEventArgsUT.cs @@ -0,0 +1,16 @@ +using CoreLibrary.Events; +using Xunit; + +namespace UnitTesting +{ + public class NouveauJoueurEventArgsUT + { + [Fact] + public void TestConstructeurValide() + { + NouveauJoueurEventArgs evenement = new NouveauJoueurEventArgs("Céleste"); + + Assert.Equal("Céleste", evenement.Nom); + } + } +} diff --git a/Sources/UnitTesting/NouveauTourEventArgsUT.cs b/Sources/UnitTesting/NouveauTourEventArgsUT.cs new file mode 100644 index 0000000..f3ee7da --- /dev/null +++ b/Sources/UnitTesting/NouveauTourEventArgsUT.cs @@ -0,0 +1,29 @@ +using CoreLibrary.Core; +using CoreLibrary.Events; +using CoreLibrary.Joueurs; +using Xunit; + +namespace UnitTesting +{ + public class NouveauTourEventArgsUT + { + [Fact] + public void TestConstructeurValide() + { + Joueur joueur = new Joueur("Céleste"); + Plateau plateau = new Plateau(4, 12); + int tour = 10; + Code code = new Code([new Jeton(Couleur.BLEU), new Jeton(Couleur.ROUGE), new Jeton(Couleur.ROUGE), new Jeton(Couleur.JAUNE)]); + + NouveauTourEventArgs evenement = new NouveauTourEventArgs( + joueur, tour, code, plateau.Grille(), plateau.Indicateurs() + ); + + Assert.Equal(joueur, evenement.Joueur); + Assert.Equal(tour, evenement.Tour); + Assert.Equal(code, evenement.Code); + Assert.Equal(plateau.Grille(), evenement.Grille); + Assert.Equal(plateau.Indicateurs(), evenement.Indicateurs); + } + } +} From 70d57a6e85d080380e29302418f39b064ba86268 Mon Sep 17 00:00:00 2001 From: "nicolas.barbosa" Date: Sat, 25 May 2024 16:33:21 +0200 Subject: [PATCH 05/12] Correction manager et permanance --- .../Manager/IPersistanceManager.cs | 10 ++++---- Sources/CoreLibrary/Manager/Manager.cs | 24 ++++++++----------- Sources/CoreLibrary/Manager/Stub.cs | 24 +++++++++++++++++++ Sources/MauiSpark/MauiProgram.cs | 4 +--- Sources/MauiSpark/MauiSpark.csproj | 2 +- 5 files changed, 41 insertions(+), 23 deletions(-) create mode 100644 Sources/CoreLibrary/Manager/Stub.cs diff --git a/Sources/CoreLibrary/Manager/IPersistanceManager.cs b/Sources/CoreLibrary/Manager/IPersistanceManager.cs index 5795d3a..acbdd63 100644 --- a/Sources/CoreLibrary/Manager/IPersistanceManager.cs +++ b/Sources/CoreLibrary/Manager/IPersistanceManager.cs @@ -1,11 +1,11 @@ -namespace CoreLibrary.Manager +using CoreLibrary.Joueurs; + +namespace CoreLibrary.Manager { public interface IPersistanceManager { - public void Charger(); - - public void Enregistrer(); - + public IEnumerable Charger(); + public void Enregistrer(IEnumerable donnees); } } diff --git a/Sources/CoreLibrary/Manager/Manager.cs b/Sources/CoreLibrary/Manager/Manager.cs index 55ad615..b853e8a 100644 --- a/Sources/CoreLibrary/Manager/Manager.cs +++ b/Sources/CoreLibrary/Manager/Manager.cs @@ -3,26 +3,22 @@ using CoreLibrary.Regles; namespace CoreLibrary.Manager { - public class Manager : IPersistanceManager + public class Manager : IDisposable { - private Joueur[] joueurs = []; - public IReadOnlyList Joueurs => Array.AsReadOnly(joueurs); + IPersistanceManager persistance; - public void Charger() + private readonly IEnumerable joueurs; + public IEnumerable Joueurs => joueurs; + + public Manager(IPersistanceManager persistance) { - joueurs = [ - new Joueur("Pauline", 50, 5, 2, 0), - new Joueur("Céleste", 40, 6, 2, 0), - new Joueur("Camille", 55, 8, 0, 1), - new Joueur("Toto", 70, 0, 0, 10), - ]; + this.persistance = persistance; + joueurs = this.persistance.Charger(); } - - public void Enregistrer() + public void Dispose() { - throw new NotImplementedException(); + persistance.Enregistrer(joueurs); } - } } diff --git a/Sources/CoreLibrary/Manager/Stub.cs b/Sources/CoreLibrary/Manager/Stub.cs new file mode 100644 index 0000000..1d1b7aa --- /dev/null +++ b/Sources/CoreLibrary/Manager/Stub.cs @@ -0,0 +1,24 @@ +using CoreLibrary.Joueurs; +using System.Diagnostics.CodeAnalysis; + +namespace CoreLibrary.Manager +{ + public class Stub : IPersistanceManager + { + public IEnumerable Charger() + { + return [ + new Joueur("Pauline", 50, 5, 2, 0), + new Joueur("Céleste", 40, 6, 2, 0), + new Joueur("Camille", 55, 8, 0, 1), + new Joueur("Toto", 70, 0, 0, 10), + ]; + } + + [SuppressMessage("SonarAnalyzer", "S1186", Justification = "This method is intentionally left blank.")] + public void Enregistrer(IEnumerable donnees) + { + + } + } +} diff --git a/Sources/MauiSpark/MauiProgram.cs b/Sources/MauiSpark/MauiProgram.cs index be3b5b2..82d1290 100644 --- a/Sources/MauiSpark/MauiProgram.cs +++ b/Sources/MauiSpark/MauiProgram.cs @@ -5,12 +5,10 @@ namespace MauiSpark { public static class MauiProgram { - public static Manager Manager { get; private set; } = new Manager(); + public static Manager Manager { get; private set; } = new Manager(new Stub()); public static MauiApp CreateMauiApp() { - Manager.Charger(); - var builder = MauiApp.CreateBuilder(); builder .UseMauiApp() diff --git a/Sources/MauiSpark/MauiSpark.csproj b/Sources/MauiSpark/MauiSpark.csproj index f26917a..526a3d2 100644 --- a/Sources/MauiSpark/MauiSpark.csproj +++ b/Sources/MauiSpark/MauiSpark.csproj @@ -18,7 +18,7 @@ true true enable - enable + enable MauiSpark From de465e76c2c3afe33a769b6ba0ca5bee4a4f04d6 Mon Sep 17 00:00:00 2001 From: "nicolas.barbosa" Date: Sat, 25 May 2024 20:12:14 +0200 Subject: [PATCH 06/12] Correction code smells et tests unitaires --- Sources/CoreLibrary/Manager/Manager.cs | 5 +- Sources/UnitTesting/JoueurBuilderUT.cs | 23 +++++ Sources/UnitTesting/JoueurUT.cs | 15 +++ Sources/UnitTesting/ManagerUT.cs | 16 ++++ Sources/UnitTesting/ReglesClassiquesUT.cs | 107 ++++++++++++++++++++++ Sources/UnitTesting/StubUT.cs | 21 +++++ 6 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 Sources/UnitTesting/JoueurBuilderUT.cs create mode 100644 Sources/UnitTesting/ManagerUT.cs create mode 100644 Sources/UnitTesting/StubUT.cs diff --git a/Sources/CoreLibrary/Manager/Manager.cs b/Sources/CoreLibrary/Manager/Manager.cs index b853e8a..b82115c 100644 --- a/Sources/CoreLibrary/Manager/Manager.cs +++ b/Sources/CoreLibrary/Manager/Manager.cs @@ -1,11 +1,10 @@ using CoreLibrary.Joueurs; -using CoreLibrary.Regles; namespace CoreLibrary.Manager { public class Manager : IDisposable { - IPersistanceManager persistance; + private readonly IPersistanceManager persistance; private readonly IEnumerable joueurs; public IEnumerable Joueurs => joueurs; @@ -19,6 +18,8 @@ namespace CoreLibrary.Manager public void Dispose() { persistance.Enregistrer(joueurs); + + GC.SuppressFinalize(this); } } } diff --git a/Sources/UnitTesting/JoueurBuilderUT.cs b/Sources/UnitTesting/JoueurBuilderUT.cs new file mode 100644 index 0000000..f6e90db --- /dev/null +++ b/Sources/UnitTesting/JoueurBuilderUT.cs @@ -0,0 +1,23 @@ +using CoreLibrary.Events; +using CoreLibrary.Joueurs; +using Xunit; + +namespace UnitTesting +{ + public class JoueurBuilderUT + { + [Fact] + public void JoueurBuilderTest() + { + string nom = "Céleste"; + string? nomEvenement = ""; + + JoueurBuilder builder = new JoueurBuilder(); + builder.ConstruireJoueur += (Object? sender, ConstruireJoueurEventArgs e) => nomEvenement = e.Nom; + + builder.Nom(nom); + + Assert.Equal(nom, nomEvenement); + } + } +} diff --git a/Sources/UnitTesting/JoueurUT.cs b/Sources/UnitTesting/JoueurUT.cs index 147f3ee..cd899e0 100644 --- a/Sources/UnitTesting/JoueurUT.cs +++ b/Sources/UnitTesting/JoueurUT.cs @@ -1,4 +1,5 @@ using CoreLibrary.Core; +using CoreLibrary.Events; using CoreLibrary.Joueurs; using Xunit; @@ -40,5 +41,19 @@ namespace UnitTesting Assert.Equal(nbPartiePerdue, joueur.NbPartiePerdue); } + [Fact] + public void TestEvenement() + { + Code code = new Code([new Jeton(Couleur.ROUGE), new Jeton(Couleur.BLEU), new Jeton(Couleur.JAUNE), new Jeton(Couleur.VERT)]); + Code? codeEvenement = null; + + Joueur j = new Joueur("Céleste"); + j.JouerCode += (Object? sender, JouerCodeEventArgs e) => codeEvenement = e.Code; + + j.Code(code); + + Assert.NotNull(codeEvenement); + Assert.Equal(code, codeEvenement); + } } } diff --git a/Sources/UnitTesting/ManagerUT.cs b/Sources/UnitTesting/ManagerUT.cs new file mode 100644 index 0000000..082088c --- /dev/null +++ b/Sources/UnitTesting/ManagerUT.cs @@ -0,0 +1,16 @@ +using CoreLibrary.Manager; +using Xunit; + +namespace UnitTesting +{ + public class ManagerUT + { + [Fact] + public void TestConstruteur() + { + Manager manager = new Manager(new Stub()); + Assert.NotNull(manager.Joueurs); + Assert.NotEmpty(manager.Joueurs); + } + } +} diff --git a/Sources/UnitTesting/ReglesClassiquesUT.cs b/Sources/UnitTesting/ReglesClassiquesUT.cs index b58aa1c..030c8b4 100644 --- a/Sources/UnitTesting/ReglesClassiquesUT.cs +++ b/Sources/UnitTesting/ReglesClassiquesUT.cs @@ -16,6 +16,25 @@ namespace UnitTesting Assert.Equal("Règles classiques", new ReglesClassiques().Nom); } + [Fact] + public void TestNbJoueur() + { + ReglesClassiques regles = new ReglesClassiques(); + Assert.Equal(0, regles.NbJoueurs); + regles.AjouterJoueur("Bonjour"); + Assert.Equal(1, regles.NbJoueurs); + regles.AjouterJoueur("Bonsoir"); + Assert.Equal(2, regles.NbJoueurs); + } + + [Fact] + public void GenererCode() + { + ReglesClassiques regles = new ReglesClassiques(); + Assert.Equal(new Code(4).NbJetons, regles.GenererCode().NbJetons); + Assert.Equal(4, regles.GenererCode().TailleMaximale()); + } + [Fact] public void TestJoueurCourantPartieNonCommencee() { @@ -145,5 +164,93 @@ namespace UnitTesting Assert.Single(gagnants); Assert.Contains(regles.JoueurCourant().Item1, gagnants); } + + [Fact] + public void TestPerdants() + { + ReglesClassiques regles = new ReglesClassiques(); + Partie partie = new Partie(regles); + + regles.AjouterJoueur("joueur1"); + regles.AjouterJoueur("joueur2"); + + regles.CommencerLaPartie(); + + Plateau plateauj1 = regles.JoueurCourant().Item2; + + Type type = typeof(Plateau); + FieldInfo? fieldInfo = type.GetField("codeSecret", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull(fieldInfo); + Code? codeSecret = (Code?)fieldInfo.GetValue(plateauj1); + Assert.NotNull(codeSecret); + + regles.JoueurCourant().Item2.AjouterCode(codeSecret); + + regles.PasserLaMain(); + + IEnumerable perdants = regles.Perdants(); + Assert.Single(perdants); + Assert.Contains(regles.JoueurCourant().Item1, perdants); + } + + + [Fact] + public void EstTermineeMaxTour() + { + ReglesClassiques regles = new ReglesClassiques(); + regles.AjouterJoueur("1"); + regles.AjouterJoueur("2"); + regles.CommencerLaPartie(); + + for (int i = 0; i < 24; ++i) + { + Plateau plateau = regles.JoueurCourant().Item2; + Code code = new Code(4); + code.AjouterJeton(new Jeton(Couleur.ROUGE)); + code.AjouterJeton(new Jeton(Couleur.ROUGE)); + code.AjouterJeton(new Jeton(Couleur.ROUGE)); + code.AjouterJeton(new Jeton(Couleur.ROUGE)); + plateau.AjouterCode(code); + + regles.PasserLaMain(); + } + + Assert.True(regles.EstTerminee()); + } + + [Fact] + public void EstTermineeNon() + { + ReglesClassiques regles = new ReglesClassiques(); + regles.AjouterJoueur("1"); + regles.AjouterJoueur("2"); + regles.CommencerLaPartie(); + + for (int i = 0; i < 12; ++i) + regles.PasserLaMain(); + + Assert.False(regles.EstTerminee()); + } + + [Fact] + public void EstTermineeCodeTrouve() + { + ReglesClassiques regles = new ReglesClassiques(); + regles.AjouterJoueur("1"); + regles.AjouterJoueur("2"); + regles.CommencerLaPartie(); + + Plateau plateauj1 = regles.JoueurCourant().Item2; + + Type type = typeof(Plateau); + FieldInfo? fieldInfo = type.GetField("codeSecret", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull(fieldInfo); + Code? codeSecret = (Code?)fieldInfo.GetValue(plateauj1); + Assert.NotNull(codeSecret); + + regles.JoueurCourant().Item2.AjouterCode(codeSecret); + + Assert.True(regles.EstTerminee()); + } } } diff --git a/Sources/UnitTesting/StubUT.cs b/Sources/UnitTesting/StubUT.cs new file mode 100644 index 0000000..bfdcea5 --- /dev/null +++ b/Sources/UnitTesting/StubUT.cs @@ -0,0 +1,21 @@ +using CoreLibrary.Manager; +using Xunit; + +namespace UnitTesting +{ + public class StubUT + { + [Fact] + public void ChargerTest() + { + Assert.NotEmpty(new Stub().Charger()); + } + + [Fact] + public void EnregistrerTest() + { + new Stub().Enregistrer([]); + } + + } +} From 7abbba34990cc742b76c128874776432cdde33bf Mon Sep 17 00:00:00 2001 From: "nicolas.barbosa" Date: Sat, 25 May 2024 20:24:35 +0200 Subject: [PATCH 07/12] tentative de correction de code smell dispose --- Sources/CoreLibrary/Manager/Manager.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Sources/CoreLibrary/Manager/Manager.cs b/Sources/CoreLibrary/Manager/Manager.cs index b82115c..619d180 100644 --- a/Sources/CoreLibrary/Manager/Manager.cs +++ b/Sources/CoreLibrary/Manager/Manager.cs @@ -1,9 +1,12 @@ using CoreLibrary.Joueurs; +using System.Runtime.InteropServices; namespace CoreLibrary.Manager { public class Manager : IDisposable { + private bool estDetruit; + private readonly IPersistanceManager persistance; private readonly IEnumerable joueurs; @@ -17,9 +20,22 @@ namespace CoreLibrary.Manager public void Dispose() { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool detruire) + { + if (estDetruit) return; + persistance.Enregistrer(joueurs); - GC.SuppressFinalize(this); + estDetruit = true; + } + + ~Manager() + { + Dispose(false); } } } From b298a51b8e4a75513580578b529aa7bbf45bd0ed Mon Sep 17 00:00:00 2001 From: "nicolas.barbosa" Date: Sat, 25 May 2024 20:27:42 +0200 Subject: [PATCH 08/12] Correction de code smell tests --- Sources/UnitTesting/StubUT.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/UnitTesting/StubUT.cs b/Sources/UnitTesting/StubUT.cs index bfdcea5..8fe5f4a 100644 --- a/Sources/UnitTesting/StubUT.cs +++ b/Sources/UnitTesting/StubUT.cs @@ -14,7 +14,7 @@ namespace UnitTesting [Fact] public void EnregistrerTest() { - new Stub().Enregistrer([]); + Assert.Null(Record.Exception(() => new Stub().Enregistrer([]))); } } From f9a53fe4412934fc9421d9e9addcaa120a231af9 Mon Sep 17 00:00:00 2001 From: "nicolas.barbosa" Date: Sat, 25 May 2024 20:48:01 +0200 Subject: [PATCH 09/12] tests unitaires sur stub --- Sources/CoreLibrary/Manager/IPersistanceManager.cs | 2 ++ Sources/CoreLibrary/Manager/Stub.cs | 4 +++- Sources/UnitTesting/ManagerUT.cs | 9 +++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Sources/CoreLibrary/Manager/IPersistanceManager.cs b/Sources/CoreLibrary/Manager/IPersistanceManager.cs index acbdd63..501b80b 100644 --- a/Sources/CoreLibrary/Manager/IPersistanceManager.cs +++ b/Sources/CoreLibrary/Manager/IPersistanceManager.cs @@ -4,6 +4,8 @@ namespace CoreLibrary.Manager { public interface IPersistanceManager { + public bool EstEnregistre { get; } + public IEnumerable Charger(); public void Enregistrer(IEnumerable donnees); diff --git a/Sources/CoreLibrary/Manager/Stub.cs b/Sources/CoreLibrary/Manager/Stub.cs index 1d1b7aa..dfebedb 100644 --- a/Sources/CoreLibrary/Manager/Stub.cs +++ b/Sources/CoreLibrary/Manager/Stub.cs @@ -5,6 +5,8 @@ namespace CoreLibrary.Manager { public class Stub : IPersistanceManager { + public bool EstEnregistre { get; private set; } = false; + public IEnumerable Charger() { return [ @@ -18,7 +20,7 @@ namespace CoreLibrary.Manager [SuppressMessage("SonarAnalyzer", "S1186", Justification = "This method is intentionally left blank.")] public void Enregistrer(IEnumerable donnees) { - + EstEnregistre = true; } } } diff --git a/Sources/UnitTesting/ManagerUT.cs b/Sources/UnitTesting/ManagerUT.cs index 082088c..ef2d401 100644 --- a/Sources/UnitTesting/ManagerUT.cs +++ b/Sources/UnitTesting/ManagerUT.cs @@ -12,5 +12,14 @@ namespace UnitTesting Assert.NotNull(manager.Joueurs); Assert.NotEmpty(manager.Joueurs); } + + [Fact] + public void TestDispose() + { + Stub stub = new Stub(); + Manager manager = new Manager(stub); + manager.Dispose(); + Assert.True(stub.EstEnregistre); + } } } From df601a57b46fd2c716f52e1bc524b6533eb970c6 Mon Sep 17 00:00:00 2001 From: "nicolas.barbosa" Date: Sat, 25 May 2024 20:59:40 +0200 Subject: [PATCH 10/12] Fin de tests unitaires sur tout sauf partie --- Sources/UnitTesting/JoueurBuilderUT.cs | 18 ++++++++++++++++++ Sources/UnitTesting/JoueurUT.cs | 24 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/Sources/UnitTesting/JoueurBuilderUT.cs b/Sources/UnitTesting/JoueurBuilderUT.cs index f6e90db..881dec8 100644 --- a/Sources/UnitTesting/JoueurBuilderUT.cs +++ b/Sources/UnitTesting/JoueurBuilderUT.cs @@ -1,5 +1,6 @@ using CoreLibrary.Events; using CoreLibrary.Joueurs; +using System.Reflection; using Xunit; namespace UnitTesting @@ -19,5 +20,22 @@ namespace UnitTesting Assert.Equal(nom, nomEvenement); } + + [Fact] + public void JoueurBuilderQuandConstruireJoueur() + { + string nom = "Céleste"; + string? nomEvenement = ""; + + JoueurBuilder builder = new JoueurBuilder(); + builder.ConstruireJoueur += (Object? sender, ConstruireJoueurEventArgs e) => nomEvenement = e.Nom; + + Type type = typeof(JoueurBuilder); + MethodInfo? methodInfo = type.GetMethod("QuandConstruireJoueur", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull(methodInfo); + methodInfo.Invoke(builder, [nom]); + + Assert.Equal(nom, nomEvenement); + } } } diff --git a/Sources/UnitTesting/JoueurUT.cs b/Sources/UnitTesting/JoueurUT.cs index cd899e0..f749d4d 100644 --- a/Sources/UnitTesting/JoueurUT.cs +++ b/Sources/UnitTesting/JoueurUT.cs @@ -1,6 +1,7 @@ using CoreLibrary.Core; using CoreLibrary.Events; using CoreLibrary.Joueurs; +using System.Reflection; using Xunit; namespace UnitTesting @@ -55,5 +56,28 @@ namespace UnitTesting Assert.NotNull(codeEvenement); Assert.Equal(code, codeEvenement); } + + [Fact] + public void JoueurQuandJouerCode() + { + Code code = new Code(4); + code.AjouterJeton(new Jeton(Couleur.ROUGE)); + code.AjouterJeton(new Jeton(Couleur.BLANC)); + code.AjouterJeton(new Jeton(Couleur.BLEU)); + code.AjouterJeton(new Jeton(Couleur.NOIR)); + + Code? codeEvenement = null; + + Joueur joueur = new Joueur("Céleste"); + joueur.JouerCode += (Object? sender, JouerCodeEventArgs e) => codeEvenement = e.Code; + + Type type = typeof(Joueur); + MethodInfo? methodInfo = type.GetMethod("QuandJouerCode", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull(methodInfo); + methodInfo.Invoke(joueur, [code]); + + Assert.NotNull(codeEvenement); + Assert.Equal(code, codeEvenement); + } } } From 34eb1bccf87f8c1ba35d14211872742cb7bf9752 Mon Sep 17 00:00:00 2001 From: "nicolas.barbosa" Date: Sat, 25 May 2024 21:03:58 +0200 Subject: [PATCH 11/12] tentative de couverture tests --- Sources/UnitTesting/JoueurBuilderUT.cs | 11 ++++++++++- Sources/UnitTesting/JoueurUT.cs | 14 +++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Sources/UnitTesting/JoueurBuilderUT.cs b/Sources/UnitTesting/JoueurBuilderUT.cs index 881dec8..33ac207 100644 --- a/Sources/UnitTesting/JoueurBuilderUT.cs +++ b/Sources/UnitTesting/JoueurBuilderUT.cs @@ -1,4 +1,5 @@ -using CoreLibrary.Events; +using CoreLibrary.Core; +using CoreLibrary.Events; using CoreLibrary.Joueurs; using System.Reflection; using Xunit; @@ -37,5 +38,13 @@ namespace UnitTesting Assert.Equal(nom, nomEvenement); } + + [Fact] + public void JoueurBuilderQuandConstruireJoueurSansBranchement() + { + JoueurBuilder builder = new JoueurBuilder(); + + builder.Nom("Pauline"); + } } } diff --git a/Sources/UnitTesting/JoueurUT.cs b/Sources/UnitTesting/JoueurUT.cs index f749d4d..b4ea26f 100644 --- a/Sources/UnitTesting/JoueurUT.cs +++ b/Sources/UnitTesting/JoueurUT.cs @@ -15,7 +15,7 @@ namespace UnitTesting Joueur joueur = new Joueur(nom); - + Assert.Equal(nom, joueur.Nom); Assert.Equal(0, joueur.NbCoutTotal); Assert.Equal(0, joueur.NbPartieGagnee); @@ -79,5 +79,17 @@ namespace UnitTesting Assert.NotNull(codeEvenement); Assert.Equal(code, codeEvenement); } + + [Fact] + public void JoueurQuandJouerCodeSansBranchement() + { + Joueur joueur = new Joueur("Pauline"); + Code code = new Code(4); + code.AjouterJeton(new Jeton(Couleur.ROUGE)); + code.AjouterJeton(new Jeton(Couleur.BLANC)); + code.AjouterJeton(new Jeton(Couleur.BLEU)); + code.AjouterJeton(new Jeton(Couleur.NOIR)); + joueur.Code(code); + } } } From a7522c7922193b1ed4a499f4550322deee63f290 Mon Sep 17 00:00:00 2001 From: "nicolas.barbosa" Date: Sat, 25 May 2024 21:07:10 +0200 Subject: [PATCH 12/12] Enfin les tests unitaires sur joueurs et joueur builder --- Sources/UnitTesting/JoueurBuilderUT.cs | 2 +- Sources/UnitTesting/JoueurUT.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Sources/UnitTesting/JoueurBuilderUT.cs b/Sources/UnitTesting/JoueurBuilderUT.cs index 33ac207..ffafcdc 100644 --- a/Sources/UnitTesting/JoueurBuilderUT.cs +++ b/Sources/UnitTesting/JoueurBuilderUT.cs @@ -44,7 +44,7 @@ namespace UnitTesting { JoueurBuilder builder = new JoueurBuilder(); - builder.Nom("Pauline"); + Assert.Null(Record.Exception(() => builder.Nom("Pauline"))); } } } diff --git a/Sources/UnitTesting/JoueurUT.cs b/Sources/UnitTesting/JoueurUT.cs index b4ea26f..10846b5 100644 --- a/Sources/UnitTesting/JoueurUT.cs +++ b/Sources/UnitTesting/JoueurUT.cs @@ -89,7 +89,8 @@ namespace UnitTesting code.AjouterJeton(new Jeton(Couleur.BLANC)); code.AjouterJeton(new Jeton(Couleur.BLEU)); code.AjouterJeton(new Jeton(Couleur.NOIR)); - joueur.Code(code); + + Assert.Null(Record.Exception(() => joueur.Code(code))); } } }