TP6 Question3: plus d'information concernant l'attendu de certains tests JNEWS

Programmation Avancée

Modérateur : douinj

castr_ju
Messages : 6
Inscription : 10 oct. 2020 13:59

TP6 Question3: plus d'information concernant l'attendu de certains tests JNEWS

Message par castr_ju » 18 nov. 2020 21:57

Bonjour,

Est-il possible d'avoir plus d'informations sur les comportements attendus concernant les tests JNEWS suivants:
1) testAssertion(question3) failed
2) testSelection(question3) failed
3) testAssertionError(question3) failed
4) testPour2_10_itérations(question3) failed
5) testPourPour_5_itérations(question3) failed
6) test_CompilationDUneBouclePour(question3) failed
7) test_CompilationDUneBouclePourAvecAfficher(question3) failed
8) testBouclesImbriquees2(question3) failed
9) testBouclesImbriquees(question3) failed
10) testFactorielPour(question3) failed

La classe TestsEvaluationAVerifier s'exécute avec tout les tests en vert.

Pour la classe TestDesAssertionsAVerifier, c'est au vert pour les méthodes présentent par défaut dans le package. Par contre la méthode vue sur le forum, testAssertionError elle ne passe pas (la valeur bluej.vm.args=-ea est paramétrée dans le fichier bluej.defs), quand je regarde le contenu de cette méthode:

Code : Tout sélectionner

fail("attention, " + i.accepter(vs) + " est-il sans effet ???");
Cela me laisse penser que je devrais modifier la classe VisiteurInstToString car un plus haut dans cette même méthode je vois:

Code : Tout sélectionner

VisiteurInstruction vs = new VisiteurInstToString(ves,vbs); 
Or j'ai l'impression qu'il ne faut pas toucher cette classe VisiteurInstToString.

TestDesAssertionsAVerifier crée les classes telles que décrites dans la classe de test:
  • Les classes: Somme, BoucleBoucle, Fact, BouclePour et PourClasseTest, compilent toutes sans erreur et peuvent s'exécuter et se terminer.
  • Les classes: BoucleTantQuePour, BoucleTantQuePour2 et TestAvecImbricationMultiples, compilent sans erreur mais donnent des exécutables qui bouclent, mais j'ai l'impression que c'est le comportement attendu quand je retranscris sur papier le programme que je vois dans TestDesAssertionsAVerifier.
Par exemple mon rendu pour la classe BoucleTantQuePour est:

Code : Tout sélectionner

public class BoucleTantQuePour{

  public static void main(String[] args)throws Exception{
    int i=0;
    int j=1;

    while(i < 10){
     
     
     while(j < 10){
      
      for(i=0;(i < 5);j=(j + 1)){
       
       i=(i + 1);
       
       System.out.print(i);
      }
     }
     
     i=(i + 1);
     j=1;
    }
  }

}
Cela me semble bien retranscrire le contenu de la méthode test_CompilationDeBouclesTantQuePourImbriquees() de la classe TestsCompilationAVerifier:

Code : Tout sélectionner

       Contexte m = new Memoire();
        Variable i = new Variable(m,"i");
        Variable j = new Variable(m,"j",1);
        
        Instruction inst = 
            new TantQue( 
                new Inf(i,new Constante(10)),
                new Sequence(
                    new TantQue(
                        new Inf(j,new Constante(10)),
                        new Pour( 
                            new Affectation(i,new Constante(0)), new Inf(i, new Constante(5)), 
                            new Sequence(
                                new Affectation(i,new Addition(i,new Constante(1))),
                                new Afficher(i)), 
                            new Affectation(j,new Addition(j,new Constante(1)))
                        )),
                    new Sequence(
                        new Affectation(i,new Addition(i,new Constante(1))),
                        new Affectation(j, new Constante(1))
                    )
                )
            );
Merci d'avance si vous pouvez me donner quelques indices pour continuer à avancer.

Cordialement,

douinj
Messages : 204
Inscription : 18 mars 2009 15:46

Re: TP6 Question3: plus d'information concernant l'attendu de certains tests JNEWS

Message par douinj » 19 nov. 2020 9:15

Bonjour,

Ce qui semble être le dénominateur commun de vos tentatives est l'évaluation des variables, regardez de ce côté et aidez vous des règles d'inférence

dans votre code java, vérifiez l'exécution de cette méthode
public static void test(){
assert false:"assert est bien évaluée :-) ";
}


