diff --git a/.drone.yml b/.drone.yml index 4d835c6..62bd864 100644 --- a/.drone.yml +++ b/.drone.yml @@ -8,44 +8,52 @@ trigger: - push steps: - - name: build-CoreLibrary + - name: build image: mcr.microsoft.com/dotnet/sdk:8.0 commands: - cd Sources - - dotnet restore CoreLibrary/CoreLibrary.csproj - - dotnet build CoreLibrary/CoreLibrary.csproj -c Release --no-restore - - name: build-ConsoleApp - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - cd Sources - - dotnet restore ConsoleApp/ConsoleApp.csproj - - dotnet build ConsoleApp/ConsoleApp.csproj -c Release --no-restore - - name: build-UnitTesting - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - cd Sources - - dotnet restore UnitTesting/UnitTesting.csproj - - dotnet build UnitTesting/UnitTesting.csproj -c Release --no-restore - - name: build-MauiSpark - image: mcr.microsoft.com/dotnet/sdk:8.0 - commands: - - mkdir /usr/lib/android-sdk - - cd /usr/lib/android-sdk - - wget -O commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-9123335_latest.zip - - apt update && apt install unzip default-jdk -y - - unzip commandlinetools.zip - - yes | /usr/lib/android-sdk/cmdline-tools/bin/sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0" --sdk_root=/usr/lib/android-sdk/ - - cd /drone/src/Sources - - dotnet --version - - dotnet workload install maui-android - - dotnet restore MauiSpark/MauiSpark.csproj - - dotnet build MauiSpark/MauiSpark.csproj -c Release --no-restore /p:AndroidSdkDirectory=/usr/lib/android-sdk/ -property:Aapt2ToolPath=/usr/lib/android-sdk/build-tools/34.0.0 + - dotnet restore mastermindSansMaui.sln + - dotnet build mastermindSansMaui.sln -c Release --no-restore + - dotnet publish mastermindSansMaui.sln -c Release --no-restore -o $CI_PROJECT_DIR/build/release + #- name: build-MauiSpark + # image: mcr.microsoft.com/dotnet/sdk:8.0 + # commands: + # - mkdir /usr/lib/android-sdk + # - cd /usr/lib/android-sdk + # - wget -O commandlinetools.zip https://dl.google.com/android/repository/commandlinetools-linux-9123335_latest.zip + # - apt update && apt install unzip default-jdk -y + # - unzip commandlinetools.zip + # - yes | /usr/lib/android-sdk/cmdline-tools/bin/sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0" --sdk_root=/usr/lib/android-sdk/ + # - cd /drone/src/Sources + # - dotnet --version + # - dotnet workload install maui-android + # - dotnet restore MauiSpark/MauiSpark.csproj + # - dotnet build MauiSpark/MauiSpark.csproj -c Release --no-restore /p:AndroidSdkDirectory=/usr/lib/android-sdk/ -property:Aapt2ToolPath=/usr/lib/android-sdk/build-tools/34.0.0 - name: tests image: mcr.microsoft.com/dotnet/sdk:8.0 commands: - cd Sources/ - - dotnet restore UnitTesting/UnitTesting.csproj - - dotnet test UnitTesting/UnitTesting.csproj --no-restore + - dotnet restore mastermindSansMaui.sln + - dotnet test mastermindSansMaui.sln --no-restore + depends_on: [build] + - name: code-inspection + image: hub.codefirst.iut.uca.fr/marc.chevaldonne/codefirst-dronesonarplugin-dotnet8 + secrets: [ SECRET_SONAR_LOGIN ] + environment: + sonar_host: https://codefirst.iut.uca.fr/sonar/ + sonar_token: + from_secret: sonar_token + project_key: celestebarbosa-mastermind + coverage_exclusions: "Tests/**" + commands: + - cd Sources/ + - dotnet restore mastermindSansMaui.sln + - dotnet sonarscanner begin /k:$${project_key} /d:sonar.host.url=$${sonar_host} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions=$${coverage_exclusions} /d:sonar.login=$${sonar_token} + - dotnet build mastermindSansMaui.sln -c Release --no-restore + - dotnet test mastermindSansMaui.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage" + - reportgenerator -reports:"**/coverage.cobertura.xml" -reporttypes:SonarQube -targetdir:"coveragereport" + - dotnet publish mastermindSansMaui.sln -c Release --no-restore -o CI_PROJECT_DIR/build/release + - dotnet sonarscanner end /d:sonar.login=$${sonar_token} - name: generate-and-deploy-docs image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-docdeployer failure: ignore diff --git a/Sources/ConsoleApp/Program.cs b/Sources/ConsoleApp/Program.cs index fc9e32a..475a617 100644 --- a/Sources/ConsoleApp/Program.cs +++ b/Sources/ConsoleApp/Program.cs @@ -10,8 +10,36 @@ ReglesClassiques partie = new ReglesClassiques(); Utils.AfficherTitre(); Utils.AfficherTitre("Joueurs"); -string joueur1 = Utils.SaisirNom(); -string joueur2 = Utils.SaisirNom(); + +string joueur1; +string joueur2; + +while (true) +{ + try + { + joueur1 = Utils.SaisirNom(); + break; + } + catch(UtilsNomJoueurNullException) + { + Console.WriteLine("Nom invalide pour le joueur ! Ressaisir le nom"); + } +} + +while (true) +{ + try + { + joueur2 = Utils.SaisirNom(); + break; + } + catch (UtilsNomJoueurNullException) + { + Console.WriteLine("Nom invalide pour le joueur 2 ! Ressaisir le nom"); + } +} + Utils.AfficherSeparateur(); partie.AjouterJoueur(joueur1); diff --git a/Sources/ConsoleApp/Utils.cs b/Sources/ConsoleApp/Utils.cs index b19d651..76b1885 100644 --- a/Sources/ConsoleApp/Utils.cs +++ b/Sources/ConsoleApp/Utils.cs @@ -62,8 +62,13 @@ namespace ConsoleApp Console.WriteLine(nom); Console.Write(">>> "); nom = Console.ReadLine() ?? nom; + if (nom == "") + { + --nombreJoueurs; + throw new UtilsNomJoueurNullException(); + } Console.WriteLine(); - + return nom; } @@ -218,7 +223,15 @@ namespace ConsoleApp else { Console.Write("\b\b\b \b\b\b\b\b\b\b\b\b\b\b\b"); - code.SupprimerDernierJeton(); + try + { + code.SupprimerDernierJeton(); + } + catch(CodeTableauLesJetonsVideException) + { + Console.WriteLine("Il n'y a pas de jetons! Impossible de supprimer"); + } + } } } diff --git a/Sources/ConsoleApp/UtilsNomJoueurNullException.cs b/Sources/ConsoleApp/UtilsNomJoueurNullException.cs new file mode 100644 index 0000000..20187e7 --- /dev/null +++ b/Sources/ConsoleApp/UtilsNomJoueurNullException.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp +{ + public class UtilsNomJoueurNullException : Exception + { + public UtilsNomJoueurNullException() : base("Le nom du joueur est null") + { } + } +} diff --git a/Sources/CoreLibrary/Code.cs b/Sources/CoreLibrary/Code.cs index 29c865f..d48f42d 100644 --- a/Sources/CoreLibrary/Code.cs +++ b/Sources/CoreLibrary/Code.cs @@ -7,32 +7,43 @@ public int NbJetons { get; private set; } = 0; public Code(int tailleCode) - { + { lesJetons = new Jeton?[tailleCode]; } - public Code(IEnumerable jetons) + public Code(IEnumerable jetons) { - lesJetons = jetons.ToArray(); + lesJetons = new Jeton?[NbJetons]; + foreach(Jeton jeton in jetons) + AjouterJeton(jeton); } public void AjouterJeton(Jeton jeton) - { + { + if (EstComplet()) + throw new CodeTableauLesJetonsCompletException(); + lesJetons[NbJetons++] = jeton; } public void SupprimerDernierJeton() { + if(NbJetons <= 0) + throw new CodeTableauLesJetonsVideException(); + lesJetons[NbJetons--] = null; } public Jeton RecupererJeton(int indice) { + if(indice < 0 || indice > TailleMaximale()) + throw new CodeIndiceHorsDePorteeException(); + Jeton? jeton = lesJetons[indice]; if (!jeton.HasValue) - throw new Exception(); - + throw new CodeJetonNullException(); + return jeton.Value; } @@ -54,6 +65,8 @@ public IEnumerable Comparer(Code autreCode) { // Mon code est le code correct, l'autre code est celui qui teste + if (!autreCode.EstComplet()) + throw new CodeTableauLesJetonsIncompletException(); Indicateur[] indicateurs = []; @@ -100,3 +113,5 @@ } } } + + diff --git a/Sources/CoreLibrary/CodeIndiceHorsDePorteeException.cs b/Sources/CoreLibrary/CodeIndiceHorsDePorteeException.cs new file mode 100644 index 0000000..36c0929 --- /dev/null +++ b/Sources/CoreLibrary/CodeIndiceHorsDePorteeException.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CoreLibrary +{ + public class CodeIndiceHorsDePorteeException : Exception + { + public CodeIndiceHorsDePorteeException() : base("L'indice pointe en dehors du tableau") + { } + } +} diff --git a/Sources/CoreLibrary/CodeJetonNullException.cs b/Sources/CoreLibrary/CodeJetonNullException.cs new file mode 100644 index 0000000..41297ab --- /dev/null +++ b/Sources/CoreLibrary/CodeJetonNullException.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CoreLibrary +{ + public class CodeJetonNullException : Exception + { + public CodeJetonNullException() : base("le jeton est null") + { } + } +} diff --git a/Sources/CoreLibrary/CodeTableauLesJetonsCompletException.cs b/Sources/CoreLibrary/CodeTableauLesJetonsCompletException.cs new file mode 100644 index 0000000..dfc3d44 --- /dev/null +++ b/Sources/CoreLibrary/CodeTableauLesJetonsCompletException.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CoreLibrary +{ + public class CodeTableauLesJetonsCompletException : Exception + { + public CodeTableauLesJetonsCompletException() : base("Le tableau des jetons est plein") + { } + + } +} diff --git a/Sources/CoreLibrary/CodeTableauLesJetonsIncompletException.cs b/Sources/CoreLibrary/CodeTableauLesJetonsIncompletException.cs new file mode 100644 index 0000000..2205f9c --- /dev/null +++ b/Sources/CoreLibrary/CodeTableauLesJetonsIncompletException.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CoreLibrary +{ + public class CodeTableauLesJetonsIncompletException : Exception + { + public CodeTableauLesJetonsIncompletException() : base("Le tableau des jetons est incomplet") + { } + } +} diff --git a/Sources/CoreLibrary/CodeTableauLesJetonsVideException.cs b/Sources/CoreLibrary/CodeTableauLesJetonsVideException.cs new file mode 100644 index 0000000..d9300f8 --- /dev/null +++ b/Sources/CoreLibrary/CodeTableauLesJetonsVideException.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CoreLibrary +{ + public class CodeTableauLesJetonsVideException : Exception + { + public CodeTableauLesJetonsVideException() : base("Le tableau des jetons est vide") + { } + } +} diff --git a/Sources/CoreLibrary/Plateau.cs b/Sources/CoreLibrary/Plateau.cs index 2017fa7..d8b0c16 100644 --- a/Sources/CoreLibrary/Plateau.cs +++ b/Sources/CoreLibrary/Plateau.cs @@ -15,6 +15,16 @@ public Plateau(int tailleCode, int tailleGrille) { + if(tailleCode <= 0) + { + throw new PlateauTailleCodeException(); + } + + if (tailleGrille <= 0) + { + throw new PlateauTailleGrilleException(); + } + codeSecret = new Code(tailleCode); grille = new Code?[tailleGrille]; indicateurs = new IEnumerable[tailleGrille]; @@ -22,11 +32,6 @@ this.tailleCode = tailleCode; GenererCodeAleatoire(); - - foreach (Jeton? jeton in codeSecret.Jetons()) - { - Console.WriteLine(jeton.Value.Couleur); - } } private void GenererCodeAleatoire() @@ -46,6 +51,16 @@ public void AjouterCode(Code code) { + if (code.TailleMaximale() != tailleCode) + { + throw new PlateauTailleCodeException(); + } + + if (!code.EstComplet()) + { + throw new PlateauCodeIncompletException(); + } + indicateurs[Tour - 1] = codeSecret.Comparer(code); grille[Tour - 1] = code; ++Tour; @@ -94,3 +109,4 @@ } } } + diff --git a/Sources/CoreLibrary/PlateauCodeIncompletException.cs b/Sources/CoreLibrary/PlateauCodeIncompletException.cs new file mode 100644 index 0000000..d522cb4 --- /dev/null +++ b/Sources/CoreLibrary/PlateauCodeIncompletException.cs @@ -0,0 +1,8 @@ +namespace CoreLibrary +{ + public class PlateauCodeIncompletException : Exception + { + public PlateauCodeIncompletException() : base("Le code est incomplet") + { } + } +} diff --git a/Sources/CoreLibrary/PlateauTailleCodeException.cs b/Sources/CoreLibrary/PlateauTailleCodeException.cs new file mode 100644 index 0000000..a73ed73 --- /dev/null +++ b/Sources/CoreLibrary/PlateauTailleCodeException.cs @@ -0,0 +1,7 @@ +namespace CoreLibrary +{ + public class PlateauTailleCodeException : Exception + { + public PlateauTailleCodeException() : base("La taille du code doit être positive non nulle.") { } + } +} diff --git a/Sources/CoreLibrary/PlateauTailleCodeIncompleteException.cs b/Sources/CoreLibrary/PlateauTailleCodeIncompleteException.cs new file mode 100644 index 0000000..38133c7 --- /dev/null +++ b/Sources/CoreLibrary/PlateauTailleCodeIncompleteException.cs @@ -0,0 +1,7 @@ +namespace CoreLibrary +{ + public class PlateauTailleCodeIncompleteException : Exception + { + public PlateauTailleCodeIncompleteException() : base("Le code n'est pas remplit au maximum") { } + } +} diff --git a/Sources/CoreLibrary/PlateauTailleGrilleException.cs b/Sources/CoreLibrary/PlateauTailleGrilleException.cs new file mode 100644 index 0000000..1305e65 --- /dev/null +++ b/Sources/CoreLibrary/PlateauTailleGrilleException.cs @@ -0,0 +1,8 @@ +namespace CoreLibrary +{ + public class PlateauTailleGrilleException : Exception + { + public PlateauTailleGrilleException() : base("La taille de la grille doit être égale positive non nulle.") + { } + } +} diff --git a/Sources/CoreLibrary/ReglesClassiques.cs b/Sources/CoreLibrary/ReglesClassiques.cs index 632c259..a7ac01e 100644 --- a/Sources/CoreLibrary/ReglesClassiques.cs +++ b/Sources/CoreLibrary/ReglesClassiques.cs @@ -10,7 +10,6 @@ public int TourMaximum { get => 12; } public int TailleCodeMaximum { get => 4; } - public int NbJoueurs { get => nbJoueurs; } public int NbJoueursMaximum { get => 2; } @@ -29,7 +28,7 @@ public Joueur JoueurCourant() { if (!joueurCourant.HasValue) - throw new Exception(); + throw new ReglesClassiquesJoueurCourantNull(); return joueurs[joueurCourant.Value]; } @@ -37,7 +36,9 @@ public void PasserLaMain() { if (!joueurCourant.HasValue) - throw new Exception(); + { + throw new ReglesClassiquesJoueurCourantNull(); + } joueurCourant++; if (joueurCourant >= joueurs.Length) diff --git a/Sources/CoreLibrary/ReglesClassiquesJoueurCourantNull.cs b/Sources/CoreLibrary/ReglesClassiquesJoueurCourantNull.cs new file mode 100644 index 0000000..89e6df5 --- /dev/null +++ b/Sources/CoreLibrary/ReglesClassiquesJoueurCourantNull.cs @@ -0,0 +1,8 @@ +namespace CoreLibrary +{ + public class ReglesClassiquesJoueurCourantNull : Exception + { + public ReglesClassiquesJoueurCourantNull() : base("Le joueur courant est null") + { } + } +} diff --git a/Sources/MauiSpark/MauiSpark.csproj b/Sources/MauiSpark/MauiSpark.csproj index 4322eef..9f70617 100644 --- a/Sources/MauiSpark/MauiSpark.csproj +++ b/Sources/MauiSpark/MauiSpark.csproj @@ -1,7 +1,7 @@  - net8.0-android;net8.0-ios;net8.0-maccatalyst + net8.0-android; $(TargetFrameworks);net8.0-windows10.0.19041.0 diff --git a/Sources/mastermindSansMaui.sln b/Sources/mastermindSansMaui.sln new file mode 100644 index 0000000..7e490cc --- /dev/null +++ b/Sources/mastermindSansMaui.sln @@ -0,0 +1,46 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34330.188 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreLibrary", "CoreLibrary\CoreLibrary.csproj", "{341FB405-085D-4C34-B395-64EF0F9B93E0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp", "ConsoleApp\ConsoleApp.csproj", "{97507EBF-3973-4D1C-BE56-2F125B25E74F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTesting", "UnitTesting\UnitTesting.csproj", "{A2182054-C0D1-46D6-BD39-F3F7926CE2DD}" + ProjectSection(ProjectDependencies) = postProject + {341FB405-085D-4C34-B395-64EF0F9B93E0} = {341FB405-085D-4C34-B395-64EF0F9B93E0} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {341FB405-085D-4C34-B395-64EF0F9B93E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {341FB405-085D-4C34-B395-64EF0F9B93E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {341FB405-085D-4C34-B395-64EF0F9B93E0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {341FB405-085D-4C34-B395-64EF0F9B93E0}.Release|Any CPU.Build.0 = Release|Any CPU + {97507EBF-3973-4D1C-BE56-2F125B25E74F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {97507EBF-3973-4D1C-BE56-2F125B25E74F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97507EBF-3973-4D1C-BE56-2F125B25E74F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97507EBF-3973-4D1C-BE56-2F125B25E74F}.Release|Any CPU.Build.0 = Release|Any CPU + {BD22A919-E40E-4791-A6B0-2B8D37BBE834}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD22A919-E40E-4791-A6B0-2B8D37BBE834}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD22A919-E40E-4791-A6B0-2B8D37BBE834}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {BD22A919-E40E-4791-A6B0-2B8D37BBE834}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD22A919-E40E-4791-A6B0-2B8D37BBE834}.Release|Any CPU.Build.0 = Release|Any CPU + {BD22A919-E40E-4791-A6B0-2B8D37BBE834}.Release|Any CPU.Deploy.0 = Release|Any CPU + {A2182054-C0D1-46D6-BD39-F3F7926CE2DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2182054-C0D1-46D6-BD39-F3F7926CE2DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2182054-C0D1-46D6-BD39-F3F7926CE2DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2182054-C0D1-46D6-BD39-F3F7926CE2DD}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B3BD74E0-E5DA-4859-B2B7-E3759C2089EE} + EndGlobalSection +EndGlobal