import static org.junit.Assert.assertTrue; // import static : une facilite offerte depuis java5 (pas besoin de mettre le prefixe)
import static org.junit.Assert.assertFalse; // 
import org.junit.Test;


/**
 * Une classe pour faire des tests sur la classe Carte avec JUnit
 */
public class TestCarte {

    // un test pour Junit4 c'est une methode avec l'annotation @Test devant une methode avec un type de retour void.
    @Test
    public void egaleSiIdentiquesEtVisible() {
        Carte un = new Carte(1);
        un.toggleVisible();
         // on peut stipuler que des choses sont normalement egales (il faut charger de maniere statique les Assert si on veut eviter d'avoir a ecrire de quelle classe on parle)
        assertTrue(un.egale(un));
    }

    // le nom du test doit etre le plus explicite possible
    @Test
    public void egalSiMemeValeurEtVisible() {
       Carte un = new Carte(1);
       un.toggleVisible();
       Carte unBis = new Carte(1);
       unBis.toggleVisible();
       assertTrue(un.egale(unBis));
    }

    @Test
    public void pasEgalSiPasMemeValeurEtVisible() {
       Carte un = new Carte(1);
       un.toggleVisible();
       Carte deux = new Carte(2);
       deux.toggleVisible();
       assertFalse(un.egale(deux));
    }

    // un test pour Junit4 qui cherche a verifier qu'il y a bien une exception
    @Test(expected = NullPointerException.class)
    public void egalPasFaitPourNull(){
        Carte bad = null;
        Carte un = new Carte(1);
        un.egale(bad);
    }

    // un autre test pour Junit4 qui cherche a verifier qu'il y a bien une exception
    @Test(expected = IllegalArgumentException.class)
    public void egalPasFaitPourParametreNonVisible(){
        Carte un = new Carte(1);
         un.toggleVisible();
        Carte deux = new Carte(2);
        un.egale(deux);
    }

    // un autre test pour Junit4 qui cherche a verifier qu'il y a bien une exception
    @Test(expected = IllegalStateException.class)
    public void egalPasFaitPourCarteThisNonVisible(){
        Carte un = new Carte(1);
        Carte deux = new Carte(2);
        deux.toggleVisible();    
        un.egale(deux);
    }

    //Le monde est mal fait et parfois c'est le test qui est faux.
    //Notez que je suis vraiment mechant car ce test est satisfait au debut avec le code propose...
    //Moralite : faites des tests tres simples et faites vous relire! 
    @Test 
    public void egalTestMalFait(){
        Carte un = new Carte(1);
        un.toggleVisible();
        Carte deux = new Carte(2);
        deux.toggleVisible();
        un.toggleVisible();//copie colle de la mort
        assertFalse(un.egale(deux));
    }

    // si on ne met pas l'annotation arobase test, le test n'est jamais pris en compte.
    // c'est juste une methode annexe qui n'est pas appellee comme dans n'importe quelle classe.
    public void autreTestMalFait(){
        assertFalse(true);
    }
    
     
}
