From b1dde68ec1db8ec7ad037ec0543c2b017eedbf27 Mon Sep 17 00:00:00 2001 From: Morph01 Date: Sun, 5 Jan 2025 11:16:34 +0100 Subject: [PATCH] feat: add constraint management and validation to Sudoku class --- app/src/main/java/sudoku/Grille.java | 4 ++ app/src/main/java/sudoku/Sudoku.java | 22 +++++++++ app/src/test/java/sudoku/AppTest.java | 55 +++++++++++++++++++++++ app/src/test/java/sudoku/TestBloc.java | 8 +++- app/src/test/java/sudoku/TestColonne.java | 7 ++- app/src/test/java/sudoku/TestLigne.java | 7 ++- 6 files changed, 100 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/sudoku/Grille.java b/app/src/main/java/sudoku/Grille.java index 6102976..62c1b2d 100644 --- a/app/src/main/java/sudoku/Grille.java +++ b/app/src/main/java/sudoku/Grille.java @@ -199,6 +199,10 @@ public class Grille { System.out.println(sb.toString()); } + public int getTaille() { + return taille; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/app/src/main/java/sudoku/Sudoku.java b/app/src/main/java/sudoku/Sudoku.java index 40f2fef..eb684a6 100644 --- a/app/src/main/java/sudoku/Sudoku.java +++ b/app/src/main/java/sudoku/Sudoku.java @@ -1,10 +1,32 @@ package sudoku; +import java.util.ArrayList; +import java.util.List; + public class Sudoku { private final Grille grille; + private final List contraintes; public Sudoku(int taille) { this.grille = new Grille(taille); + this.contraintes = new ArrayList<>(); + } + + public void ajouterContrainte(Contrainte contrainte) { + contraintes.add(contrainte); + } + + public void creerBloc(List positions) { + grille.creerBloc(positions); + } + + public boolean estValide(Case c) { + for (Contrainte contrainte : contraintes) { + if (!contrainte.estRespectee(grille, c)) { + return false; + } + } + return true; } public Grille getGrille() { diff --git a/app/src/test/java/sudoku/AppTest.java b/app/src/test/java/sudoku/AppTest.java index 0ce7908..6bc67d3 100644 --- a/app/src/test/java/sudoku/AppTest.java +++ b/app/src/test/java/sudoku/AppTest.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Arrays; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; public class AppTest { @Test @@ -32,4 +33,58 @@ public class AppTest { Symbole.of(9))); assertEquals(expectedSymbols, sudoku.getGrille().getSymbolesPossibles()); } + + @Test + public void testContraintes() { + // 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)))); + + // Add constraints + sudoku.ajouterContrainte(new ContrainteLigne()); + sudoku.ajouterContrainte(new ContrainteColonne()); + sudoku.ajouterContrainte(new ContrainteBloc()); + + // Fill the grid with valid symbols + sudoku.getGrille().setCase(0, 0, Symbole.of(1)); + sudoku.getGrille().setCase(0, 1, Symbole.of(2)); + sudoku.getGrille().setCase(0, 2, Symbole.of(3)); + sudoku.getGrille().setCase(1, 0, Symbole.of(4)); + sudoku.getGrille().setCase(1, 1, Symbole.of(5)); + sudoku.getGrille().setCase(1, 2, Symbole.of(6)); + sudoku.getGrille().setCase(2, 0, Symbole.of(7)); + sudoku.getGrille().setCase(2, 1, Symbole.of(8)); + sudoku.getGrille().setCase(2, 2, Symbole.of(9)); + + // Create square blocks + sudoku.getGrille().creerBlocCarre(); + + System.out.println(sudoku.getGrille().toString()); + + // Verify that the constraints are respected + assertTrue(sudoku.estValide(sudoku.getGrille().getCase(0, 0))); + assertTrue(sudoku.estValide(sudoku.getGrille().getCase(1, 1))); + assertTrue(sudoku.estValide(sudoku.getGrille().getCase(2, 2))); + + // Add a duplicate symbol in the same row + // sudoku.getGrille().setCase(0, 3, Symbole.of(1)); + // assertFalse(sudoku.estValide(sudoku.getGrille().getCase(0, 3))); + + // Add a duplicate symbol in the same column + // sudoku.getGrille().setCase(3, 0, Symbole.of(1)); + // assertFalse(sudoku.estValide(sudoku.getGrille().getCase(3, 0))); + + // Add a duplicate symbol in the same block + // sudoku.getGrille().setCase(1, 1, Symbole.of(1)); + // assertFalse(sudoku.estValide(sudoku.getGrille().getCase(1, 1))); + } } \ No newline at end of file diff --git a/app/src/test/java/sudoku/TestBloc.java b/app/src/test/java/sudoku/TestBloc.java index 72571a4..b6f3910 100644 --- a/app/src/test/java/sudoku/TestBloc.java +++ b/app/src/test/java/sudoku/TestBloc.java @@ -2,6 +2,8 @@ package sudoku; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; + import java.util.ArrayList; import java.util.Arrays; @@ -23,6 +25,9 @@ public class TestBloc { Symbole.of(8), Symbole.of(9)))); + // Add constraints + sudoku.ajouterContrainte(new ContrainteBloc()); + sudoku.getGrille().setCase(0, 0, Symbole.of(1)); sudoku.getGrille().setCase(6, 1, Symbole.of(2)); sudoku.getGrille().setCase(2, 2, Symbole.of(3)); @@ -34,8 +39,9 @@ public class TestBloc { sudoku.getGrille().setCase(4, 8, Symbole.of(9)); //doublon bloc sudoku.getGrille().setCase(1, 1, Symbole.of(1)); + assertFalse(sudoku.estValide(sudoku.getGrille().getCase(1, 1))); - sudoku.getGrille().createSquareBlocs(); + sudoku.getGrille().creerBlocCarre(); System.out.println("Sudoku :"); System.out.println(sudoku.getGrille().toString()); diff --git a/app/src/test/java/sudoku/TestColonne.java b/app/src/test/java/sudoku/TestColonne.java index dfda201..fa6e201 100644 --- a/app/src/test/java/sudoku/TestColonne.java +++ b/app/src/test/java/sudoku/TestColonne.java @@ -2,6 +2,8 @@ package sudoku; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; + import java.util.ArrayList; import java.util.Arrays; @@ -23,6 +25,8 @@ public class TestColonne { Symbole.of(8), Symbole.of(9)))); + sudoku.ajouterContrainte(new ContrainteColonne()); + sudoku.getGrille().setCase(0, 0, Symbole.of(1)); sudoku.getGrille().setCase(6, 1, Symbole.of(2)); sudoku.getGrille().setCase(2, 2, Symbole.of(3)); @@ -34,8 +38,9 @@ public class TestColonne { sudoku.getGrille().setCase(4, 8, Symbole.of(9)); // doublon colonne sudoku.getGrille().setCase(4, 0, Symbole.of(1)); + assertFalse(sudoku.estValide(sudoku.getGrille().getCase(4, 0))); - sudoku.getGrille().createSquareBlocs(); + sudoku.getGrille().creerBlocCarre(); System.out.println("Sudoku :"); System.out.println(sudoku.getGrille().toString()); diff --git a/app/src/test/java/sudoku/TestLigne.java b/app/src/test/java/sudoku/TestLigne.java index 826bd46..6309caf 100644 --- a/app/src/test/java/sudoku/TestLigne.java +++ b/app/src/test/java/sudoku/TestLigne.java @@ -2,6 +2,8 @@ package sudoku; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; + import java.util.ArrayList; import java.util.Arrays; @@ -23,6 +25,8 @@ public class TestLigne { Symbole.of(8), Symbole.of(9)))); + sudoku.ajouterContrainte(new ContrainteLigne()); + sudoku.getGrille().setCase(0, 0, Symbole.of(1)); sudoku.getGrille().setCase(6, 1, Symbole.of(2)); sudoku.getGrille().setCase(2, 2, Symbole.of(3)); @@ -34,8 +38,9 @@ public class TestLigne { sudoku.getGrille().setCase(4, 8, Symbole.of(9)); //doublon ligne sudoku.getGrille().setCase(0, 4, Symbole.of(1)); + assertFalse(sudoku.estValide(sudoku.getGrille().getCase(0, 4))); - sudoku.getGrille().createSquareBlocs(); + sudoku.getGrille().creerBlocCarre(); System.out.println("Sudoku :"); System.out.println(sudoku.getGrille().toString());