à suivre...

castr_ju
Messages : 6
Inscription : 10 oct. 2020 13:59

Re: TP6 Question3: plus d'information concernant l'attendu de certains tests JNEWS

Message par castr_ju » 20 nov. 2020 9:36

Bonjour,

J'ai modifié le code mais j'ai toujours les mêmes tests en erreur.

Concernant:
public static void test(){
assert false:"assert est bien évaluée :-) ";
}

Si bluej.vm.args=-ea est commenté dans bluej.defs, le test passe. S'il n'est pas commenté, le test ne passe pas: "java.lang.AssertionError: assert est bien évaluée :-) ". Mais je ne sais pas quoi en faire vis à vis de ce test vu sur le forum qui ne passe pas:

Code : Tout sélectionner

    public void testAssertionErrorVersionFromForum(){
        Contexte m = new Memoire();
        Variable x = new Variable(m,"x",5);
        VisiteurExpression ve = new VisiteurEvaluation(m);
        VisiteurExpressionBooleenne vb = new VisiteurBoolEvaluation(ve);
        VisiteurInstruction vi = new VisiteurInstEvaluation(ve,vb);

        VisiteurExpression ves = new VisiteurInfixe(m);
        VisiteurExpressionBooleenne vbs = new VisiteurBoolToString(ves);
        VisiteurInstruction vs = new VisiteurInstToString(ves,vbs);

        Instruction i = new Assertion(new Egal(x,new Constante(6)));
        try{
            i.accepter(vi);
            fail();
        }catch(junit.framework.AssertionFailedError e){
            fail("attention, " + i.accepter(vs) + " est-il sans effet ???");
        }catch(AssertionError e){
            
        }
    }   
Pour info, ma méthode visite(Assertion a) de la classe VisiteurInstEvaluation est écrite ainsi:

Code : Tout sélectionner

    public Contexte visite(Assertion a) throws AssertionError {
        // à compléter
        // à compléter par l'usage de assert de java, installer l'option \"-ea\" ligne 480 de bluej.defs soit bluej.vm.args=-ea
        // à compléter
        // à compléter
        // return null; // à compléter en retournant le contexte modifié;

        Contexte res = this.vi.contexte();
        try{
            a.cond().accepter(this.vb);
        } catch(Exception e){
            throw new AssertionError(e.getMessage());
        }catch (junit.framework.AssertionFailedError e) {
            throw new AssertionError(e.getMessage());
        }
        return res;

    }
Concernant votre indice sur l'évaluation des variables. En restant dans la question 3 (les tests JNEWS de la question 1 étant bon je ne crois pas devoir retourner si bas pour trouver l'erreur),J'ai creusé sur la méthode

Code : Tout sélectionner

public Contexte visite(Affectation a)
de VisiteurInstEvaluation, au début je l'avais écrit comme cela

Code : Tout sélectionner

this.vi.contexte().ecrire(
a.v().nom(),
a.exp().accepter(this.vi)
);
return this.vi.contexte();
je l'ai rectifié comme cela:

Code : Tout sélectionner

new Variable(
this.vi.contexte(),
a.v().nom(),
a.exp().accepter(this.vi)
);
 return this.vi.contexte();
. Je n'ai pas l'impression que cela change quoi que ce soit entre les deux.


J'ai créé cette classe de test suivant, pouvez vous me dire si ma compréhension du comportement est correcte:

Code : Tout sélectionner

    public void testAffectationContenuContext(){
        Contexte m = new Memoire();
        Variable i = new Variable(m,"i");
        Variable j = new Variable(m,"j",1);
        
        assertEquals(m.toString(),"{i=0, j=1}");

        Variable k = new Variable(m,"j",2);
        assertEquals(m.toString(),"{i=0, j=2}");



        Variable l = new Variable(m,"l",15);
        assertEquals(m.toString(),"{i=0, j=2, l=15}");
        
        l = new Variable(m,"l",10);
        assertEquals(m.toString(),"{i=0, j=2, l=10}");

        Affectation a = new Affectation(i,new Addition(i,new Constante(1)));
        VisiteurExpression<Integer> ve = new VisiteurEvaluation(m);
        VisiteurExpressionBooleenne<Boolean> vb = new VisiteurBoolEvaluation(ve);
        VisiteurInstruction<Contexte> vi = new VisiteurInstEvaluation(ve,vb);
        assertEquals(m.toString(),"{i=0, j=2, l=10}");
        a.accepter(vi);
        assertEquals(m.toString(),"{i=1, j=2, l=10}");
        a.accepter(vi);
        assertEquals(m.toString(),"{i=2, j=2, l=10}");
       
        Affectation b = new Affectation(j,new Multiplication(j,new Constante(10)));
        b.accepter(vi);
        assertEquals(m.toString(),"{i=2, j=20, l=10}");

        b = new Affectation(i,new Multiplication(j,new Constante(30)));
        assertEquals(m.toString(),"{i=2, j=20, l=10}");
        b.accepter(vi);
        assertEquals(m.toString(),"{i=600, j=20, l=10}");
        
        
    }

