TP - Spécification et test avec JML

publicité
École Centrale Paris
3e année
Techniques de vérification formelle
Année 2014-2015
TP - Spécification et test avec JML
L’objectif de ce TP est d’écrire des spécifications pour une classe Java à l’aide du langage
JML et de tester cette classe en s’aidant des spécifications et des outils associés à JML. Vous
trouverez l’archive contenant les squelettes des fichiers à compléter et les implantations à tester
à l’adresse http://www.lri.fr/~longuet/Enseignements/14-15/ECP-TVF/TP-JML.zip.
Spécification des tableaux redimensionnables. On considère la classe RArray implantant des tableaux redimensionnables. Une instance de la classe RArray est un tableau dont les
valeurs non null sont stockées au début du tableau, entre les indices 0 et taille (exclu). Un
même objet peut être présent plusieurs fois dans le tableau.
Le constructeur de la classe permet d’initialiser un RArray vide de la capacité passée en
argument (non nulle). Il est possible de vider entièrement un RArray avec clear. On peut
savoir si un élément est présent dans un RArray avec contains, le nombre d’occurrences
de cet élément avec nbOcc, et un des indices auxquels se trouve un élément avec index (la
méthode renvoie −1 si l’élément n’est pas présent).
Il est toujours possible d’ajouter un élément à un RArray avec la méthode add, il est
redimensionné si besoin. La méthode replace permet de remplacer l’élément à l’indice index
par un nouvel élément, et renvoie l’élément remplacé. On peut supprimer l’objet se trouvant
à un indice donné avec removeInd. On peut supprimer toutes les occurrences d’un objet avec
remove, qui renvoie true si l’élément a pu être supprimé, false sinon.
public class RArray {
private Object[] tab;
private int taille;
public
public
public
public
public
public
public
public
public
RArray(int capacite) {}
void clear() {}
boolean contains(Object e) {}
int nbOcc(Object e) {}
int index(Object e) {}
void add(Object e) {}
Object replace(Object e, int indice) {}
Object removeInd(int indice) {}
boolean remove(Object e) {}
}
Fichiers fournis. Le fichier RArray.refines-java va contenir la spécification JML de
la classe RArray.java dont sont fournies plusieurs implantations, chacune dans un dossier
RArray*. Elle donne en en-tête le chemin de la classe implantant cette spécification. Il faudra changer ce chemin pour changer l’implantation à tester.
1
//@ refines "RArray1/RArray.java";
Le fichier TestRArray.java contiendra les tests pour cette classe RArray. Le but est
d’écrire la spécification JML et les tests pour la classe RArray, et de tester les implantations
fournies contre votre spécification JML.
Pour ce faire, dans le dossier contenant la spécification et les tests :
> jmlc RArray.refines-java
> javac TestRArray.java
> jmlrac TestRArray
Questions.
1. Complétez le squelette du fichier RArray.refines-java fourni :
(a) donnez en JML les invariants de la classe RArray ;
(b) pour chacune des méthodes de la classe RArray, donnez une spécification JML de
cette méthode en termes de pré et post-conditions.
2. Complétez le squelette de la classe TestRArray.java fourni avec un ensemble de méthodes de test, de manière à couvrir les différents cas de la spécification JML de la classe
RArray.
3. Exécutez vos tests avec jmlrac sur la classe RArray dont la spécification
RArray.refines-java a été compilée avec jmlc (comme expliqué plus haut). Corrigez
vos spécifications en fonction des résultats de vos tests.
N.B. : vous pouvez compiler vos spécifications à tout moment avec jmlc.
Fichiers à rendre.
Envoyer à [email protected] les fichiers RArray.refines-java et TestRArray.java complétés, ainsi qu’un rapport de test des implantations fournies, expliquant pour chacune les non
conformités trouvées.
2
Téléchargement