Skip to content

Commit

Permalink
Test GridMaster
Browse files Browse the repository at this point in the history
  • Loading branch information
Lob2018 committed Feb 1, 2025
1 parent 2ee8cce commit 01090d3
Show file tree
Hide file tree
Showing 3 changed files with 169 additions and 33 deletions.
7 changes: 0 additions & 7 deletions src/main/java/fr/softsf/sudokufx/interfaces/IGridMaster.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,4 @@ public interface IGridMaster {
* @return 0 si la grille est générée avec succès et cohérente, sinon -1.
**/
int resoudreLaGrille(final int[] grille);

/**
* Affiche la grille Sudoku sous forme de texte dans la console.
*
* @param grille Grille Sudoku à afficher.
*/
void afficherLaGrilleDansLaConsole(final int[] grille);
}
39 changes: 13 additions & 26 deletions src/main/java/fr/softsf/sudokufx/utils/sudoku/GridMaster.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,23 +40,11 @@ public GridMaster() {
* @param grilleResolue La grille résolue à partir de laquelle les cases seront cachées.
* @param grilleAResoudre La grille à résoudre, avec ses cases cachées (valeur à zéro).
* @return La difficulté dans la grille à résoudre (somme des possibilités restantes).
* Retourne -1 si le niveau est invalide.
* Retourne le niveau facile pour toutes autres valeurs que 2 ou 3.
*/
private static int genererLaGrilleAResoudre(final int niveau, final int[] grilleResolue, final int[] grilleAResoudre) {
int sommeDesPossibilites;
return switch (niveau) {
case 1 -> {
int nombreDeCasesACacher = nombreAleatoire(facileMinCachees, moyenMinCachees);
do {
// Copier la grilleResolue
System.arraycopy(grilleResolue, 0, grilleAResoudre, 0, NOMBRE_CASES);
// Cacher les cases
cacherLesCases(nombreDeCasesACacher, grilleAResoudre);
// Récupérer la somme des possibilités
sommeDesPossibilites = SommeDesPossibilitesDeLaGrille(getPossibilites(grilleAResoudre));
} while (sommeDesPossibilites > moyenMinDifficulte);
yield sommeDesPossibilites;
}
case 2 -> {
int nombreDeCasesACacher = nombreAleatoire(moyenMinCachees, moyenMaxCachees);
do {
Expand All @@ -82,7 +70,18 @@ private static int genererLaGrilleAResoudre(final int niveau, final int[] grille
} while (sommeDesPossibilites < moyenMaxDifficulte);
yield sommeDesPossibilites;
}
default -> -1;
default -> {
int nombreDeCasesACacher = nombreAleatoire(facileMinCachees, moyenMinCachees);
do {
// Copier la grilleResolue
System.arraycopy(grilleResolue, 0, grilleAResoudre, 0, NOMBRE_CASES);
// Cacher les cases
cacherLesCases(nombreDeCasesACacher, grilleAResoudre);
// Récupérer la somme des possibilités
sommeDesPossibilites = SommeDesPossibilitesDeLaGrille(getPossibilites(grilleAResoudre));
} while (sommeDesPossibilites > moyenMinDifficulte);
yield sommeDesPossibilites;
}
};
}

Expand Down Expand Up @@ -320,17 +319,5 @@ public final int[][] creerLesGrilles(final int niveau) {
return new int[][]{grilleResolue, grilleAResoudre, new int[]{pourcentageDeDifficulte}};
}

@Override
public final void afficherLaGrilleDansLaConsole(final int[] grille) {
for (int y = 0; y < DIMENSION; y++) {
for (int x = 0; x < DIMENSION; x++) {
int valeur = grille[y * DIMENSION + x];
System.out.print(valeur == 0 ? "_" : CHIFFRES.charAt(valeur));
if (x * y < 64) System.out.print(", ");
}
System.out.println();
}
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package fr.softsf.sudokufx.unit.utils.sudoku;

import fr.softsf.sudokufx.interfaces.IGridMaster;
import fr.softsf.sudokufx.utils.sudoku.GridMaster;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

public class GridMasterUTest {
private final IGridMaster iGridMaster = new GridMaster();

@Test
void createUnknownGrids_success() {
int[][] grids = iGridMaster.creerLesGrilles(-1);
assertNotNull(grids);
assertNotNull(grids[0]);
assertNotNull(grids[1]);
assertNotNull(grids[2]);
// The resolved grid
assertEquals(81, grids[0].length);
int countForResolvedGrid = 0;
for (int value : grids[0]) {
if (value == 0) countForResolvedGrid++;
}
assertEquals(0, countForResolvedGrid);
// The grid to be resolved
assertEquals(81, grids[1].length);
int countForToBeResolvedGrid = 0;
for (int value : grids[1]) {
if (value == 0) countForToBeResolvedGrid++;
}
assertNotEquals(0, countForToBeResolvedGrid);
// The difficulty
assertTrue(grids[2][0] >= 0 && grids[2][0] <= 100, "The unknown difficulty is set as easy and must be between 0 and 100");
}

@Test
void createEasyGrids_success() {
int[][] grids = iGridMaster.creerLesGrilles(1);
assertNotNull(grids);
assertNotNull(grids[0]);
assertNotNull(grids[1]);
assertNotNull(grids[2]);
// The resolved grid
assertEquals(81, grids[0].length);
int countForResolvedGrid = 0;
for (int value : grids[0]) {
if (value == 0) countForResolvedGrid++;
}
assertEquals(0, countForResolvedGrid);
// The grid to be resolved
assertEquals(81, grids[1].length);
int countForToBeResolvedGrid = 0;
for (int value : grids[1]) {
if (value == 0) countForToBeResolvedGrid++;
}
assertNotEquals(0, countForToBeResolvedGrid);
// The difficulty
assertTrue(grids[2][0] >= 0 && grids[2][0] <= 100, "The easy difficulty must be between 0 and 100");
}

@Test
void createMediumGrids_success() {
int[][] grids = iGridMaster.creerLesGrilles(2);
assertNotNull(grids);
assertNotNull(grids[0]);
assertNotNull(grids[1]);
assertNotNull(grids[2]);
// The resolved grid
assertEquals(81, grids[0].length);
int countForResolvedGrid = 0;
for (int value : grids[0]) {
if (value == 0) countForResolvedGrid++;
}
assertEquals(0, countForResolvedGrid);
// The grid to be resolved
assertEquals(81, grids[1].length);
int countForToBeResolvedGrid = 0;
for (int value : grids[1]) {
if (value == 0) countForToBeResolvedGrid++;
}
assertNotEquals(0, countForToBeResolvedGrid);
// The difficulty
assertTrue(grids[2][0] >= 0 && grids[2][0] <= 100, "The medium difficulty must be between 0 and 100");
}

@Test
void createHardGrids_success() {
int[][] grids = iGridMaster.creerLesGrilles(3);
assertNotNull(grids);
assertNotNull(grids[0]);
assertNotNull(grids[1]);
assertNotNull(grids[2]);
// The resolved grid
assertEquals(81, grids[0].length);
int countForResolvedGrid = 0;
for (int value : grids[0]) {
if (value == 0) countForResolvedGrid++;
}
assertEquals(0, countForResolvedGrid);
// The grid to be resolved
assertEquals(81, grids[1].length);
int countForToBeResolvedGrid = 0;
for (int value : grids[1]) {
if (value == 0) countForToBeResolvedGrid++;
}
assertNotEquals(0, countForToBeResolvedGrid);
// The difficulty
assertTrue(grids[2][0] >= 0 && grids[2][0] <= 100, "The hard difficulty must be between 0 and 100");
}

@Test
void resolveGrid_success() {
int[] toBeResolvedGrid = new int[]{
5, 3, 4, 6, 7, 8, 9, 0, 2,
6, 7, 2, 1, 9, 5, 3, 4, 8,
1, 9, 8, 3, 4, 2, 5, 6, 7,
8, 5, 9, 7, 6, 1, 4, 2, 3,
4, 2, 6, 8, 5, 3, 0, 0, 1,
7, 1, 3, 9, 2, 4, 8, 5, 6,
9, 6, 1, 5, 3, 7, 2, 8, 4,
2, 8, 7, 4, 1, 9, 6, 3, 5,
3, 4, 5, 2, 8, 6, 0, 0, 9
};
int result = iGridMaster.resoudreLaGrille(toBeResolvedGrid);
assertEquals(0, result);
assertArrayEquals(new int[]{
5, 3, 4, 6, 7, 8, 9, 1, 2,
6, 7, 2, 1, 9, 5, 3, 4, 8,
1, 9, 8, 3, 4, 2, 5, 6, 7,
8, 5, 9, 7, 6, 1, 4, 2, 3,
4, 2, 6, 8, 5, 3, 7, 9, 1,
7, 1, 3, 9, 2, 4, 8, 5, 6,
9, 6, 1, 5, 3, 7, 2, 8, 4,
2, 8, 7, 4, 1, 9, 6, 3, 5,
3, 4, 5, 2, 8, 6, 1, 7, 9
}, toBeResolvedGrid);
}

@Test
void resolveGrid_failed() {
int[] toBeResolvedGrid = new int[]{
5, 3, 4, 6, 7, 8, 9, 0, 2,
6, 7, 2, 1, 9, 5, 3, 4, 8,
1, 9, 8, 3, 4, 2, 5, 6, 7,
8, 5, 9, 7, 6, 1, 4, 2, 3,
4, 2, 6, 8, 5, 3, 0, 0, 1,
7, 1, 3, 9, 2, 4, 8, 5, 6,
9, 6, 1, 5, 3, 7, 2, 8, 4,
2, 8, 7, 4, 1, 9, 6, 3, 5,
3, 4, 5, 2, 8, 6, 0, 8, 9
};
int result = iGridMaster.resoudreLaGrille(toBeResolvedGrid);
assertEquals(-1, result);
}
}

0 comments on commit 01090d3

Please sign in to comment.