Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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 14:39]
admin Cordier Amelie () [Phase 4. Implémentation de votre second effet]
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** qui se trouve à l'adresse suivante : https://github.com/ameliecordier/P4Magic-G4.git.  Si vous n'avez pas de compte GitHub, vous pouvez cloner directement le projet, mais vous ne pourrez pas faire la dernière question du TP. 
- +
-<note>TODO URL GitHub</note>+
  
 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'hésitez pas à demander.  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'hésitez pas à demander. 
  
-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 d'un effet. Ensuite, vous lancez la partie. Vous observerez que vous êtes en mode "debug" : les cases aux bordures vertes sont les cases sur lesquelles un effet (on ne sait pas lequel) s'applique. Les autres cases sont normales. Si vous arrivez à une configuration gagnante, le jeu vous le dira. Vous pouvez jouer un peu avec l'interface, mais ne perdez pas trop de temps !+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 d'un effet. Ensuite, vous lancez la partie. Vous observerez que vous êtes en mode "debug" : les cases aux bordures vertes sont les cases sur lesquelles un effet (on ne sait pas lequel) s'applique. Les autres cases sont normales. Si vous arrivez à une configuration gagnante, le jeu vous le dira. Vous pouvez jouer un peu avec l'interface, mais ne perdez pas trop de temps !
  
 ==== 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'aller plus loin, vous devez comprendre comment fonctionne le code. Rassurez-vous, vous n'avez pas besoin de maîtriser tous les détails pour réaliser le TP. Avant d'aller plus loin, vous devez comprendre comment fonctionne le code. Rassurez-vous, vous n'avez pas besoin de maîtriser tous les détails pour réaliser le TP.
  
-Pour mieux comprendre les explications qui suivent, n'hésitez pas à consulter le diagramme de classes disponible ci-dessous.  +Pour mieux comprendre les explications qui suivent, n'hésitez pas à consulter le diagramme de classes disponible ici : {{:ens:cvda-2016:projetargouml.zip|diagramme UML}}.  
  
 Le projet est implémenté en respectant l'architecture MVC. Il contient 4 packages : ''model'', ''view'', ''controller'' (pour MVC) et un package contenant juste la classe principale qui permet de lancer le jeu. L'interface est réalisée en Swing. Le projet est accompagné de tests unitaires, stockés dans un répertorie séparé. Le projet est implémenté en respectant l'architecture MVC. Il contient 4 packages : ''model'', ''view'', ''controller'' (pour MVC) et un package contenant juste la classe principale qui permet de lancer le jeu. L'interface est réalisée en Swing. Le projet est accompagné de tests unitaires, stockés dans un répertorie séparé.
