/**
 * TestExpression.java                              7 mai 2021
 * IUT Rodez info1 2020-2021, pas de copyright, aucun droit
 */
package interpreteurlir.expressions.tests;

import static info1.outils.glg.Assertions.*;

import interpreteurlir.expressions.Expression;
import interpreteurlir.expressions.ExpressionChaine;
import interpreteurlir.expressions.ExpressionEntier;
import interpreteurlir.Contexte;

/**
 * Tests unitaires de {@link Expression}
 * @author Nicolas Caminade
 * @author Sylvan Courtiol
 * @author Pierre Debas
 * @author Heïa Dexter
 * @author Lucas Vabre
 */
public class TestExpression {
    
    /** Jeu d'essai d'expression typée */
    private Expression[] fixture = {
        new ExpressionChaine("$chaine = \"texte\""),  
        new ExpressionChaine("$chaine=\"tata\""),
        new ExpressionChaine("   $tata  \t  "),
        new ExpressionChaine("\"une chaine de texte\""),
        new ExpressionChaine("$chaine= \"toto\"+\"titi\""),
        new ExpressionChaine("$chaine= $toto +\"titi\""),
        new ExpressionChaine("$chaine= \"toto\"+ $titi"),
        new ExpressionChaine("$chaine=$toto +$titi"),
        new ExpressionChaine("   \"toto\"+\"titi\""),
        new ExpressionChaine("$toto +\"titi\""),
        new ExpressionChaine("\"toto\"+ $titi"),
        new ExpressionChaine("$toto +    $titi"), 
        // TODO expression entière
    };
    
    /**
     * Tests unitaires de {@link Expression#referencerContexte(Contexte)}
     */
    public void testReferencerContexte() {

        Contexte reference = new Contexte();
        Contexte[] contextes = {
                null, reference, reference, new Contexte()
        };
        
        boolean[] resultatAttendu = { false, true, true, false };
        
        System.out.println("\tExécution du test de "
                + "Expression#referencerContexte(Contexte)");
        for (int numTest = 0 ; numTest < contextes.length ;  numTest++) {
            assertTrue(   Expression.referencerContexte(contextes[numTest]) 
                       == resultatAttendu[numTest]);
        }
    }
    
    /**
     * Tests unitaires de {@link Expression#toString()}
     */
    public void testToString() {
        final String[] chaineAttendue = {
            "$chaine = \"texte\"",  
            "$chaine = \"tata\"",
            "$tata",
            "\"une chaine de texte\"",
            "$chaine = \"toto\" + \"titi\"",
            "$chaine = $toto + \"titi\"",
            "$chaine = \"toto\" + $titi",
            "$chaine = $toto + $titi",
            "\"toto\" + \"titi\"",
            "$toto + \"titi\"",
            "\"toto\" + $titi",
            "$toto + $titi"       
        };
        
        System.out.println("\tExécution du test de Expression#toString()");
        for (int numTest = 0 ; numTest < chaineAttendue.length ; numTest++) {
            assertEquivalence(chaineAttendue[numTest], 
                              fixture[numTest].toString());
        }
    }
    
    /**
     * Tests unitaires de {@link Expression#determinerTypeExpression(String)}
     */
    public void testDeterminerTypeExpression() {
        final String[] TEXTE_EXPRESSION = {
            /* Expression de type chaine */
            "$chaine = \"texte\"",  
            "$chaine=\"tata\"",
            "   $tata  \t  ",
            "   \"une chaine de texte\"",
            "$chaine= \"toto\"+\"titi\"",
            "   $chaine= $toto +\"titi\"",
            "$chaine= \"toto\"+ $titi",
            "$chaine=$toto +$titi",
            "   \"toto\"+\"titi\"",
            "\t$toto +\"titi\"",
            "\"toto\"+ $titi",
            "$toto +    $titi", 
            
            /* Expression de type Entier */
            "78",
            "  entier",
            "78   %89",
            "  entier- nombre",
            "\t  entier/78",
            "entier = 78  ",
            " nombre= nombre + 78",
            " entier =78 *2"
        };
        
        final int INDEX_DEBUT_ENTIER = 12;
        
        System.out.println("\tExécution du test de "
                           + "Expression#determinerTypeExpression(String)");
        
        for (int numTest = 0; numTest < TEXTE_EXPRESSION.length ; numTest++) {
            if (numTest < INDEX_DEBUT_ENTIER) {
                assertTrue(Expression.determinerTypeExpression(
                        TEXTE_EXPRESSION[numTest]) instanceof ExpressionChaine);
            } else {
                assertTrue(Expression.determinerTypeExpression(
                        TEXTE_EXPRESSION[numTest]) instanceof ExpressionEntier);
            }
        }
    }
    

}
