Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
ens:cvda-2016:tpnote [2016/06/05 13:21] admin Cordier Amelie () [Phase 2. Découverte du code et prise en main des tests] |
ens:cvda-2016:tpnote [2016/07/15 08:30] (Version actuelle) |
||
---|---|---|---|
Ligne 72: | Ligne 72: | ||
==== Phase 1. Prise en main du projet | ==== Phase 1. Prise en main du projet | ||
- | 1. Avec votre navigateur préféré, connectez-vous à Github puis faites un fork du projet **P4Magic**. | + | 1. Avec votre navigateur préféré, connectez-vous à Github puis faites un fork du projet **P4Magic** |
- | + | ||
- | < | + | |
2. Depuis votre IDE préféré, clonez le projet que vous venez de forker. | 2. Depuis votre IDE préféré, clonez le projet que vous venez de forker. | ||
Ligne 80: | Ligne 78: | ||
3. Au besoin, fixez les imports. Vous pourriez être amenés à ajouter JUnit 4.12 et Harmcrest 1.3 dans Test Libraries. Si vous rencontrez des difficultés dans cette phase, n' | 3. Au besoin, fixez les imports. Vous pourriez être amenés à ajouter JUnit 4.12 et Harmcrest 1.3 dans Test Libraries. Si vous rencontrez des difficultés dans cette phase, n' | ||
- | 4. Exécutez le programme pour le tester en mode graphique. La première fenêtre vous permet de choisir le pourcentage de cases qui seront porteuses | + | 4. Exécutez le programme pour le tester en mode graphique. La première fenêtre vous permet de choisir le pourcentage de chances qu'une case soit porteuse |
==== Phase 2. Découverte du code et prise en main des tests ==== | ==== Phase 2. Découverte du code et prise en main des tests ==== | ||
Ligne 88: | Ligne 86: | ||
Avant d' | Avant d' | ||
- | Pour mieux comprendre les explications qui suivent, n' | + | Pour mieux comprendre les explications qui suivent, n' |
Le projet est implémenté en respectant l' | Le projet est implémenté en respectant l' | ||
- | |||
- | < | ||
Dans le package **controller**, | Dans le package **controller**, | ||
Ligne 115: | Ligne 111: | ||
==== Phase 3. Implémentation de votre premier effet ==== | ==== Phase 3. Implémentation de votre premier effet ==== | ||
+ | Dans la version initiale du projet cloné, un seul effet est implémenté et testé. Il s'agit de l' | ||
- | Dans la version initiale du projet cloné, un | + | 1. Commencez par exécuter les tests contenus dans la classe |
- | seul effet est implémenté et testé. Il s'agit de l'effet | + | |
- | 'ChangeColorEffect'. Dans cette partie, | + | |
- | second effet. | + | |
- | 1. Commencez par exécuter les tests contenus dans la classe | + | <WRAP center round help 60%> |
- | ' | + | **Q1 :** dans votre compte-rendu, |
- | de vos tests fonctionne bien. | + | </ |
- | Q1 : dans votre compte-rendu, | + | 2. Récupérez le code de test pour la classe |
- | de JUnit qui s'affiche dans l'onglet "Test Results" | + | |
- | 2. Récupérez | + | <file java DisappearEffectTest.java> |
- | ci-dessous. | + | package model; |
+ | /** | ||
+ | * MagicP4 | ||
+ | * IUT Lyon 1 - 2016 | ||
+ | */ | ||
+ | |||
+ | |||
+ | import org.junit.After; | ||
+ | import org.junit.AfterClass; | ||
+ | import org.junit.Before; | ||
+ | import org.junit.BeforeClass; | ||
+ | import org.junit.Test; | ||
+ | import static org.junit.Assert.*; | ||
+ | |||
+ | /** | ||
+ | * Classe de tests de l' | ||
+ | * Principe de l' | ||
+ | * une case portant l' | ||
+ | * l' | ||
+ | * et le tour de jeu change | ||
+ | * | ||
+ | * @author acordier | ||
+ | */ | ||
+ | public class DisappearEffectTest { | ||
+ | |||
+ | static Game aGame; | ||
+ | |||
+ | public DisappearEffectTest() { | ||
+ | } | ||
+ | |||
+ | @BeforeClass | ||
+ | public static void setUpClass() { | ||
+ | |||
+ | } | ||
+ | |||
+ | @AfterClass | ||
+ | public static void tearDownClass() { | ||
+ | } | ||
+ | |||
+ | @Before | ||
+ | public void setUp() { | ||
+ | |||
+ | // Création d'un jeu vide | ||
+ | aGame = new Game(); | ||
+ | Board b = new Board(10, 10); | ||
+ | aGame.setBoard(b); | ||
+ | |||
+ | } | ||
+ | |||
+ | @After | ||
+ | public void tearDown() { | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test du bon fonctionnement du jeu, en dehors de l' | ||
+ | * attendus après le coup : - un pion de plus sur le plateau - le tour de | ||
+ | * jeu est passé - l' | ||
+ | */ | ||
+ | @Test | ||
+ | public void testDisappearEffectNormalGame() { | ||
+ | |||
+ | // On pré-remplit le plateau | ||
+ | Utils.simulateAGame(aGame); | ||
+ | |||
+ | // Effet fixé sur une case (qui n'est pas encore remplie) | ||
+ | int height = aGame.getBoard().getHeight(); | ||
+ | // height-3 correspond à la première case vide dans la colonne O, vu que l'on a déjà joué deux coups dans cette colonne | ||
+ | aGame.getBoard().getTileIJ(height - 3, 0).setEffect(new | ||
+ | |||
+ | // Récupération de l'ID du joueur avant que le coup soit joué | ||
+ | int id_player = aGame.getCurrentPlayer().getId(); | ||
+ | |||
+ | // Récupération du nombre de pions présents | ||
+ | int nb_tokens_before = aGame.getBoard().getTotalTilesCount(); | ||
+ | |||
+ | // Coup joué sur une case ne contenant pas l' | ||
+ | aGame.playMove(1); | ||
+ | |||
+ | // Récupération du nombre de pions après le coup | ||
+ | int nb_tokens_after = aGame.getBoard().getTotalTilesCount(); | ||
+ | |||
+ | // Vérifications : | ||
+ | // - l' | ||
+ | // - le tour de jeu a bien changé | ||
+ | // - il y a bien un pion de plus sur le plateau | ||
+ | assertTrue(" | ||
+ | assertTrue(aGame.getCurrentPlayer().getId() != id_player); | ||
+ | assertEquals(nb_tokens_before + 1, nb_tokens_after); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test de DisappearEffect sur grille vide | ||
+ | * Vérification de l' | ||
+ | * tuile après application de l' | ||
+ | * Résultats attendus : la case doit être | ||
+ | * vide, le tour de jeu doit être passé | ||
+ | */ | ||
+ | @Test | ||
+ | public void testDisappearEffectEmptyGame() { | ||
+ | |||
+ | // Effet fixé sur une case | ||
+ | int height = aGame.getBoard().getHeight(); | ||
+ | aGame.getBoard().getTileIJ(height - 1, 0).setEffect(new DisappearEffect()); | ||
+ | |||
+ | // Récupération de l'ID du joueur courant | ||
+ | int id_player = aGame.getCurrentPlayer().getId(); | ||
+ | |||
+ | // Coup joué sur la case de l' | ||
+ | aGame.playMove(0); | ||
+ | |||
+ | // Vérifications : | ||
+ | // - la case est bien vide après | ||
+ | // - l' | ||
+ | // - le tour de jeu a bien changé | ||
+ | assertEquals(-1, | ||
+ | assertTrue(" | ||
+ | assertTrue(aGame.getCurrentPlayer().getId() != id_player); | ||
+ | |||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test de DisappearEffect sur grille vide | ||
+ | * Vérification du nombre de jetons | ||
+ | * après jeu | ||
+ | * Résultat attendu : le nombre doit être égal à 0 | ||
+ | */ | ||
+ | @Test | ||
+ | public void testDisappearEffectEmptyGameWithTilesNumber() { | ||
+ | |||
+ | // Effet fixé sur une case | ||
+ | int height = aGame.getBoard().getHeight(); | ||
+ | aGame.getBoard().getTileIJ(height - 1, 0).setEffect(new DisappearEffect()); | ||
+ | |||
+ | // Coup joué sur cette case | ||
+ | aGame.playMove(0); | ||
+ | |||
+ | // Vérification que le nombre de jetons au total est égal à 0 | ||
+ | assertEquals(0, | ||
+ | |||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Test de DisappearEffect sur grille pré-remplie | ||
+ | * Vérification de l' | ||
+ | * la tuile après application de l' | ||
+ | * Résultat attendu : la case doit | ||
+ | * être vide, l' | ||
+ | * et le tour doit être passé | ||
+ | */ | ||
+ | @Test | ||
+ | public void testDisappearEffectFilledGame() { | ||
+ | |||
+ | // On pré-remplit le plateau pour les besoins de la simulation | ||
+ | Utils.simulateAGame(aGame); | ||
+ | |||
+ | // Effet fixé sur une case (qui n'est pas encore remplie) | ||
+ | int height = aGame.getBoard().getHeight(); | ||
+ | // height-3 correspond à la première case vide dans la colonne O, vu que l'on a déjà joué deux coups dans cette colonne | ||
+ | aGame.getBoard().getTileIJ(height - 3, 0).setEffect(new DisappearEffect()); | ||
+ | |||
+ | // Récupération de l'ID du joueur avant que le coup soit joué | ||
+ | int id_player = aGame.getCurrentPlayer().getId(); | ||
+ | |||
+ | // Coup joué sur cette case | ||
+ | aGame.playMove(0); | ||
+ | |||
+ | // Vérifications : | ||
+ | // - la case est bien vide après | ||
+ | // - l' | ||
+ | // - le tour de jeu a bien changé | ||
+ | assertEquals(-1, | ||
+ | assertTrue(" | ||
+ | assertTrue(aGame.getCurrentPlayer().getId() != id_player); | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | </ | ||
3. Exécutez ce code de test. | 3. Exécutez ce code de test. | ||
- | Q2 : dans votre compte-rendu, | + | <WRAP center round help 60%> |
- | de JUnit qui s' | + | **Q2 :** dans votre compte-rendu, |
+ | </ | ||
- | 4. Implémentez le code nécessaire dans la classe ' | + | 4. Implémentez le code nécessaire dans la classe |
- | sorte à ce que tous les tests passent. | + | |
- | Q3 : dans votre compte-rendu, | + | <WRAP center round help 60%> |
- | de JUnit qui s' | + | **Q3 :** dans votre compte-rendu, |
- | rapport, un point pour le code) | + | </ |
- | Q4 : faites un commit de votre projet après avoir bien veillé à | + | <WRAP center round help 60%> |
- | sauvegarder tous vos fichiers. (1 point) | + | **Q4 :** faites un commit de votre projet après avoir bien veillé à sauvegarder tous vos fichiers. (1 point) |
- | + | </ | |
- | Attention : si vous voulez que vos effets soient actifs dans le jeu | + | |
- | en mode graphique, il ne faut pas oublier de mettre à jour la classe | + | |
- | ' | + | |
+ | <note important> | ||
+ | </ | ||
==== Phase 4. Implémentation de votre second effet ==== | ==== Phase 4. Implémentation de votre second effet ==== | ||
- | Vous trouverez ci-dessous une liste d' | + | Vous trouverez ci-dessous une liste d' |
- | partie, vous devez en choisir un, implémenter la classe de test, | + | |
- | implémenter le code correspondant, | + | Liste des effets : |
+ | * Rajouter un pion de la couleur courante dans chaque colonne | ||
+ | * Fait disparaître un certain nombre de pions de façon aléatoire (effet à paramétrer par nombre de pions, nombre de couleurs) | ||
+ | * Changer la couleur de tout le voisinage (pion joué + les 7 pions autour, s'il y en a) | ||
+ | * Fait disparaître la colonne dans laquelle le pion est joué | ||
+ | * Fait disparaître la ligne dans laquelle le pion est joué | ||
+ | * Fait exploser le voisinage du pion joué (et gérer les effets en cascade) | ||
+ | * Fait apparaître de manière aléatoire un autre pion sur le jeu | ||
- | Q5 : effectuez un commit de votre code de test et de votre code | ||
- | d' | ||
- | pour le code) | ||
- | Q6 : exécutez en une seule fois l'ensemble des tests présents dans le | + | <WRAP center round help 60%> |
- | projet. Dans le rapport, indiquez Q6 et copiez-collez la sortie de | + | **Q5 :** effectuez un commit de votre code de test et de votre code d'effet (1 point pour le commit + 1 point pour le rapport |
- | JUnit. | + | pour le code) |
+ | </ | ||
+ | <WRAP center round help 60%> | ||
+ | **Q6 :** exécutez en une seule fois l' | ||
+ | </ | ||
- | TODO Faire la liste des effets implémentables | ||
==== Phase 5. À votre tour d' | ==== Phase 5. À votre tour d' | ||
- | Il reste beaucoup de choses à faire pour améliorer 'Magic P4' | + | Il reste beaucoup de choses à faire pour améliorer 'Magic P4'. Dans cette partie, vous pouvez choisir de traiter les questions |
+ | libres (**QL**) que vous voulez. Plus vous traitez de questions, plus vous aurez de points. | ||
- | Q7 : lister les questions que vous traitez | + | Par ailleurs, si votre code est suffisamment bien fait, il sera intégré au projet principal et sera donc disponible pour les futurs |
- | Dans cette partie, vous pouvez choisir de traiter | + | étudiants qui feront ce TP. **Vous deviendrez donc contributeurs officiels |
- | libres (QL) que vous voulez. Plus vous traitez | + | |
- | points. | + | |
- | Par ailleurs, si votre code est suffisamment bien fait, il sera | + | <WRAP center round help 60%> |
- | intégré au projet principal | + | **Q7 :** Dans votre rapport, écrivez Q7 et inscrivez la liste des questions que vous avez traité |
- | étudiants qui feront ce TP. Vous deviendrez donc contributeurs | + | </ |
- | officiels de P4Magic. | + | |
- | QL1 : implémenter un autre effet, et écrire la classe de tests | + | **QL1 :** implémenter un autre effet, et écrire la classe de tests correspondante. Vous pouvez choisir d' |
- | correspondante. Vous pouvez choisir d' | + | |
- | précédente, | + | |
- | veillez à bien expliquer le comportement attendu de votre effet. | + | |
- | (1 point) | + | |
- | QL2 : écrire les tests de la méthode win. La classe Game contient une | + | **QL2 :** écrire les tests de la méthode |
- | méthode ' | + | |
- | une suite gagnante. Dans cette question, il s'agit d' | + | |
- | qui permettent de s' | + | |
- | QL3 : couverture de code, couverture des tests. Ici, il s'agit de | + | **QL3 :** couverture de code, couverture des tests. Ici, il s'agit de faire une analyse du code existant et de déterminer d'une part s'il y a du code mort, et d' |
- | faire une analyse du code existant et de déterminer d'une part s'il y | + | |
- | a du code mort, et d' | + | |
- | il faut faire des recommendations | + | |
- | c' | + | |
- | définies. Vous répondrez à cette question dans votre rapport. (2 points) | + | |
- | QL4 : réfléchir à une ré-organisation du code qui permettrait de | + | **QL4 :** réfléchir à une ré-organisation du code qui permettrait de faire un P4Magic à plus de deux joueurs. Ici, il s'agit de réfléchir à tout ce qu'il faudrait modifier pour que l'on puisse jouer au P4Magic |
- | faire un P4Magic à plus de deux joueurs. Ici, il s'agit de réfléchir à | + | |
- | tout ce qu'il faudrait modifier pour que l'on puisse jouer au P4 Magic | + | |
- | à plus de deux joueurs. Vous rapporterez le résultat de vos réflexions | + | |
- | dans votre rapport, à moins que vous ne préfériez implémenter | + | |
- | directement votre solution ? (2 points) | + | |
- | QL5 : améliorer le paramétrage du jeu. Dans cette question, il s'agit | + | ** QL5 :** améliorer le paramétrage du jeu. Dans cette question, il s'agit d' |
- | d' | + | |
- | lancement. Les paramètres attendus sont : | + | |
* Taille de la grille | * Taille de la grille | ||
* Couleurs des joueurs | * Couleurs des joueurs | ||
Ligne 217: | Ligne 373: | ||
Vous pouvez ajouter d' | Vous pouvez ajouter d' | ||
- | QL6 : réaliser la partie IHM pour la QL5. | + | **QL6 :** réaliser la partie IHM pour la QL5. |
- | + | ||
- | QL7 : durée de vie des effets. Dans la version actuelle, les effets | + | |
- | sont actifs en permanence, ce qui peut poser problème dans certaines | + | |
- | configuration. Votre mission : modifier l' | + | |
- | ce que l'on puisse choisir, pour chaque effet, s'il est actif en | + | |
- | permanence, ou bien s'il disparaît de la case après avoir été activé | + | |
- | un certain nombre de fois. (3 points) | + | |
- | + | ||
- | QL8 : tester les méthodes de comptage de tuiles. | + | |
- | + | ||
- | QL9 : gérer les cases mortes. | + | |
+ | **QL7 :** durée de vie des effets. Dans la version actuelle, les effets sont actifs en permanence, ce qui peut poser problème dans certaines configuration. Votre mission : modifier l' | ||
+ | **QL8 :** tester les méthodes de comptage de tuiles. La classe '' | ||
+ | **QL9 :** gérer les cases mortes. Imaginez une façon de gérer des cases mortes, c' | ||
==== Phase 6. Rendu du TP ==== | ==== Phase 6. Rendu du TP ==== | ||
- | **Q8 :** vérifiez que votre code est bien commenté, bien documenté et bien formaté, puis générez la javadoc totale. (2 points) | + | <WRAP center round help 60%> |
+ | **Q8 :** vérifiez que votre code est bien commenté, bien documenté et bien formaté, puis générez la javadoc totale. Ajoutez à votre rapport un screenshot qui prouve que la javadoc a bien été générée. (2 points) | ||
+ | </ | ||
+ | <WRAP center round help 60%> | ||
**Q9 :** générez le diagramme UML du projet global, mettez-le en forme, et intégrez-le à votre rapport. (1 point) | **Q9 :** générez le diagramme UML du projet global, mettez-le en forme, et intégrez-le à votre rapport. (1 point) | ||
+ | </ | ||
- | **Q10 :** Effectuez un dernier commit de votre projet. Assurez-vous de bien commiter la javadoc également. Ensuite, n' | + | <WRAP center round help 60%> |
+ | **Q10 :** Effectuez un dernier commit de votre projet. Ensuite, n' | ||
+ | </ | ||
+ | <WRAP center round help 60%> | ||
**Q11 :** Depuis Github, effectuez un pull request sur le projet original. (1 point) | **Q11 :** Depuis Github, effectuez un pull request sur le projet original. (1 point) | ||
- | + | </ | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||