JML - TD 1 Yves LEDRU septembre 2013



Documents pareils
TP1. Outils Java Eléments de correction

Introduction à Eclipse

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Tp 1 correction. Structures de données (IF2)

La base de données XML exist. A. Belaïd

Java Licence Professionnelle CISII,

Plan du cours. Historique du langage Nouveautés de Java 7

Cours 1: Java et les objets

Environnements de développement (intégrés)

Java Licence Professionnelle CISII,

Le langage C. Séance n 4

TP, première séquence d exercices.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Quelques éléments de compilation en C et makefiles

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Bases Java - Eclipse / Netbeans

Projet de programmation (IK3) : TP n 1 Correction

Chapitre 10. Les interfaces Comparable et Comparator 1

Programmation avec des objets : Cours 7. Menu du jour

Cours 1 : La compilation

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Programmer en JAVA. par Tama

Conventions d écriture et outils de mise au point

Java Licence professionnelle CISII,

Systeme d'exploitation

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Utilisation d objets : String et ArrayList

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Les arbres binaires de recherche

TP1 : Initiation à Java et Eclipse

Arbres binaires de recherche

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Initiation à JAVA et à la programmation objet.

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Algorithmique I. Algorithmique I p.1/??

Installation et compilation de gnurbs sous Windows

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Chapitre VI- La validation de la composition.

Le prototype de la fonction main()

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Votre premier projet Android

Installation et prise en main

BIRT (Business Intelligence and Reporting Tools)

F. Barthélemy. 17 mai 2005

Package Java.util Classe générique

Cours d initiation à la programmation en C++ Johann Cuenin

Remise à niveau d un programme JAVA du domaine public

Programmation par les Objets en Java

TD/TP 1 Introduction au SDK d Android

Un ordonnanceur stupide

Programmation Orientée Objet Java

TP1 : Initiation à l algorithmique (1 séance)

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

TP Programmation Java / JDBC / Oracle

as Architecture des Systèmes d Information

Problèmes liés à la concurrence

Auto-évaluation Programmation en Java

Introduction au langage C

TD3: tableaux avancées, première classe et chaînes

Classe et groupe : 1P 3 SEN TRI. Ubuntu : serveur Contrôleur de Domaine (PDC) avec SAMBA

1. Base de données SQLite

Plateforme PAYZEN. Définition de Web-services

Java DataBaseConnectivity

Apprendre Java et C++ avec NetBeans

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Une introduction à Java

Cours de Programmation 2

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Construire des plug-ins pour SAS Management Console SAS 9.1

Eclipse atelier Java

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Définition des Webservices Ordre de paiement par . Version 1.0

Introduction au langage Java

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

ACTIVITÉ DE PROGRAMMATION

Java et les annotations

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Pharmed. gestion de pharmacie hospitalière. Installation / déploiement

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Présentation du langage et premières fonctions

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Programmation Par Objets

Corrigés des premiers exercices sur les classes

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Les structures de données. Rajae El Ouazzani

Java 1.5 : principales nouveautés

Corrigé des exercices sur les références

Environnements de développement (intégrés)

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Transcription:

Université Joseph Fourier UFR IM2AG Master 2 Génie Informatique année 2013-2014 1 Logiciels utilisés 1.1 Distribution JML5.6 JML - TD 1 Yves LEDRU septembre 2013 La distribution de JML5.6 est installée sur les stations de travail Linux de l UFR IM2AG. Elle est également disponible à l URL suivant: http://sourceforge.net/projects/jmlspecs/files/jmlspecs/5.6_rc4/ Pour l installer sous Windows, il suffit de récupérer le fichier JML.5.6_rc4.tar.gz, de l extraire sous C:\JML et de rajouter C:\JML\bin à votre path sous windows. Une documentation plus complète sur JML est disponible sur le site http://jmlspecs.org ou à l URL suivant http://www.eecs.ucf.edu/~leavens/jml/jmlrefman/ 1.2 Autres outils Les tests seront effectués avec JUnit, de préférence, avec la version 4 de JUnit, disponible sous http://junit.org/ (mais également incluse dans la distribution de eclipse). Si vous travaillez sous Windows, il est recommandé d utiliser GNU make, disponible sous: http://gnuwin32.sourceforge.net/packages/make.htm Vérifiez également que make et javac sont dans votre path. Si vous travaillez sous eclipse, vous devez configurer (setup) votre projet pour qu il utilise JUnit4, et ajouter jmlruntime.jar dans votre build path (via le menu Properties>Java Build Path>Libraries de votre projet, et la commande Add external JARs Les fichiers décrits dans ce TP sont disponibles sur le site Moodle du cours: http://imag-moodle.e.ujf-grenoble.fr/course/view.php?id=93 1

