Merge remote-tracking branch 'tp2/master'

This commit is contained in:
Laureηt 2023-04-22 17:29:56 +02:00
commit 54c4240f38
Signed by: Laurent
SSH key fingerprint: SHA256:kZEpW8cMJ54PDeCvOhzreNr4FSh6R13CMGH/POoO8DI
10 changed files with 306 additions and 0 deletions

19
Assert.java Normal file
View file

@ -0,0 +1,19 @@
/** La classe Assert définit des méthodes de vérification. Pour l'instant, la
* seule méthode de vérification est assertTrue mais d'autres pourraient être
* définies (voir JUnit).
*
* @author Xavier Crégut
* @version $Revision: 1.1 $
*/
abstract public class Assert {
/** Vérifier que la condition est vraie.
* @param condition la condition à vérifier
*/
static public void assertTrue(boolean condition) {
if (! condition) {
throw new Echec();
}
}
}

35
CasLimitesTest.java Normal file
View file

@ -0,0 +1,35 @@
/** Tester quelques cas limites.
* @author Xavier Crégut
* @version $Revision$
*/
public class CasLimitesTest {
public void testOK() {
// OK.
}
private void testMethodePrivee() {
throw new RuntimeException("Une méthode privée n'est pas un test !");
}
protected void testMethodeProtegee() {
throw new RuntimeException("Une méthode protected n'est pas un test !");
}
void testMethodePaquetage() {
throw new RuntimeException("Une méthode de droit d'accès paquetage n'est pas un test !");
}
public static void testMethodeDeClasse() {
throw new RuntimeException("Une méthode de classe n'est pas un test !");
}
public void testAvecParametre(int a) {
throw new RuntimeException("Une méthode avec des paramètres n'est pas un test !");
}
public void testAvecParametre2(int a) {
throw new RuntimeException("Une méthode avec des paramètres n'est pas un test !");
}
}

View file

@ -0,0 +1,13 @@
/** L'exception DeviseInvalideException indique des devises incompatibles sur
* des opérations entre monnaies.
*
* @author Xavier Crégut
* @version $Revision: 1.1 $
*/
public class DeviseInvalideException extends Exception {
public DeviseInvalideException(String message) {
super(message);
}
}

12
Echec.java Normal file
View file

@ -0,0 +1,12 @@
/** L'exception Echec permet de signaler l'erreur fonctionnelle d'un test.
* @author Xavier Crégut
* @version $Revision: 1.1 $
*/
public class Echec extends Error {
public Echec() {
super("condition non vérifiée");
}
public Echec(String message) {
super(message);
}
}

17
ErreurTest.java Normal file
View file

@ -0,0 +1,17 @@
/** ErreurTest est un programme de test qui définit trois méthodes de test
* dont une provoque une erreur.
*/
public class ErreurTest {
public void tester1() {
}
public void tester2() {
Assert.assertTrue(false);
}
public void tester3() {
Assert.assertTrue(true);
}
}

117
LanceurIndependant.java Normal file
View file

