[LAJ1] JoueurTest

Voir le sujet précédent Voir le sujet suivant Aller en bas

[LAJ1] JoueurTest

Message  NicoM le Lun 14 Avr 2008, 22:16

Bonjour !! Very Happy

Encore un soucis... et oui....

Voilà la classe test qui est fournie :

Code:
package g30617.p2.tests;

/*
 * JoueurTest.java
 * JUnit based test
 *
 * Created on 18 fevrier 2008, 13:41
 */

import g30617.p2.*;
import g30617.p2.console.*;
import static g30617.p2.Symbole.*;
import static g30617.p2.Couleur.*;

import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.Before;

import java.util.List;
import java.util.ArrayList;


/**
 * tests de la classe Joueur.
 * @author mba
 *
 */
public class JoueurTest  {
   
    private Jeu jeu;
    /**
    * les initialisations communes a tous les tests.
    **/
    @Before public void setUp() {
       
        Passage passage;
        List<Joueur> joueurs;
        Cercle<Joueur> cercleJoueurs;
        Tas pioche;  // les cartes du jeu
        Tas ecarts;    // les cartes ecartees
        List<Pirate> barque;
        List<Pirate> forteresse;
        Joueur joueurCourant;
        int nbCoupsCourant;
        Joueur joueurVert,
              joueurJaune;
       
        passage = new Passage(new int[]{0,1,2,3,4,5}, new int[]{1,1,1,1,1,1}); // tel quel
/*
 --------------------------------------------------------------------------------
  *    >    #    &    !    @    &    !    *    @    >    #    #    &    @    >
  1    2    3    4    5    6    7    8    9    10  11  12  13  14  15  16
--------------------------------------------------------------------------------
  *    !    @    *    !    #    &    >    >    @    &    !    #    *    !    #
  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32
--------------------------------------------------------------------------------
  >    *    @    &
  33  34  35  36
-------------------------------------------------------------------------------- 
*/ 
// deux joueurs VERT - JAUNE
        joueurs = new ArrayList<Joueur>();
        joueurVert = new Joueur(VERT, new StrategieClavier());
        joueurJaune = new Joueur(JAUNE, new StrategieIASimple());
        joueurs.add(joueurVert);
        joueurs.add(joueurJaune);
        cercleJoueurs = new Cercle<Joueur> (joueurs,0);
       
        // deux cartes dans le tas
        pioche = new Tas();
        pioche.ajouter(new Carte(POIGNARD));
        pioche.ajouter(new Carte(CHAPEAU));
       
        // pas de cartes ecartees
        ecarts = new Tas();
       
        // barque vide
        barque = new ArrayList<Pirate>();
       
        // forteresse vide
        forteresse = new ArrayList<Pirate>();
       
        // le VERT est le courant
        joueurCourant = cercleJoueurs.courant();
       
        // premier coup du joueur VERT
        nbCoupsCourant = 1;
       
        jeu = new Jeu( passage , cercleJoueurs, pioche, ecarts, barque, forteresse, nbCoupsCourant);
    }
    /**
    * test de jouerCarte. Verifie qu'apres le jeu la main du joueur n'a plus la carte, et que les ecarts ont bien recu une carte.
    */
    @Test  public void testJouerCarte() throws Exception {
        http://System.out.println("jouerCarte");
        Carte carte = new Carte(CHAPEAU);
       
      [b] [u] jeu.getCourant().getMain().ajouter(carte);[/u][/b]
        jeu.getCourant().jouerCarte(jeu, carte);
        assertEquals(0,jeu.getCourant().getMain().size()); // carte retiree  de la main
        assertEquals(1, jeu.getEcarts().size());  // carte ajoutee aux ecarts
        assertEquals(carte, jeu.getEcarts().piocher()); // c'est meme la bonne carte
    }
    /**
    * test de piocherCarte. Verifie que une carte est bien retiree de pioche.
    */
    @Test  public void testPiocherCarteNominal()throws TasException {
        http://System.out.println("piocherCarte");
        jeu.getPioche().piocher();
        assertEquals(1,jeu.getPioche().size());
    }
    /**
    * test de piocherCarte avec un tas vide. Verifie que l'exception est bien levee.
    */
    @Test(expected=TasException.class) public void testPiocherCarteVide()throws TasException  {
        http://System.out.println("PiocherCarte");
        jeu.getPioche().piocher();
        jeu.getPioche().piocher();
        jeu.getPioche().piocher(); // -> Exception
    }
}

