mirror of
https://github.com/LucasVbr/interpreteur-lir.git
synced 2026-05-13 17:21:52 +00:00
Prototype 2.0
This commit is contained in:
@@ -9,6 +9,8 @@ import java.util.Scanner;
|
||||
|
||||
import interpreteurlir.expressions.Expression;
|
||||
import interpreteurlir.motscles.Commande;
|
||||
import interpreteurlir.motscles.instructions.Instruction;
|
||||
import interpreteurlir.programmes.*;
|
||||
|
||||
/**
|
||||
* Analyseur de l'entrée standard du programme interpréteur LIR.
|
||||
@@ -34,6 +36,9 @@ public class Analyseur {
|
||||
|
||||
/** contexte de cet analyseur */
|
||||
private Contexte contexteGlobal;
|
||||
|
||||
/** programme de cet analyseur */
|
||||
private Programme programme;
|
||||
|
||||
/**
|
||||
* Initialise un analyseur ayant son propre contexte.
|
||||
@@ -43,6 +48,8 @@ public class Analyseur {
|
||||
entree = new Scanner(System.in);
|
||||
contexteGlobal = new Contexte();
|
||||
Expression.referencerContexte(contexteGlobal);
|
||||
programme = new Programme();
|
||||
Commande.referencerProgramme(programme);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -51,18 +58,72 @@ public class Analyseur {
|
||||
*/
|
||||
public void mainLoop() {
|
||||
String ligneSaisie;
|
||||
String[] decoupage;
|
||||
String motCle;
|
||||
String arguments;
|
||||
String texteEtiquette;
|
||||
for (;;) {
|
||||
texteEtiquette = null;
|
||||
|
||||
System.out.print(INVITE);
|
||||
ligneSaisie = entree.nextLine().trim();
|
||||
|
||||
String[] decoupage = ligneSaisie.split(" ", 2);
|
||||
String motCle = decoupage.length >= 1 ? decoupage[0] : "";
|
||||
String arguments = decoupage.length >= 2 ? decoupage[1] : "";
|
||||
/* Instruction avec étiquette */
|
||||
if (!ligneSaisie.isBlank()
|
||||
&& Character.isDigit(ligneSaisie.charAt(0))) {
|
||||
decoupage = ligneSaisie.split(" ", 2);
|
||||
texteEtiquette = decoupage.length >= 1 ? decoupage[0] : "";
|
||||
ligneSaisie = decoupage.length >= 2 ? decoupage[1] : "";
|
||||
}
|
||||
|
||||
executerCommande(motCle, arguments.trim());
|
||||
decoupage = ligneSaisie.split(" ", 2);
|
||||
motCle = decoupage.length >= 1 ? decoupage[0] : "";
|
||||
arguments = decoupage.length >= 2 ? decoupage[1] : "";
|
||||
|
||||
if (texteEtiquette == null) {
|
||||
executerCommande(motCle, arguments.trim());
|
||||
} else {
|
||||
editerProgramme(texteEtiquette, motCle, arguments.trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajoute une ligne de code (étiquette associée à une instruction)
|
||||
* au programme chargé.
|
||||
* @param texteEtiquette représentation texte de l'étiquette
|
||||
* @param motCle mot clé de l'instruction
|
||||
* @param arguments reste de la ligne saisie après le mot clé
|
||||
*/
|
||||
private void editerProgramme(String texteEtiquette, String motCle,
|
||||
String arguments) {
|
||||
Class<?> aAjouter;
|
||||
try {
|
||||
aAjouter = rechercheInstruction(motCle);
|
||||
|
||||
Class<?> classeArg = String.class;
|
||||
Class<?> classeContexte = Contexte.class;
|
||||
Instruction inst = (Instruction)aAjouter
|
||||
.getConstructor(classeArg, classeContexte)
|
||||
.newInstance(arguments, contexteGlobal);
|
||||
|
||||
Etiquette etiquette = new Etiquette(texteEtiquette);
|
||||
|
||||
programme.ajouterLigne(etiquette, inst);
|
||||
feedback(false);
|
||||
|
||||
} catch ( InvocationTargetException | IllegalAccessException
|
||||
| InstantiationException | NoSuchMethodException
|
||||
| InterpreteurException | ExecutionException lancee) {
|
||||
|
||||
System.err.println(NOK_FEEDBACK
|
||||
+ (lancee.getMessage() != null
|
||||
? lancee.getMessage()
|
||||
: lancee.getCause().getMessage()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Recherche la commande et exécute cette commande si présente.
|
||||
* Affiche un feedback si la commande ne s'en occupe pas ou erreur.
|
||||
@@ -84,7 +145,7 @@ public class Analyseur {
|
||||
feedback(cmd.executer());
|
||||
} catch ( InvocationTargetException | IllegalAccessException
|
||||
| InstantiationException | NoSuchMethodException
|
||||
| InterpreteurException lancee) {
|
||||
| InterpreteurException | ExecutionException lancee) {
|
||||
|
||||
System.err.println(NOK_FEEDBACK
|
||||
+ (lancee.getMessage() != null
|
||||
@@ -127,6 +188,8 @@ public class Analyseur {
|
||||
|
||||
if (motCle == null || motCle.isBlank()) {
|
||||
throw new InterpreteurException(ERREUR_VIDE);
|
||||
} else if (!motCle.equals(motCle.toLowerCase())) {
|
||||
throw new InterpreteurException(ERREUR_INCONNU);
|
||||
}
|
||||
|
||||
motCle = (Character.toUpperCase(motCle.charAt(0)))
|
||||
@@ -145,6 +208,42 @@ public class Analyseur {
|
||||
|
||||
return aChercher;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recherche l'instruction correspondant au mot clé.
|
||||
* <ul><li>Les instructions doivent être
|
||||
* dans le package interpreteurlir.motscles.instructions</li>
|
||||
* <ul>
|
||||
* La classe correspondant doit avoir un nom qui se finit avec le mot clé
|
||||
* (première lettre en majuscule)
|
||||
* @param motCle mot clé de l'instruction
|
||||
* @return Classe de cette instruction.
|
||||
* @throws InterpreteurException si motCle est vide, null ou non reconnue
|
||||
*/
|
||||
private static Class<?> rechercheInstruction(String motCle) {
|
||||
final String ERREUR_VIDE = "ligne vide";
|
||||
final String ERREUR_INCONNU = "mot clé inconnu";
|
||||
final String CLASS_PATH_INST =
|
||||
"interpreteurlir.motscles.instructions.Instruction";
|
||||
|
||||
if (motCle == null || motCle.isBlank()) {
|
||||
throw new InterpreteurException(ERREUR_VIDE);
|
||||
} else if (!motCle.equals(motCle.toLowerCase())) {
|
||||
throw new InterpreteurException(ERREUR_INCONNU);
|
||||
}
|
||||
|
||||
motCle = (Character.toUpperCase(motCle.charAt(0)))
|
||||
+ (motCle.length() > 1 ? motCle.substring(1) : "");
|
||||
|
||||
Class<?> aChercher;
|
||||
try {
|
||||
aChercher = Class.forName(CLASS_PATH_INST + motCle);
|
||||
} catch(ClassNotFoundException | NoClassDefFoundError nonCmd) {
|
||||
throw new InterpreteurException(ERREUR_INCONNU);
|
||||
}
|
||||
|
||||
return aChercher;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lancement de l'interpréteur LIR.
|
||||
|
||||
@@ -17,97 +17,75 @@ import interpreteurlir.InterpreteurException;
|
||||
*/
|
||||
public class Identificateur /* extends Variable */
|
||||
implements Comparable<Identificateur> {
|
||||
|
||||
|
||||
/** Longueur maximale d'un identificateur (ne prend pas en compte le $) */
|
||||
public static final int LONGUEUR_MAX = 24;
|
||||
|
||||
/** Nom identificateur */
|
||||
public static final int LONGUEUR_MAX = 25;
|
||||
|
||||
/** Nom identificateur */
|
||||
private String nom;
|
||||
|
||||
|
||||
/**
|
||||
* Instantiation de l'identificateur
|
||||
* @param identificateur
|
||||
*/
|
||||
public Identificateur(String identificateur) {
|
||||
super();
|
||||
if(!isIdentificateur(identificateur)) {
|
||||
throw new InterpreteurException(identificateur
|
||||
+ " n'est pas un identificateur");
|
||||
}
|
||||
|
||||
nom = identificateur;
|
||||
public Identificateur(String identificateur) {
|
||||
super();
|
||||
identificateur = identificateur.trim();
|
||||
if(!isIdentificateur(identificateur)) {
|
||||
throw new InterpreteurException(identificateur
|
||||
+ " n'est pas un identificateur");
|
||||
}
|
||||
|
||||
/**
|
||||
* Prédicat qui vérifie si une chaîne correspond à un identificateur
|
||||
* <ul>
|
||||
* <li>Longueur comprise entre 1 et 24 caractères</li>
|
||||
* <li>N'est pas une chaîne vide</li>
|
||||
* <li>N'est pas null</li>
|
||||
* </ul>
|
||||
* @param aComparer
|
||||
* @return true si le prédicat est vérifié
|
||||
* false sinon
|
||||
*/
|
||||
public static boolean isIdentificateur(String aComparer) {
|
||||
return aComparer != null
|
||||
&& aComparer.length() > 0
|
||||
&& !removeDollar(aComparer).isBlank()
|
||||
&& removeDollar(aComparer).length() <= LONGUEUR_MAX
|
||||
&& isAlphanumerique(removeDollar(aComparer));
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprime le caractère $ si il est présent en premier dans la chaîne
|
||||
* @param chaine a modifier
|
||||
* @return la chaîne modifiée
|
||||
*/
|
||||
public static String removeDollar(String chaine) {
|
||||
if(chaine.charAt(0) == '$') return chaine.substring(1);
|
||||
return chaine;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prédicat testant si une chaîne est composée de chiffre ou de lettres
|
||||
* @param aTester chaîne a tester
|
||||
* @return true si le prédicat est vérifié
|
||||
* false sinon
|
||||
*/
|
||||
public static boolean isAlphanumerique(String aTester) {
|
||||
int index;
|
||||
|
||||
for (index = 0 ;
|
||||
index < aTester.length()
|
||||
&& (isLettre(aTester.charAt(index))
|
||||
|| isChiffre(aTester.charAt(index)));
|
||||
index++)
|
||||
; // Corps vide
|
||||
|
||||
return index >= aTester.length();
|
||||
}
|
||||
|
||||
/**
|
||||
* Prédicat attestant si un caractère est une lettre
|
||||
* @param aTester caractère a tester
|
||||
* @return true si le prédicat est vérifié
|
||||
* false sinon
|
||||
*/
|
||||
public static boolean isLettre(char aTester) {
|
||||
return 'a' <= aTester && aTester <= 'z'
|
||||
|| 'A' <= aTester && aTester <= 'Z';
|
||||
}
|
||||
|
||||
/**
|
||||
* Prédicat attestant si un caractère est un chiffre
|
||||
* @param aTester caractère a tester
|
||||
* @return true si le prédicat est vérifié
|
||||
* false sinon
|
||||
*/
|
||||
public static boolean isChiffre(char aTester) {
|
||||
return '0' <= aTester && aTester <= '9';
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
nom = identificateur;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prédicat qui vérifie si une chaîne correspond à un identificateur
|
||||
* <ul>
|
||||
* <li>Longueur comprise entre 1 et 24 caractères</li>
|
||||
* <li>N'est pas une chaîne vide</li>
|
||||
* <li>N'est pas null</li>
|
||||
* </ul>
|
||||
* @param aTester
|
||||
* @return true si le prédicat est vérifié
|
||||
* false sinon
|
||||
*/
|
||||
public static boolean isIdentificateur(String aTester) {
|
||||
return aTester != null
|
||||
&& aTester.length() > 0
|
||||
&& !removeDollar(aTester).isBlank()
|
||||
&& removeDollar(aTester).length() <= LONGUEUR_MAX
|
||||
&& isAlphanumerique(removeDollar(aTester));
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprime le caractère $ si il est présent en premier dans la chaîne
|
||||
* @param chaine a modifier
|
||||
* @return la chaîne modifiée
|
||||
*/
|
||||
public static String removeDollar(String chaine) {
|
||||
if(chaine.charAt(0) == '$') return chaine.substring(1);
|
||||
return chaine;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prédicat testant si une chaîne est composée de chiffre ou de lettres
|
||||
* @param aTester chaîne a tester
|
||||
* @return true si le prédicat est vérifié
|
||||
* false sinon
|
||||
*/
|
||||
public static boolean isAlphanumerique(String aTester) {
|
||||
int index;
|
||||
for (index = 0 ;
|
||||
index < aTester.length()
|
||||
&& Character.isLetterOrDigit(aTester.charAt(index)) ;
|
||||
index++)
|
||||
; // Corps vide
|
||||
|
||||
return index >= aTester.length();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return la valeur de nom
|
||||
*/
|
||||
public String getNom() {
|
||||
@@ -125,6 +103,4 @@ implements Comparable<Identificateur> {
|
||||
public int compareTo(Identificateur aComparer) {
|
||||
return nom.compareTo(aComparer.nom);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -19,31 +19,30 @@ import interpreteurlir.InterpreteurException;
|
||||
public class IdentificateurChaine extends Identificateur {
|
||||
|
||||
/**
|
||||
* Instantiation d'identificateur de chaîne
|
||||
* @param identificateur a instancier
|
||||
* @throws InterpreteurException si l'identificateur est invalide
|
||||
*/
|
||||
public IdentificateurChaine(String identificateur) {
|
||||
super(identificateur.trim());
|
||||
|
||||
identificateur = identificateur.trim();
|
||||
if(!isIdentificateurChaine(identificateur)) {
|
||||
throw new InterpreteurException(identificateur
|
||||
+ " n'est pas un identificateur"
|
||||
+ " de chaine");
|
||||
}
|
||||
* Instantiation d'identificateur de chaîne
|
||||
* @param identificateur a instancier
|
||||
* @throws InterpreteurException si l'identificateur est invalide
|
||||
*/
|
||||
public IdentificateurChaine(String identificateur) {
|
||||
super(identificateur);
|
||||
identificateur = identificateur.trim();
|
||||
if(!isIdentificateurChaine(identificateur)) {
|
||||
throw new InterpreteurException(identificateur
|
||||
+ " n'est pas un identificateur"
|
||||
+ " de chaine");
|
||||
}
|
||||
|
||||
/**
|
||||
* Prédicat attestant la validité de l'identificateur
|
||||
* @param identificateur à tester
|
||||
* @return true si l'identificateur est bien un identificateur d'entier
|
||||
* false sinon
|
||||
*/
|
||||
private static boolean isIdentificateurChaine(String identificateur) {
|
||||
}
|
||||
|
||||
return identificateur.length() >= 2
|
||||
&& identificateur.charAt(0) == '$'
|
||||
&& isLettre(identificateur.charAt(1));
|
||||
}
|
||||
/**
|
||||
* Prédicat attestant la validité de l'identificateur
|
||||
* @param identificateur à tester
|
||||
* @return true si l'identificateur est bien un identificateur d'entier
|
||||
* false sinon
|
||||
*/
|
||||
private static boolean isIdentificateurChaine(String identificateur) {
|
||||
|
||||
return identificateur.length() >= 2
|
||||
&& identificateur.charAt(0) == '$'
|
||||
&& Character.isLetter(identificateur.charAt(1));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,9 @@ package interpreteurlir.donnees;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
|
||||
/**
|
||||
* Identificateur d'entier
|
||||
* Identificateur d'entier utilisé pour instancier des variables du même type.
|
||||
* Un identificateur entier commence par une lettre suivie d'au plus 24
|
||||
* caractère alphanumériques.
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
@@ -18,36 +20,37 @@ import interpreteurlir.InterpreteurException;
|
||||
*/
|
||||
public class IdentificateurEntier extends Identificateur {
|
||||
|
||||
/**
|
||||
* Instantiation d'identificateur d'entier
|
||||
* @param identificateur a instancier
|
||||
* @throws InterpreteurException si l'identificateur est invalide
|
||||
*/
|
||||
public IdentificateurEntier(String identificateur) {
|
||||
super(identificateur);
|
||||
|
||||
if(!isIdentificateurEntier(identificateur)) {
|
||||
throw new InterpreteurException(identificateur
|
||||
+ " n'est pas un identificateur"
|
||||
+ " d'entier");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prédicat attestant la validité de l'identificateur
|
||||
*
|
||||
* Un identificateur d'entier est valide si
|
||||
* - Il contient au maximum 24 caractères
|
||||
* - Commence obligatoirement par une lettre (majuscule ou minuscule)
|
||||
* - suivie uniquement de lettres (majuscule ou minuscule) ou de chiffres
|
||||
*
|
||||
* @param identificateur à tester
|
||||
* @return true si l'identificateur est bien un identificateur d'entier
|
||||
* false sinon
|
||||
*/
|
||||
private static boolean isIdentificateurEntier(String identificateur) {
|
||||
|
||||
return isLettre(identificateur.charAt(0))
|
||||
&& isAlphanumerique(identificateur.substring(1));
|
||||
/**
|
||||
* Instantiation de cet identificateur d'entier avec le nom spécififié
|
||||
* en argument. Lève une exception si l'identificateur n'est pas
|
||||
* valide.
|
||||
* @param identificateur a instancier
|
||||
* @throws InterpreteurException si l'identificateur est invalide
|
||||
*/
|
||||
public IdentificateurEntier(String identificateur) {
|
||||
super(identificateur);
|
||||
|
||||
if(!isIdentificateurEntier(identificateur)) {
|
||||
throw new InterpreteurException(identificateur
|
||||
+ " n'est pas un identificateur"
|
||||
+ " d'entier");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prédicat attestant la validité de l'identificateur
|
||||
*
|
||||
* Un identificateur d'entier est valide si
|
||||
* - Il contient au maximum 24 caractères
|
||||
* - Commence obligatoirement par une lettre (majuscule ou minuscule)
|
||||
* - suivie uniquement de lettres (majuscule ou minuscule) ou de chiffres
|
||||
*
|
||||
* @param aTester à tester
|
||||
* @return true si l'identificateur est bien un identificateur d'entier
|
||||
* false sinon
|
||||
*/
|
||||
private static boolean isIdentificateurEntier(String aTester) {
|
||||
return aTester.length() <= 25 && Character.isLetter(aTester.charAt(0))
|
||||
&& isAlphanumerique(aTester.substring(1));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
package interpreteurlir.donnees;
|
||||
|
||||
import interpreteurlir.donnees.litteraux.Chaine;
|
||||
import interpreteurlir.donnees.litteraux.Entier;
|
||||
import interpreteurlir.donnees.litteraux.Litteral;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
|
||||
@@ -38,7 +39,7 @@ public class Variable extends Object implements Comparable<Variable> {
|
||||
if (!isVariable(identificateur, valeur)) {
|
||||
throw new InterpreteurException("Identificateur '"
|
||||
+ identificateur.toString()
|
||||
+ "' et type de "
|
||||
+ "' et type de "
|
||||
+ valeur.toString()
|
||||
+ "incompatible.");
|
||||
}
|
||||
@@ -50,7 +51,7 @@ public class Variable extends Object implements Comparable<Variable> {
|
||||
|
||||
private static boolean isVariable(Identificateur id, Litteral valeur) {
|
||||
return id instanceof IdentificateurChaine && valeur instanceof Chaine
|
||||
/* || id instanceof IdentificateurEntier && valeur instanceof Entier */;
|
||||
|| id instanceof IdentificateurEntier && valeur instanceof Entier;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -20,7 +20,8 @@ public class Chaine extends Litteral {
|
||||
public static final int LG_MAX_CHAINE = 70;
|
||||
|
||||
/** Erreur chaîne trop longue */
|
||||
private static final String ERREUR_LG_MAX = "Longueur maximale dépassée";
|
||||
private static final String ERREUR_LG_MAX =
|
||||
"Longueur maximale d'une chaîne dépassée";
|
||||
|
||||
/** Erreur constante littéral chaîne invalide */
|
||||
private static final String ERREUR_INVALIDE =
|
||||
@@ -69,7 +70,6 @@ public class Chaine extends Litteral {
|
||||
*/
|
||||
@Override
|
||||
public int compareTo(Litteral autre) {
|
||||
// TODO Auto-generated method stub
|
||||
return this.valeur.toString().compareTo(autre.valeur.toString());
|
||||
}
|
||||
|
||||
|
||||
@@ -4,21 +4,86 @@
|
||||
*/
|
||||
package interpreteurlir.donnees.litteraux;
|
||||
|
||||
import interpreteurlir.ExecutionException;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
|
||||
/**
|
||||
* BOUCHON
|
||||
* @author
|
||||
*
|
||||
* Constante littérale de type entier
|
||||
*
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class Entier extends Litteral {
|
||||
|
||||
private static final int LONG_CH_MAX = 11;
|
||||
|
||||
/** Valeur entière minimale */
|
||||
public static int VALEUR_MIN = Integer.MIN_VALUE;
|
||||
|
||||
/** TODO commenter l'état initial
|
||||
* @param i
|
||||
/** Valeur entière minimale */
|
||||
public static int VALEUR_MAX = Integer.MAX_VALUE;
|
||||
|
||||
/**
|
||||
* Initialisation de cet entier avec une valeur passée en argument
|
||||
* @param unEntier
|
||||
* @throws InterpreteurException lorsque entier n'est pas un Entier
|
||||
*/
|
||||
public Entier(int i) {
|
||||
super(Integer.valueOf(i));
|
||||
// TODO Auto-generated constructor stub
|
||||
valeur = i;
|
||||
@SuppressWarnings("boxing")
|
||||
public Entier(int unEntier) {
|
||||
|
||||
if (! isEntier(unEntier)) {
|
||||
throw new InterpreteurException("Erreur. " + unEntier
|
||||
+ " n'est pas un entier. ");
|
||||
}
|
||||
super.valeur = unEntier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialisation de cet entier avec une valeur passée en argument
|
||||
* @param uneValeur
|
||||
*/
|
||||
public Entier(String uneValeur) {
|
||||
if (!isEntier(uneValeur)) {
|
||||
throw new InterpreteurException(uneValeur
|
||||
+ " n'est pas un nombre entier. ");
|
||||
}
|
||||
|
||||
valeur = Integer.valueOf(uneValeur);
|
||||
}
|
||||
|
||||
private static boolean isEntier(String uneValeur) {
|
||||
if (uneValeur != null && !uneValeur.isBlank()
|
||||
&& uneValeur.length() <= LONG_CH_MAX
|
||||
&& (isChiffre(uneValeur.charAt(0))
|
||||
|| uneValeur.length() > 1 && (uneValeur.charAt(0) == '-'
|
||||
|| uneValeur.charAt(0) == '+'))) {
|
||||
int i;
|
||||
for (i = 1; i < uneValeur.length() && isChiffre(uneValeur.charAt(i));
|
||||
i++)
|
||||
; /* corps vide */
|
||||
if ((uneValeur.startsWith("+214748364")
|
||||
|| uneValeur.startsWith("214748364"))
|
||||
&& uneValeur.charAt(uneValeur.length() - 1) > '7'
|
||||
|| uneValeur.startsWith("-214748364")
|
||||
&& uneValeur.charAt(uneValeur.length() - 1) > '8'
|
||||
)
|
||||
return false;
|
||||
|
||||
return i >= uneValeur.length();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean isChiffre(char caractere) {
|
||||
return '0' <= caractere && caractere <= '9';
|
||||
}
|
||||
|
||||
private static boolean isEntier(int entier) {
|
||||
return VALEUR_MIN <= entier && entier <= VALEUR_MAX;
|
||||
}
|
||||
|
||||
/* non javadoc
|
||||
@@ -28,7 +93,80 @@ public class Entier extends Litteral {
|
||||
public String toString() {
|
||||
return valeur.toString();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public Integer getValeur() {
|
||||
return (Integer) super.valeur;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare cet entier à un autre entier
|
||||
* @param autre
|
||||
* @return une valeur < 0 lorsque autre > cet entier
|
||||
* une valeur > 0 lorsque autre < cet entier
|
||||
* une valeur = 0 lorsque autre et cet entier sont égaux
|
||||
*/
|
||||
public int compareTo(Entier autre) {
|
||||
return ((Integer) valeur).compareTo(autre.getValeur());
|
||||
}
|
||||
|
||||
/**
|
||||
* Somme de deux entiers
|
||||
* @param premier Entier
|
||||
* @param second Entier
|
||||
* @return la somme des deux entiers
|
||||
*/
|
||||
public static Entier somme(Entier premier, Entier second) {
|
||||
return new Entier((int) premier.getValeur() + (int) second.getValeur());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Soustraction de deux entiers
|
||||
* @param premier Entier
|
||||
* @param second Entier
|
||||
* @return le résultat de premier auquel on soustrait second
|
||||
*/
|
||||
public static Entier soustrait(Entier premier, Entier second) {
|
||||
return new Entier((int) premier.getValeur() - (int) second.getValeur());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Multiplication de deux entiers
|
||||
* @param premier Entier
|
||||
* @param second Entier
|
||||
* @return le résultat de premier multiplié par second
|
||||
*/
|
||||
public static Entier multiplie(Entier premier, Entier second) {
|
||||
return new Entier((int) premier.getValeur() * (int) second.getValeur());
|
||||
}
|
||||
|
||||
/**
|
||||
* Division de deux entiers
|
||||
* @param premier Entier
|
||||
* @param second Entier
|
||||
* @return le quotient de la division de premier par second
|
||||
* @throws ExecutionException lorsque le diviseur est nul
|
||||
*/
|
||||
public static Entier quotient(Entier premier, Entier second) {
|
||||
if (second.compareTo(new Entier (0)) == 0) {
|
||||
throw new ExecutionException("Erreur. Division par 0. ");
|
||||
}
|
||||
return new Entier((int) premier.getValeur() / (int) second.getValeur());
|
||||
}
|
||||
|
||||
/**
|
||||
* Division de deux entiers
|
||||
* @param premier Entier
|
||||
* @param second Entier
|
||||
* @return le reste de la division de premier par second
|
||||
* @throws ExecutionException lorsque le diviseur est nul
|
||||
*/
|
||||
public static Entier reste(Entier premier, Entier second) {
|
||||
if (second.compareTo(new Entier (0)) == 0) {
|
||||
throw new ExecutionException("Erreur. Division par 0. ");
|
||||
}
|
||||
return new Entier((int) premier.getValeur() % (int) second.getValeur());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,301 @@
|
||||
/**
|
||||
* TestEntier.java 13 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.donnees.litteraux.tests;
|
||||
|
||||
import interpreteurlir.ExecutionException;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.donnees.litteraux.Entier;
|
||||
|
||||
import static interpreteurlir.donnees.litteraux.Entier.*;
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import static java.lang.Integer.MIN_VALUE;
|
||||
import static java.lang.Integer.MAX_VALUE;
|
||||
|
||||
/**
|
||||
* Tests des méthode de la classe Entier
|
||||
*
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class TestEntier {
|
||||
|
||||
/** Jeu d'entiers correctement instanciés à partir d'un entier */
|
||||
private final Entier[] ENTIERS_INT = {
|
||||
new Entier(MIN_VALUE),
|
||||
new Entier(MAX_VALUE),
|
||||
new Entier(1),
|
||||
new Entier(-4587),
|
||||
new Entier(-569),
|
||||
new Entier(-3),
|
||||
new Entier(0),
|
||||
new Entier(2),
|
||||
new Entier(78),
|
||||
new Entier(781),
|
||||
new Entier(179892),
|
||||
};
|
||||
|
||||
/** Jeu d'entiers correctement instanciés */
|
||||
private final Entier[] ENTIERS_STRING = {
|
||||
|
||||
new Entier("1"),
|
||||
new Entier("-4587"),
|
||||
new Entier("-569"),
|
||||
new Entier("-3"),
|
||||
new Entier("0"),
|
||||
new Entier("2"),
|
||||
new Entier("78"),
|
||||
new Entier("781"),
|
||||
new Entier("179892"),
|
||||
new Entier("-2147483648"),
|
||||
new Entier("2147483647"),
|
||||
};
|
||||
|
||||
/** Jeu d'integers correspondants */
|
||||
private static final int[] INT_VALIDES = {
|
||||
MIN_VALUE,
|
||||
MAX_VALUE,
|
||||
1,
|
||||
-4587,
|
||||
-569,
|
||||
-3,
|
||||
0,
|
||||
2,
|
||||
78,
|
||||
781,
|
||||
179892,
|
||||
};
|
||||
|
||||
/**
|
||||
* Test unitaire du constructeur Entier(String)
|
||||
*/
|
||||
public static void testEntierString() {
|
||||
final String[] INVALIDES = {
|
||||
null,
|
||||
"",
|
||||
" ",
|
||||
"\t",
|
||||
"\n",
|
||||
"a",
|
||||
"michel",
|
||||
"Janis Joplin",
|
||||
"(93)",
|
||||
" 78.3",
|
||||
"2147483648756",
|
||||
"2147483648",
|
||||
"+2147483648",
|
||||
"-2147483649",
|
||||
"-",
|
||||
"+",
|
||||
};
|
||||
|
||||
for (int i = 0; i < INVALIDES.length; i++) {
|
||||
try {
|
||||
new Entier(INVALIDES[i]);
|
||||
echec();
|
||||
} catch (InterpreteurException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de la méthode toString()
|
||||
*/
|
||||
public void testToString() {
|
||||
for (int i = 0; i < INT_VALIDES.length; i ++) {
|
||||
assertTrue(ENTIERS_INT[i].toString()
|
||||
.compareTo(Integer.toString(INT_VALIDES[i])) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de la méthode toCompareTo()
|
||||
*/
|
||||
public void testCompareTo() {
|
||||
final Entier REF_MIN = new Entier(MIN_VALUE);
|
||||
final Entier REF_MAX = new Entier(MAX_VALUE);
|
||||
|
||||
for (int i = 2; i < ENTIERS_INT.length; i++) {
|
||||
assertTrue(REF_MIN.compareTo(ENTIERS_INT[i]) < 0);
|
||||
assertTrue(REF_MAX.compareTo(ENTIERS_INT[i]) > 0);
|
||||
}
|
||||
|
||||
for (int i = 0; i < ENTIERS_INT.length; i++) {
|
||||
assertTrue(ENTIERS_INT[i].compareTo(new Entier(INT_VALIDES[i])) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de la méthode getValeur()
|
||||
*/
|
||||
@SuppressWarnings("boxing")
|
||||
public void testGetValeur() {
|
||||
final Integer[] ATTENDUS = {
|
||||
MIN_VALUE,
|
||||
MAX_VALUE,
|
||||
1,
|
||||
-4587,
|
||||
-569,
|
||||
-3,
|
||||
0,
|
||||
2,
|
||||
78,
|
||||
781,
|
||||
179892,
|
||||
};
|
||||
|
||||
for (int i = 0; i < ENTIERS_INT.length; i++) {
|
||||
assertTrue(ENTIERS_INT[i].getValeur().compareTo(ATTENDUS[i]) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de la méthode somme()
|
||||
*/
|
||||
public void testSomme() {
|
||||
final Entier[] ATTENDUS = {
|
||||
new Entier(MIN_VALUE + MIN_VALUE),
|
||||
new Entier(MAX_VALUE + MAX_VALUE),
|
||||
new Entier(1 + 1),
|
||||
new Entier(-9174),
|
||||
new Entier(-1138),
|
||||
new Entier(-6),
|
||||
new Entier(0),
|
||||
new Entier(4),
|
||||
new Entier(156),
|
||||
new Entier(1562),
|
||||
new Entier(359784),
|
||||
};
|
||||
|
||||
for (int i = 0; i < ENTIERS_INT.length; i++) {
|
||||
assertTrue(somme(ENTIERS_INT[i], ENTIERS_INT[i])
|
||||
.compareTo(ATTENDUS[i]) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de la méthode soustrait()
|
||||
*/
|
||||
public void testSoustrait() {
|
||||
Entier zero = new Entier(0);
|
||||
|
||||
for (int i = 0; i < ENTIERS_INT.length; i++) {
|
||||
assertTrue(soustrait(ENTIERS_INT[i], ENTIERS_INT[i])
|
||||
.compareTo(zero) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de la méthode multiplie()
|
||||
*/
|
||||
public void testMultiplie() {
|
||||
final Entier[] ATTENDUS = {
|
||||
new Entier(MIN_VALUE * MIN_VALUE),
|
||||
new Entier(MAX_VALUE * MAX_VALUE),
|
||||
new Entier(1 * 1),
|
||||
new Entier(-4587 * (-4587)),
|
||||
new Entier(-569 * (-569)),
|
||||
new Entier(-3 * (-3)),
|
||||
new Entier(0 * 0),
|
||||
new Entier(2 * 2),
|
||||
new Entier(78 * 78),
|
||||
new Entier(781 * 781),
|
||||
new Entier(179892 * 179892),
|
||||
};
|
||||
|
||||
for (int i = 0; i < ENTIERS_INT.length; i++) {
|
||||
assertTrue(multiplie(ENTIERS_INT[i], ENTIERS_INT[i])
|
||||
.compareTo(ATTENDUS[i]) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de la méthode quotient()
|
||||
*/
|
||||
public void testQuotient() {
|
||||
final Entier DIVISEUR = new Entier(2);
|
||||
|
||||
final Entier[] ATTENDUS = {
|
||||
new Entier(-1073741824),
|
||||
new Entier(1073741823),
|
||||
new Entier(0),
|
||||
new Entier(-2293),
|
||||
new Entier(-284),
|
||||
new Entier(-1),
|
||||
new Entier(0),
|
||||
new Entier(1),
|
||||
new Entier(39),
|
||||
new Entier(390),
|
||||
new Entier(89946)
|
||||
};
|
||||
|
||||
for (int i = 0; i < ENTIERS_INT.length; i++) {
|
||||
assertTrue(quotient(ENTIERS_INT[i], DIVISEUR)
|
||||
.compareTo(ATTENDUS[i]) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de la méthode quotient()
|
||||
*/
|
||||
public void testQuotientParZero() {
|
||||
final Entier DIVISEUR = new Entier(0);
|
||||
|
||||
for (int i = 0; i < ENTIERS_INT.length; i++) {
|
||||
try {
|
||||
quotient(ENTIERS_INT[i], DIVISEUR);
|
||||
echec();
|
||||
} catch (ExecutionException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de la méthode quotient()
|
||||
*/
|
||||
public void testReste() {
|
||||
final Entier DIVISEUR = new Entier(2);
|
||||
|
||||
final Entier[] ATTENDUS = {
|
||||
new Entier(0),
|
||||
new Entier(1),
|
||||
new Entier(1),
|
||||
new Entier(-1),
|
||||
new Entier(-1),
|
||||
new Entier(-1),
|
||||
new Entier(0),
|
||||
new Entier(0),
|
||||
new Entier(0),
|
||||
new Entier(1),
|
||||
new Entier(0)
|
||||
};
|
||||
|
||||
for (int i = 0; i < ENTIERS_INT.length; i++) {
|
||||
assertTrue(reste(ENTIERS_INT[i], DIVISEUR)
|
||||
.compareTo(ATTENDUS[i]) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de la méthode quotient()
|
||||
*/
|
||||
public void testResteParZero() {
|
||||
final Entier DIVISEUR = new Entier(0);
|
||||
|
||||
for (int i = 0; i < ENTIERS_INT.length; i++) {
|
||||
try {
|
||||
reste(ENTIERS_INT[i], DIVISEUR);
|
||||
echec();
|
||||
} catch (ExecutionException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ package interpreteurlir.donnees.tests;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.donnees.Identificateur;
|
||||
|
||||
/**
|
||||
@@ -43,9 +44,9 @@ public class TestIdentificateur {
|
||||
null,
|
||||
"",
|
||||
|
||||
// Fait au maximum 24 caractères
|
||||
// Fait au maximum 25 caractères
|
||||
"$jeSuisUnTresLongIdentificateur", // 30 char
|
||||
"$jeSuisUnTresLongIdentific",
|
||||
"$jeSuisUnTresLongIdentifica",
|
||||
|
||||
// Espaces
|
||||
"id 3a",
|
||||
@@ -67,7 +68,7 @@ public class TestIdentificateur {
|
||||
try {
|
||||
new Identificateur(INVALIDE[noJeu]);
|
||||
echec();
|
||||
} catch (IllegalArgumentException lancee) {
|
||||
} catch (InterpreteurException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ package interpreteurlir.donnees.tests;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.donnees.IdentificateurChaine;
|
||||
|
||||
/**
|
||||
@@ -19,7 +20,7 @@ import interpreteurlir.donnees.IdentificateurChaine;
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class TestIdentificateurChaine {
|
||||
/** Jeu d'identificateurs de chaîne correctement instanciés */
|
||||
/** Jeu d'identificateurs de chaîne correctement instanciés */
|
||||
private static IdentificateurChaine[] FIXTURE = {
|
||||
new IdentificateurChaine("$a"),
|
||||
new IdentificateurChaine("$A"),
|
||||
@@ -27,66 +28,67 @@ public class TestIdentificateurChaine {
|
||||
new IdentificateurChaine("$Alpha"),
|
||||
new IdentificateurChaine("$Alpha5"),
|
||||
new IdentificateurChaine("$jeSuisUnTresLongIdentifi")
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* Tests unitaires du constructeur IdentificateurEntier(String identificateur)
|
||||
*/
|
||||
public static void testIdentificateurChaineString() {
|
||||
final String[] INVALIDE = {
|
||||
null,
|
||||
"",
|
||||
|
||||
// Commence par une lettre
|
||||
"9alpha",
|
||||
" 5alpha",
|
||||
|
||||
// Fait au maximum 24 caractères
|
||||
"$jeSuisUnTresLongIdentificateur", // 30 char
|
||||
"$jeSuisUnTresLongIdentific",
|
||||
|
||||
// Espaces
|
||||
"id 3a",
|
||||
"$id 3a",
|
||||
" ",
|
||||
"$ ",
|
||||
|
||||
// caractères d'échapements
|
||||
"\t",
|
||||
"\n",
|
||||
"$\t",
|
||||
"$\n",
|
||||
|
||||
// , cas particulier
|
||||
"$",
|
||||
"$1"
|
||||
};
|
||||
|
||||
for(int noJeu = 0; noJeu < INVALIDE.length ; noJeu++) {
|
||||
try {
|
||||
new IdentificateurChaine(INVALIDE[noJeu]);
|
||||
echec();
|
||||
} catch (IllegalArgumentException lancee) {
|
||||
// test OK
|
||||
}
|
||||
}
|
||||
final String[] INVALIDE = {
|
||||
null,
|
||||
"",
|
||||
|
||||
// Commence par une lettre
|
||||
"9alpha",
|
||||
" 5alpha",
|
||||
|
||||
// Fait au maximum 25 caractères
|
||||
"$jeSuisUnTresLongIdentificateur", // 30 char
|
||||
"$jeSuisUnTresLongIdentifica",
|
||||
|
||||
// Espaces
|
||||
"id 3a",
|
||||
"$id 3a",
|
||||
" ",
|
||||
"$ ",
|
||||
|
||||
// caractères d'échapements
|
||||
"\t",
|
||||
"\n",
|
||||
"$\t",
|
||||
"$\n",
|
||||
|
||||
// , cas particulier
|
||||
"$",
|
||||
"$1"
|
||||
};
|
||||
|
||||
for(int noJeu = 0; noJeu < INVALIDE.length ; noJeu++) {
|
||||
try {
|
||||
new IdentificateurChaine(INVALIDE[noJeu]);
|
||||
echec();
|
||||
} catch (InterpreteurException lancee) {
|
||||
// test OK
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tests unitaires de getNom()
|
||||
*/
|
||||
public static void testGetNom() {
|
||||
final String[] NOM_VALIDES = {
|
||||
"$a",
|
||||
"$A",
|
||||
"$alpha",
|
||||
"$Alpha",
|
||||
"$Alpha5",
|
||||
"$jeSuisUnTresLongIdentifi"
|
||||
"$a",
|
||||
"$A",
|
||||
"$alpha",
|
||||
"$Alpha",
|
||||
"$Alpha5",
|
||||
"$jeSuisUnTresLongIdentifi"
|
||||
};
|
||||
|
||||
for (int noJeu = 0 ; noJeu < NOM_VALIDES.length ; noJeu++) {
|
||||
assertEquivalence(NOM_VALIDES[noJeu], FIXTURE[noJeu].getNom());
|
||||
}
|
||||
|
||||
for (int noJeu = 0 ; noJeu < NOM_VALIDES.length ; noJeu++) {
|
||||
assertEquivalence(NOM_VALIDES[noJeu], FIXTURE[noJeu].getNom());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ package interpreteurlir.donnees.tests;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.donnees.IdentificateurEntier;
|
||||
|
||||
/**
|
||||
@@ -19,65 +20,65 @@ import interpreteurlir.donnees.IdentificateurEntier;
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class TestIdentificateurEntier {
|
||||
|
||||
/** Jeu d'identificateurs d'entier correctement instanciés */
|
||||
|
||||
/** Jeu d'identificateurs d'entier correctement instanciés */
|
||||
private static IdentificateurEntier[] FIXTURE = {
|
||||
new IdentificateurEntier("a"),
|
||||
new IdentificateurEntier("A"),
|
||||
new IdentificateurEntier("alpha"),
|
||||
new IdentificateurEntier("Alpha"),
|
||||
new IdentificateurEntier("Alpha5"),
|
||||
new IdentificateurEntier("jeSuisUnTresLongIdentifi")
|
||||
};
|
||||
|
||||
new IdentificateurEntier("jeSuisUnTresLongIdentific")
|
||||
};
|
||||
|
||||
/**
|
||||
* Tests unitaires du constructeur IdentificateurEntier(String identificateur)
|
||||
*/
|
||||
public static void testIdentificateurEntierString() {
|
||||
final String[] INVALIDE = {
|
||||
// Commence par une lettre
|
||||
"9alpha",
|
||||
" 5alpha",
|
||||
"$beta",
|
||||
|
||||
// Fait au maximum 24 caractères
|
||||
"jeSuisUnTresLongIdentificateur", // 30 char
|
||||
"jeSuisUnTresLongIdentific",
|
||||
|
||||
// Espaces, caractères d'échapements, cas particulier
|
||||
"id 3a",
|
||||
"",
|
||||
" ",
|
||||
"\t",
|
||||
"\n",
|
||||
null
|
||||
};
|
||||
|
||||
for(int noJeu = 0; noJeu < INVALIDE.length ; noJeu++) {
|
||||
try {
|
||||
new IdentificateurEntier(INVALIDE[noJeu]);
|
||||
echec();
|
||||
} catch (IllegalArgumentException lancee) {
|
||||
// test OK
|
||||
}
|
||||
}
|
||||
final String[] INVALIDE = {
|
||||
// Ne commence pas par une lettre
|
||||
"9alpha",
|
||||
" 5alpha",
|
||||
"$beta",
|
||||
|
||||
// Fait plus de 25 caractères
|
||||
"jeSuisUnTresLongIdentificateur", // 30 char
|
||||
"jeSuisUnTresLongIdentifica",
|
||||
|
||||
// Espaces, caractères d'échapements, cas particulier
|
||||
"id 3a",
|
||||
"",
|
||||
" ",
|
||||
"\t",
|
||||
"\n",
|
||||
null
|
||||
};
|
||||
|
||||
for(int noJeu = 0; noJeu < INVALIDE.length ; noJeu++) {
|
||||
try {
|
||||
new IdentificateurEntier(INVALIDE[noJeu]);
|
||||
echec();
|
||||
} catch (InterpreteurException lancee) {
|
||||
// test OK
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tests unitaires de getNom()
|
||||
*/
|
||||
public static void testGetNom() {
|
||||
final String[] NOM_VALIDES = {
|
||||
"a",
|
||||
"A",
|
||||
"alpha",
|
||||
"Alpha",
|
||||
"Alpha5",
|
||||
"jeSuisUnTresLongIdentifi"
|
||||
};
|
||||
|
||||
for (int noJeu = 0 ; noJeu < NOM_VALIDES.length ; noJeu++) {
|
||||
assertEquivalence(NOM_VALIDES[noJeu], FIXTURE[noJeu].getNom());
|
||||
}
|
||||
final String[] NOM_VALIDES = {
|
||||
"a",
|
||||
"A",
|
||||
"alpha",
|
||||
"Alpha",
|
||||
"Alpha5",
|
||||
"jeSuisUnTresLongIdentific"
|
||||
};
|
||||
|
||||
for (int noJeu = 0 ; noJeu < NOM_VALIDES.length ; noJeu++) {
|
||||
assertEquivalence(NOM_VALIDES[noJeu], FIXTURE[noJeu].getNom());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,8 +4,14 @@
|
||||
*/
|
||||
package interpreteurlir.expressions;
|
||||
|
||||
import interpreteurlir.ExecutionException;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.donnees.Identificateur;
|
||||
import interpreteurlir.donnees.IdentificateurChaine;
|
||||
import interpreteurlir.donnees.IdentificateurEntier;
|
||||
import interpreteurlir.donnees.litteraux.Chaine;
|
||||
import interpreteurlir.donnees.litteraux.Entier;
|
||||
import interpreteurlir.donnees.litteraux.Litteral;
|
||||
|
||||
/**
|
||||
* Expression de type Entier qui peut être calculer.
|
||||
@@ -16,6 +22,19 @@ import interpreteurlir.donnees.litteraux.Entier;
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class ExpressionEntier extends Expression {
|
||||
|
||||
/** Liste des opérateurs possibles sur les entiers */
|
||||
private static final char[] OPERATEURS = {'+', '-', '*', '/', '%'};
|
||||
|
||||
/** message d'erreur de chaîne null ou vide */
|
||||
private static final String ERREUR_VIDE =
|
||||
"une expression ne peut être vide";
|
||||
|
||||
/** Erreur opérande attendue */
|
||||
private static final String OPERANDE_D_MANQUANT =
|
||||
" : opérande droit attendu";
|
||||
|
||||
private char operateur;
|
||||
|
||||
/**
|
||||
* Initalise une expression de type Entier avec les liens nécessaires à son
|
||||
@@ -26,7 +45,85 @@ public class ExpressionEntier extends Expression {
|
||||
*/
|
||||
public ExpressionEntier(String texteExpression) {
|
||||
super();
|
||||
// TODO
|
||||
String gauche;
|
||||
String droite;
|
||||
String aTraiter;
|
||||
|
||||
if (texteExpression == null || texteExpression.isBlank())
|
||||
throw new InterpreteurException(ERREUR_VIDE);
|
||||
|
||||
aTraiter = texteExpression.trim();
|
||||
|
||||
/* Traitement d'une éventuelle affectation */
|
||||
int indexEgal = aTraiter.indexOf('=');
|
||||
if (indexEgal > 0) {
|
||||
identificateursOperandes[INDEX_AFFECTATION] =
|
||||
new IdentificateurEntier(aTraiter.substring(0, indexEgal).trim());
|
||||
|
||||
aTraiter = aTraiter.substring(indexEgal + 1).trim();
|
||||
}
|
||||
|
||||
/* Repérage de l'opérateur et de l'opérande droite s'ils existent */
|
||||
int indexOperateur = detecterOperateur(aTraiter);
|
||||
gauche = aTraiter.trim();
|
||||
if (indexOperateur > 0) {
|
||||
operateur = aTraiter.charAt(indexOperateur);
|
||||
gauche = aTraiter.substring(0, indexOperateur).trim();
|
||||
|
||||
if (aTraiter.length() - 1 <= indexOperateur)
|
||||
throw new ExecutionException(aTraiter + OPERANDE_D_MANQUANT);
|
||||
|
||||
droite = aTraiter.substring(indexOperateur + 1).trim();
|
||||
initialiserOperande(droite, INDEX_OPERANDE_D);
|
||||
}
|
||||
|
||||
initialiserOperande(gauche, INDEX_OPERANDE_G);
|
||||
}
|
||||
|
||||
/**
|
||||
* Détecte la présence d'un opérateur dans cette expression et renvoie
|
||||
* sa position
|
||||
* @param expression dont on cherche à connaître la position de l'opérande
|
||||
* @return position sous forme d'entier, -1 si pas d'opérateur
|
||||
*/
|
||||
private static int detecterOperateur(String expression) {
|
||||
for (int i = 1 ; i < expression.length() ; i++) {
|
||||
for (char operateur : OPERATEURS)
|
||||
if (operateur == expression.charAt(i))
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialise l'opérande à sa place dans l'expression.
|
||||
* @param droite
|
||||
* @param indexOperandeD
|
||||
*/
|
||||
private void initialiserOperande(String operande, int index) {
|
||||
if (INDEX_OPERANDE_G != index && INDEX_OPERANDE_D != index) {
|
||||
throw new IllegalArgumentException("index invalide");
|
||||
}
|
||||
|
||||
if (operandeEstLitteral(operande)) {
|
||||
litterauxOperandes[index] = new Entier(operande);
|
||||
} else {
|
||||
identificateursOperandes[index] =
|
||||
new IdentificateurEntier(operande);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Détermine si l'opérande est un littéral de type entier
|
||||
* @param operande à tester
|
||||
* @return true si l'operande commence par +, - ou un chiffre,
|
||||
* false dans le cas contraire.
|
||||
*/
|
||||
private static boolean operandeEstLitteral(String operande) {
|
||||
char aTester = operande.charAt(0);
|
||||
return Character.isDigit(aTester) || aTester == '-' || aTester == '+';
|
||||
}
|
||||
|
||||
/* non javadoc
|
||||
@@ -34,17 +131,71 @@ public class ExpressionEntier extends Expression {
|
||||
*/
|
||||
@Override
|
||||
public Entier calculer() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
Entier valeur;
|
||||
super.calculer();
|
||||
|
||||
/* Détermine opérandeGauche */
|
||||
Identificateur idGauche =
|
||||
identificateursOperandes[INDEX_OPERANDE_G];
|
||||
Entier operandeG = (Entier)(idGauche == null
|
||||
? litterauxOperandes[INDEX_OPERANDE_G]
|
||||
: contexteGlobal.lireValeurVariable(idGauche));
|
||||
|
||||
/* Détermine possible operandeDroite */
|
||||
Identificateur idDroite =
|
||||
identificateursOperandes[INDEX_OPERANDE_D];
|
||||
Entier operandeD = null;
|
||||
if (idDroite != null || litterauxOperandes[INDEX_OPERANDE_D] != null) {
|
||||
operandeD = (Entier)(idDroite == null
|
||||
? litterauxOperandes[INDEX_OPERANDE_D]
|
||||
: contexteGlobal.lireValeurVariable(idDroite));
|
||||
}
|
||||
|
||||
/* Calcul de la valeur */
|
||||
valeur = operandeD == null
|
||||
? operandeG
|
||||
: switch (operateur) {
|
||||
case '+' -> Entier.somme(operandeG, operandeD);
|
||||
case '-' -> Entier.soustrait(operandeG, operandeD);
|
||||
case '*' -> Entier.multiplie(operandeG, operandeD);
|
||||
case '/' -> Entier.quotient(operandeG, operandeD);
|
||||
case '%' -> Entier.reste(operandeG, operandeD);
|
||||
default -> operandeG;
|
||||
};
|
||||
|
||||
/* Affectation si nécessaire */
|
||||
if (identificateursOperandes[INDEX_AFFECTATION] != null) {
|
||||
contexteGlobal.ajouterVariable(
|
||||
identificateursOperandes[INDEX_AFFECTATION], valeur);
|
||||
}
|
||||
|
||||
return valeur;
|
||||
}
|
||||
|
||||
/* non javadoc
|
||||
* @see interpreteurlir.expressions.Expression#toString()
|
||||
/*
|
||||
* Non - javadoc
|
||||
* @see java.lang.Object#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
// TODO Auto-generated method stub
|
||||
return "ExpressionEntier#toString() BOUCHON";
|
||||
StringBuilder resultat = new StringBuilder("");
|
||||
|
||||
Identificateur affect = identificateursOperandes[INDEX_AFFECTATION];
|
||||
resultat.append(affect == null ? "" : (affect.toString() + " = "));
|
||||
|
||||
Identificateur gaucheId = identificateursOperandes[INDEX_OPERANDE_G];
|
||||
Litteral gaucheLitteral = litterauxOperandes[INDEX_OPERANDE_G];
|
||||
resultat.append(gaucheId != null ? gaucheId.toString()
|
||||
: gaucheLitteral.toString());
|
||||
|
||||
Identificateur droiteId = identificateursOperandes[INDEX_OPERANDE_D];
|
||||
Litteral droiteLitteral = litterauxOperandes[INDEX_OPERANDE_D];
|
||||
if (droiteId != null || droiteLitteral != null) {
|
||||
resultat.append(" " + operateur + " ");
|
||||
resultat.append(droiteId != null ? droiteId.toString()
|
||||
: droiteLitteral.toString());
|
||||
}
|
||||
|
||||
return resultat.toString();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -112,7 +112,6 @@ public class TestExpression {
|
||||
"entier = 78 ",
|
||||
" nombre= nombre + 78",
|
||||
" entier =78 *2"
|
||||
// TODO expressionEntier
|
||||
};
|
||||
|
||||
final int INDEX_DEBUT_ENTIER = 12;
|
||||
|
||||
@@ -4,10 +4,21 @@
|
||||
*/
|
||||
package interpreteurlir.expressions.tests;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.ExecutionException;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.donnees.Identificateur;
|
||||
import interpreteurlir.donnees.IdentificateurChaine;
|
||||
import interpreteurlir.donnees.IdentificateurEntier;
|
||||
import interpreteurlir.donnees.litteraux.Chaine;
|
||||
import interpreteurlir.donnees.litteraux.Entier;
|
||||
import interpreteurlir.expressions.Expression;
|
||||
import interpreteurlir.expressions.ExpressionEntier;
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link Expression}
|
||||
* Tests unitaires de {@link ExpressionEntier}
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
@@ -15,5 +26,135 @@ import interpreteurlir.expressions.Expression;
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class TestExpressionEntier {
|
||||
|
||||
|
||||
/* jeu de test d'expressions entières valides */
|
||||
private static final ExpressionEntier[] FIXTURE = {
|
||||
new ExpressionEntier("entier = 2 + 3"),
|
||||
new ExpressionEntier("entier=2*3"),
|
||||
new ExpressionEntier("bob= marcel-2"),
|
||||
new ExpressionEntier("45 +14"),
|
||||
new ExpressionEntier("45 * -2"),
|
||||
new ExpressionEntier("affectation = 64"),
|
||||
new ExpressionEntier("affectation= marcel"),
|
||||
new ExpressionEntier("entier = j34n + pi3rr3"),
|
||||
new ExpressionEntier(" entier = j34n"),
|
||||
new ExpressionEntier(" 42"),
|
||||
new ExpressionEntier("rep0ns3= 42"),
|
||||
new ExpressionEntier("division = 12/0"),
|
||||
new ExpressionEntier("modulo = 12%0")
|
||||
};
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link ExpressionEntier#ExpressionEntier(String)}
|
||||
*/
|
||||
public static void testExpressionEntierString() {
|
||||
final String[] INVALIDES = {
|
||||
/* identificateurs non valides */
|
||||
"$bob =2",
|
||||
"j@ck= 2+3",
|
||||
"@75S= #michel",
|
||||
"unidentificateurbeaucouptroplong = 0",
|
||||
"truc.length = 9000",
|
||||
|
||||
/* types non compatibles */
|
||||
"resultat = \"50\"",
|
||||
"resultat = 30.2",
|
||||
"resultat = 10 / 2.0",
|
||||
|
||||
/* Nombre incorrect d'opérandes */
|
||||
"resultat = 10 * 5 + 3",
|
||||
"famille = marcel + jean + albert",
|
||||
"divisionRatee = 5 /",
|
||||
"ratee=*7",
|
||||
};
|
||||
|
||||
for (String invalide : INVALIDES) {
|
||||
try {
|
||||
new ExpressionEntier(invalide);
|
||||
echec();
|
||||
|
||||
} catch(InterpreteurException | ExecutionException lancee) {
|
||||
// Empty body
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link ExpressionEntier#calculer()}
|
||||
*/
|
||||
public static void testCalculer() {
|
||||
final Entier[] RESULTATS_ATTENDUS = {
|
||||
new Entier(5),
|
||||
new Entier(6),
|
||||
new Entier(-2),
|
||||
new Entier(59),
|
||||
new Entier(-90),
|
||||
new Entier(64),
|
||||
new Entier(0),
|
||||
new Entier(3),
|
||||
new Entier(1),
|
||||
new Entier(42),
|
||||
new Entier(42),
|
||||
new Entier(0), // Bouchon
|
||||
new Entier(0) // Bouchon
|
||||
};
|
||||
|
||||
/* Exception levée si contexte non référencé */
|
||||
try {
|
||||
FIXTURE[0].calculer();
|
||||
echec();
|
||||
} catch (RuntimeException e) {
|
||||
// vide
|
||||
}
|
||||
|
||||
/*
|
||||
* Création contexte (avec marcel = 0 j34n = 1 et pi3rr3 = 2) et
|
||||
* référencement
|
||||
*/
|
||||
Contexte contexteGlobal = new Contexte();
|
||||
contexteGlobal.ajouterVariable(new IdentificateurEntier("marcel"),
|
||||
new Entier(0));
|
||||
contexteGlobal.ajouterVariable(new IdentificateurEntier("j34n"),
|
||||
new Entier(1));
|
||||
contexteGlobal.ajouterVariable(new IdentificateurEntier("pi3rr3"),
|
||||
new Entier(2));
|
||||
Expression.referencerContexte(contexteGlobal);
|
||||
System.out.print("\tContexte initial : \n" + contexteGlobal);
|
||||
|
||||
for (int i = 0 ; i < FIXTURE.length ; i++) {
|
||||
try {
|
||||
System.out.println("\nCalcul de : " + FIXTURE[i]);
|
||||
assertTrue(FIXTURE[i].calculer()
|
||||
.compareTo(RESULTATS_ATTENDUS[i]) == 0);
|
||||
System.out.println("\tContexte : \n" + contexteGlobal);
|
||||
} catch (ExecutionException divzero) {
|
||||
System.out.println("Attention Division par 0");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* test de toString()
|
||||
*/
|
||||
public static void testToString() {
|
||||
final String[] ATTENDUES = {
|
||||
"entier = 2 + 3",
|
||||
"entier = 2 * 3",
|
||||
"bob = marcel - 2",
|
||||
"45 + 14",
|
||||
"45 * -2",
|
||||
"affectation = 64",
|
||||
"affectation = marcel",
|
||||
"entier = j34n + pi3rr3",
|
||||
"entier = j34n",
|
||||
"42",
|
||||
"rep0ns3 = 42",
|
||||
"division = 12 / 0",
|
||||
"modulo = 12 % 0"
|
||||
};
|
||||
|
||||
for (int i = 0 ; i < FIXTURE.length ; i++) {
|
||||
assertTrue(FIXTURE[i].toString().equals(ATTENDUES[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ package interpreteurlir.motscles;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.programmes.Programme;
|
||||
|
||||
/**
|
||||
* Une commande (générale) n'a aucun comportement.
|
||||
@@ -20,6 +21,9 @@ import interpreteurlir.InterpreteurException;
|
||||
*/
|
||||
public class Commande {
|
||||
|
||||
/** référence du programme global */
|
||||
protected static Programme programmeGlobal;
|
||||
|
||||
/** référence du contexte possiblement manié directement par la commande */
|
||||
protected Contexte contexte;
|
||||
|
||||
@@ -52,6 +56,27 @@ public class Commande {
|
||||
// pas de comportement pour une Commande générale
|
||||
return false; // pas de feedback
|
||||
}
|
||||
|
||||
/**
|
||||
* Référence le programme pour accéder et modifier le programme chargé.
|
||||
* Le référencement vaut pour toutes les commandes/instructions
|
||||
* et est possible une unique fois.
|
||||
* @param aReferencer référence du programme global
|
||||
* @return <ul><li>true si le programme a pu être référencé</li>
|
||||
* <li>true si aReferencer == programme déjà référencer</li>
|
||||
* <li>false si aReferencer est null</li>
|
||||
* <li>false si un programme est déjà référencer</li>
|
||||
* </ul>
|
||||
*/
|
||||
public static boolean referencerProgramme(Programme aReferencer) {
|
||||
if (aReferencer != null
|
||||
&& ( programmeGlobal == null
|
||||
|| aReferencer == programmeGlobal)) {
|
||||
programmeGlobal = aReferencer;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -20,8 +20,6 @@ import interpreteurlir.InterpreteurException;
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class CommandeDebut extends Commande {
|
||||
|
||||
// TODO adapter la classe aux programmes
|
||||
|
||||
/**
|
||||
* Initialise une commande debut qui est sans arguments
|
||||
@@ -50,6 +48,7 @@ public class CommandeDebut extends Commande {
|
||||
@Override
|
||||
public boolean executer() {
|
||||
contexte.raz();
|
||||
programmeGlobal.raz();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
/**
|
||||
* CommandeEfface.java 16 mai 2021
|
||||
* IUT info1 2020-2021, pas de copyright, aucun droit
|
||||
*/
|
||||
package interpreteurlir.motscles;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.programmes.Etiquette;
|
||||
|
||||
/**
|
||||
* Instruction permettant d'effacer une, plusieurs, ou l'intégralité des lignes
|
||||
* de code d'un programme écrit dans l'interpréteur LIR.
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heïa Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class CommandeEfface extends Commande {
|
||||
|
||||
/** Erreur nombre incorrect d'arguments */
|
||||
private static final String ERREUR_NB_ARGS =
|
||||
"nombre d'arguments incorrect. Syntaxe attendue ==> <debut>:<fin>";
|
||||
|
||||
/** Plage de suppression des lignes de code */
|
||||
private Etiquette[] plageSuppression;
|
||||
|
||||
/**
|
||||
* Initialise cette InstructionEfface à partir des arguments et du
|
||||
* contexte passés en paramètres. Modifie le programme global référencé
|
||||
* par l'analyseur.
|
||||
* @param arguments lignes à effacer (tout le programme si vide)
|
||||
* @param contexte
|
||||
*/
|
||||
public CommandeEfface(String arguments, Contexte contexte) {
|
||||
super(arguments, contexte);
|
||||
plageSuppression = analyserArguments(arguments);
|
||||
}
|
||||
|
||||
/*
|
||||
* Non - javadoc
|
||||
* @see interpreteurlir.motscles.instructions.Instruction#executer()
|
||||
*/
|
||||
@Override
|
||||
public boolean executer() {
|
||||
programmeGlobal.effacer(plageSuppression[0], plageSuppression[1]);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Découpe la chaîne argument en une plage de deux étiquettes
|
||||
* @param aDecouper chaîne à analyser
|
||||
* @return la plage de lignes de code à supprimer sous forme de tableau
|
||||
* d'étiquettes.
|
||||
*/
|
||||
private static Etiquette[] analyserArguments(String aDecouper) {
|
||||
String[] valeurs = aDecouper.split(":");
|
||||
if (valeurs.length != 2)
|
||||
throw new InterpreteurException(ERREUR_NB_ARGS);
|
||||
|
||||
Etiquette[] aRenvoyer = {
|
||||
new Etiquette(valeurs[0]),
|
||||
new Etiquette(valeurs[1])
|
||||
};
|
||||
|
||||
return aRenvoyer;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
/**
|
||||
* CommandeLance.java 15 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.motscles;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.programmes.Programme;
|
||||
import interpreteurlir.programmes.Etiquette;
|
||||
|
||||
/**
|
||||
* Démarre l'exécution d'un programme à partir de son plus petit numéro
|
||||
* d'étiquette.
|
||||
*
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class CommandeLance extends Commande {
|
||||
|
||||
private Etiquette debutLancer;
|
||||
|
||||
/**
|
||||
* Initialise la commande lance avec ses arguments et le contexte
|
||||
* @param arguments
|
||||
* @param contexte
|
||||
* @throws InterpreteurException en cas d'erreur de syntaxe à
|
||||
* la création d'une étiquette
|
||||
*/
|
||||
public CommandeLance(String arguments, Contexte contexte) {
|
||||
super(arguments, contexte);
|
||||
|
||||
if (arguments.isBlank()) {
|
||||
debutLancer = null;
|
||||
} else {
|
||||
debutLancer = new Etiquette(arguments);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Exécution de la commande :
|
||||
* <ul><li>Lance le programme à partir de l'étiquette la plus
|
||||
* petite s'il n'y a pas d'argument</li>
|
||||
* <li>Lance le programme à partir de l'étiquette passée
|
||||
* en paramètre</li>
|
||||
* </ul>
|
||||
* @return true car un feedback est affiché
|
||||
* @throws RuntimeException si un programme n'est pas référencé
|
||||
* dans la classe {@link Commande}
|
||||
*/
|
||||
public boolean executer() {
|
||||
|
||||
final String ERREUR = "erreur exécution";
|
||||
|
||||
if (programmeGlobal == null) {
|
||||
throw new RuntimeException(ERREUR);
|
||||
}
|
||||
|
||||
if (debutLancer == null) {
|
||||
programmeGlobal.lancer();
|
||||
} else {
|
||||
programmeGlobal.lancer(debutLancer);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
/**
|
||||
* CommandeListe.java 15 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.motscles;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.programmes.Etiquette;
|
||||
import static interpreteurlir.programmes.Etiquette.*;
|
||||
|
||||
/**
|
||||
* Commande liste affiche les lignes de codes du programme,
|
||||
* soit dans leur intégralité, soit dans un intervalle donné
|
||||
*
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class CommandeListe extends Commande {
|
||||
|
||||
private Etiquette debut;
|
||||
|
||||
private Etiquette fin;
|
||||
|
||||
/**
|
||||
* Initialise la commande liste avec ses arguments et le contexte
|
||||
*
|
||||
* @param arguments
|
||||
* @param contexte
|
||||
* @throws InterpreteurException en cas d'erreur de syntaxe lors
|
||||
* de l'instanciation des étiquettes
|
||||
*/
|
||||
public CommandeListe(String arguments, Contexte contexte) {
|
||||
super(arguments, contexte);
|
||||
|
||||
final int ARGS_DEBUT = 0;
|
||||
final int ARGS_FIN = 1;
|
||||
|
||||
final String ERREUR_INTERVALLE = "usage <etiquette debut>:"
|
||||
+ "<etiquette fin> avec "
|
||||
+ "<etiquette debut> < "
|
||||
+ "<etiquette fin> ";
|
||||
|
||||
if (arguments.isBlank()) {
|
||||
debut = new Etiquette(VALEUR_ETIQUETTE_MIN);
|
||||
fin = new Etiquette(VALEUR_ETIQUETTE_MAX);
|
||||
} else {
|
||||
String[] decoupage = arguments.split(":");
|
||||
|
||||
if (decoupage.length < 2) {
|
||||
throw new InterpreteurException(ERREUR_INTERVALLE);
|
||||
}
|
||||
|
||||
debut = new Etiquette(decoupage[ARGS_DEBUT]);
|
||||
fin = new Etiquette(decoupage[ARGS_FIN]);
|
||||
|
||||
if (debut.compareTo(fin) > 0) {
|
||||
throw new InterpreteurException(ERREUR_INTERVALLE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Exécution de la commande :
|
||||
* <ul><li>Affiche les lignes de code du programme entre l'étiquette
|
||||
* de début et celle de fin passées en argument</li>
|
||||
* <li>Affiche l'intégralité des lignes de code du programme</li>
|
||||
* </ul>
|
||||
* @return true car un feedback est affiché
|
||||
* @throws RuntimeException si un programme n'est pas référencé
|
||||
* dans la classe {@link Commande}
|
||||
*/
|
||||
public boolean executer() {
|
||||
|
||||
final String ERREUR = "erreur exécution";
|
||||
|
||||
if (programmeGlobal == null) {
|
||||
throw new RuntimeException(ERREUR);
|
||||
}
|
||||
if (debut != null || fin != null) {
|
||||
System.out.print(programmeGlobal.listeBornee(debut, fin));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
/**
|
||||
* InstructionAffiche.java 13 mai 2021
|
||||
* IUT info1 2020-2021, pas de copyright, aucun droit
|
||||
*/
|
||||
package interpreteurlir.motscles.instructions;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.expressions.Expression;
|
||||
import interpreteurlir.expressions.ExpressionChaine;
|
||||
|
||||
/**
|
||||
* Affiche sur la sortie standard une expression passée en argument. Cette
|
||||
* expression ne doit pas contenir d'affectation. Si aucune expression n'est
|
||||
* passée en argument, effectue un retour à la ligne.
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heïa Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class InstructionAffiche extends Instruction {
|
||||
|
||||
/** Erreur d'affectation illegale */
|
||||
private static final String AFFECTATION_ILLEGALE = "affectation illegale";
|
||||
|
||||
/**
|
||||
* Initialise cette InstructionAffiche à partir de son contexte global
|
||||
* d'exécution et de l'expression passée en argument. Lève une exception
|
||||
* si cette expression contient une affectation.
|
||||
* @param arguments contenant l'expression dont le résultat doit être
|
||||
* affiché.
|
||||
* @param contexte global de la session d'interpreteurlir
|
||||
* @throws InterpreteurException si la chaîne arguments contient un signe
|
||||
* égal en dehors d'un littéral de chaîne de caractères.
|
||||
*/
|
||||
public InstructionAffiche(String arguments, Contexte contexte) {
|
||||
super(arguments, contexte);
|
||||
|
||||
if (ExpressionChaine.indexOperateur(arguments, '=') >= 0)
|
||||
throw new InterpreteurException(AFFECTATION_ILLEGALE);
|
||||
|
||||
aExecuter = arguments.isBlank()
|
||||
? null
|
||||
: Expression.determinerTypeExpression(arguments.trim());
|
||||
}
|
||||
|
||||
/*
|
||||
* Non - javadoc
|
||||
* @see interpreteurlir.motscles.instructions.Instruction#executer()
|
||||
*/
|
||||
@Override
|
||||
public boolean executer() {
|
||||
if (aExecuter == null) {
|
||||
System.out.println();
|
||||
} else {
|
||||
System.out.print(aExecuter.calculer().getValeur());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Non - javadoc
|
||||
* @see interpreteurlir.motscles.instructions.Instruction#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return "affiche" + (aExecuter == null ? ""
|
||||
: " " + aExecuter.toString());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
/**
|
||||
* InstructionEntre.java 13 mai 2021
|
||||
* IUT Rodez info1 2020-2021, pas de copyright, aucun droit
|
||||
*/
|
||||
package interpreteurlir.motscles.instructions;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.ExecutionException;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.donnees.*;
|
||||
import interpreteurlir.donnees.litteraux.Chaine;
|
||||
import interpreteurlir.donnees.litteraux.Entier;
|
||||
|
||||
import java.util.Scanner;
|
||||
|
||||
/**
|
||||
* Instruction qui attend que l'utilisateur
|
||||
* entre une valeur sur l'entrée standard du type de l'identificateur argument
|
||||
* cette valeur sera affectée dans une variable ayant cet
|
||||
* identificateur dans le contexte.
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class InstructionEntre extends Instruction {
|
||||
|
||||
/**
|
||||
* Identificateur à affecter à partir de la valeur
|
||||
* saisie à l'execution de cette instruction
|
||||
*/
|
||||
private Identificateur id;
|
||||
|
||||
/**
|
||||
* Initialise une instruction entre avec un
|
||||
* identificateur chaine ou entier en argument
|
||||
* @param arguments représentation texte de l'indentificateur
|
||||
* @param contexte contexte pour l'enregistrement de la valeur
|
||||
* saisie à l'execution
|
||||
* @throws InterpreteurException si argument n'est pas
|
||||
* un identificateur valide
|
||||
* @throws NullPointerException si contexte ou argument est null
|
||||
*/
|
||||
public InstructionEntre(String arguments, Contexte contexte) {
|
||||
super(arguments, contexte);
|
||||
final String ERREUR_ARG = "Entre attend un identificateur en argument";
|
||||
|
||||
if (arguments.isBlank()) {
|
||||
throw new InterpreteurException(ERREUR_ARG);
|
||||
}
|
||||
|
||||
if (arguments.indexOf("$") >= 0) {
|
||||
id = new IdentificateurChaine(arguments.trim());
|
||||
} else {
|
||||
id = new IdentificateurEntier(arguments.trim());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Execution de l'instruction :
|
||||
* L'utilisateur saisi une valeur sur l'entrée standard qui sera affectée
|
||||
* à une variable dans le contexte ayant comme identificateur celui
|
||||
* de l'instruction si le type est compatible
|
||||
* @return false car aucun feedback affiché directement
|
||||
* @throws ExecutionException si la valeur saisie n'est pas compatible
|
||||
* avec le type de l'identificateur de l'instruction
|
||||
*/
|
||||
public boolean executer() {
|
||||
|
||||
final String MESSAGE_ERREUR_TYPE = "Le type saisi ne correspond"
|
||||
+ " pas au type demandé";
|
||||
Scanner entree = new Scanner(System.in);
|
||||
|
||||
String valeurSaisie = entree.nextLine();
|
||||
|
||||
try {
|
||||
if (id instanceof IdentificateurEntier) {
|
||||
contexte.ajouterVariable(id, new Entier(valeurSaisie.trim()));
|
||||
} else {
|
||||
contexte.ajouterVariable(id, new Chaine("\""
|
||||
+ valeurSaisie + "\""));
|
||||
}
|
||||
} catch (InterpreteurException lancee) {
|
||||
throw new ExecutionException(MESSAGE_ERREUR_TYPE);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* non javadoc
|
||||
* @see java.lang.Object#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return "entre " + id;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
/**
|
||||
* InstructionProcedure.java 15 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.motscles.instructions;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.ExecutionException;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.programmes.Etiquette;
|
||||
|
||||
/**
|
||||
* Instruction qui transfère l'exécution au numéro d'étiquette spécifié
|
||||
* et reprendra en séquence lorsque la procédure sera terminée
|
||||
* (instruction retour)
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*
|
||||
*/
|
||||
public class InstructionProcedure extends Instruction {
|
||||
|
||||
/** Etiquette désignant le début de la procedure à exécuter */
|
||||
private Etiquette debutProcedure;
|
||||
|
||||
/**
|
||||
* Initialise une procédure avec une étiquette en argument.
|
||||
* @param arguments Représentation texte d'une étiquette
|
||||
* @param contexte Contexte de la session de l'interpreteur LIR
|
||||
* @throws InterpreteurException Si un arguments ne corresponds
|
||||
* pas a une étiquette valide
|
||||
* @throws NullPointerException Si contexte ou argument est null
|
||||
*/
|
||||
public InstructionProcedure(String arguments, Contexte contexte) {
|
||||
super(arguments, contexte);
|
||||
|
||||
final String ERREUR_ARG = "procedure attend une étiquette en argument";
|
||||
|
||||
if(arguments.isBlank()) {
|
||||
throw new InterpreteurException(ERREUR_ARG);
|
||||
}
|
||||
|
||||
debutProcedure = new Etiquette(arguments);
|
||||
}
|
||||
|
||||
/* non javadoc
|
||||
* @see interpreteurlir.motscles.instructions.Instruction#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return "procedure " + debutProcedure;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execution de l'instruction :
|
||||
* Appel d'une procedure située à l'étiquette de l'instruction.
|
||||
* L'appel s'empile sur le contexte appellant pour ce qui est du
|
||||
* compteur ordinal.
|
||||
* @return false car aucun feedback affiché directement
|
||||
* @throws RuntimeException si un programme n'est pas référencé en membre
|
||||
* de classe de Commande.
|
||||
*/
|
||||
public boolean executer() {
|
||||
|
||||
final String ERREUR_REFERENCEMENT = "Le programme doit être référencé "
|
||||
+ "dans la classe commande";
|
||||
|
||||
if (programmeGlobal == null) {
|
||||
throw new RuntimeException(ERREUR_REFERENCEMENT);
|
||||
}
|
||||
|
||||
programmeGlobal.appelProcedure(debutProcedure);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
/**
|
||||
* InstructionRetour.java 15 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.motscles.instructions;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.ExecutionException;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
|
||||
/**
|
||||
* Instruction qui transfère l'exécution au numéro d'étiquette
|
||||
* appelant (continue en séquence après l'instruction procedure qui à généré
|
||||
* l'appel).
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*
|
||||
*/
|
||||
public class InstructionRetour extends Instruction {
|
||||
|
||||
/**
|
||||
* Initialise une procedure qui est sans argument
|
||||
* @param arguments Argument de retour soit une chaine blanche ou vide
|
||||
* @param contexte Contexte de la session de l'interpreteur LIR
|
||||
* @throws InterpreteurException Si arguments n'est pas une chaîne blanche
|
||||
* ou vide.
|
||||
* @throws NullPointerException Si contexte ou argument est null
|
||||
*/
|
||||
public InstructionRetour(String arguments, Contexte contexte) {
|
||||
super(arguments, contexte);
|
||||
|
||||
final String ERREUR_ARG = "L'instruction retour n'a pas d'arguments";
|
||||
|
||||
if (!arguments.isBlank()) {
|
||||
throw new InterpreteurException(ERREUR_ARG);
|
||||
}
|
||||
}
|
||||
|
||||
/* non javadoc
|
||||
* @see interpreteurlir.motscles.instructions.Instruction#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return "retour";
|
||||
}
|
||||
|
||||
/**
|
||||
* Execution de l'instruction :
|
||||
* Retour d'une procédure en séquence après l'instruction procédure
|
||||
* appelante.
|
||||
* @return false car aucun feedback affiché directement
|
||||
* @throws RuntimeException si un programme n'est pas référencé en membre
|
||||
* de classe de Commande.
|
||||
* @throws ExecutionException Lorsque retour est exécuté alors qu'aucune
|
||||
* Instruction procedure n'a été exécutée avant.
|
||||
*/
|
||||
public boolean executer() {
|
||||
|
||||
final String ERREUR_REFERENCEMENT = "Le programme doit être référencé "
|
||||
+ "dans la classe commande";
|
||||
|
||||
if (programmeGlobal == null) {
|
||||
throw new RuntimeException(ERREUR_REFERENCEMENT);
|
||||
}
|
||||
|
||||
programmeGlobal.retourProcedure();
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
/**
|
||||
* InstructionStop.java 16 mai 2021
|
||||
* IUT info1 2020-2021, pas de copyright, aucun droit
|
||||
*/
|
||||
package interpreteurlir.motscles.instructions;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.programmes.Programme;
|
||||
|
||||
/**
|
||||
* Instruction stop servant à marquer la fin d'un programme de l'interpréteur
|
||||
* LIR. Aucune ligne de code portant une étiquette supérieure ne sera donc lue.
|
||||
* L'usage de cette instruction en ligne de commande directe n'a aucun effet.
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heïa Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class InstructionStop extends Instruction {
|
||||
|
||||
/** Message d'erreur si instruction passée avec des arguments */
|
||||
private static final String ERREUR_ARGUMENTS =
|
||||
"l'instruction stop n'accepte pas d'arguments";
|
||||
/**
|
||||
* Initialise cette instruction stop à partir des arguments, du contexte
|
||||
* et du programme passés en paramètres. Cette instruction ne modifie que
|
||||
* le programme. Si arguments n'est pas vide, une exception sera levée.
|
||||
* @param arguments doit être vide
|
||||
* @param contexte global de la session de l'interpréteur
|
||||
* @throws InterpreteurException si arguments non vide
|
||||
*/
|
||||
public InstructionStop(String arguments, Contexte contexte) {
|
||||
super(arguments, contexte);
|
||||
|
||||
if (!arguments.isBlank())
|
||||
throw new InterpreteurException(ERREUR_ARGUMENTS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Non - javadoc
|
||||
* @see interpreteurlir.motscles.instructions.Instruction#executer()
|
||||
*/
|
||||
@Override
|
||||
public boolean executer() {
|
||||
|
||||
final String ERREUR_REFERENCEMENT = "Le programme doit être référencé "
|
||||
+ "dans la classe commande";
|
||||
|
||||
if (programmeGlobal == null) {
|
||||
throw new RuntimeException(ERREUR_REFERENCEMENT);
|
||||
}
|
||||
|
||||
programmeGlobal.stop();
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Non - javadoc
|
||||
* @see interpreteurlir.motscles.instructions.Instruction#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return "stop";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* InstructionVaen.java 15 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.motscles.instructions;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.programmes.Etiquette;
|
||||
|
||||
/**
|
||||
* Instruction qui transfère l'execution au numéro étiquette spécifié.
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*
|
||||
*/
|
||||
public class InstructionVaen extends Instruction {
|
||||
|
||||
/** Etiquette à laquelle le programme doit se rendre */
|
||||
private Etiquette etiquette;
|
||||
|
||||
/**
|
||||
* Initialise un saut de ligne avec une étiquette en argument.
|
||||
* @param arguments Etiquette à laquelle le programme doit se rendre
|
||||
* @param contexte Contexte de la session de l'interpreteur LIR
|
||||
*/
|
||||
public InstructionVaen(String arguments, Contexte contexte) {
|
||||
super(arguments, contexte);
|
||||
|
||||
final String ERREUR_ARG = "vaen attend une étiquette en argument";
|
||||
|
||||
if (arguments.isBlank()) {
|
||||
throw new InterpreteurException(ERREUR_ARG);
|
||||
}
|
||||
|
||||
this.etiquette = new Etiquette(arguments);
|
||||
}
|
||||
|
||||
/* non javadoc -
|
||||
* @see interpreteurlir.motscles.instructions.Instruction#toString()
|
||||
* */
|
||||
@Override
|
||||
public String toString() {
|
||||
return "vaen " + etiquette;
|
||||
}
|
||||
|
||||
/**
|
||||
* Execution de l'instruction :
|
||||
* Realise un saut a l'étiquette spécifiée.
|
||||
* L'appel s'empile sur le contexte appellant pour ce qui est du
|
||||
* compteur ordinal.
|
||||
* @return false car aucun feedback affiché directement
|
||||
* @throws RuntimeException si un programme n'est pas référencé en membre
|
||||
* de classe de Commande.
|
||||
*/
|
||||
public boolean executer() {
|
||||
|
||||
final String ERREUR = "erreur exécution";
|
||||
|
||||
if (programmeGlobal == null) {
|
||||
throw new RuntimeException(ERREUR);
|
||||
}
|
||||
|
||||
programmeGlobal.vaen(etiquette);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -23,7 +23,8 @@ import interpreteurlir.expressions.ExpressionChaine;
|
||||
public class InstructionVar extends Instruction {
|
||||
|
||||
/**
|
||||
* TODO comment initial state of the object
|
||||
* Initialise une instruction var à partir de arguments.
|
||||
* Le contexte sera modifié à l'exécution dde l'instruction.
|
||||
* @param arguments expression à exécuter
|
||||
* @param contexte global de l'interpréteur
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
/**
|
||||
* TestInstructionAffiche.java 13 mai 2021
|
||||
* IUT info1 2020-2021, pas de copyright, aucun droit
|
||||
*/
|
||||
package interpreteurlir.motscles.instructions.tests;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.ExecutionException;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.expressions.Expression;
|
||||
import interpreteurlir.motscles.instructions.InstructionAffiche;
|
||||
|
||||
|
||||
/**
|
||||
* Tests unitaires de l'instruction affiche, avec et sans arguments.
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heïa Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class TestInstructionAffiche {
|
||||
|
||||
/** Contexte d'execution pour jeux de tests */
|
||||
private static final Contexte CONTEXTE_GBL = new Contexte();
|
||||
|
||||
/** Jeu données valides pour test de InstructionAffiche */
|
||||
private static final InstructionAffiche[] FIXTURE = {
|
||||
new InstructionAffiche("", CONTEXTE_GBL),
|
||||
new InstructionAffiche(" ", CONTEXTE_GBL),
|
||||
new InstructionAffiche("\"Hello World !!!\"", CONTEXTE_GBL),
|
||||
new InstructionAffiche("3 + 3", CONTEXTE_GBL),
|
||||
new InstructionAffiche("marcel", CONTEXTE_GBL),
|
||||
new InstructionAffiche("marcel + -3", CONTEXTE_GBL),
|
||||
new InstructionAffiche("$fraysse", CONTEXTE_GBL),
|
||||
new InstructionAffiche("$sanchis + \"coucou\"", CONTEXTE_GBL),
|
||||
new InstructionAffiche("\"300000000000000000 ça passe\"", CONTEXTE_GBL)
|
||||
};
|
||||
|
||||
/**
|
||||
* Tests unitaires de
|
||||
* {@link InstructionAffiche#InstructionAffiche(String, Contexte)}
|
||||
*/
|
||||
public static void testInstructionAffiche() {
|
||||
|
||||
final String[] INVALIDES = {
|
||||
"a = b + c",
|
||||
"3 +",
|
||||
"une chaine de plus de soixtante quinze caractères ne devrait pas"
|
||||
+ "pouvoir s'afficher parce qu'elle est trop longue !",
|
||||
"30000000000000000000000",
|
||||
"12aveyron",
|
||||
"$aveyron + 12"
|
||||
};
|
||||
|
||||
Expression.referencerContexte(CONTEXTE_GBL);
|
||||
System.out.println("Exécution du test de InstructionAffiche(String"
|
||||
+ ", Contexte)");
|
||||
for (String argInvalide : INVALIDES) {
|
||||
try {
|
||||
new InstructionAffiche(argInvalide, CONTEXTE_GBL);
|
||||
echec();
|
||||
} catch (InterpreteurException | ExecutionException lancee) {
|
||||
// Empty body
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link InstructionAffiche#executer()}
|
||||
*/
|
||||
public static void testExecuter() {
|
||||
|
||||
System.out.println("Exécution du test de executer()\nTEST VISUEL SUR "
|
||||
+ "CONSOLE :");
|
||||
|
||||
Expression.referencerContexte(CONTEXTE_GBL);
|
||||
for (InstructionAffiche aLancer : FIXTURE)
|
||||
aLancer.executer();
|
||||
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link InstructionAffiche#toString()}
|
||||
*/
|
||||
public static void testToString() {
|
||||
|
||||
final String[] ATTENDUS = {
|
||||
"affiche",
|
||||
"affiche",
|
||||
"affiche \"Hello World !!!\"",
|
||||
"affiche 3 + 3",
|
||||
"affiche marcel",
|
||||
"affiche marcel + -3",
|
||||
"affiche $fraysse",
|
||||
"affiche $sanchis + \"coucou\"",
|
||||
"affiche \"300000000000000000 ça passe\""
|
||||
};
|
||||
|
||||
System.out.println("Exécution du test de toString()");
|
||||
for (int i = 0 ; i < FIXTURE.length ; i++) {
|
||||
assertTrue(FIXTURE[i].toString().compareTo(ATTENDUS[i]) == 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
/**
|
||||
* TestInstructionEntre.java 13 mai 2021
|
||||
* IUT Rodez info1 2020-2021, pas de copyright, aucun droit
|
||||
*/
|
||||
package interpreteurlir.motscles.instructions.tests;
|
||||
|
||||
import interpreteurlir.motscles.instructions.InstructionEntre;
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.ExecutionException;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.donnees.litteraux.Entier;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
/**
|
||||
* Test unitaire de {@link InstructionEntre}
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class TestInstructionEntre {
|
||||
|
||||
/**
|
||||
* Contexte pour les tests
|
||||
*/
|
||||
private final Contexte CONTEXTE_GLB = new Contexte();
|
||||
|
||||
/**
|
||||
* Jeux de données de instructionEntre valides
|
||||
*/
|
||||
private InstructionEntre[] fixture = {
|
||||
new InstructionEntre("$chaine ", CONTEXTE_GLB),
|
||||
new InstructionEntre(" $toto", CONTEXTE_GLB),
|
||||
new InstructionEntre("\t entier ", CONTEXTE_GLB),
|
||||
new InstructionEntre("resultat", CONTEXTE_GLB),
|
||||
};
|
||||
|
||||
/**
|
||||
* Test unitaire de
|
||||
* {@link InstructionEntre#InstructionEntre(String, Contexte)}
|
||||
*/
|
||||
public void testInstructionEntreStringContexte() {
|
||||
|
||||
System.out.println("\tExécution du test de "
|
||||
+ "InstructionEntre#InstructionEntre(String, Contexte)");
|
||||
|
||||
final Contexte CONTEXTE = new Contexte();
|
||||
|
||||
final String[] ARGS_INVALIDES = {
|
||||
"",
|
||||
"$hhjdkeliyehozrbnjkm236khl749k",
|
||||
"$chaine = $toto + \"\"",
|
||||
"entier/2",
|
||||
"45"
|
||||
};
|
||||
|
||||
|
||||
for (String arg : ARGS_INVALIDES) {
|
||||
|
||||
try {
|
||||
new InstructionEntre(arg, CONTEXTE);
|
||||
echec();
|
||||
|
||||
} catch (InterpreteurException lancee) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
new InstructionEntre("$chaine ", CONTEXTE);
|
||||
new InstructionEntre(" $toto", CONTEXTE);
|
||||
new InstructionEntre("\t entier ", CONTEXTE);
|
||||
new InstructionEntre("resultat", CONTEXTE);
|
||||
} catch (InterpreteurException lancee) {
|
||||
echec();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link InstructionEntre#toString()}
|
||||
*/
|
||||
public void testToString() {
|
||||
|
||||
final String[] TEXTE_ATTENDU = {
|
||||
"entre $chaine", "entre $toto", "entre entier", "entre resultat"
|
||||
};
|
||||
|
||||
System.out.println("\tExécution du test de "
|
||||
+ "InstructionEntre#toString()");
|
||||
|
||||
for (int numTest = 0 ; numTest < TEXTE_ATTENDU.length ; numTest++) {
|
||||
assertEquivalence(TEXTE_ATTENDU[numTest],
|
||||
fixture[numTest].toString());
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link InstructionEntre#executer()}
|
||||
*/
|
||||
public void testExecuter() {
|
||||
System.out.println("Execution du test de InstructionEntre#executer()");
|
||||
|
||||
for (InstructionEntre entre : fixture) {
|
||||
|
||||
System.out.println("? " + entre);
|
||||
try {
|
||||
assertFalse(entre.executer());
|
||||
System.out.println("ok");
|
||||
} catch (ExecutionException lancee) {
|
||||
System.err.println("nok : " + lancee.getMessage());
|
||||
}
|
||||
}
|
||||
System.out.println("Contexte : \n" + CONTEXTE_GLB);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
/**
|
||||
* TestInstructionProcedure.java 15 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.motscles.instructions.tests;
|
||||
|
||||
import interpreteurlir.motscles.Commande;
|
||||
import interpreteurlir.motscles.instructions.InstructionProcedure;
|
||||
import interpreteurlir.motscles.instructions.InstructionVar;
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.donnees.IdentificateurEntier;
|
||||
import interpreteurlir.expressions.Expression;
|
||||
import interpreteurlir.programmes.*;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import info1.outils.glg.TestException;
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link InstructionProcedure}
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*
|
||||
*/
|
||||
public class TestInstructionProcedure {
|
||||
|
||||
/** Contexte global pour les tests */
|
||||
private final Contexte CONTEXTE = new Contexte();
|
||||
|
||||
/** Jeu de donnée d'InstructionProcedure valides */
|
||||
private final InstructionProcedure[] FIXTURE = {
|
||||
new InstructionProcedure(" 1 ", CONTEXTE),
|
||||
new InstructionProcedure(" 10", CONTEXTE),
|
||||
new InstructionProcedure("5 ", CONTEXTE),
|
||||
new InstructionProcedure("1549", CONTEXTE),
|
||||
new InstructionProcedure("99999", CONTEXTE)
|
||||
};
|
||||
|
||||
/** Programme utilisé dans les tests */
|
||||
private final Programme PROG_REFERENCE = new Programme();
|
||||
|
||||
/**
|
||||
* Tests unitaires de
|
||||
* {@link InstructionProcedure#InstructionProcedure(String, Contexte)}
|
||||
*/
|
||||
public void testInstructionProcedureStringContexte() {
|
||||
|
||||
System.out.println("\tExecution du test de "
|
||||
+ "InstructionProcedure"
|
||||
+ "#InstructionProcedure(String, Contexte)");
|
||||
|
||||
final String[] ARGS_INVALIDES = {
|
||||
/* Sans arguments */
|
||||
"",
|
||||
"\t",
|
||||
" ",
|
||||
"\n",
|
||||
|
||||
/* Arguments invalides */
|
||||
"LETTRE",
|
||||
"6messages",
|
||||
"-5",
|
||||
"100000"
|
||||
};
|
||||
|
||||
for (int i = 0 ; i < ARGS_INVALIDES.length ; i++) {
|
||||
try {
|
||||
new InstructionProcedure(ARGS_INVALIDES[i], CONTEXTE);
|
||||
echec();
|
||||
} catch (InterpreteurException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
new InstructionProcedure(" 1 ", CONTEXTE);
|
||||
new InstructionProcedure(" 10", CONTEXTE);
|
||||
new InstructionProcedure("5 ", CONTEXTE);
|
||||
new InstructionProcedure("1549", CONTEXTE);
|
||||
new InstructionProcedure("99999", CONTEXTE);
|
||||
} catch (InterpreteurException e) {
|
||||
echec();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link InstructionProcedure#toString()}
|
||||
*/
|
||||
public void testToString() {
|
||||
System.out.println("\tExecution du test de "
|
||||
+ "InstructionProcedure#toString()");
|
||||
|
||||
final String[] FORMAT_ATTENDU = {
|
||||
"procedure 1",
|
||||
"procedure 10",
|
||||
"procedure 5",
|
||||
"procedure 1549",
|
||||
"procedure 99999",
|
||||
};
|
||||
|
||||
for (int i = 0 ; i < FORMAT_ATTENDU.length ; i++) {
|
||||
assertEquivalence(FORMAT_ATTENDU[i], FIXTURE[i].toString());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link InstructionProcedure#executer()}
|
||||
*/
|
||||
public void testExecuter() {
|
||||
System.out.println("\tExecution du test de "
|
||||
+ "InstructionProcedure#executer()");
|
||||
|
||||
for(InstructionProcedure instruction : FIXTURE) {
|
||||
try {
|
||||
instruction.executer();
|
||||
echec();
|
||||
} catch (RuntimeException e) {
|
||||
if (e instanceof TestException) {
|
||||
echec();
|
||||
}
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
Commande.referencerProgramme(PROG_REFERENCE);
|
||||
Expression.referencerContexte(CONTEXTE);
|
||||
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(3),
|
||||
new InstructionVar("test=5", CONTEXTE));
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(4), FIXTURE[1]);
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(5),
|
||||
new InstructionVar("test=-1", CONTEXTE));
|
||||
|
||||
PROG_REFERENCE.lancer();
|
||||
assertEquivalence(CONTEXTE.lireValeurVariable(
|
||||
new IdentificateurEntier("test")).getValeur(), 5);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
/**
|
||||
* TestInstructionRetour.java 15 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.motscles.instructions.tests;
|
||||
|
||||
import interpreteurlir.motscles.Commande;
|
||||
import interpreteurlir.motscles.instructions.InstructionProcedure;
|
||||
import interpreteurlir.motscles.instructions.InstructionRetour;
|
||||
import interpreteurlir.motscles.instructions.InstructionVar;
|
||||
import interpreteurlir.programmes.Etiquette;
|
||||
import interpreteurlir.programmes.Programme;
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.ExecutionException;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.donnees.IdentificateurEntier;
|
||||
import interpreteurlir.expressions.Expression;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import info1.outils.glg.TestException;
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link InstructionRetour}
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*
|
||||
*/
|
||||
public class TestInstructionRetour {
|
||||
|
||||
/** Contexte global pour les tests */
|
||||
private final Contexte CONTEXTE = new Contexte();
|
||||
|
||||
/** Programme utilisé dans les tests */
|
||||
private final Programme PROG_REFERENCE = new Programme();
|
||||
|
||||
/** Jeu de donnée d'InstructionRetour valides */
|
||||
private final InstructionRetour[] FIXTURE = {
|
||||
new InstructionRetour("", CONTEXTE),
|
||||
new InstructionRetour(" ", CONTEXTE),
|
||||
new InstructionRetour("\t", CONTEXTE),
|
||||
new InstructionRetour("\t ", CONTEXTE)
|
||||
};
|
||||
|
||||
/**
|
||||
* Tests unitaires de
|
||||
* {@link InstructionRetour#InstructionRetour(String, Contexte)}
|
||||
*/
|
||||
public void testInstructionRetourStringContexte() {
|
||||
System.out.println("\t Exécution du test de "
|
||||
+ "InstructionRetour#InstructionRetour(String, Contexte)");
|
||||
|
||||
final String[] ARGS_INVALIDES = {
|
||||
" a ",
|
||||
"bonjour bonsoir",
|
||||
"513",
|
||||
"@!?/",
|
||||
"^p65Na@"
|
||||
};
|
||||
|
||||
for (int i = 0 ; i < ARGS_INVALIDES.length ; i++) {
|
||||
try {
|
||||
new InstructionRetour(ARGS_INVALIDES[i], CONTEXTE);
|
||||
echec();
|
||||
} catch (InterpreteurException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
new InstructionRetour("", CONTEXTE);
|
||||
new InstructionRetour(" ", CONTEXTE);
|
||||
new InstructionRetour("\t", CONTEXTE);
|
||||
new InstructionRetour("\t ", CONTEXTE);
|
||||
} catch (InterpreteurException lancee) {
|
||||
echec();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link InstructionRetour#toString()}
|
||||
*/
|
||||
public void testToString() {
|
||||
System.out.println("\tExecution du test de "
|
||||
+ "InstructionRetour#toString()");
|
||||
|
||||
for (int i = 0 ; i < FIXTURE.length ; i++) {
|
||||
assertEquivalence("retour", FIXTURE[i].toString());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link InstructionRetour#executer()}
|
||||
*/
|
||||
public void testExecuter() {
|
||||
System.out.println("\tExecution du test de "
|
||||
+ "InstructionRetour#executer()");
|
||||
|
||||
for(InstructionRetour instruction : FIXTURE) {
|
||||
try {
|
||||
instruction.executer();
|
||||
echec();
|
||||
} catch (RuntimeException e) {
|
||||
if (e instanceof TestException) {
|
||||
echec();
|
||||
}
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
Commande.referencerProgramme(PROG_REFERENCE);
|
||||
Expression.referencerContexte(CONTEXTE);
|
||||
|
||||
/* Test retour procedure invalide */
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(1), FIXTURE[0]);
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(4),
|
||||
new InstructionProcedure("1", CONTEXTE));
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(10), FIXTURE[1]);
|
||||
|
||||
try {
|
||||
PROG_REFERENCE.lancer(new Etiquette(2));
|
||||
echec();
|
||||
} catch (ExecutionException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
|
||||
PROG_REFERENCE.raz();
|
||||
|
||||
/* Tests retour procedure valide */
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(1),
|
||||
new InstructionVar("test=5", CONTEXTE));
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(2), FIXTURE[0]);
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(3),
|
||||
new InstructionVar("test=-1", CONTEXTE));
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(4),
|
||||
new InstructionProcedure("1", CONTEXTE));
|
||||
|
||||
PROG_REFERENCE.lancer(new Etiquette(3));
|
||||
assertEquivalence(CONTEXTE.lireValeurVariable(
|
||||
new IdentificateurEntier("test")).getValeur(), 5);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
/**
|
||||
* TestInstructionStop.java 16 mai 2021
|
||||
* IUT info1 2020-2021, pas de copyright, aucun droit
|
||||
*/
|
||||
package interpreteurlir.motscles.instructions.tests;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.expressions.Expression;
|
||||
import interpreteurlir.motscles.Commande;
|
||||
import interpreteurlir.motscles.instructions.InstructionAffiche;
|
||||
import interpreteurlir.motscles.instructions.InstructionStop;
|
||||
import interpreteurlir.programmes.Etiquette;
|
||||
import interpreteurlir.programmes.Programme;
|
||||
|
||||
/**
|
||||
* Tests unitaires de l'instruction stop de l'interpréteur LIR.
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heïa Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class TestInstructionStop {
|
||||
|
||||
/** Contexte d'exécution nécessaire à instanciation */
|
||||
private static final Contexte CONTEXTE_TESTS = new Contexte();
|
||||
|
||||
/** Instruction stop valide */
|
||||
public static final InstructionStop[] FIXTURE = {
|
||||
new InstructionStop("", CONTEXTE_TESTS),
|
||||
new InstructionStop("\t", CONTEXTE_TESTS),
|
||||
new InstructionStop(" ", CONTEXTE_TESTS)
|
||||
};
|
||||
/** Tests du constructeur */
|
||||
public static void testInstructionStop() {
|
||||
|
||||
final String[] INVALIDES = {
|
||||
"coucou",
|
||||
" Bonjour",
|
||||
null,
|
||||
"entier = 2 + 3"
|
||||
};
|
||||
|
||||
System.out.println("Exécution du test de InstructionStop"
|
||||
+ "(String, Contexte)");
|
||||
for (String aTester : INVALIDES) {
|
||||
try {
|
||||
new InstructionStop(aTester, CONTEXTE_TESTS);
|
||||
echec();
|
||||
} catch (InterpreteurException | NullPointerException e) {
|
||||
// Empty block
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Test de executer() */
|
||||
public static void testExecuter() {
|
||||
Programme pgmTest = new Programme();
|
||||
System.out.println("Exécution du test de executer()\ntestVisuel\n");
|
||||
Commande.referencerProgramme(pgmTest);
|
||||
Expression.referencerContexte(CONTEXTE_TESTS);
|
||||
pgmTest.ajouterLigne(new Etiquette(10),
|
||||
new InstructionAffiche("Bonjour", CONTEXTE_TESTS));
|
||||
pgmTest.ajouterLigne(new Etiquette(20),
|
||||
new InstructionAffiche("Comment", CONTEXTE_TESTS));
|
||||
pgmTest.ajouterLigne(new Etiquette(30),
|
||||
new InstructionAffiche("Allez", CONTEXTE_TESTS));
|
||||
pgmTest.ajouterLigne(new Etiquette(40),
|
||||
new InstructionAffiche("Vous", CONTEXTE_TESTS));
|
||||
pgmTest.ajouterLigne(new Etiquette(45),
|
||||
new InstructionStop("", CONTEXTE_TESTS));
|
||||
pgmTest.ajouterLigne(new Etiquette(50),
|
||||
new InstructionAffiche("foobar", CONTEXTE_TESTS));
|
||||
System.out.println(pgmTest);
|
||||
System.out.println("lancement du programme : ne doit pas "
|
||||
+ "afficher foobar");
|
||||
pgmTest.lancer();
|
||||
}
|
||||
|
||||
/** Tests de toString() */
|
||||
public static void testToString() {
|
||||
|
||||
final String ATTENDUE = "stop";
|
||||
System.out.println("Exécution du test de toString()");
|
||||
for (InstructionStop valide : FIXTURE)
|
||||
assertTrue(valide.toString().compareTo(ATTENDUE) == 0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
/**
|
||||
* TestInstructionVaen.java 15 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.motscles.instructions.tests;
|
||||
|
||||
import interpreteurlir.motscles.Commande;
|
||||
import interpreteurlir.motscles.instructions.InstructionAffiche;
|
||||
import interpreteurlir.motscles.instructions.InstructionVaen;
|
||||
import interpreteurlir.programmes.Etiquette;
|
||||
import interpreteurlir.programmes.Programme;
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.expressions.Expression;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import info1.outils.glg.TestException;
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link InstructionVaen}
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*
|
||||
*/
|
||||
public class TestInstructionVaen {
|
||||
|
||||
/** Contexte global pour les tests */
|
||||
private final Contexte CONTEXTE = new Contexte();
|
||||
|
||||
/** Programme utilisé dans les tests */
|
||||
private final Programme PROG_REFERENCE = new Programme();
|
||||
|
||||
/** Jeu de donnée d'InstructionRetour valides */
|
||||
private final InstructionVaen[] FIXTURE = {
|
||||
new InstructionVaen("10", CONTEXTE),
|
||||
new InstructionVaen("9", CONTEXTE),
|
||||
new InstructionVaen("20", CONTEXTE),
|
||||
new InstructionVaen("70", CONTEXTE),
|
||||
new InstructionVaen("40", CONTEXTE),
|
||||
};
|
||||
|
||||
/**
|
||||
* Tests unitaires de
|
||||
* {@link InstructionVaen#InstructionVaen(String, Contexte)}
|
||||
*/
|
||||
public void testInstructionVaenStringContexte() {
|
||||
System.out.println("\tExecution du test de "
|
||||
+ "InstructionVaen#InstructionVaen(String, Contexte)");
|
||||
|
||||
final String[] ARGS_INVALIDES = {
|
||||
"greuuuuuu",
|
||||
" motus 5800",
|
||||
"100000",
|
||||
"-4",
|
||||
"$$$$£££"
|
||||
};
|
||||
|
||||
Expression.referencerContexte(CONTEXTE);
|
||||
|
||||
/* Cas invalides */
|
||||
for (int i = 0; i < ARGS_INVALIDES.length; i++) {
|
||||
try {
|
||||
new InstructionVaen(ARGS_INVALIDES[i], CONTEXTE);
|
||||
echec();
|
||||
} catch (InterpreteurException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
/* Cas Valides */
|
||||
try {
|
||||
new InstructionVaen("10", CONTEXTE);
|
||||
new InstructionVaen("9", CONTEXTE);
|
||||
new InstructionVaen("20", CONTEXTE);
|
||||
new InstructionVaen("70", CONTEXTE);
|
||||
new InstructionVaen("40", CONTEXTE);
|
||||
} catch (InterpreteurException lancee) {
|
||||
echec();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link InstructionVaen#toString()}
|
||||
*/
|
||||
public void testToString() {
|
||||
System.out.println("\tExecution du test de "
|
||||
+ "InstructionVaen#toString()");
|
||||
|
||||
final String[] FORMAT_ATTENDU = {
|
||||
"vaen 10",
|
||||
"vaen 9",
|
||||
"vaen 20",
|
||||
"vaen 70",
|
||||
"vaen 40"
|
||||
};
|
||||
|
||||
for (int i = 0 ; i < FORMAT_ATTENDU.length ; i++) {
|
||||
assertEquivalence(FORMAT_ATTENDU[i], FIXTURE[i].toString());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link InstructionVaen#executer()}
|
||||
*/
|
||||
public void testExecuter() {
|
||||
System.out.println("\tExecution du test de "
|
||||
+ "InstructionVaen#executer()");
|
||||
|
||||
/* Cas invalide : où le programme global est vide */
|
||||
for(InstructionVaen instruction : FIXTURE) {
|
||||
try {
|
||||
instruction.executer();
|
||||
echec();
|
||||
} catch (RuntimeException e) {
|
||||
if (e instanceof TestException) {
|
||||
echec();
|
||||
}
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
/* Cas valide */
|
||||
Commande.referencerProgramme(PROG_REFERENCE);
|
||||
Expression.referencerContexte(CONTEXTE);
|
||||
|
||||
System.out.println("Test visuel : Ne doit pas afficher "
|
||||
+ "les étiquettes (25, 31, 40 )");
|
||||
/* 1,10,13 -> 78, 89 (saute 25, 31, 40) */
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(1),
|
||||
new InstructionAffiche("\"1 \"", CONTEXTE));
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(10),
|
||||
new InstructionAffiche("\"10 \"", CONTEXTE));
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(13),
|
||||
new InstructionAffiche("\"13 \"", CONTEXTE));
|
||||
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(25),
|
||||
new InstructionAffiche("\"25 \"", CONTEXTE));
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(31),
|
||||
new InstructionAffiche("\"31 \"", CONTEXTE));
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(40),
|
||||
new InstructionAffiche("\"40 \"", CONTEXTE));
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(78),
|
||||
new InstructionAffiche("\"78 \"", CONTEXTE));
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(89),
|
||||
new InstructionAffiche("\"89 \"", CONTEXTE));
|
||||
|
||||
PROG_REFERENCE.ajouterLigne(new Etiquette(14),
|
||||
new InstructionVaen("78", CONTEXTE));
|
||||
|
||||
PROG_REFERENCE.lancer();
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
@@ -72,7 +72,7 @@ public class TestInstructionVar {
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO comment method responsibilities
|
||||
* Lancement des tests
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
|
||||
@@ -7,7 +7,9 @@ package interpreteurlir.motscles.tests;
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.expressions.Expression;
|
||||
import interpreteurlir.motscles.Commande;
|
||||
import interpreteurlir.programmes.Programme;
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link interpreteurlir.motscles.Commande}
|
||||
@@ -26,6 +28,26 @@ public class TestCommande {
|
||||
new Commande("$chaine = \"toto\" + $tata", new Contexte())
|
||||
};
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link Commande#referencerProgramme(Programme)}
|
||||
*/
|
||||
public void testReferencerProgramme() {
|
||||
|
||||
Programme reference = new Programme();
|
||||
Programme[] programmes = {
|
||||
null, reference, reference, new Programme()
|
||||
};
|
||||
|
||||
boolean[] resultatAttendu = { false, true, true, false };
|
||||
|
||||
System.out.println("\tExécution du test de "
|
||||
+ "Commande#referencerProgramme(Programme)");
|
||||
for (int numTest = 0 ; numTest < programmes.length ; numTest++) {
|
||||
assertTrue( Commande.referencerProgramme(programmes[numTest])
|
||||
== resultatAttendu[numTest]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link Commande#Commande(String, Contexte)}
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
/**
|
||||
* TestCommandeEfface.java 16 mai 2021
|
||||
* IUT info1 2020-2021, pas de copyright, aucun droit
|
||||
*/
|
||||
package interpreteurlir.motscles.tests;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.motscles.Commande;
|
||||
import interpreteurlir.motscles.CommandeEfface;
|
||||
import interpreteurlir.motscles.instructions.InstructionAffiche;
|
||||
import interpreteurlir.programmes.Etiquette;
|
||||
import interpreteurlir.programmes.Programme;
|
||||
|
||||
/**
|
||||
* Tests unitaires de la commande d'effacement de lignes de codes pour
|
||||
* l'interpréteur LIR.
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heïa Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class TestCommandeEfface {
|
||||
|
||||
/** Contexte pour tests */
|
||||
public static final Contexte CONTEXTE_TESTS = new Contexte();
|
||||
|
||||
/** Programme global pour tests */
|
||||
public static final Programme PGM_TESTS = new Programme();
|
||||
|
||||
/** Jeu de test valide */
|
||||
public static final CommandeEfface[] FIXTURE = {
|
||||
new CommandeEfface("1:99999", CONTEXTE_TESTS),
|
||||
new CommandeEfface(" 1 : 99999 ", CONTEXTE_TESTS),
|
||||
new CommandeEfface("99999 :1 ", CONTEXTE_TESTS),
|
||||
new CommandeEfface("1 : 1", CONTEXTE_TESTS),
|
||||
new CommandeEfface(" 250: 150 ", CONTEXTE_TESTS)
|
||||
};
|
||||
|
||||
/** Test du constructeur */
|
||||
public static void testCommandeEfface() {
|
||||
|
||||
final String[] INVALIDES = {
|
||||
"",
|
||||
"23 : ",
|
||||
" : 15",
|
||||
"coucou",
|
||||
"50 : coucou",
|
||||
"12.4: 24",
|
||||
"-14 : 90",
|
||||
"\'a\' : 99"
|
||||
};
|
||||
|
||||
System.out.println("Exécution du test de CommandeEfface"
|
||||
+ "(String, Contexte)");
|
||||
for (String aTester : INVALIDES) {
|
||||
try {
|
||||
new CommandeEfface(aTester, CONTEXTE_TESTS);
|
||||
echec();
|
||||
} catch (InterpreteurException e) {
|
||||
// TODO: handle exception
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Test de executer() */
|
||||
public static void testExecuter() {
|
||||
|
||||
System.out.println("Exécution du test d'executer()\nTest visuel :");
|
||||
Commande.referencerProgramme(PGM_TESTS);
|
||||
PGM_TESTS.ajouterLigne(new Etiquette(10),
|
||||
new InstructionAffiche("Bonjour", CONTEXTE_TESTS));
|
||||
PGM_TESTS.ajouterLigne(new Etiquette(20),
|
||||
new InstructionAffiche("Comment", CONTEXTE_TESTS));
|
||||
PGM_TESTS.ajouterLigne(new Etiquette(30),
|
||||
new InstructionAffiche("Allez", CONTEXTE_TESTS));
|
||||
PGM_TESTS.ajouterLigne(new Etiquette(40),
|
||||
new InstructionAffiche("Vous", CONTEXTE_TESTS));
|
||||
PGM_TESTS.ajouterLigne(new Etiquette(50),
|
||||
new InstructionAffiche("foobar", CONTEXTE_TESTS));
|
||||
System.out.println(PGM_TESTS);
|
||||
|
||||
CommandeEfface effacement = new CommandeEfface("20:30", CONTEXTE_TESTS);
|
||||
effacement.executer();
|
||||
|
||||
System.out.println(PGM_TESTS);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
/**
|
||||
* TestCommandeLance.java 15 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.motscles.tests;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.expressions.Expression;
|
||||
import interpreteurlir.motscles.CommandeLance;
|
||||
import interpreteurlir.motscles.instructions.Instruction;
|
||||
import interpreteurlir.motscles.instructions.InstructionVar;
|
||||
import interpreteurlir.programmes.Etiquette;
|
||||
import interpreteurlir.programmes.Programme;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import info1.outils.glg.TestException;
|
||||
|
||||
/**
|
||||
* Tests unitaires de la classe CommandeLance
|
||||
*
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class TestCommandeLance {
|
||||
|
||||
private Contexte contexteTest = new Contexte();
|
||||
private Programme programmeTest = new Programme();
|
||||
|
||||
private final CommandeLance[] FIXTURE = {
|
||||
new CommandeLance("", contexteTest),
|
||||
new CommandeLance("10", contexteTest),
|
||||
new CommandeLance("9", contexteTest),
|
||||
new CommandeLance("20", contexteTest),
|
||||
new CommandeLance("70", contexteTest),
|
||||
new CommandeLance("40", contexteTest),
|
||||
};
|
||||
|
||||
private final String[] ARGS_VALIDES = {
|
||||
"",
|
||||
"10",
|
||||
"9",
|
||||
"20",
|
||||
"70",
|
||||
"40"
|
||||
};
|
||||
|
||||
private final Etiquette[] JEU_ETIQUETTES = {
|
||||
new Etiquette(1),
|
||||
new Etiquette(10),
|
||||
new Etiquette(13),
|
||||
new Etiquette(25),
|
||||
new Etiquette(31),
|
||||
new Etiquette(40),
|
||||
new Etiquette(78),
|
||||
new Etiquette(89)
|
||||
};
|
||||
|
||||
private final Instruction[] JEU_INSTRUCTIONS = {
|
||||
new InstructionVar("$res = \"1 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"10 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"13 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"25 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"31 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"40 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"78 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"89 \"", contexteTest)
|
||||
};
|
||||
|
||||
private void ecrireProgrammeTest() {
|
||||
for (int i = 0 ; i < JEU_ETIQUETTES.length ; i++) {
|
||||
programmeTest.ajouterLigne(JEU_ETIQUETTES[i],
|
||||
JEU_INSTRUCTIONS[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Test unitaire de
|
||||
* {@link CommandeLance#CommandeLance(String, interpreteurlir.Contexte)}
|
||||
*/
|
||||
public void testCommandeLance() {
|
||||
|
||||
final String[] ARGS_INVALIDES = {
|
||||
"greuuuuuu",
|
||||
" motus 5800",
|
||||
"100000",
|
||||
"-4",
|
||||
"$$$$£££"
|
||||
};
|
||||
|
||||
Expression.referencerContexte(contexteTest);
|
||||
|
||||
for (int i = 0; i < ARGS_INVALIDES.length; i++) {
|
||||
try {
|
||||
new CommandeLance(ARGS_INVALIDES[i], contexteTest);
|
||||
echec();
|
||||
} catch (InterpreteurException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0 ; i < ARGS_VALIDES.length ; i++) {
|
||||
try {
|
||||
contexteTest.raz();
|
||||
new CommandeLance(ARGS_VALIDES[i], contexteTest);
|
||||
} catch (InterpreteurException lancee) {
|
||||
echec();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link CommandeLance#executer()}
|
||||
*/
|
||||
public void testExecuter() {
|
||||
|
||||
//ecrireProgrammeTest();
|
||||
Expression.referencerContexte(contexteTest);
|
||||
|
||||
for (int i = 0 ; i < FIXTURE.length ; i++) {
|
||||
try {
|
||||
FIXTURE[i].executer();
|
||||
echec();
|
||||
} catch (RuntimeException lancee) {
|
||||
if (lancee instanceof TestException) {
|
||||
echec();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Tests valides faits en intégration
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
/**
|
||||
* TestCommandeListe.java 15 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.motscles.tests;
|
||||
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.expressions.Expression;
|
||||
import interpreteurlir.motscles.Commande;
|
||||
import interpreteurlir.motscles.CommandeListe;
|
||||
import interpreteurlir.motscles.instructions.Instruction;
|
||||
import interpreteurlir.motscles.instructions.InstructionVar;
|
||||
import interpreteurlir.programmes.Etiquette;
|
||||
import interpreteurlir.programmes.Programme;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import info1.outils.glg.TestException;
|
||||
|
||||
/**
|
||||
* Tests unitaires de la classe Commande liste
|
||||
*
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class TestCommandeListe {
|
||||
|
||||
private Programme programmeTest = new Programme();
|
||||
private Contexte contexteTest = new Contexte();
|
||||
|
||||
private final CommandeListe[] FIXTURE = {
|
||||
new CommandeListe("1:89", contexteTest),
|
||||
new CommandeListe("13:30", contexteTest),
|
||||
new CommandeListe("17:54", contexteTest),
|
||||
new CommandeListe("40:108", contexteTest),
|
||||
};
|
||||
|
||||
private final String[] ARGS_VALIDES = {
|
||||
"1:90",
|
||||
"5:45",
|
||||
"40:56"
|
||||
};
|
||||
|
||||
private final Etiquette[] JEU_ETIQUETTES = {
|
||||
new Etiquette(1),
|
||||
new Etiquette(10),
|
||||
new Etiquette(13),
|
||||
new Etiquette(25),
|
||||
new Etiquette(31),
|
||||
new Etiquette(40),
|
||||
new Etiquette(78),
|
||||
new Etiquette(89)
|
||||
};
|
||||
|
||||
private final Instruction[] JEU_INSTRUCTIONS = {
|
||||
new InstructionVar("$res = \"1 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"10 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"13 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"25 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"31 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"40 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"78 \"", contexteTest),
|
||||
new InstructionVar("$res = $res + \"89 \"", contexteTest)
|
||||
};
|
||||
|
||||
private void ecrireProgrammeTest() {
|
||||
for (int i = 0 ; i < JEU_ETIQUETTES.length ; i++) {
|
||||
programmeTest.ajouterLigne(JEU_ETIQUETTES[i],
|
||||
JEU_INSTRUCTIONS[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de
|
||||
* {@link CommandeListe#CommandeListe(String, interpreteurlir.Contexte)}
|
||||
*/
|
||||
public void testCommandeListe() {
|
||||
|
||||
final String[] ARGS_INVALIDES = {
|
||||
"agreu",
|
||||
"0:0",
|
||||
"-4:9",
|
||||
"45:-8",
|
||||
"78:12",
|
||||
"1:",
|
||||
":4",
|
||||
"1:100000"
|
||||
};
|
||||
|
||||
for (int i = 0; i < ARGS_INVALIDES.length; i++) {
|
||||
try {
|
||||
new CommandeListe(ARGS_INVALIDES[i], contexteTest);
|
||||
echec();
|
||||
} catch (InterpreteurException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0 ; i < ARGS_VALIDES.length ; i++) {
|
||||
try {
|
||||
new CommandeListe(ARGS_VALIDES[i], contexteTest);
|
||||
} catch (InterpreteurException lancee) {
|
||||
echec();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link CommandeListe#executer()}
|
||||
*/
|
||||
public void testExecuter() {
|
||||
|
||||
for (int i = 0 ; i < FIXTURE.length ; i++) {
|
||||
try {
|
||||
FIXTURE[i].executer();
|
||||
echec();
|
||||
} catch (RuntimeException lancee) {
|
||||
if (lancee instanceof TestException) {
|
||||
echec();
|
||||
}
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
ecrireProgrammeTest();
|
||||
Commande.referencerProgramme(programmeTest);
|
||||
Expression.referencerContexte(contexteTest);
|
||||
|
||||
for (int i = 0 ; i < FIXTURE.length ; i++) {
|
||||
try {
|
||||
FIXTURE[i].executer();
|
||||
} catch (RuntimeException lancee) {
|
||||
echec();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
/**
|
||||
* Etiquette.java 13 mai 2021
|
||||
* IUT Rodez info1 2020-2021, pas de copyright, aucun droit
|
||||
*/
|
||||
package interpreteurlir.programmes;
|
||||
|
||||
import interpreteurlir.InterpreteurException;
|
||||
|
||||
/**
|
||||
* Etiquette permettant de définir les ordres d'exécution
|
||||
* des instructions d'un programme.
|
||||
* Le compteur ordinal pointe vers une étiquette.
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heïa Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class Etiquette implements Comparable<Etiquette> {
|
||||
|
||||
/** Valeur minimale d'une étiquette */
|
||||
public static final int VALEUR_ETIQUETTE_MIN = 1;
|
||||
|
||||
/** Valeur maximale d'une étiquette */
|
||||
public static final int VALEUR_ETIQUETTE_MAX = 99999;
|
||||
|
||||
/** Message d'erreur pour une étiquette invalide */
|
||||
private static final String MSG_INVALIDE =
|
||||
"valeur invalide pour une étiquette";
|
||||
|
||||
/** valeur de cette étiquette */
|
||||
private int valeur;
|
||||
|
||||
/**
|
||||
* Initialise une étiquette qui défini l'ordre d'exécution
|
||||
* d'une instruction à partir d'un entier
|
||||
* @param valeur valeur de l'étiquette
|
||||
* @throws InterpreteurException si valeur n'appartient pas
|
||||
* à [ VALEUR_ETIQUETTE_MIN, VALEUR_ETIQUETTE_MAX ]
|
||||
*/
|
||||
public Etiquette(int valeur) {
|
||||
super();
|
||||
if (valeur < VALEUR_ETIQUETTE_MIN || valeur > VALEUR_ETIQUETTE_MAX) {
|
||||
throw new InterpreteurException(MSG_INVALIDE);
|
||||
}
|
||||
|
||||
this.valeur = valeur;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialise une étiquette qui défini l'ordre d'exécution
|
||||
* d'une instruction à partir d'un entier dans une chaîne de texte
|
||||
* @param valeur chaîne contenant la valeur de l'étiquette
|
||||
* @throws InterpreteurException si l'entier de valeur n'appartient pas
|
||||
* à [ VALEUR_ETIQUETTE_MIN, VALEUR_ETIQUETTE_MAX ]
|
||||
*/
|
||||
public Etiquette(String valeur) {
|
||||
super();
|
||||
|
||||
int valeurEntiere;
|
||||
|
||||
try {
|
||||
valeurEntiere = Integer.valueOf(valeur.trim());
|
||||
} catch (NumberFormatException | NullPointerException lancee) {
|
||||
throw new InterpreteurException(MSG_INVALIDE);
|
||||
}
|
||||
|
||||
if (valeurEntiere < VALEUR_ETIQUETTE_MIN
|
||||
|| valeurEntiere > VALEUR_ETIQUETTE_MAX) {
|
||||
throw new InterpreteurException(MSG_INVALIDE);
|
||||
}
|
||||
|
||||
this.valeur = valeurEntiere;
|
||||
}
|
||||
|
||||
/* non javadoc
|
||||
* @see java.lang.Object#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return Integer.toString(valeur);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return valeur de valeur
|
||||
*/
|
||||
public int getValeur() {
|
||||
return valeur;
|
||||
}
|
||||
|
||||
/* non javadoc
|
||||
* @see java.lang.Comparable#compareTo(java.lang.Object)
|
||||
*/
|
||||
@Override
|
||||
public int compareTo(Etiquette aComparer) {
|
||||
return valeur - aComparer.valeur;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,279 @@
|
||||
/**
|
||||
* Programme.java 14 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.programmes;
|
||||
|
||||
import java.util.EmptyStackException;
|
||||
import java.util.Map;
|
||||
import java.util.Stack;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import interpreteurlir.ExecutionException;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.motscles.instructions.Instruction;
|
||||
|
||||
import static interpreteurlir.programmes.Etiquette.VALEUR_ETIQUETTE_MAX;
|
||||
import static interpreteurlir.programmes.Etiquette.VALEUR_ETIQUETTE_MIN;
|
||||
|
||||
/**
|
||||
* Enregistrement des lignes de code (instruction associée à une
|
||||
* étiquette) et gestion de l'exécution des lignes de code dans
|
||||
* l'ordre des étiquettes
|
||||
*
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class Programme {
|
||||
|
||||
private static final String ERREUR_INTERVALLE = "erreur dans l'intervalle "
|
||||
+ "d'étiquettes. ";
|
||||
|
||||
/** Pile LIFO pour la gestion des étiquettes */
|
||||
private Stack<Etiquette> compteurOrdinnal;
|
||||
|
||||
/** Détermine la poursuite d'exécution de ce programme */
|
||||
private boolean enExecution;
|
||||
|
||||
private TreeMap<Etiquette, Instruction> lignesCode;
|
||||
|
||||
/**
|
||||
* Initialisation de ce programme sans lignes de code
|
||||
* <p>
|
||||
*
|
||||
*/
|
||||
public Programme() {
|
||||
super();
|
||||
lignesCode = new TreeMap<Etiquette, Instruction>();
|
||||
enExecution = false;
|
||||
compteurOrdinnal = new Stack<Etiquette>();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Remise à zero de ce programme
|
||||
* <p>
|
||||
* Vide ce programme de toute lignes de code (instruction associée
|
||||
* à une étiquette)
|
||||
*/
|
||||
public void raz() {
|
||||
lignesCode.clear();
|
||||
compteurOrdinnal.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajoute une ligne de code (instruction associée à une étiquette)
|
||||
* à ce programme
|
||||
* <p>
|
||||
* Une ligne ajoutée à une même étiquette écrase le contenu associé
|
||||
* à cette dernière
|
||||
*
|
||||
* @param etiquette pour donner l'ordre d'exécution de ce programme
|
||||
* @param instruction associée une étiquette à insérer dans ce
|
||||
* programme
|
||||
* @throws NullPointerException si l'étiquette ou l'instruction
|
||||
* est nulle
|
||||
*/
|
||||
public void ajouterLigne(Etiquette etiquette, Instruction instruction) {
|
||||
if (etiquette == null || instruction == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
|
||||
lignesCode.put(etiquette, instruction);
|
||||
}
|
||||
|
||||
/* non javadoc
|
||||
* @see java.lang.Object#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
|
||||
Object[] tableauEtiquette
|
||||
= lignesCode.keySet().toArray();
|
||||
|
||||
Object[] tableauInstruction
|
||||
= lignesCode.values().toArray();
|
||||
|
||||
StringBuilder aAfficher = new StringBuilder("");
|
||||
|
||||
for (int i = 0; i < tableauEtiquette.length; i++) {
|
||||
aAfficher.append(tableauEtiquette[i] + " "
|
||||
+ tableauInstruction[i] + '\n');
|
||||
}
|
||||
|
||||
return aAfficher.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Liste des lignes de code comprise entre les étiquettes de
|
||||
* début et les étiquettes de fin
|
||||
* <p>
|
||||
* S'il n'y aucune ligne de code dans l'intervalle, alors la
|
||||
* chaîne renvoyée contient un message qui l'indique.
|
||||
*
|
||||
* @param debut étiquette à partir de laquelle le programme
|
||||
* est listé
|
||||
* @param fin dernière étiquette associée à son contenu à lister
|
||||
* @return la représentation texte des lignes de code comprise
|
||||
* entre les étiquettes de début et les étiquettes de fin
|
||||
* @throws InterpreteurException si fin est strictement inférieur
|
||||
* à debut
|
||||
*/
|
||||
public String listeBornee(Etiquette debut, Etiquette fin) {
|
||||
|
||||
if (fin.compareTo(debut) < 0) {
|
||||
throw new InterpreteurException(ERREUR_INTERVALLE);
|
||||
}
|
||||
|
||||
StringBuilder aAfficher = new StringBuilder("");
|
||||
Etiquette cleCourante = debut;
|
||||
Instruction instCourante = null;
|
||||
Map.Entry<Etiquette, Instruction> entreeCourante;
|
||||
boolean lignesRestantes;
|
||||
|
||||
do {
|
||||
entreeCourante = lignesCode.ceilingEntry(cleCourante);
|
||||
lignesRestantes = entreeCourante != null;
|
||||
|
||||
if (lignesRestantes) {
|
||||
cleCourante = entreeCourante.getKey();
|
||||
instCourante = entreeCourante.getValue();
|
||||
lignesRestantes = cleCourante.compareTo(fin) <= 0;
|
||||
}
|
||||
|
||||
if (lignesRestantes) {
|
||||
aAfficher.append(cleCourante + " " + instCourante + '\n');
|
||||
cleCourante = new Etiquette(cleCourante.getValeur() + 1);
|
||||
}
|
||||
} while (lignesRestantes);
|
||||
|
||||
return aAfficher.toString().equals("")
|
||||
? "Aucune ligne de code dans cet intervalle.\n"
|
||||
: aAfficher.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Efface les lignes de code comprises entre les étiquettes debut
|
||||
* et fin
|
||||
*
|
||||
* @param debut étiquette à partir de laquelle le programme
|
||||
* est à effacer
|
||||
* @param fin dernière étiquette associée à son contenu à effacer
|
||||
* @throws InterpreteurException si fin est strictement inférieur
|
||||
* à debut
|
||||
*/
|
||||
public void effacer(Etiquette debut, Etiquette fin) {
|
||||
|
||||
if (fin.compareTo(debut) < 0) {
|
||||
throw new InterpreteurException(ERREUR_INTERVALLE);
|
||||
}
|
||||
|
||||
Etiquette cleCourante = debut;
|
||||
boolean lignesRestantes;
|
||||
|
||||
do {
|
||||
cleCourante = lignesCode.ceilingKey(cleCourante);
|
||||
lignesRestantes = cleCourante != null
|
||||
&& cleCourante.compareTo(fin) <= 0;
|
||||
if (lignesRestantes) {
|
||||
lignesCode.remove(cleCourante);
|
||||
cleCourante = new Etiquette(cleCourante.getValeur() + 1);
|
||||
}
|
||||
} while (lignesRestantes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Arrête l'exécution du programme
|
||||
*/
|
||||
public void stop() {
|
||||
enExecution = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Boucle d'exécution du programme
|
||||
*/
|
||||
private void execution() {
|
||||
Etiquette etiquetteCourante;
|
||||
while (enExecution) {
|
||||
etiquetteCourante = compteurOrdinnal.pop();
|
||||
etiquetteCourante = lignesCode.ceilingKey(etiquetteCourante);
|
||||
enExecution = etiquetteCourante != null
|
||||
&& etiquetteCourante.getValeur() + 1 <= VALEUR_ETIQUETTE_MAX;
|
||||
|
||||
if (enExecution) {
|
||||
compteurOrdinnal.push(
|
||||
new Etiquette(etiquetteCourante.getValeur() + 1));
|
||||
lignesCode.get(etiquetteCourante).executer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Lance l'exécution du programme à partir de l'étiquette
|
||||
* passée en argument
|
||||
*
|
||||
* @param etiquetteDepart étiquette à partir de laquelle
|
||||
* l'exécution du programme est lancée
|
||||
*/
|
||||
public void lancer(Etiquette etiquetteDepart) {
|
||||
compteurOrdinnal.clear();
|
||||
compteurOrdinnal.push(etiquetteDepart);
|
||||
enExecution = true;
|
||||
execution();
|
||||
}
|
||||
|
||||
/**
|
||||
* Lance l'exécution du programme à partir de l'étiquette
|
||||
* la plus petite
|
||||
*/
|
||||
public void lancer() {
|
||||
lancer(new Etiquette(VALEUR_ETIQUETTE_MIN));
|
||||
}
|
||||
|
||||
/**
|
||||
* Change le compteur ordinal avec l'étiquette argument
|
||||
* @param destination étiquette où continuer l'exécution
|
||||
*/
|
||||
public void vaen(Etiquette destination) {
|
||||
if (!compteurOrdinnal.isEmpty()) {
|
||||
compteurOrdinnal.pop();
|
||||
}
|
||||
compteurOrdinnal.push(destination);
|
||||
enExecution = true;
|
||||
execution();
|
||||
}
|
||||
|
||||
/**
|
||||
* Appel une procédure en empilant l'étiquette de départ dans
|
||||
* le compteurOrdinal
|
||||
* @param depart étiquette du début de la procédure
|
||||
*/
|
||||
public void appelProcedure(Etiquette depart) {
|
||||
compteurOrdinnal.push(depart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retour d'une procédure en dépilant l'étiquette de départ dans
|
||||
* le compteurOrdinal
|
||||
* @param depart étiquette du début de la procédure
|
||||
* @throws ExecutionException lorsque retourProcedure vide le
|
||||
* compteurOrdinnal
|
||||
*/
|
||||
public void retourProcedure() {
|
||||
final String ERREUR_RETOUR = "erreur retour nécessite un appel de "
|
||||
+ "procédure au préalable";
|
||||
try {
|
||||
compteurOrdinnal.pop();
|
||||
} catch (EmptyStackException lancee) {
|
||||
// empty body
|
||||
}
|
||||
|
||||
|
||||
if (compteurOrdinnal.isEmpty()) {
|
||||
throw new ExecutionException(ERREUR_RETOUR);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,219 @@
|
||||
/**
|
||||
* TestEtiquette.java 13 mai 2021
|
||||
* IUT Rodez info1 2020-2021, pas de copyright, aucun droit
|
||||
*/
|
||||
package interpreteurlir.programmes.tests;
|
||||
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.programmes.Etiquette;
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link Etiquette}
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heïa Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class TestEtiquette {
|
||||
|
||||
/** Jeu de données valides pour les tests */
|
||||
private Etiquette[] fixture = {
|
||||
new Etiquette(Etiquette.VALEUR_ETIQUETTE_MIN),
|
||||
new Etiquette(10),
|
||||
new Etiquette(15),
|
||||
new Etiquette(8),
|
||||
new Etiquette(18),
|
||||
new Etiquette(1500),
|
||||
new Etiquette(1501),
|
||||
new Etiquette(Etiquette.VALEUR_ETIQUETTE_MAX),
|
||||
new Etiquette("" +Etiquette.VALEUR_ETIQUETTE_MIN),
|
||||
new Etiquette(" 10"),
|
||||
new Etiquette("15 "),
|
||||
new Etiquette("8"),
|
||||
new Etiquette("18"),
|
||||
new Etiquette("1500 "),
|
||||
new Etiquette(" 1501 "),
|
||||
new Etiquette("" + Etiquette.VALEUR_ETIQUETTE_MAX),
|
||||
};
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link Etiquette#Etiquette(int)}
|
||||
*/
|
||||
public void testEtiquetteInt() {
|
||||
System.out.println("\tExécution du test de Etiquette#Etiquette(int)");
|
||||
|
||||
final int[] INVALIDES = {
|
||||
Integer.MIN_VALUE, -1, 0, 100000, Integer.MAX_VALUE
|
||||
};
|
||||
|
||||
for (int valeur : INVALIDES) {
|
||||
try {
|
||||
new Etiquette(valeur);
|
||||
echec();
|
||||
} catch (InterpreteurException lancee) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
new Etiquette(Etiquette.VALEUR_ETIQUETTE_MIN);
|
||||
new Etiquette(10);
|
||||
new Etiquette(15);
|
||||
new Etiquette(8);
|
||||
new Etiquette(18);
|
||||
new Etiquette(1500);
|
||||
new Etiquette(1501);
|
||||
new Etiquette(Etiquette.VALEUR_ETIQUETTE_MAX);
|
||||
} catch (InterpreteurException lancee) {
|
||||
echec();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link Etiquette#Etiquette(String)}
|
||||
*/
|
||||
public void testEtiquetteString() {
|
||||
System.out.println("\tExécution du test de "
|
||||
+ "Etiquette#Etiquette(String)");
|
||||
|
||||
final String[] INVALIDES = {
|
||||
null, "", "cinq",
|
||||
"" + Integer.MIN_VALUE, "-1", " 0",
|
||||
"100000 ", "" + Integer.MAX_VALUE
|
||||
};
|
||||
|
||||
for (String valeur : INVALIDES) {
|
||||
try {
|
||||
new Etiquette(valeur);
|
||||
echec();
|
||||
} catch (InterpreteurException lancee) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
new Etiquette("" +Etiquette.VALEUR_ETIQUETTE_MIN);
|
||||
new Etiquette(" 10");
|
||||
new Etiquette("15 ");
|
||||
new Etiquette("8");
|
||||
new Etiquette("18");
|
||||
new Etiquette("1500 ");
|
||||
new Etiquette(" 1501 ");
|
||||
new Etiquette("" + Etiquette.VALEUR_ETIQUETTE_MAX);
|
||||
} catch (InterpreteurException lancee) {
|
||||
echec();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link Etiquette#toString()}
|
||||
*/
|
||||
public void testToString() {
|
||||
System.out.println("\tExécution du test de Etiquette#toString()");
|
||||
|
||||
final String[] TEXTE_ATTENDU = {
|
||||
"1",
|
||||
"10",
|
||||
"15",
|
||||
"8",
|
||||
"18",
|
||||
"1500",
|
||||
"1501",
|
||||
"99999",
|
||||
"1",
|
||||
"10",
|
||||
"15",
|
||||
"8",
|
||||
"18",
|
||||
"1500",
|
||||
"1501",
|
||||
"99999",
|
||||
};
|
||||
|
||||
for (int numTest = 0 ; numTest < TEXTE_ATTENDU.length ; numTest++) {
|
||||
assertEquivalence(fixture[numTest].toString(),
|
||||
TEXTE_ATTENDU[numTest]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link Etiquette#getValeur()}
|
||||
*/
|
||||
public void testGetValeur() {
|
||||
System.out.println("\tExécution du test de Etiquette#getValeur()");
|
||||
|
||||
final int[] VALEUR_ATTENDUE = {
|
||||
1,
|
||||
10,
|
||||
15,
|
||||
8,
|
||||
18,
|
||||
1500,
|
||||
1501,
|
||||
99999,
|
||||
1,
|
||||
10,
|
||||
15,
|
||||
8,
|
||||
18,
|
||||
1500,
|
||||
1501,
|
||||
99999,
|
||||
};
|
||||
|
||||
for (int numTest = 0 ; numTest < VALEUR_ATTENDUE.length ; numTest++) {
|
||||
assertEquivalence(fixture[numTest].getValeur(),
|
||||
VALEUR_ATTENDUE[numTest]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaires de {@link Etiquette#compareTo(Etiquette)}
|
||||
*/
|
||||
public void testCompareTo() {
|
||||
final Etiquette[] CROISSANTS = {
|
||||
new Etiquette(Etiquette.VALEUR_ETIQUETTE_MIN),
|
||||
new Etiquette(8),
|
||||
new Etiquette(10),
|
||||
new Etiquette(15),
|
||||
new Etiquette(18),
|
||||
new Etiquette(1500),
|
||||
new Etiquette(1501),
|
||||
new Etiquette(Etiquette.VALEUR_ETIQUETTE_MAX),
|
||||
};
|
||||
|
||||
System.out.println("\tExécution du test de "
|
||||
+ "Etiquette#compareTo(Etiquette)");
|
||||
|
||||
/** Test croissant */
|
||||
for (int reference = 0 ; reference < CROISSANTS.length ; reference++) {
|
||||
for (int numtest = reference + 1 ;
|
||||
numtest < CROISSANTS.length ;
|
||||
numtest++) {
|
||||
assertTrue(CROISSANTS[reference].compareTo(
|
||||
CROISSANTS[numtest]) < 0);
|
||||
}
|
||||
}
|
||||
|
||||
/** Test décroissant */
|
||||
for (int reference = CROISSANTS.length - 1 ;
|
||||
reference > 0 ;
|
||||
reference--) {
|
||||
|
||||
for (int numtest = reference - 1 ;
|
||||
numtest >= 0 ;
|
||||
numtest--) {
|
||||
assertTrue(CROISSANTS[reference].compareTo(
|
||||
CROISSANTS[numtest]) > 0);
|
||||
}
|
||||
}
|
||||
|
||||
Etiquette referenceEgalite = new Etiquette(666);
|
||||
assertTrue(referenceEgalite.compareTo(referenceEgalite) == 0);
|
||||
assertTrue(referenceEgalite.compareTo(new Etiquette("666")) == 0);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,364 @@
|
||||
/**
|
||||
* TestProgramme.java 14 mai 2021
|
||||
* IUT-Rodez info1 2020-2021, pas de droits, pas de copyrights
|
||||
*/
|
||||
package interpreteurlir.programmes.tests;
|
||||
|
||||
import interpreteurlir.programmes.*;
|
||||
import interpreteurlir.Contexte;
|
||||
import interpreteurlir.ExecutionException;
|
||||
import interpreteurlir.InterpreteurException;
|
||||
import interpreteurlir.expressions.Expression;
|
||||
import interpreteurlir.motscles.instructions.*;
|
||||
import static info1.outils.glg.Assertions.*;
|
||||
|
||||
/**
|
||||
* Tests unitaires de {@link Programme}
|
||||
*
|
||||
* @author Nicolas Caminade
|
||||
* @author Sylvan Courtiol
|
||||
* @author Pierre Debas
|
||||
* @author Heia Dexter
|
||||
* @author Lucas Vabre
|
||||
*/
|
||||
public class TestProgramme {
|
||||
|
||||
private Programme programmeTest = new Programme();
|
||||
|
||||
private Contexte contexteTest = new Contexte();
|
||||
|
||||
private final Etiquette[] JEU_ETIQUETTES = {
|
||||
new Etiquette(1),
|
||||
new Etiquette(10),
|
||||
new Etiquette(13),
|
||||
new Etiquette(5),
|
||||
new Etiquette(31),
|
||||
new Etiquette(40),
|
||||
new Etiquette(5),
|
||||
new Etiquette(89)
|
||||
};
|
||||
|
||||
private final Instruction[] JEU_INSTRUCTIONS = {
|
||||
new InstructionVar("$toto = \"toto\"", contexteTest),
|
||||
new InstructionVar("tata = 0 + 0", contexteTest),
|
||||
new InstructionVar("$titi = \"titi\"", contexteTest),
|
||||
new InstructionEntre("agreu", contexteTest),
|
||||
new InstructionEntre("tutu", contexteTest),
|
||||
new InstructionVar("entier = 93", contexteTest),
|
||||
new InstructionVar("$agreuagreu = \"agreu\"", contexteTest),
|
||||
new InstructionVar("$youpi = \"youpi lapin\"", contexteTest)
|
||||
};
|
||||
|
||||
private static final Etiquette[][] BORNES = {
|
||||
{ new Etiquette(6), new Etiquette(6) },
|
||||
{ new Etiquette(1), new Etiquette(90) },
|
||||
{ new Etiquette(31), new Etiquette(39) },
|
||||
{ new Etiquette(9), new Etiquette(41) }
|
||||
};
|
||||
|
||||
private static final int DEBUT = 0;
|
||||
private static final int FIN = 1;
|
||||
|
||||
private void ajoutLigne() {
|
||||
for (int i = 0; i < JEU_ETIQUETTES.length; i++) {
|
||||
programmeTest.ajouterLigne(JEU_ETIQUETTES[i], JEU_INSTRUCTIONS[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link Programme#Programme()}
|
||||
*/
|
||||
public void testProgramme() {
|
||||
System.out.println("\tExécution du test de Programme() : ");
|
||||
|
||||
try {
|
||||
new Programme();
|
||||
} catch (Exception lancee) {
|
||||
echec();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link Programme#ajouterLigne(Etiquette, Instruction)}
|
||||
*/
|
||||
public void testAjouterLigne() {
|
||||
|
||||
final Etiquette[] ETIQUETTES_INVALIDES = {
|
||||
null,
|
||||
new Etiquette(1),
|
||||
null,
|
||||
};
|
||||
|
||||
final Instruction[] INSTRUCTIONS_INVALIDES = {
|
||||
new InstructionEntre("janis", contexteTest),
|
||||
null,
|
||||
null
|
||||
};
|
||||
|
||||
System.out.println("\tExécution du test de ajouterLigne() : ");
|
||||
|
||||
for (int i = 0; i < ETIQUETTES_INVALIDES.length; i++) {
|
||||
try {
|
||||
programmeTest.ajouterLigne(ETIQUETTES_INVALIDES[i],
|
||||
INSTRUCTIONS_INVALIDES[i]);
|
||||
echec();
|
||||
} catch (NullPointerException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < JEU_ETIQUETTES.length; i++) {
|
||||
try {
|
||||
programmeTest.ajouterLigne(JEU_ETIQUETTES[i],
|
||||
JEU_INSTRUCTIONS[i]);
|
||||
} catch (NullPointerException lancee) {
|
||||
echec();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link Programme#toString()}
|
||||
*/
|
||||
public void testToString() {
|
||||
|
||||
final String TEXTE_ATTENDU = "1 var $toto = \"toto\"\n"
|
||||
+ "5 var $agreuagreu = \"agreu\"\n"
|
||||
+ "10 var tata = 0 + 0\n"
|
||||
+ "13 var $titi = \"titi\"\n"
|
||||
+ "31 entre tutu\n"
|
||||
+ "40 var entier = 93\n"
|
||||
+ "89 var $youpi = \"youpi lapin\"\n";
|
||||
|
||||
ajoutLigne();
|
||||
System.out.println("\tExécution du test de toString() : ");
|
||||
assertEquivalence(TEXTE_ATTENDU, programmeTest.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link Programme#raz()}
|
||||
*/
|
||||
public void testRaz() {
|
||||
|
||||
System.out.println("\tExécution du test de raz() : ");
|
||||
|
||||
programmeTest.raz();
|
||||
assertEquivalence(programmeTest.toString(), "");
|
||||
|
||||
ajoutLigne();
|
||||
programmeTest.raz();
|
||||
assertEquivalence(programmeTest.toString(), "");
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link Programme#listeBornee(Etiquette, Etiquette)}
|
||||
*/
|
||||
public void testListeBornee() {
|
||||
|
||||
final String[] TEXTES_ATTENDUS = {
|
||||
"Aucune ligne de code dans cet intervalle.\n",
|
||||
"1 var $toto = \"toto\"\n"
|
||||
+ "5 var $agreuagreu = \"agreu\"\n"
|
||||
+ "10 var tata = 0 + 0\n"
|
||||
+ "13 var $titi = \"titi\"\n"
|
||||
+ "31 entre tutu\n"
|
||||
+ "40 var entier = 93\n"
|
||||
+ "89 var $youpi = \"youpi lapin\"\n",
|
||||
"31 entre tutu\n",
|
||||
"10 var tata = 0 + 0\n"
|
||||
+ "13 var $titi = \"titi\"\n"
|
||||
+ "31 entre tutu\n"
|
||||
+ "40 var entier = 93\n",
|
||||
};
|
||||
|
||||
final Etiquette[][] BORNES_INVALIDES = {
|
||||
{ new Etiquette(8), new Etiquette(6) },
|
||||
{ new Etiquette(10000), new Etiquette(90) }
|
||||
};
|
||||
|
||||
ajoutLigne();
|
||||
|
||||
System.out.println("\tExécution du test de listeBornee() : ");
|
||||
|
||||
for (int i = 0; i < TEXTES_ATTENDUS.length; i++) {
|
||||
assertEquivalence(TEXTES_ATTENDUS[i],
|
||||
programmeTest.listeBornee(BORNES[i][DEBUT],
|
||||
BORNES[i][FIN]));
|
||||
}
|
||||
|
||||
for (int i = 0; i < BORNES_INVALIDES.length; i++) {
|
||||
try {
|
||||
programmeTest.listeBornee(BORNES_INVALIDES[i][DEBUT],
|
||||
BORNES_INVALIDES[i][FIN]);
|
||||
echec();
|
||||
} catch (InterpreteurException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link Programme#effacer(Etiquette, Etiquette)}
|
||||
*/
|
||||
public void testEffacer() {
|
||||
|
||||
// final Etiquette[][] BORNES = {
|
||||
// { new Etiquette(6), new Etiquette(6) },
|
||||
// { new Etiquette(1), new Etiquette(90) },
|
||||
// { new Etiquette(31), new Etiquette(39) },
|
||||
// { new Etiquette(9), new Etiquette(41) }
|
||||
// };
|
||||
|
||||
final String[] TEXTES_ATTENDUS = {
|
||||
"1 var $toto = \"toto\"\n"
|
||||
+ "5 var $agreuagreu = \"agreu\"\n"
|
||||
+ "10 var tata = 0 + 0\n"
|
||||
+ "13 var $titi = \"titi\"\n"
|
||||
+ "31 entre tutu\n"
|
||||
+ "40 var entier = 93\n"
|
||||
+ "89 var $youpi = \"youpi lapin\"\n",
|
||||
"",
|
||||
"1 var $toto = \"toto\"\n"
|
||||
+ "5 var $agreuagreu = \"agreu\"\n"
|
||||
+ "10 var tata = 0 + 0\n"
|
||||
+ "13 var $titi = \"titi\"\n"
|
||||
+ "40 var entier = 93\n"
|
||||
+ "89 var $youpi = \"youpi lapin\"\n",
|
||||
"1 var $toto = \"toto\"\n"
|
||||
+ "5 var $agreuagreu = \"agreu\"\n"
|
||||
+ "89 var $youpi = \"youpi lapin\"\n",
|
||||
};
|
||||
|
||||
final Etiquette[][] BORNES_INVALIDES = {
|
||||
{ new Etiquette(8), new Etiquette(6) },
|
||||
{ new Etiquette(10000), new Etiquette(90) }
|
||||
};
|
||||
|
||||
System.out.println("\tExécution du test de effacer() : ");
|
||||
|
||||
for (int i = 0; i < BORNES.length ; i++) {
|
||||
ajoutLigne();
|
||||
programmeTest.effacer(BORNES[i][DEBUT], BORNES[i][FIN]);
|
||||
assertEquivalence(programmeTest.toString(), TEXTES_ATTENDUS[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < BORNES_INVALIDES.length; i++) {
|
||||
try {
|
||||
programmeTest.effacer(BORNES_INVALIDES[i][DEBUT],
|
||||
BORNES_INVALIDES[i][FIN]);
|
||||
echec();
|
||||
} catch (InterpreteurException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link Programme#stop()}
|
||||
*/
|
||||
public void testStop() {
|
||||
//TODO écrire les tests lorsque l'instruction stop sera définie
|
||||
|
||||
System.out.println("\tExécution du test de stop() : ");
|
||||
|
||||
echec();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link Programme#lancer(Etiquette)}
|
||||
*/
|
||||
public void testLancerEtiquette() {
|
||||
final Etiquette[] ETIQUETTES_DEPART = {
|
||||
new Etiquette(1),
|
||||
new Etiquette(9),
|
||||
new Etiquette(25),
|
||||
new Etiquette(90)
|
||||
};
|
||||
|
||||
Expression.referencerContexte(contexteTest);
|
||||
|
||||
ajoutLigne();
|
||||
|
||||
System.out.println("\tExécution du test de lancer(Etiquette) "
|
||||
+ "TEST INTERACTIF : ");
|
||||
|
||||
for (int i = 0; i < ETIQUETTES_DEPART.length; i++) {
|
||||
System.out.println(programmeTest.listeBornee(ETIQUETTES_DEPART[i],
|
||||
new Etiquette(9999)));
|
||||
|
||||
contexteTest.raz();
|
||||
programmeTest.lancer(ETIQUETTES_DEPART[i]);
|
||||
System.out.println(contexteTest.toString());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link Programme#lancer()}
|
||||
*/
|
||||
public void testLancer() {
|
||||
|
||||
Expression.referencerContexte(contexteTest);
|
||||
contexteTest.raz();
|
||||
|
||||
ajoutLigne();
|
||||
|
||||
System.out.println("\tExécution du test de lancer() "
|
||||
+ "TEST INTERACTIF : ");
|
||||
System.out.println(programmeTest.toString());
|
||||
programmeTest.lancer();
|
||||
System.out.println(contexteTest.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link Programme#appelProcedure(Etiquette)}
|
||||
*/
|
||||
public void testAppelProcedure() {
|
||||
//TODO écrire les tests
|
||||
|
||||
System.out.println("\tExécution du test de appelProcedure(Etiquette) "
|
||||
+ ": ");
|
||||
|
||||
echec();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link Programme#retourProcedure()}
|
||||
*/
|
||||
public void testRetourProcedure() {
|
||||
|
||||
System.out.println("\tExécution du test de retourProcedure() : ");
|
||||
|
||||
// Simulation du lancement du programme
|
||||
programmeTest.appelProcedure(new Etiquette(1));
|
||||
// Lancement de 2 procédures
|
||||
programmeTest.appelProcedure(new Etiquette(100));
|
||||
programmeTest.appelProcedure(new Etiquette(50));
|
||||
|
||||
try {
|
||||
programmeTest.retourProcedure();
|
||||
programmeTest.retourProcedure();
|
||||
} catch (ExecutionException lancee) {
|
||||
echec();
|
||||
}
|
||||
|
||||
try {
|
||||
programmeTest.retourProcedure();
|
||||
echec();
|
||||
} catch (ExecutionException lancee) {
|
||||
// Test OK
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test unitaire de {@link Programme#vaen(Etiquette)}
|
||||
*/
|
||||
public void testVaen() {
|
||||
//TODO écrire les tests
|
||||
|
||||
System.out.println("\tExécution du test de vaen(Etiquette) "
|
||||
+ ": ");
|
||||
|
||||
echec();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user