2 Implantation d un ensemble par un arbre On considère la structure de données suivante, contrainte par un invariant JML (fichier SetAsTree.java). 1 /*@ nullable_by_default @*/ public class SetAsTree{ public Integer val; public SetAsTree ltree; 5 public SetAsTree rtree; //@ public invariant ((val!= null) (ltree == null && rtree == null)); //@ public invariant ((ltree == null) (!ltree.emptyset() && ( ltree.max() < val.intvalue() ))); //@ public invariant ((rtree == null) (!rtree.emptyset() && ( rtree.min() > val.intvalue() ))); 10 //@ public invariant (* no cycle in the tree *); // Constructor public SetAsTree(){ // produces an empty set val = null; 15 ltree = null; rtree = null; public SetAsTree(int v){ // produces a singleton node val = new Integer(v); 20 ltree = null; rtree = null; public SetAsTree(int v, SetAsTree l, SetAsTree r){ // arbitrary node val = new Integer(v); 25 ltree = l; rtree = r; //getters and setters 30 public Integer getval() { return val; public void setval(integer val) { this.val = val; 35 public SetAsTree getltree() { return ltree; public void setltree(setastree ltree) { 40 this.ltree = ltree; public SetAsTree getrtree() { return rtree; 45 public void setrtree(setastree rtree) { this.rtree = rtree; // Application specific methods 50 public void insert(int v){ public void delete(int v){ 55 // Pure functions used in the specification public /*@ pure @*/ boolean emptyset(){ return val == null; public /*@ pure @*/ int min(){ 60 if (ltree!= null && ltree.getval().intvalue() < val.intvalue()){return ltree.min(); else return val.intvalue(); 2

public /*@ pure @*/ int max(){ if (rtree!= null && rtree.getval().intvalue() > val.intvalue()){return rtree.max(); 65 else return val.intvalue(); // Non side-effecting methods public /*@ non_null @*/ String tostring(){ 70 String s = ""; if (ltree!= null) {s=s+ltree.tostring();; s = s+" "+val+" "; if (rtree!= null) {s=s+rtree.tostring();; return s; 75 public void skip(){ // useful to test the invariant. Cette structure de données code un ensemble d entiers sous forme d arbre. L invariant garantit les propriétés suivantes: 1. Les éléments de l arbre n y apparaissent qu une fois. 2. Une valeur est toujours plus grande que tous les éléments de l arbre à gauche et plus petite que les éléments de l arbre à droite. 3. Il n y a pas d éléments nuls inutiles. 4. Il n existe qu un seul chemin de la racine de l arbre à un de ses éléments. 5. L arbre ne comprend pas de circularités (spécifié informellement). L objectif de ce premier TD est de se familiariser avec JML et JUnit et d implanter les opérations insert et delete. Cette implantation doit être compatible avec l invariant. L opération insert ajoute un entier, passé comme paramêtre, à l arbre. Si l élément est déjà dans l arbre, l arbre n est pas modifié. L opération delete enlève un entier, passé comme paramêtre, de l arbre. Si l élément n est pas dans l arbre, l arbre n est pas modifié. 3 Programmes de test Pour tester votre implantation, vous disposez de plusieurs programmes de test. MainSetAsTree.java est un programme principal qui appelle les opérations insert et delete puis affiche le contenu de l arbre. Ce même test (sans afficher l état de l arbre) est proposé sous forme de test JUnit dans le fichier TestSetAsTreeJUnit4.java. Le fichier FailingTestSetAsTreeJUnit4.java comprend deux tests correspondant à des formes d arbres interdites. Seul le premier test rapporte une erreur. Le fichier A1Test.java propose une suite de test plus élaborée avec plusieurs centaines de tests. 3

4 Commandes utiles Le fichier Makefile reprend la plupart des commandes nécessaires pour construire ou exécuter l application et ses tests. 1 JMLC = jmlc -O -Q RM = rm JAVA = java JAVAC = javac 5 JUNIT4 = "C:\Program Files (x86)\junit\junit4.10\junit-4.10.jar" JMLRUNTIME = "C:\JML\bin\jmlruntime.jar" JMLCLASSPATH =.;$(JMLRUNTIME) JMLJUNITCLASSPATH = $(JMLCLASSPATH);$(JUNIT4) 10 run : MainSetAsTree.class $(JAVA) -cp $(JMLCLASSPATH) MainSetAsTree 15 SetAsTree.class : SetAsTree.java $(JMLC) SetAsTree.java MainSetAsTree.class : SetAsTree.class MainSetAsTree.java $(JAVAC) MainSetAsTree.java A1Test.class : SetAsTree.class A1Test.java 20 $(JAVAC) -classpath $(JMLJUNITCLASSPATH) A1Test.java A1Test.run : A1Test.class java -cp $(JMLJUNITCLASSPATH) A1Test 25 TestSetAsTreeJUnit4.class : SetAsTree.class TestSetAsTreeJUnit4.java $(JAVAC) -classpath $(JMLJUNITCLASSPATH) TestSetAsTreeJUnit4.java 30 TestSetAsTreeJUnit4.run : TestSetAsTreeJUnit4.class java -cp $(JMLJUNITCLASSPATH) TestSetAsTreeJUnit4 FailingTestSetAsTreeJUnit4.class : SetAsTree.class FailingTestSetAsTreeJUnit4.java $(JAVAC) -classpath $(JMLJUNITCLASSPATH) FailingTestSetAsTreeJUnit4.java FailingTestSetAsTreeJUnit4.run : FailingTestSetAsTreeJUnit4.class 35 java -cp $(JMLJUNITCLASSPATH) FailingTestSetAsTreeJUnit4 eclipsebin : cp *.class../bin 40 clean : $(RM) *.class Pour construire l application et la tester avec le programme MainSetAsTree tapez: make run Pour exécuter la suite de tests TestSetAsTreeJUnit4.class: make TestSetAsTreeJUnit4.run Pour exécuter la suite de tests FailingTestSetAsTreeJUnit4.class: 4

5 Questions Le but de cette première séance de travaux dirigés est de prendre en main les outils et de constater qu un invariant JML permet de détecter des mauvaises instantiations de la structure de données. 1. Compilez et exécutez le programme MainSetAsTree avec make run. 2. Compilez et exécutez la suite de test TestSetAsTreeJUnit4 avec make TestSetAsTreeJUnit4.run Vous constatez que tous les tests réussissent. 3. Compilez et exécutez la suite de test FailingTestSetAsTreeJUnit4 avec Vous constatez qu un des deux tests échoue. Le deuxième test devrait échouer, mais pour que JML voie l erreur, il faut qu il soit appelé depuis la racine de l arbre. 4. Modifiez FailingTestSetAsTreeJUnit4 en ajoutant s5.skip(); au 2e test et constatez que l erreur est détectée. 5. Créez un troisième test pour FailingTestSetAsTreeJUnit4 qui corresponde à un arbre interdit par l invariant et vérifiez qu il échoue à cause d une exception JML. 6. Recompilez SetAsTree.java avec javac uniquement et jouez les tests: javac SetAsTree.java Vous constatez que la spécification JML, qui est à l intérieur de commentaires, n est pas prise en compte par javac et que tous les tests réussissent. 7. Implantez l opération insert. Vous prendrez garde à passer un argument de type Integer (et non int) à setval(integer val) car jmlc fait la distinction entre ces deux types. Testez votre implantation avec les fichiers mis à votre disposition. Complétez les fichiers de test si nécessaire. 8. Si il vous reste du temps: implantez l opération delete. 5