- 
-<note>TODO Diagramme UML </note> 
  
 Dans le package **controller**, le ''GameController'' assure la communication entre le modèle (qui contient la logique applicative du jeu, et la vue (qui contient la partie interface). Dans le package **controller**, le ''GameController'' assure la communication entre le modèle (qui contient la logique applicative du jeu, et la vue (qui contient la partie interface).
Ligne 120: Ligne 116:
  
 <WRAP center round help 60%> <WRAP center round help 60%>
-**Q1 :** dans votre compte-rendu, écrivez Q1 puis copiez-collez la sortie de JUnit qui s'affiche dans l'onglet "Test Results". (1 point)+**Q1 :** dans votre compte-rendu, écrivez Q1 puis faites une capture d'écran (lisible) de la sortie de JUnit qui s'affiche dans l'onglet "Test Results". (1 point)
 </WRAP> </WRAP>
  
 2. Récupérez le code de test pour la classe ''DisappearEffect'' ci-dessous.  2. Récupérez le code de test pour la classe ''DisappearEffect'' ci-dessous. 
  
-<note>Mettre le code de test ici</note>+<file java DisappearEffectTest.java> 
 +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'effet Disappear  
 + * Principe de l'effet : un pion joué sur 
 + * une case portant l'effet Disappear disparaît immédiatement. Conséquences : 
 + * l'état du jeu n'est pas modifié, le pion joué n'apparaît pas sur la grille, 
 + * 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'effet Résultats 
 +     * attendus après le coup : - un pion de plus sur le plateau - le tour de 
 +     * jeu est passé - l'effet a bien été appliqué 
 +     */ 
 +    @Test 
 +    public void testDisappearEffectNormalGame() { 
 + 
 +        // 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(); 
 + 
 +        // 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'effet  
 +        aGame.playMove(1); 
 + 
 +        // Récupération du nombre de pions après le coup  
 +        int nb_tokens_after = aGame.getBoard().getTotalTilesCount(); 
 + 
 +        // Vérifications : 
 +        // - l'effet est bien appliqué sur la case  
 +        // - le tour de jeu a bien changé 
 +        // - il y a bien un pion de plus sur le plateau 
 +        assertTrue("Doit être d'effet disappear", aGame.getBoard().getTileIJ(height - 3, 0).getEffect() instanceof DisappearEffect); 
 +        assertTrue(aGame.getCurrentPlayer().getId() != id_player); 
 +        assertEquals(nb_tokens_before + 1, nb_tokens_after); 
 +    } 
 + 
 +    /** 
 +     * Test de DisappearEffect sur grille vide  
 +     * Vérification de l'état de la 
 +     * tuile après application de l'effet  
 +     * 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'effet  
 +        aGame.playMove(0); 
 + 
 +        // Vérifications : 
 +        // - la case est bien vide après 
 +        // - l'effet est bien appliqué sur la case  
 +        // - le tour de jeu a bien changé 
 +        assertEquals(-1, aGame.getBoard().getTileIJ(height - 1, 0).getStatus()); 
 +        assertTrue("Doit être d'effet disappear", aGame.getBoard().getTileIJ(height - 1, 0).getEffect() instanceof DisappearEffect); 
 +        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, aGame.getBoard().getTotalTilesCount()); 
 + 
 +    } 
 + 
 +    /** 
 +     * Test de DisappearEffect sur grille pré-remplie  
 +     * Vérification de l'état de 
 +     * la tuile après application de l'effet  
 +     * Résultat attendu : la case doit 
 +     * être vide, l'effet doit être sur la case  
 +     * 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'effet est bien appliqué sur la case  
 +        // - le tour de jeu a bien changé 
 +        assertEquals(-1, aGame.getBoard().getTileIJ(height - 3, 0).getStatus()); 
 +        assertTrue("Doit être d'effet disappear", aGame.getBoard().getTileIJ(height - 3, 0).getEffect() instanceof DisappearEffect); 
 +        assertTrue(aGame.getCurrentPlayer().getId() != id_player); 
 + 
 +    } 
 + 
 +
 + 
 +</file>
  
 3. Exécutez ce code de test. 3. Exécutez ce code de test.
    
 <WRAP center round help 60%> <WRAP center round help 60%>
-**Q2 :** dans votre compte-rendu, écrivez Q2 puis copiez-collez la sortie de JUnit qui s'affiche dans l'onglet "Test Results". (1 point)+**Q2 :** dans votre compte-rendu, écrivez Q2 puis faites une capture d'écran lisible de la sortie de JUnit qui s'affiche dans l'onglet "Test Results". (1 point)
 </WRAP> </WRAP>
  
Ligne 136: Ligne 311:
  
 <WRAP center round help 60%> <WRAP center round help 60%>
-**Q3 :** dans votre compte-rendu, écrivez Q3 puis copiez-collez la sortie de JUnit qui s'affiche dans l'onglet "Test Results". (1 point pour le rapport, un point pour le code)+**Q3 :** dans votre compte-rendu, écrivez Q3 puis faites une capture d'écran lisible de la sortie de JUnit qui s'affiche dans l'onglet "Test Results". (1 point pour le rapport, un point pour le code)
 </WRAP> </WRAP>
  
Ligne 165: Ligne 340:
  
 <WRAP center round help 60%> <WRAP center round help 60%>
-**Q6 :** exécutez en une seule fois l'ensemble des tests présents dans le projet. Dans le rapport, indiquez Q6 et copiez-collez la sortie de JUnit. (1 point)+**Q6 :** exécutez en une seule fois l'ensemble des tests présents dans le projet. Dans le rapport, indiquez Q6 et faites une capture d'écran lisible de la sortie de JUnit. (1 point)
 </WRAP> </WRAP>
  
Ligne 209: Ligne 384:
  
 <WRAP center round help 60%> <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. (2 points)+**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> </WRAP>
  
Ligne 217: Ligne 392:
  
 <WRAP center round help 60%> <WRAP center round help 60%>
-**Q10 :** Effectuez un dernier commit de votre projet. Assurez-vous de bien commiter la javadoc également. Ensuite, n'oubliez pas de pousser votre travail sur Github pour qu'il puisse être corrigé. Copiez l'URL de votre projet Github dans votre rapport. Déposez votre rapport sur [[https://tomuss.univ-lyon1.fr|Tomuss]]. (1 point)+**Q10 :** Effectuez un dernier commit de votre projet. Ensuite, n'oubliez pas de pousser votre travail sur Github pour qu'il puisse être corrigé. Copiez l'URL de votre projet Github dans votre rapport. Déposez votre rapport sur [[https://tomuss.univ-lyon1.fr|Tomuss]]. (1 point)
 </WRAP> </WRAP>