Je ne vais plus pouvoir y passer beaucoup de temps, maintenant, je vais devoir passer au TP suivant.

douinj
Messages : 204
Inscription : 18 mars 2009 15:46

Re: TP6 Question3: plus d'information concernant l'attendu de certains tests JNEWS

Message par douinj » 20 nov. 2020 17:22

Bonjour,

Votre méthode de test est en succès avec la version dite référente

Code : Tout sélectionner

    public void testAffectationContenuContext(){
        Contexte m = new Memoire();
        Variable i = new Variable(m,"i");
        Variable j = new Variable(m,"j",1);
        
        assertEquals(m.toString(),"{i=0, j=1}");

        Variable k = new Variable(m,"j",2);
        assertEquals(m.toString(),"{i=0, j=2}");



        Variable l = new Variable(m,"l",15);
        assertEquals(m.toString(),"{i=0, j=2, l=15}");
        
        l = new Variable(m,"l",10);
        assertEquals(m.toString(),"{i=0, j=2, l=10}");

        Affectation a = new Affectation(i,new Addition(i,new Constante(1)));
        VisiteurExpression<Integer> ve = new VisiteurEvaluation(m);
        VisiteurExpressionBooleenne<Boolean> vb = new VisiteurBoolEvaluation(ve);
        VisiteurInstruction<Contexte> vi = new VisiteurInstEvaluation(ve,vb);
        assertEquals(m.toString(),"{i=0, j=2, l=10}");
        a.accepter(vi);
        assertEquals(m.toString(),"{i=1, j=2, l=10}");
        a.accepter(vi);
        assertEquals(m.toString(),"{i=2, j=2, l=10}");
       
        Affectation b = new Affectation(j,new Multiplication(j,new Constante(10)));
        b.accepter(vi);
        assertEquals(m.toString(),"{i=2, j=20, l=10}");

        b = new Affectation(i,new Multiplication(j,new Constante(30)));
        assertEquals(m.toString(),"{i=2, j=20, l=10}");
        b.accepter(vi);
        assertEquals(m.toString(),"{i=600, j=20, l=10}");
        
        
    }

douinj
Messages : 204
Inscription : 18 mars 2009 15:46

Re: TP6 Question3: plus d'information concernant l'attendu de certains tests JNEWS

Message par douinj » 20 nov. 2020 17:22

La visite d'une affectation, cf. un post sur le forum
Bonjour

Quel est le raisonnement dans l'évaluation d'une variable en java ? si vous lisez cette ligne x = x +2;


/** Visite d'une instance de la classe Affectation.
*
* l'affectation, X = Exp, Exp est une expression arithmétique <br>
* <code>
*
* M,Exp -interprete-> N <br>
* ________________________________<br>
* M, X = Exp -interprete-> M[X]=N <br>
* </code>
*
* @param a une affectation
* @return la mémoire résultante
*/
public Contexte visite(Affectation a){
Integer n = a.exp().accepter(this.vi); // M,Exp -interprete-> N
// --------------------------------
vi.contexte().ecrire(a.v().nom(),n); // M[X]=N
return this.vi.contexte();
}

douinj
Messages : 204
Inscription : 18 mars 2009 15:46

Re: TP6 Question3: plus d'information concernant l'attendu de certains tests JNEWS

Message par douinj » 20 nov. 2020 17:25

Et enfin la visite d'une assertion

Code : Tout sélectionner

  public Contexte visite(Assertion a) {
    try{
       boolean condition = a.cond().accepter(this.vb);
       assert condition;
    }catch(AssertionError ae){
      throw ae;
    }
    return this.vi.contexte();
  }

Répondre