diff --git a/Sources/ConsoleApp/Program.cs b/Sources/ConsoleApp/Program.cs index c7c5129..5f7a9dc 100644 --- a/Sources/ConsoleApp/Program.cs +++ b/Sources/ConsoleApp/Program.cs @@ -9,8 +9,8 @@ using Persistance.Persistance; namespace ConsoleApp { /// - /// Permet de jouer une partie de mastermind, avec les règles classiques - /// (2 joueurs, 12 tours, un code à 4 couleurs parmi 6) + /// Permet de jouer une partie de mastermind, avec les regles classiques + /// (2 joueurs, 12 tours, un code a code couleurs parmi 6) /// [ExcludeFromCodeCoverage] public static class Program diff --git a/Sources/CoreLibrary/Exceptions/JoueurDejaConnecteException.cs b/Sources/CoreLibrary/Exceptions/JoueurDejaConnecteException.cs deleted file mode 100644 index f06f56e..0000000 --- a/Sources/CoreLibrary/Exceptions/JoueurDejaConnecteException.cs +++ /dev/null @@ -1,49 +0,0 @@ -using CoreLibrary.Joueurs; -using System.Runtime.Serialization; - -namespace CoreLibrary.Exceptions -{ - /// - /// Exception levée lorsqu'un joueur se connecte alors qu'il l'est déjà. - /// - [Serializable] - public class JoueurDejaConnecteException : Exception - { - // Message par défaut - private const string messageDefaut = "Le joueur est déjà connecté."; - - /// - /// Initialise une nouvelle instance de la classe avec le message par défaut. - /// - public JoueurDejaConnecteException() : base(messageDefaut) - {} - - /// - /// Initialise une nouvelle instance de la classe avec le message spécifié. - /// - public JoueurDejaConnecteException(string message) : base(message) - {} - - /// - /// Initialise une nouvelle instance de la classe avec le joueur spécifié. - /// - public JoueurDejaConnecteException(Joueur joueur) : base($"Le joueur {joueur.Nom} est déjà connecté.") - { } - - /// - /// Initialise une nouvelle instance de la classe avec le message et l'exception parent spécifiés. - /// - public JoueurDejaConnecteException(string message, Exception exception) : base(message, exception) - {} - - [Obsolete("This method is obsolete. Use alternative methods for data retrieval.", DiagnosticId = "SYSLIB0051")] - protected JoueurDejaConnecteException(SerializationInfo info, StreamingContext contexte) : base(info, contexte) - {} - - [Obsolete("This method is obsolete. Use alternative methods for data retrieval.", DiagnosticId = "SYSLIB0051")] - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - base.GetObjectData(info, context); - } - } -} diff --git a/Sources/CoreLibrary/Joueurs/Robot.cs b/Sources/CoreLibrary/Joueurs/Robot.cs index 2ada0dc..dd3ce38 100644 --- a/Sources/CoreLibrary/Joueurs/Robot.cs +++ b/Sources/CoreLibrary/Joueurs/Robot.cs @@ -137,9 +137,6 @@ namespace CoreLibrary.Joueurs /// Une liste de tous les codes restants possibles. private static void SupprimerCodesImpossibles(List codes, Plateau plateau) { - if (codes == null) - return; - List indicesASupprimer = new List(); // Pour chaque code possible diff --git a/Sources/MauiSpark/Pages/ReglesPage.xaml b/Sources/MauiSpark/Pages/ReglesPage.xaml index c207aba..3d8b0f0 100644 --- a/Sources/MauiSpark/Pages/ReglesPage.xaml +++ b/Sources/MauiSpark/Pages/ReglesPage.xaml @@ -18,7 +18,7 @@ - + diff --git a/Sources/MauiSpark/Vues/IndicateurVue.xaml b/Sources/MauiSpark/Vues/IndicateurVue.xaml index 6ea4634..7b6f6d8 100644 --- a/Sources/MauiSpark/Vues/IndicateurVue.xaml +++ b/Sources/MauiSpark/Vues/IndicateurVue.xaml @@ -10,6 +10,8 @@ VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"> diff --git a/Sources/MauiSpark/Vues/JetonVue.xaml b/Sources/MauiSpark/Vues/JetonVue.xaml index 6f3571b..9b3f933 100644 --- a/Sources/MauiSpark/Vues/JetonVue.xaml +++ b/Sources/MauiSpark/Vues/JetonVue.xaml @@ -11,6 +11,8 @@ HorizontalOptions="FillAndExpand"> diff --git a/Sources/MauiSpark/Vues/ReglesVue.xaml b/Sources/MauiSpark/Vues/ReglesVue.xaml index f4d64cb..784276a 100644 --- a/Sources/MauiSpark/Vues/ReglesVue.xaml +++ b/Sources/MauiSpark/Vues/ReglesVue.xaml @@ -9,7 +9,7 @@ StrokeShape="RoundRectangle 10"> - diff --git a/Sources/MauiSpark/Vues/ReglesVue.xaml.cs b/Sources/MauiSpark/Vues/ReglesVue.xaml.cs index c179692..421e01d 100644 --- a/Sources/MauiSpark/Vues/ReglesVue.xaml.cs +++ b/Sources/MauiSpark/Vues/ReglesVue.xaml.cs @@ -6,9 +6,9 @@ namespace MauiSpark.Vues; public partial class ReglesVue : ContentView { /// - /// Identifie la propriété de dépendance pour le titre des règles. + /// Identifie la propriété de dépendance pour le Nom des règles. /// - public static readonly BindableProperty TitreProperty = BindableProperty.Create(nameof(Titre), typeof(string), typeof(ReglesVue), default(string)); + public static readonly BindableProperty NomProperty = BindableProperty.Create(nameof(Nom), typeof(string), typeof(ReglesVue), default(string)); /// /// Identifie la propriété de dépendance pour la description des règles. @@ -18,10 +18,10 @@ public partial class ReglesVue : ContentView /// /// Obtient ou définit le titre des règles. /// - public string Titre + public string Nom { - get => (string)GetValue(TitreProperty); - set => SetValue(TitreProperty, value); + get => (string)GetValue(NomProperty); + set => SetValue(NomProperty, value); } /// diff --git a/Sources/UnitTesting/JoueurDejaConnecteExceptionUT.cs b/Sources/UnitTesting/JoueurDejaConnecteExceptionUT.cs deleted file mode 100644 index f1035e6..0000000 --- a/Sources/UnitTesting/JoueurDejaConnecteExceptionUT.cs +++ /dev/null @@ -1,83 +0,0 @@ -using CoreLibrary.Exceptions; -using System.Reflection; -using System.Runtime.Serialization; -using Xunit; - -namespace UnitTesting -{ - public class JoueurDejaConnecteExceptionUT - { - [Fact] - public void ExceptionDefaut() - { - Assert.ThrowsAsync(() => throw new JoueurDejaConnecteException()); - } - - [Fact] - public void ExceptionMessage() - { - string message = "Mon super gros problème."; - - Assert.ThrowsAsync(() => throw new JoueurDejaConnecteException(message)); - - try - { - throw new JoueurDejaConnecteException(message); - } - catch (JoueurDejaConnecteException e) - { - Assert.Equal(message, e.Message); - } - } - - [Fact] - public void ExceptionMessageEtException() - { - string message = "Mon super gros problème."; - string message2 = "Pas de chance..."; - InvalidOperationException parent = new InvalidOperationException(message2); - - Assert.ThrowsAsync(() => throw new JoueurDejaConnecteException(message, parent)); - - try - { - throw new JoueurDejaConnecteException(message, parent); - } - catch (JoueurDejaConnecteException e) - { - Assert.Equal(message, e.Message); - Assert.NotNull(e.InnerException); - Assert.IsType(e.InnerException); - Assert.Equal(message2, e.InnerException.Message); - } - } - - [Fact] - public void ExceptionSerialisation() - { - JoueurDejaConnecteException exception = new JoueurDejaConnecteException(); - -#pragma warning disable SYSLIB0050 - SerializationInfo info = new SerializationInfo(typeof(JoueurDejaConnecteException), new FormatterConverter()); - StreamingContext contexte = new StreamingContext(StreamingContextStates.All); -#pragma warning restore SYSLIB0050 - -#pragma warning disable SYSLIB0051 - exception.GetObjectData(info, contexte); -#pragma warning restore SYSLIB0051 - - Assert.Equal(exception.Message, info.GetString("Message")); - -#pragma warning disable SYSLIB0050 - JoueurDejaConnecteException exceptionSerialisee = - (JoueurDejaConnecteException)FormatterServices.GetUninitializedObject(typeof(JoueurDejaConnecteException)); -#pragma warning restore SYSLIB0050 - - ConstructorInfo? constructeur = typeof(JoueurDejaConnecteException).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, [typeof(SerializationInfo), typeof(StreamingContext)], null); - Assert.NotNull(constructeur); - constructeur.Invoke(exceptionSerialisee, [info, contexte]); - - Assert.Equal(exception.Message, exceptionSerialisee.Message); - } - } -} diff --git a/Sources/UnitTesting/JoueurUT.cs b/Sources/UnitTesting/JoueurUT.cs index 864a822..3cfdd81 100644 --- a/Sources/UnitTesting/JoueurUT.cs +++ b/Sources/UnitTesting/JoueurUT.cs @@ -13,7 +13,7 @@ namespace UnitTesting /// /// public class JoueurUT - { + { /// /// /// @@ -26,8 +26,8 @@ namespace UnitTesting Assert.Equal(nom, joueur.Nom); - } - + } + /// /// /// @@ -40,8 +40,8 @@ namespace UnitTesting Assert.Equal(nom, joueur.Nom); - } - + } + /// /// /// @@ -65,8 +65,8 @@ namespace UnitTesting Assert.True(eventTriggered); Assert.NotNull(eventArgs); Assert.Equal(joueur2, eventArgs?.Joueur); - } - + } + /// /// /// @@ -89,20 +89,8 @@ namespace UnitTesting Assert.True(eventTriggered); Assert.NotNull(eventArgs); Assert.Equal(joueur2, eventArgs?.Joueur); - } - - /// - /// - /// - [Fact] - public void TestSeConnecterThrowException() - { - Joueur joueur = new Joueur("Joueur"); - joueur.SeConnecter(joueur); + } - Assert.Throws(() => joueur.SeConnecter(joueur)); - } - /// /// /// @@ -113,8 +101,8 @@ namespace UnitTesting Joueur joueur = new Joueur(nom); string result = joueur.ToString(); Assert.Equal(nom, result); - } - + } + /// /// /// @@ -125,8 +113,8 @@ namespace UnitTesting string result = joueur.ToString(); Assert.Equal("", result); - } - + } + /// /// /// @@ -140,8 +128,8 @@ namespace UnitTesting double result = joueur.Statistique(regles, statistique); Assert.Equal(0, result); - } - + } + /// /// /// @@ -156,8 +144,8 @@ namespace UnitTesting double result = joueur.Statistique(regles, statistique); Assert.Equal(1, result); - } - + } + /// /// /// @@ -172,8 +160,8 @@ namespace UnitTesting double result = joueur.Statistique(regles, statistique); Assert.Equal(1, result); - } - + } + /// /// /// @@ -190,5 +178,25 @@ namespace UnitTesting Assert.Equal(2, result); } + + + [Fact] + public void TestJoueurEcoute() + { + Joueur joueur = new Joueur("Joueur1"); + + MethodInfo? QuandJoueurSeConnecter = typeof(Joueur).GetMethod("QuandJoueurSeConnecter", BindingFlags.NonPublic | BindingFlags.Instance); + + Assert.NotNull(QuandJoueurSeConnecter); + + QuandJoueurSeConnecter?.Invoke(joueur, [joueur]); + + bool appel = false; + joueur.JoueurSeConnecter += (sender, e) => appel = true; + + QuandJoueurSeConnecter?.Invoke(joueur, [joueur]); + + Assert.True(appel); + } } } diff --git a/Sources/UnitTesting/PartieUT.cs b/Sources/UnitTesting/PartieUT.cs index 3b86a0f..1b57245 100644 --- a/Sources/UnitTesting/PartieUT.cs +++ b/Sources/UnitTesting/PartieUT.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; +using System.Reflection; using Xunit; using CoreLibrary; using CoreLibrary.Core; @@ -9,8 +6,6 @@ using CoreLibrary.Joueurs; using CoreLibrary.Regles; using CoreLibrary.Evenements; using CoreLibrary.Exceptions; -using System.Diagnostics.Tracing; -using Xunit.Abstractions; namespace UnitTesting diff --git a/Sources/UnitTesting/PlateauUT.cs b/Sources/UnitTesting/PlateauUT.cs index 340ba81..21c2c50 100644 --- a/Sources/UnitTesting/PlateauUT.cs +++ b/Sources/UnitTesting/PlateauUT.cs @@ -2,9 +2,6 @@ using System.Reflection; using CoreLibrary.Core; using Xunit; -using CoreLibrary.Joueurs; -using CoreLibrary.Regles; -using CoreLibrary; namespace UnitTesting { @@ -12,7 +9,7 @@ namespace UnitTesting /// Classe test pour la classe Plateau. /// public class PlateauUT - { + { /// /// Test que le constructeur de Plateau soit valide. /// @@ -22,8 +19,8 @@ namespace UnitTesting Plateau plateau = new Plateau(4,12); Assert.NotNull(plateau); Assert.False(plateau.Victoire); - } - + } + /// /// Test que le constructeur de Plateau soit invalide. /// @@ -32,8 +29,8 @@ namespace UnitTesting { Assert.Throws(() => new Plateau(-1, 10)); Assert.Throws(() => new Plateau(3, -1)); - } - + } + /// /// Test la méthode EstComplet de Plateau et vérifie qu'il renvoie True. /// @@ -54,8 +51,8 @@ namespace UnitTesting bool estComplet = plateau.Complet; Assert.True(estComplet); - } - + } + /// /// Test la méthode EstComplet de Plateau et vérifie qu'il renvoie False. /// @@ -75,8 +72,8 @@ namespace UnitTesting bool estComplet = plateau.Complet; Assert.False(estComplet); - } - + } + /// /// Test l'exception CodeCompletException de Plateau avec une taille de code supérieure à ce qui est défini. /// @@ -99,8 +96,8 @@ namespace UnitTesting Assert.Throws(() => code.AjouterJeton(new Jeton(Couleur.Bleu))); - } - + } + /// /// Test l'exception CodeIncompletException de Plateau avec un code incomplet. /// @@ -111,8 +108,8 @@ namespace UnitTesting Code code = new Code(4); Assert.Throws(() => plateau.AjouterCode(code)); - } - + } + /// /// Test la méthode AjouterCode de Plateau avec un bon code. /// @@ -131,8 +128,8 @@ namespace UnitTesting Assert.NotNull(codeSecret); plateau.AjouterCode(codeSecret); Assert.True(plateau.Victoire); - } - + } + /// /// Test la méthode AjouterCode de Plateau et vérifie la grille et ses composants. /// @@ -164,8 +161,8 @@ namespace UnitTesting Assert.Equal(4, jetonsGrille.First().Count()); Assert.Single(indicateurs); - } - + } + /// /// Test que la grille du plateau est vide. /// @@ -179,8 +176,8 @@ namespace UnitTesting Assert.Empty(jetons); Assert.Empty(indicateurs); - } - + } + /// /// Test l'exception GrilleCompleteException de Plateau. /// @@ -209,8 +206,8 @@ namespace UnitTesting plateau.AjouterCode(codeComplet2); Assert.Throws(() => plateau.AjouterCode(codeComplet3)); - } - + } + /// /// Test l'événement QuandPlateauAjouterCode de Plateau. /// @@ -231,8 +228,8 @@ namespace UnitTesting QuandPlateauAjouterCodeInfo?.Invoke(plateau, []); Assert.True(appel); - } - + } + /// /// Test la méthode AjouterCode de Plateau et vérifie tous les cas d'arrêts. /// diff --git a/Sources/UnitTesting/RobotUT.cs b/Sources/UnitTesting/RobotUT.cs new file mode 100644 index 0000000..7a8b303 --- /dev/null +++ b/Sources/UnitTesting/RobotUT.cs @@ -0,0 +1,106 @@ +using CoreLibrary.Core; +using CoreLibrary.Joueurs; +using System.Reflection; +using Xunit; + +namespace UnitTesting +{ + public class RobotUT + { + [Fact] + public void TestEstCodePossible() + { + // Cas 1 - Plateau vide + Plateau plateau1 = new Plateau(1, 1); + Code code1 = new Code(1); + code1.AjouterJeton(new Jeton(Couleur.Rouge)); + + MethodInfo? EstCodePossible1 = typeof(Robot).GetMethod("EstCodePossible", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); + Assert.NotNull(EstCodePossible1); + object? estPossibleObj1 = EstCodePossible1.Invoke(new Robot(), [plateau1, code1]); + + Assert.NotNull(estPossibleObj1); + Assert.IsType(estPossibleObj1); + Assert.True((bool)estPossibleObj1); + + // Cas 2 - Plateau rempli, code juste + Plateau plateau2 = new Plateau(1, 1); + + FieldInfo? codeSecretInfo2 = typeof(Plateau).GetField("codeSecret", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull(codeSecretInfo2); + + Code? codeSecret2 = codeSecretInfo2.GetValue(plateau2) as Code; + Assert.NotNull(codeSecret2); + + plateau2.AjouterCode(codeSecret2); + + MethodInfo? EstCodePossible2 = typeof(Robot).GetMethod("EstCodePossible", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); + Assert.NotNull(EstCodePossible2); + object? estPossibleObj2 = EstCodePossible2.Invoke(new Robot(), [plateau2, codeSecret2]); + Assert.NotNull(estPossibleObj2); + Assert.IsType(estPossibleObj2); + Assert.True((bool)estPossibleObj2); + + // Cas 3 - Plateau rempli, code mauvaise couleur + Code code3 = new Code(1); + code3.AjouterJeton(new Jeton(Couleur.Rouge)); + + Plateau plateau3; + Code? codeSecret3; + do + { + plateau3 = new Plateau(1, 1); + + FieldInfo? codeSecretInfo3 = typeof(Plateau).GetField("codeSecret", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull(codeSecretInfo3); + + codeSecret3 = codeSecretInfo3.GetValue(plateau3) as Code; + Assert.NotNull(codeSecret3); + } while (codeSecret3.RecupererJeton(0).Equals(code3.RecupererJeton(0))); + + plateau3.AjouterCode(codeSecret3); + + MethodInfo? EstCodePossible3 = typeof(Robot).GetMethod("EstCodePossible", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); + Assert.NotNull(EstCodePossible3); + object? estPossibleObj3 = EstCodePossible3.Invoke(new Robot(), [plateau3, code3]); + Assert.NotNull(estPossibleObj3); + Assert.IsType(estPossibleObj3); + Assert.False((bool)estPossibleObj3); + } + + [Fact] + public void TestSupprimerCodesImpossibles() + { + Code codeSecret = new Code(1); + codeSecret.AjouterJeton(new Jeton(Couleur.Rouge)); + + Code code1 = new Code(1); + code1.AjouterJeton(new Jeton(Couleur.Vert)); + + Code code2 = new Code(1); + code2.AjouterJeton(new Jeton(Couleur.Jaune)); + + List codes = new List([ + codeSecret, + code1, + code2, + ]); + + Plateau plateau = new Plateau(1, 1); + + FieldInfo? codeSecretInfo = typeof(Plateau).GetField("codeSecret", BindingFlags.NonPublic | BindingFlags.Instance); + Assert.NotNull(codeSecretInfo); + codeSecretInfo.SetValue(plateau, codeSecret); + + plateau.AjouterCode(codeSecret); + + Assert.Equal(3, codes.Count); + + MethodInfo? SupprimerCodesImpossiblesInfo = typeof(Robot).GetMethod("SupprimerCodesImpossibles", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); + Assert.NotNull(SupprimerCodesImpossiblesInfo); + SupprimerCodesImpossiblesInfo.Invoke(new Robot(), [codes, plateau]); + + Assert.Single(codes); + } + } +}