Je n'ai aucune erreur à la compilation mais bien à l'exécution !
java.lang.NullPointerException
at g30617.p2.tests.JoueurTest.testJouerCarte(JoueurTest.java : 98)

La ligne concerné est souligné dans le code.
Je la reprend ici : jeu.getCourant().getMain().ajouter(carte);

Donc je pointe vers rien!?

getCourant de ma classe Jeu :

Code:
public Joueur getCourant(){
   return this.cercleJoueurs.courant();

.courant() venant de Cercle de mba, je ne pense pas que l'erreur est là...

ensuite getMain de ma classe Joueur :

Code:
public Main getMain(){
   return this.main;

main un attribut de Joueur qui lorsque pas de paramètre main reçoit une main VIDE :

Code:
public Joueur (Couleur couleur, Strategie strategie){
   Main mainVide = new Main();
   new Joueur (couleur, strategie, mainVide);

.ajouter(carte), une méthode de la classe Main est testé par MainTest et fonctionne bien. Voilà

Merci à tous, jespère ne pas en avoir dit trop...
5 jours que je cherche, GL & HF !

thxxxx

NicoM

Nombre de messages : 116
Prénom : Nicolas
Statut : étudiant 3ieme Industrielle
Localisation : Bascule
Date d'inscription : 07/12/2007

Revenir en haut Aller en bas

Re: [LAJ1] JoueurTest

Message  NicoM le Lun 14 Avr 2008, 22:18

Je précise que TasTest,PassageTest,MainTest, CaseTest sont tous ok sauf JoueurTest où il n'y a que TestJouerCarte qui ne va pas... ERRORS

J'utilise également toutes les méthodes cités plus hauts dans d'autres classes et là jamais d'erreurs...

Merci

NicoM

Nombre de messages : 116
Prénom : Nicolas
Statut : étudiant 3ieme Industrielle
Localisation : Bascule
Date d'inscription : 07/12/2007

Revenir en haut Aller en bas

Re: [LAJ1] JoueurTest

Message  mcd le Lun 14 Avr 2008, 22:37

Dans la ligne incriminée, il y a plein de choses qui peuvent être nulles.
Tu avances dans le vide si tu ne détermines pas d'abord ce qui est null
-> des petits println() pour t'aider.
- Tu imprimes jeu;
- puis jeu.getCourant();
- puis jeu.getCourant().getMain();
Il y en a un des 3 qui va foirer; tu sauras alors mieux où chercher.

mcd

Nombre de messages : 1548
Prénom : Marco
Statut : prof
Localisation : Molenbeek
Date d'inscription : 29/09/2006

http://mcd.namok.be

Revenir en haut Aller en bas

Re: [LAJ1] JoueurTest

Message  NicoM le Lun 14 Avr 2008, 22:55

mcd a écrit:Dans la ligne incriminée, il y a plein de choses qui peuvent être nulles.
Tu avances dans le vide si tu ne détermines pas d'abord ce qui est null
-> des petits println() pour t'aider.
- Tu imprimes jeu;
- puis jeu.getCourant();
- puis jeu.getCourant().getMain();
Il y en a un des 3 qui va foirer; tu sauras alors mieux où chercher.

entre "" : les println

Bah donc getCourant : "Voila le joueur courant :g30617.p2.Joueur@1f20eeb"
voila getMain : "Voilà votre main :null"
et à ajouter(Carte) : Il m'affiche pas le println et donc error....

Pourtant ajouter(carte) de Main est correct car testé et approuvé par MainTest et revérifier 1000 fois ...

Je suis perdu :'(


edit : Main mainVide = new Main();

C'est le constructeur d'une main vide... puis création d'un joueur avec une main vide voir dans les codes plus hauts.

Code:
public class Main {
   //Attribut(s) de Main.
   private List<Carte> cartesMain =new ArrayList<Carte>();
   
   //Constructeur(s) de Main(1).
   public Main(){
   }

NicoM

Nombre de messages : 116
Prénom : Nicolas
Statut : étudiant 3ieme Industrielle
Localisation : Bascule
Date d'inscription : 07/12/2007

Revenir en haut Aller en bas

Re: [LAJ1] JoueurTest

Message  NicoM le Lun 14 Avr 2008, 23:08

Plus clairement :

Code:
@Test  public void testJouerCarte() throws Exception {
        http://System.out.println("jouerCarte");
        Carte carte = new Carte(CHAPEAU);
       
        System.out.println("Le jeu : "+jeu+" LejoueurCourant : "+jeu.getCourant()+" La main : "+jeu.getCourant().getMain()+" La carte à ajouter : "+carte);
        jeu.getCourant().getMain().ajouter(carte);
        jeu.getCourant().jouerCarte(jeu, carte);
        assertEquals(0,jeu.getCourant().getMain().size()); // carte retiree  de la main
        assertEquals(1, jeu.getEcarts().size());  // carte ajoutee aux ecarts
        assertEquals(carte, jeu.getEcarts().piocher()); // c'est meme la bonne carte
    }

Le jeu : g30617.p2.Jeu@1f20eeb LejoueurCourant : g30617.p2.Joueur@b179c3 La main : null La carte à ajouter : g30617.p2.Carte@1b10d42

La main vaut null oui car elle est vide et c'est donc pour ca que je veux mettre une carte dans la main alors pkkkkkk ouiiiiinnnnnnn

NicoM

Nombre de messages : 116
Prénom : Nicolas
Statut : étudiant 3ieme Industrielle
Localisation : Bascule
Date d'inscription : 07/12/2007

Revenir en haut Aller en bas

Re: [LAJ1] JoueurTest

Message  Wark le Lun 14 Avr 2008, 23:18

Code:

public Joueur (Couleur couleur, Strategie strategie){
  Main mainVide = new Main();
  new Joueur (couleur, strategie, mainVide);

J'avais le même problème avec ce code. En testant celui-ci :

Code:
   public Joueur(Couleur couleur,Strategie strategie){
      this.couleur = couleur;
      this.main = new Main();
      this.strategie = strategie;
   }

Tout est devenu fonctionnel.. J'en ai conclu que

Code:
new Joueur (couleur,strategie,mainVide);
n'est tout simplement pas un appel de constructeur valable.

Si tu tiens à utiliser à tout prix le second constructeur, je te recommande une méthode privée statique qui ne fait que l'appel vers la main et un truc du genre :

Code:
public Joueur(...){
this (couleur,strategie,methodeprivée());
}[/b]

Pourquoi statique ? Car le compilateur n'accepte pas d'appel implicite dans un constructeur (sauf si cet appel fait référence à une méthode statique).
Pourquoi faire une méthode à part ? Car les instructions this et super en tant que constructeur doivent être les premières instructions .. Smile

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

Re: [LAJ1] JoueurTest

Message  Wark le Lun 14 Avr 2008, 23:20

NicoM a écrit:Plus clairement :

Code:
@Test  public void testJouerCarte() throws Exception {
        http://System.out.println("jouerCarte");
        Carte carte = new Carte(CHAPEAU);
       
        System.out.println("Le jeu : "+jeu+" LejoueurCourant : "+jeu.getCourant()+" La main : "+jeu.getCourant().getMain()+" La carte à ajouter : "+carte);
        jeu.getCourant().getMain().ajouter(carte);
        jeu.getCourant().jouerCarte(jeu, carte);
        assertEquals(0,jeu.getCourant().getMain().size()); // carte retiree  de la main
        assertEquals(1, jeu.getEcarts().size());  // carte ajoutee aux ecarts
        assertEquals(carte, jeu.getEcarts().piocher()); // c'est meme la bonne carte
    }

Le jeu : g30617.p2.Jeu@1f20eeb LejoueurCourant : g30617.p2.Joueur@b179c3 La main : null La carte à ajouter : g30617.p2.Carte@1b10d42

La main vaut null oui car elle est vide et c'est donc pour ca que je veux mettre une carte dans la main alors pkkkkkk ouiiiiinnnnnnn

Petite correction pour ceci. En aucun cas ta main ne peut valoir null (même si celle-ci est vide). Null signifie que ta main ne fait référence à aucun objet. Une main vide fera référence à un objet mais ne contiendra encore rien .. ce sera juste un espace mémoire alloué. Smile

(Ton constructeur de Main vide est peut-être également responsable dans ce cas. Wink )

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

Re: [LAJ1] JoueurTest

Message  NicoM le Lun 14 Avr 2008, 23:26

Je vois... Je vais réfléchir avec tout ça... Je crois que tu allumes une pitite lumière qq part Very Happy
Merci Smile

NicoM

Nombre de messages : 116
Prénom : Nicolas
Statut : étudiant 3ieme Industrielle
Localisation : Bascule
Date d'inscription : 07/12/2007

Revenir en haut Aller en bas

Re: [LAJ1] JoueurTest

Message  mcd le Lun 14 Avr 2008, 23:34

Wark a écrit:
Code:

public Joueur (Couleur couleur, Strategie strategie){
  Main mainVide = new Main();
  new Joueur (couleur, strategie, mainVide);
Dans cet exemple, le new crée un autre objet mais pas celui qu'on est en train de construire -> pas ce qu'on veut
Wark a écrit:Pourquoi faire une méthode à part ? Car les instructions this et super en tant que constructeur doivent être les premières instructions .. Smile
Et du coup ici on pourrait s'en sortir car on est pas obligé d'assigner la main à une variable locale ->
Code:
public Joueur (Couleur couleur, Strategie strategie){
    this(couleur, strategie, new Main());

mcd

Nombre de messages : 1548
Prénom : Marco
Statut : prof
Localisation : Molenbeek
Date d'inscription : 29/09/2006

http://mcd.namok.be

Revenir en haut Aller en bas

Re: [LAJ1] JoueurTest

Message  NicoM le Lun 14 Avr 2008, 23:39

bah donc c'était bien ca... Je comprends pas très bien pourquoi mais j'ai labo demain et j'irai en débattre car j'aimais bien ce que j'avais fait.
Merci beaucoup Wark en tk !!!!!!!!!!!!!!!!!!!!

NicoM

Nombre de messages : 116
Prénom : Nicolas
Statut : étudiant 3ieme Industrielle
Localisation : Bascule
Date d'inscription : 07/12/2007

Revenir en haut Aller en bas

Re: [LAJ1] JoueurTest

Message  NicoM le Lun 14 Avr 2008, 23:41

mcd a écrit:
Wark a écrit:
Code:

public Joueur (Couleur couleur, Strategie strategie){
  Main mainVide = new Main();
  new Joueur (couleur, strategie, mainVide);
Dans cet exemple, le new crée un autre objet mais pas celui qu'on est en train de construire -> pas ce qu'on veut
Wark a écrit:Pourquoi faire une méthode à part ? Car les instructions this et super en tant que constructeur doivent être les premières instructions .. Smile
Et du coup ici on pourrait s'en sortir car on est pas obligé d'assigner la main à une variable locale ->
Code:
public Joueur (Couleur couleur, Strategie strategie){
    this(couleur, strategie, new Main());

bah voilà, plus besoin d'aller en labo, merci mr mcd, là j'ai tout comprit :d

NicoM

Nombre de messages : 116
Prénom : Nicolas
Statut : étudiant 3ieme Industrielle
Localisation : Bascule
Date d'inscription : 07/12/2007

Revenir en haut Aller en bas

Re: [LAJ1] JoueurTest

Message  Contenu sponsorisé Aujourd'hui à 07:14


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum