From 22e88a899fd6e6538594e22e277d31ac0b8f654c Mon Sep 17 00:00:00 2001 From: Morph01 Date: Sat, 4 Jan 2025 15:56:23 +0000 Subject: [PATCH] Gwendal in main : add test on futur constraints and enhance input symbol method (#1) Co-authored-by: ROGER Reviewed-on: https://git.ale-pri.com/Morph01/Sudoku/pulls/1 --- app/src/main/java/sudoku/App.java | 9 + app/src/main/java/sudoku/Grille.java | 292 +++++++++++---------- app/src/main/java/sudoku/Symbole.java | 20 +- app/src/main/java/sudoku/core/Console.java | 10 +- app/src/test/java/sudoku/AppTest.java | 30 ++- app/src/test/java/sudoku/TestBloc.java | 50 ++++ app/src/test/java/sudoku/TestColonne.java | 50 ++++ app/src/test/java/sudoku/TestLigne.java | 50 ++++ gradle/wrapper/gradle-wrapper.properties | 2 +- 9 files changed, 366 insertions(+), 147 deletions(-) create mode 100644 app/src/test/java/sudoku/TestBloc.java create mode 100644 app/src/test/java/sudoku/TestColonne.java create mode 100644 app/src/test/java/sudoku/TestLigne.java diff --git a/app/src/main/java/sudoku/App.java b/app/src/main/java/sudoku/App.java index e69b858..f0b1a3d 100644 --- a/app/src/main/java/sudoku/App.java +++ b/app/src/main/java/sudoku/App.java @@ -44,5 +44,14 @@ public class App { System.out.println("Symboles possibles :"); sudoku.getGrille().printSymbolesPossibles(); + + //Création d'un second sudoku + System.out.println("Création d'un second SUDOKU"); + + Sudoku sudoku2 = new Sudoku(9); + sudoku2.getGrille().askSetSymbolesPossibles(); + + System.out.println("Symboles possibles :"); + sudoku2.getGrille().printSymbolesPossibles(); } } diff --git a/app/src/main/java/sudoku/Grille.java b/app/src/main/java/sudoku/Grille.java index a309fdc..d8610b3 100644 --- a/app/src/main/java/sudoku/Grille.java +++ b/app/src/main/java/sudoku/Grille.java @@ -11,162 +11,184 @@ public class Grille { private final Case[][] cases; private final ArrayList blocs; private ArrayList symbolesPossibles; - - public Grille(int taille) { - this.taille = taille; - this.cases = new Case[taille][taille]; - this.blocs = new ArrayList<>(); - this.symbolesPossibles = new ArrayList<>(); - - // Initialiser les cases - for (int i = 0; i < taille; i++) { - for (int j = 0; j < taille; j++) { - cases[i][j] = new Case(i, j, null); - } + + public Grille(int taille) { + this.taille = taille; + this.cases = new Case[taille][taille]; + this.blocs = new ArrayList<>(); + this.symbolesPossibles = new ArrayList<>(); + + // Initialiser les cases + for (int i = 0; i < taille; i++) { + for (int j = 0; j < taille; j++) { + cases[i][j] = new Case(i, j, null); } } - - public void setCase(int ligne, int colonne, Symbole symbole) { - try { - if (symbole != null && !symbolesPossibles.contains(symbole)) { - throw new IllegalArgumentException("Symbole non autorisé : " + symbole); - } - cases[ligne][colonne].setSymbole(symbole); - } catch (Exception e) { - Console.errorln(e.getMessage()); + } + + public void setCase(int ligne, int colonne, Symbole symbole) { + try { + if (symbole != null && !symbolesPossibles.contains(symbole)) { + throw new IllegalArgumentException("Symbole non autorisé : " + symbole); } - + cases[ligne][colonne].setSymbole(symbole); + } catch (Exception e) { + Console.errorln(e.getMessage()); } - - public Case getCase(int ligne, int colonne) { - return cases[ligne][colonne]; + + } + + public Case getCase(int ligne, int colonne) { + return cases[ligne][colonne]; + } + + /** + * Crée un bloc à partir des positions spécifiées + * + * Exemple : + * sudoku.getGrille().createBloc(Arrays.asList( + * new int[] { 0, 0 }, + * new int[] { 0, 1 }, + * new int[] { 0, 2 }, + * new int[] { 1, 0 }, + * new int[] { 1, 1 }, + * new int[] { 1, 2 }, + * new int[] { 2, 0 }, + * new int[] { 2, 1 }, + * new int[] { 2, 2 })); + * + * @param positions + * @return + */ + public Bloc createBloc(List positions) { + Bloc bloc = new Bloc(); + for (int[] pos : positions) { + bloc.addCase(cases[pos[0]][pos[1]]); } - - /** - * Crée un bloc à partir des positions spécifiées - - Exemple : - sudoku.getGrille().createBloc(Arrays.asList( - new int[] { 0, 0 }, - new int[] { 0, 1 }, - new int[] { 0, 2 }, - new int[] { 1, 0 }, - new int[] { 1, 1 }, - new int[] { 1, 2 }, - new int[] { 2, 0 }, - new int[] { 2, 1 }, - new int[] { 2, 2 })); - * @param positions - * @return - */ - public Bloc createBloc(List positions) { - Bloc bloc = new Bloc(); - for (int[] pos : positions) { - bloc.addCase(cases[pos[0]][pos[1]]); + blocs.add(bloc); + return bloc; + } + + public void createSquareBlocs() { + try { + int blocSize = (int) Math.sqrt(taille); + if (blocSize * blocSize != taille) { + throw new IllegalArgumentException("La taille de la grille doit être un carré parfait."); } - blocs.add(bloc); - return bloc; - } - - public void createSquareBlocs() { - try { - int blocSize = (int) Math.sqrt(taille); - if (blocSize * blocSize != taille) { - throw new IllegalArgumentException("La taille de la grille doit être un carré parfait."); - } - for (int i = 0; i < taille; i += blocSize) { - for (int j = 0; j < taille; j += blocSize) { - List positions = new ArrayList<>(); - for (int k = 0; k < blocSize; k++) { - for (int l = 0; l < blocSize; l++) { - positions.add(new int[] { i + k, j + l }); - } + for (int i = 0; i < taille; i += blocSize) { + for (int j = 0; j < taille; j += blocSize) { + List positions = new ArrayList<>(); + for (int k = 0; k < blocSize; k++) { + for (int l = 0; l < blocSize; l++) { + positions.add(new int[] { i + k, j + l }); } - createBloc(positions); } + createBloc(positions); } - } catch (IllegalArgumentException e) { - Console.errorln(e.getMessage()); } + } catch (IllegalArgumentException e) { + Console.errorln(e.getMessage()); } - - // TO MOVE TO FUTUR CONSTRAINTS - // public boolean isValid() { - // for (Bloc bloc : blocs) { - // if (!bloc.isValid()) { - // return false; - // } - // } - // return true; - // } - - public void printBlocs() { - for (Bloc bloc : blocs) { - System.out.println(bloc.toString()); - } + } + + // TO MOVE TO FUTUR CONSTRAINTS + // public boolean isValid() { + // for (Bloc bloc : blocs) { + // if (!bloc.isValid()) { + // return false; + // } + // } + // return true; + // } + + public void printBlocs() { + for (Bloc bloc : blocs) { + System.out.println(bloc.toString()); } - - public void askSetSymbolesPossibles() { - try (Scanner scanner = new Scanner(System.in)) { - System.out.println(("Choisissez le type de symboles :")); - System.out.println(("1. Nombres")); - System.out.println(("2. Caractères")); - System.out.println(("3. Texte/Emoji")); - - int choix = 0; - try { - choix = Integer.parseInt(scanner.nextLine()); - } catch (NumberFormatException e) { - Console.errorln("Choix invalide"); - return; + } + + public void askSetSymbolesPossibles() { + Scanner scanner = new Scanner(System.in); + try { + Console.infoln("Choisissez le type de symboles :"); + Console.infoln("1. Nombres"); + Console.infoln("2. Lettres"); + Console.infoln("3. Texte/Emoji"); + + int choix = 0; + try { + choix = Integer.parseInt(scanner.nextLine()); + if (choix < 1 || choix > 3) { + throw new NumberFormatException("Choix invalide"); } - - for (int i = 0; i < taille; i++) { - System.out.println(("Entrez le symbole " + (i + 1) + "/" + taille + " :")); - String input = scanner.nextLine(); - - switch (choix) { - case 1: // Nombres - try { - symbolesPossibles.add(Symbole.of(Integer.parseInt(input))); - } catch (NumberFormatException e) { - Console.errorln("Veuillez entrer un nombre valide"); + } catch (NumberFormatException e) { + Console.errorln("Choix invalide"); + return; + } + + for (int i = 0; i < taille; i++) { + System.out.println(("Entrez le symbole " + (i + 1) + "/" + taille + " :")); + String input = scanner.nextLine(); + + switch (choix) { + case 1: // Nombres + Symbole intTemp = Symbole.of(input); + if (intTemp.isInt()) { + if (symbolesPossibles.contains(intTemp)) { + Console.errorln("Ce symbole existe déjà, veuillez entrer un autre symbole"); i--; - } - break; - - case 2: // Caractères - if (input.length() == 1) { - symbolesPossibles.add(Symbole.of(input.charAt(0))); } else { - Console.errorln("Veuillez entrer un seul caractère"); - i--; + symbolesPossibles.add(intTemp); } - break; - - case 3: // Texte/Emoji - if (!input.isEmpty()) { - symbolesPossibles.add(Symbole.of(input)); + } else { + Console.errorln("Veuillez entrer un nombre valide"); + i--; + } + break; + + case 2: // Lettres + if (input.length() == 1 && Symbole.of(input.charAt(0)).isLetter()) { + Symbole charTemp = Symbole.of(input.charAt(0)); + if (symbolesPossibles.contains(charTemp)) { + Console.errorln("Ce symbole existe déjà, veuillez entrer un autre symbole"); + i--; } else { - Console.errorln("Le symbole ne peut pas être vide"); - i--; + symbolesPossibles.add(charTemp); } - break; - - default: - Console.errorln("Type non supporté"); - return; - } + } else { + Console.errorln("Veuillez entrer une lettre valide"); + i--; + } + break; + + case 3: // Texte/Emoji + Symbole stringTemp = Symbole.of(input); + if (symbolesPossibles.contains(stringTemp)) { + Console.errorln("Ce symbole existe déjà, veuillez entrer un autre symbole"); + i--; + } else { + symbolesPossibles.add(stringTemp); + } + break; + + default: + Console.errorln("Type non supporté"); + return; } } + } catch (Exception e) { + System.out.println("Une erreur est survenue : " + e.getMessage()); + } finally { + scanner.close(); } - - public List getSymbolesPossibles() { - return symbolesPossibles; - } - - public void setSymbolesPossibles(ArrayList symbolesPossibles) { - this.symbolesPossibles = symbolesPossibles; + } + + public List getSymbolesPossibles() { + return symbolesPossibles; + } + + public void setSymbolesPossibles(ArrayList symbolesPossibles) { + this.symbolesPossibles = symbolesPossibles; } public void printSymbolesPossibles() { diff --git a/app/src/main/java/sudoku/Symbole.java b/app/src/main/java/sudoku/Symbole.java index 6be9f85..7dab4c6 100644 --- a/app/src/main/java/sudoku/Symbole.java +++ b/app/src/main/java/sudoku/Symbole.java @@ -20,6 +20,19 @@ public class Symbole { return new Symbole(String.valueOf(c)); } + public boolean isInt() { + try { + Integer.parseInt(valeur); + return true; + } catch (NumberFormatException e) { + return false; + } + } + + public boolean isLetter() { + return valeur.length() == 1 && Character.isLetter(valeur.charAt(0)); + } + @Override public String toString() { return valeur; @@ -27,8 +40,11 @@ public class Symbole { @Override public boolean equals(Object obj) { - if (this == obj) return true; - if (obj == null || getClass() != obj.getClass()) return false; + if (this == obj) + return true; + + if (obj == null || getClass() != obj.getClass()) + return false; Symbole symbole = (Symbole) obj; return valeur.equals(symbole.valeur); } diff --git a/app/src/main/java/sudoku/core/Console.java b/app/src/main/java/sudoku/core/Console.java index 9c12031..ccbff89 100644 --- a/app/src/main/java/sudoku/core/Console.java +++ b/app/src/main/java/sudoku/core/Console.java @@ -11,14 +11,18 @@ public class Console { static final String ANSI_BOLD = "\u001B[1m"; public static void errorln(String message) { - System.err.println(ANSI_RED + ANSI_BOLD + message + ANSI_RESET); + System.err.println(ANSI_RED + ANSI_BOLD + message + ANSI_RESET + "\n"); } public static void successln(String message) { - System.out.println(ANSI_GREEN + ANSI_BOLD + message + ANSI_RESET); + System.out.println(ANSI_GREEN + ANSI_BOLD + message + ANSI_RESET + "\n"); } public static void warnln(String message) { - System.out.println(ANSI_YELLOW + ANSI_BOLD+ message + ANSI_RESET); + System.out.println(ANSI_YELLOW + ANSI_BOLD + message + ANSI_RESET + "\n"); + } + + public static void infoln(String message) { + System.out.println(message + "\n"); } } diff --git a/app/src/test/java/sudoku/AppTest.java b/app/src/test/java/sudoku/AppTest.java index 62d8714..0ce7908 100644 --- a/app/src/test/java/sudoku/AppTest.java +++ b/app/src/test/java/sudoku/AppTest.java @@ -1,17 +1,35 @@ -/* - * This Java source file was generated by the Gradle 'init' task. - */ package sudoku; import org.junit.jupiter.api.Test; +import java.io.ByteArrayInputStream; +import java.util.ArrayList; +import java.util.Arrays; + import static org.junit.jupiter.api.Assertions.assertEquals; public class AppTest { @Test public void testExample() { - System.out.println("DOING TEST"); - assertEquals(2 + 2, 4); - System.out.println("DONE TEST"); + // Simulate user input + String simulatedInput = "1\n1\n2\n3\n4\n5\n6\n7\n8\n9\n"; + System.setIn(new ByteArrayInputStream(simulatedInput.getBytes())); + + // Create a new Sudoku + Sudoku sudoku = new Sudoku(9); + sudoku.getGrille().askSetSymbolesPossibles(); + + // Verify the symbols + ArrayList expectedSymbols = new ArrayList<>(Arrays.asList( + Symbole.of(1), + Symbole.of(2), + Symbole.of(3), + Symbole.of(4), + Symbole.of(5), + Symbole.of(6), + Symbole.of(7), + Symbole.of(8), + Symbole.of(9))); + assertEquals(expectedSymbols, sudoku.getGrille().getSymbolesPossibles()); } } \ No newline at end of file diff --git a/app/src/test/java/sudoku/TestBloc.java b/app/src/test/java/sudoku/TestBloc.java new file mode 100644 index 0000000..72571a4 --- /dev/null +++ b/app/src/test/java/sudoku/TestBloc.java @@ -0,0 +1,50 @@ +package sudoku; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; + +public class TestBloc { + @Test + public void testBloc() { + System.out.println("TEST BLOC : "); + System.out.println(new App().getGreeting()); + // Create a new Sudoku + Sudoku sudoku = new Sudoku(9); + sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList( + Symbole.of(1), + Symbole.of(2), + Symbole.of(3), + Symbole.of(4), + Symbole.of(5), + Symbole.of(6), + Symbole.of(7), + Symbole.of(8), + Symbole.of(9)))); + + sudoku.getGrille().setCase(0, 0, Symbole.of(1)); + sudoku.getGrille().setCase(6, 1, Symbole.of(2)); + sudoku.getGrille().setCase(2, 2, Symbole.of(3)); + sudoku.getGrille().setCase(0, 3, Symbole.of(4)); + sudoku.getGrille().setCase(4, 4, Symbole.of(5)); + sudoku.getGrille().setCase(0, 5, Symbole.of(6)); + sudoku.getGrille().setCase(5, 6, Symbole.of(7)); + sudoku.getGrille().setCase(0, 7, Symbole.of(8)); + sudoku.getGrille().setCase(4, 8, Symbole.of(9)); + //doublon bloc + sudoku.getGrille().setCase(1, 1, Symbole.of(1)); + + sudoku.getGrille().createSquareBlocs(); + + System.out.println("Sudoku :"); + System.out.println(sudoku.getGrille().toString()); + + System.out.println("Blocs :"); + sudoku.getGrille().printBlocs(); + + System.out.println("Symboles possibles :"); + sudoku.getGrille().printSymbolesPossibles(); + System.out.println("FIN TEST BLOC"); + } +} diff --git a/app/src/test/java/sudoku/TestColonne.java b/app/src/test/java/sudoku/TestColonne.java new file mode 100644 index 0000000..dfda201 --- /dev/null +++ b/app/src/test/java/sudoku/TestColonne.java @@ -0,0 +1,50 @@ +package sudoku; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; + +public class TestColonne { + @Test + public void testColonne() { + System.out.println("TEST COL : "); + System.out.println(new App().getGreeting()); + // Create a new Sudoku + Sudoku sudoku = new Sudoku(9); + sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList( + Symbole.of(1), + Symbole.of(2), + Symbole.of(3), + Symbole.of(4), + Symbole.of(5), + Symbole.of(6), + Symbole.of(7), + Symbole.of(8), + Symbole.of(9)))); + + sudoku.getGrille().setCase(0, 0, Symbole.of(1)); + sudoku.getGrille().setCase(6, 1, Symbole.of(2)); + sudoku.getGrille().setCase(2, 2, Symbole.of(3)); + sudoku.getGrille().setCase(0, 3, Symbole.of(4)); + sudoku.getGrille().setCase(4, 4, Symbole.of(5)); + sudoku.getGrille().setCase(0, 5, Symbole.of(6)); + sudoku.getGrille().setCase(5, 6, Symbole.of(7)); + sudoku.getGrille().setCase(0, 7, Symbole.of(8)); + sudoku.getGrille().setCase(4, 8, Symbole.of(9)); + // doublon colonne + sudoku.getGrille().setCase(4, 0, Symbole.of(1)); + + sudoku.getGrille().createSquareBlocs(); + + System.out.println("Sudoku :"); + System.out.println(sudoku.getGrille().toString()); + + System.out.println("Blocs :"); + sudoku.getGrille().printBlocs(); + + System.out.println("Symboles possibles :"); + sudoku.getGrille().printSymbolesPossibles(); + System.out.println("FIN TEST COL"); + } +} diff --git a/app/src/test/java/sudoku/TestLigne.java b/app/src/test/java/sudoku/TestLigne.java new file mode 100644 index 0000000..826bd46 --- /dev/null +++ b/app/src/test/java/sudoku/TestLigne.java @@ -0,0 +1,50 @@ +package sudoku; + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; + +public class TestLigne { + @Test + public void testLigne() { + System.out.println("TEST LIGNE : "); + System.out.println(new App().getGreeting()); + // Create a new Sudoku + Sudoku sudoku = new Sudoku(9); + sudoku.getGrille().setSymbolesPossibles(new ArrayList<>(Arrays.asList( + Symbole.of(1), + Symbole.of(2), + Symbole.of(3), + Symbole.of(4), + Symbole.of(5), + Symbole.of(6), + Symbole.of(7), + Symbole.of(8), + Symbole.of(9)))); + + sudoku.getGrille().setCase(0, 0, Symbole.of(1)); + sudoku.getGrille().setCase(6, 1, Symbole.of(2)); + sudoku.getGrille().setCase(2, 2, Symbole.of(3)); + sudoku.getGrille().setCase(0, 3, Symbole.of(4)); + sudoku.getGrille().setCase(4, 4, Symbole.of(5)); + sudoku.getGrille().setCase(0, 5, Symbole.of(6)); + sudoku.getGrille().setCase(5, 6, Symbole.of(7)); + sudoku.getGrille().setCase(0, 7, Symbole.of(8)); + sudoku.getGrille().setCase(4, 8, Symbole.of(9)); + //doublon ligne + sudoku.getGrille().setCase(0, 4, Symbole.of(1)); + + sudoku.getGrille().createSquareBlocs(); + + System.out.println("Sudoku :"); + System.out.println(sudoku.getGrille().toString()); + + System.out.println("Blocs :"); + sudoku.getGrille().printBlocs(); + + System.out.println("Symboles possibles :"); + sudoku.getGrille().printSymbolesPossibles(); + System.out.println("FIN TEST LIGNE"); + } +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bdc9a83..c30b486 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists