Compare commits

..

4 Commits

Author SHA1 Message Date
684ca4a8a7 update README 2024-06-29 01:01:55 +02:00
b6314f7fd8 Final commit 2024-06-29 00:47:26 +02:00
da0baa0a2a commite 2024-06-29 00:09:48 +02:00
07a187dc5a BDD 2024-06-28 01:09:00 +02:00
12 changed files with 171 additions and 57 deletions

View File

@@ -1,3 +1,12 @@
# Notes au correcteur :
Ce dépot contient le projet Java avec des tests unitaires et tests Cucumber.
Nous avons chacun mis au point notre propre méthode de résolution du problème. Les deux méthodes sont exécutées à la suite et sont distinctivement nommées.
Afin de comparer les performances de nos méthodes, nous avons créé une classe supplémentaire "Etude.java" faisant des tests de plus en plus lourds à nos méthodes pour comparer les temps d'exécution sur différentes tailles d'echiquiers. N'étant pas un ajout initialement prévu, la classe n'est pas proprement intégrée au projet ni testée. Il vous faudra apporter de légères modifications au code en suivant les indications des commentaires si vous voulez l'essayer par vous même.
# Problème des Huit Dames # Problème des Huit Dames
## Préambule ## Préambule

View File

@@ -51,6 +51,11 @@
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version> <version>${maven-surefire-plugin.version}</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>

View File

@@ -21,6 +21,11 @@ public class Chessboard {
currentSize = size; currentSize = size;
} }
public Position[] getQueensPositions(){
Position[] a = new Position[queensPosition.size()];
return queensPosition.toArray(a);
}
public int getTile(int x,int y){ public int getTile(int x,int y){
return gameBoard[x][y]; return gameBoard[x][y];
} }

View File