@ -0,0 +1,117 @@
import java.lang.reflect.*;
import java.util.*;
/**
* L'objectif est de faire un lanceur simple sans utiliser toutes les clases de
* notre architecture JUnit. Il permet juste de valider la compréhension de
* l'introspection en Java.
*/
public class LanceurIndependant {
private int nbTestsLances;
private int nbErreurs;
private int nbEchecs;
private List<Throwable> erreurs = new ArrayList<>();
public LanceurIndependant(String... nomsClasses) {
System.out.println();
// Lancer les tests pour chaque classe
for (String nom : nomsClasses) {
try {
System.out.println(nom + " : ");
this.testerUneClasse(nom);
System.out.println();
} catch (ClassNotFoundException e) {
System.out.println("Classe inconnue !");
} catch (Exception e) {
System.out.println("Problème : " + e);
e.printStackTrace();
}
}
// Afficher les erreurs
for (Throwable e : erreurs) {
System.out.println();
e.printStackTrace();
}
// Afficher un bilan
System.out.printf("%d tests lancés dont %d échecs et %d erreurs.", nbTestsLances, nbEchecs, nbErreurs);
}
public int getNbTests() {
return this.nbTestsLances;
}
public int getNbErreurs() {
return this.nbErreurs;
}
public int getNbEchecs() {
return this.nbEchecs;
}
private void testerUneClasse(String nomClasse)
throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException, SecurityException {
// Récupérer la classe
Class<?> classe = Class.forName(nomClasse);
// Récupérer les méthodes "preparer" et "nettoyer"
Method preparer, nettoyer;
try {
preparer = classe.getMethod("preparer");
} catch (NoSuchMethodException e) {
preparer = null;
}
try {
nettoyer = classe.getMethod("nettoyer");
} catch (NoSuchMethodException e) {
nettoyer = null;
}
// Instancier l'objet qui sera le récepteur des tests
// Object objet = classe.newInstance();
Object objet = classe.getDeclaredConstructor().newInstance();
// Exécuter les méthods de test
Method[] methods = classe.getMethods();
for (Method method : methods) {
if (method.getName().startsWith("test")) {
this.nbTestsLances++;
if (preparer != null) {
preparer.invoke(objet);
}
try {
method.invoke(objet);
System.out.println(method.getName() + " : success");
} catch (InvocationTargetException e) {
if (e.getCause() instanceof Echec) {
System.out.println(method.getName() + " : echec");
this.erreurs.add(e);
this.nbEchecs++;
} else {
System.out.println(method.getName() + " : erreur");
this.erreurs.add(e);
this.nbErreurs++;
}
} catch (java.lang.IllegalArgumentException e) {
System.out.println(method.getName() + " : erreur, n'est pas un test");
this.nbErreurs++;
}
if (nettoyer != null) {
nettoyer.invoke(objet);
}
}
}
}
public static void main(String... args) {
LanceurIndependant lanceur = new LanceurIndependant(args);
}
}

59
Monnaie.java Normal file
View file

@ -0,0 +1,59 @@
/** La classe Monnaie est caractérisée par une valeur et une devise. Deux
* monnaies peuvent être ajoutées ou retranchées.
*
* @author Xavier Crégut
* @version $Revision: 1.1 $
*/
public class Monnaie {
private int valeur;
private String devise;
/** Initialiser une monnaie à partir de sa valeur de et sa devise.
* @param valeur valeur de la monnaie
* @param devise devise de la monnaie
*/
public Monnaie(int valeur, String devise) {
this.valeur = valeur;
this.devise = devise;
}
/** Obtenir la valeur de cette monnaie.
* @param la valeur de cette monnaie
*/
public int getValeur() {
return this.valeur;
}
/** Obtenir la devise de cette monnaie.
* @param la devise de cette monnaie
*/
public String getDevise() {
return this.devise;
}
/** Ajouter une autre monnaie à cette devise.
* @param autre l'autre devise
* @depend - <send> - DeviseInvalideException
*/
public void ajouter(Monnaie autre) throws DeviseInvalideException {
verifierMemesDevises(autre);
this.valeur += autre.valeur;
}
/** Retrancher une autre monnaie à cette devise.
* @param autre l'autre devise
* @depend - <send> - DeviseInvalideException
*/
public void retrancher(Monnaie autre) throws DeviseInvalideException {
verifierMemesDevises(autre);
this.valeur -= autre.valeur;
}
private void verifierMemesDevises(Monnaie autre) throws DeviseInvalideException {
if (! this.devise.equals(autre.devise)) {
throw new DeviseInvalideException("Devises incompatibles : "
+ this.devise + " et " + autre.devise);
}
}
}

22
MonnaieTest.java Normal file
View file

@ -0,0 +1,22 @@
/** Classe regroupant les tests unitaires de la classe Monnaie. */
public class MonnaieTest {
protected Monnaie m1;
protected Monnaie m2;
public void preparer() {
this.m1 = null; // new Monnaie(5, "euro");
this.m2 = new Monnaie(7, "euro");
}
public void testerAjouter() throws DeviseInvalideException {
m1.ajouter(m2);
Assert.assertTrue(m1.getValeur() == 12);
}
public void testerRetrancher() throws DeviseInvalideException {
m1.retrancher(m2);
Assert.assertTrue(m1.getValeur() == -2);
}
}

12
MonnaieTest2.java Normal file
View file

@ -0,0 +1,12 @@
/** MonnaieTest2 : Vérifier que les méthodes de test de la superclasse sont bien
* prises en compte !
* @author Xavier Crégut
* @version $Revision$
*/
public class MonnaieTest2 extends MonnaieTest {
public void testSupplementaire() {
// OK.
}
}

BIN
sujet.pdf Normal file

Binary file not shown.