@@ -86,8 +86,8 @@ class ChessboardTest {
return x >= 0 && x < Chessboard.SIZE && y >= 0 && y < Chessboard.SIZE; return x >= 0 && x < Chessboard.SIZE && y >= 0 && y < Chessboard.SIZE;
} }
// méthode appelée par d'autres tests
void testWinningSolution(Chessboard chessboard) { private void testWinningSolution(Chessboard chessboard) {
assertEquals(Chessboard.SIZE, chessboard.getNumberOfQueen(),"Devrait etre egal a "+Chessboard.SIZE); assertEquals(Chessboard.SIZE, chessboard.getNumberOfQueen(),"Devrait etre egal a "+Chessboard.SIZE);
for(int i = 0; i< Chessboard.SIZE ;i++){ for(int i = 0; i< Chessboard.SIZE ;i++){
for(int j = 0; j< Chessboard.SIZE ;j++){ for(int j = 0; j< Chessboard.SIZE ;j++){

View File

@@ -1,27 +1,142 @@
package fr.iut_fbleau.but3.dev6_2.steps; package fr.iut_fbleau.but3.dev6_2.steps;
import fr.iut_fbleau.but3.dev6_2.*; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import fr.iut_fbleau.but3.dev6_2.Chessboard;
import fr.iut_fbleau.but3.dev6_2.EightQueensSolver;
import fr.iut_fbleau.but3.dev6_2.Position;
import io.cucumber.java.en.Given; import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then; import io.cucumber.java.en.Then;
import io.cucumber.java.en.When; import io.cucumber.java.en.When;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class EightQueensSolverSteps { public class EightQueensSolverSteps {
private EightQueensSolver eightQueensSolver; private EightQueensSolver solver;
@Given("un echiquier") private Position lastRemovedQueen;
public void unEchiquier() {
this.eightQueensSolver = new EightQueensSolver(); @Given("un echiquier vide")
public void unEchiquierVide() {
this.solver = new EightQueensSolver();
this.solver.setChessboard(new Chessboard());
}
@Given("un echiquier avec {int} reines valides")
public void unEchiquierAvecXReinesValides(int nbReines) {
Position[] positions = {new Position(3, 0), new Position(1, 1), new Position(6, 2), new Position(2, 3), new Position(5, 4), new Position(7, 5), new Position(4, 6), new Position(0, 7)};
this.solver = new EightQueensSolver();
this.solver.setChessboard(new Chessboard());
nbReines = (nbReines > Chessboard.SIZE)
? Chessboard.SIZE
: nbReines;
for(int i=0 ; i<nbReines ; i++){
Position position = positions[i];
this.solver.getChessboard().placeQueen(position.x(), position.y());
}
} }
@When("placer une reine en {int}, {int}") @When("placer une reine en {int}, {int}")
public void placerUnReineEn(int x, int y) { public void placerUneReineEn(int x, int y) {
this.eightQueensSolver.getChessboard().placeQueen(x,y); this.solver.getChessboard().placeQueen(x, y);
} }
@Then("{int} reine sur l'échiquier") @When("retirer une reine en {int}, {int}")
public void reineSurLEchiquier(int queensOnChessboard) { public void retirerUneReineEn(int x, int y) {
assertEquals(1, this.eightQueensSolver.getChessboard().getNumberOfQueen()); this.solver.getChessboard().removeQueen(x, y);
lastRemovedQueen = new Position(x, y);
} }
@Then("{int} reine\\(s) sur l'échiquier")
public void reineSurLEchiquier(int queensOnChessboard) {
assertEquals(queensOnChessboard, this.solver.getChessboard().getNumberOfQueen());
}
@Then("la colonne {int} est capturée")
public void colonneCapturee(int x){
for(int y=0; y<Chessboard.SIZE ; y++){
assertFalse(this.solver.getChessboard().VerifAccessible(x, y), "La case (" + x + ", " + y + ") est accessible mais ne devrait pas l'être.");
}
}
@Then("la ligne {int} est capturée")
public void ligneCapturee(int y){
for(int x=0; x<Chessboard.SIZE ; x++){
assertFalse(this.solver.getChessboard().VerifAccessible(x, y), "La case (" + x + ", " + y + ") est accessible mais ne devrait pas l'être.");
}
}
@Then("Then la diagonnale montante {int}, {int} est capturée")
public void diagonaleAscendanteCapturee(int startX, int startY){
int limit = Math.min(Chessboard.SIZE - startX, Chessboard.SIZE - startY);
for (int i = 0; i < limit; i++) {
int x = startX + i;
int y = startY + i;
assertFalse(this.solver.getChessboard().VerifAccessible(x, y), "La case (" + x + ", " + y + ") est accessible mais ne devrait pas l'être.");
}
}
@Then("Then la diagonnale descendante {int}, {int} est capturée")
public void diagonaleDescendanteCapturee(int startX, int startY){
int limit = Math.min(Chessboard.SIZE - startX, startY + 1);
for (int i = 0; i < limit; i++) {
int x = startX + i;
int y = startY - i;
assertFalse(this.solver.getChessboard().VerifAccessible(x, y), "La case (" + x + ", " + y + ") est accessible mais ne devrait pas l'être.");
}
}
@Then("la case {int}, {int} est libre")
public void caseReineRetireeEstLibre(int x, int y){
assertTrue(this.solver.getChessboard().VerifAccessible(x, y), "La case (" + x + ", " +y + ") est capturée mais ne devrait pas l'être.");
}
@When("le solveur Sim termine de résoudre le problème")
public void le_solveurSim_termine_de_résoudre_le_problème() {
this.solver.SolverSim(0);
}
@When("le solveur Vic termine de résoudre le problème")
public void le_solveurVic_termine_de_résoudre_le_problème() {
this.solver.SolverVic(0);
}
@Then("toutes les lignes doivent avoir une reine")
public void toutes_les_lignes_doivent_avoir_une_reine() {
for (int row = 0; row < Chessboard.SIZE; row++) {
int queenCount = 0;
for (int col = 0; col < Chessboard.SIZE; col++) {
if (solver.getChessboard().getTile(row, col) == 1) {
queenCount++;
}
}
assertTrue(1 == queenCount, "La ligne " + row + " n'a pas exactement une reine");
}
}
@Then("toutes les colonnes doivent avoir une reine")
public void toutes_les_colonnes_doivent_avoir_une_reine() {
for (int col = 0; col < Chessboard.SIZE; col++) {
int queenCount = 0;
for (int row = 0; row < Chessboard.SIZE; row++) {
if (solver.getChessboard().getTile(row, col) == 1) {
queenCount++;
}
}
assertTrue(1 == queenCount, "La colonne " + col + " n'a pas exactement une reine");
}
}
@Then("aucune reine ne doit être menacée par une autre")
public void aucune_reine_ne_doit_être_menacée_par_une_autre() {
for(Position pos : this.solver.getChessboard().getQueensPositions()){
this.solver.getChessboard().removeQueen(pos.x(), pos.y());
assertTrue(this.solver.getChessboard().VerifAccessible(pos.x(), pos.y()), "La case (" + pos.x() + ", " + pos.y() + ") est capturée mais ne devrait pas l'être.");
this.solver.getChessboard().placeQueen(pos.x(), pos.y());
}
}
} }

View File

@@ -1,24 +0,0 @@
package fr.iut_fbleau.but3.dev6_2.steps;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import fr.iut_fbleau.but3.dev6_2.Chessboard;
class ChessboardTest {
private Chessboard chessboard;
@BeforeEach
public void beforeEach(){
this.chessboard = new Chessboard();
}
@Test
void placeAQueen(){
this.chessboard.placeQueen(0,0);
assertEquals(1, this.chessboard.getNumberOfQueen());
}
}

View File

@@ -4,24 +4,5 @@ Feature: Placer une reine
Scenario: Placer une reine en 0, 0 Scenario: Placer une reine en 0, 0
Given un echiquier vide Given un echiquier vide
When placer une reine en 0, 0 When placer une reine en 0, 0
Then 1 reine sur l'échiquier Then 1 reine(s) sur l'échiquier
Scenario: Placer une reine sur une case libre
Given un echiquier avec une reine sur la ligne 0
When placer une reine sur la ligne 1
Then la reine est posée sur une case libre
And 2 reines sur l'échiquier
Feature: Résoudre le problème
Scenario: Résoudre le problème à l'aide du solveur SolverVic
Given un echiquier vide
When le solveur termine de résoudre le problème
Then la solution doit être valide
And le nombre de reines doit être égal à 8
Scenario: Résoudre le problème à l'aide du solveur SolverSim
Given un echiquier vide
When le solveur termine de résoudre le problème
Then la solution doit être valide
And le nombre de reines doit être égal à 8

View File

@@ -0,0 +1,8 @@
Feature: Retirer une reine
Retirer une reine de l'échiquier
Scenario: Retirer une reine en 0, 0
Given un echiquier avec 5 reines valides
When retirer une reine en 2, 3
Then 4 reine(s) sur l'échiquier
And la case 2, 3 est libre

View File

@@ -0,0 +1,15 @@
Feature: Résoudre le problème
Scenario: Vérification de la résolution du problème par le solveur de Simon
Given un echiquier vide
When le solveur Sim termine de résoudre le problème
Then aucune reine ne doit être menacée par une autre
And toutes les lignes doivent avoir une reine
And toutes les colonnes doivent avoir une reine
Scenario: Vérification de la résolution du problème par le solveur de Victor
Given un echiquier vide
When le solveur Vic termine de résoudre le problème
Then aucune reine ne doit être menacée par une autre
And toutes les lignes doivent avoir une reine
And toutes les colonnes doivent avoir une reine