INF 441 - TD 5
Spécification vs Implémentation

Votre opinion sur le cours de ce matin : Votre opinion sur le TD de la semaine dernière :

Soit une interface I et une spécification informelle des méthodes qu'elle déclare. Le but de ce TD est d'écrire des tests qui éprouvent toute classe C qui implémente I. Le TD sera réalisé en Java (créer pour cela le projet td5) bien que la méthodologie qu'il propose s'applique à tout autre langage de programmation.

Principe

On veut écrire une méthode testI telle que pour chaque classe C dont la déclaration est de la forme

        class C implements I {
          ...
        }
    
un appel à

    testI(new C(...), ...)
    
effectue une batterie de tests sur l'objet de la classe C passé en argument et affiche un diagnostic à l'écran. (Les points de suspension représentent ici d'éventuels paramètres nécessaires au constructeur et aux tests.)

Confinement
La batterie de tests lancée par testI(new C(...), ...) ne doit donc jamais « planter » au sens où, pour toute exception levée durant l'exécution d'une méthode de C

Pour cela on rappelle la syntaxe qui permet la récupération des exceptions

            try {
              ... code susceptible de lever une exception de classe E ...
             }
            catch (E e) {
              ... traitement du cas exceptionnel ... 
             }
          

Tester des algorithmes de tri

On va tester ici des programmes de tri. On fournit un fichier intsort.zip qui doit être décompressé dans le répertoire src/ (par exemple avec la commande unzip intfifo.zip). Il contient notamment une interface Sort dont l'unique méthode


        public void sort(int[] a);
    
effectue un tri en place du tableau d'entiers a, ainsi que plusieurs classes qui implémentent Sort.

Écrire une classe TestSort dans le paquet default qui teste si une classe qui implémente Sort répond à la spécification suivante :

L'appliquer sur les différents tris fournis (Sort1.java, Sort2.java, etc.) pour déterminer l'unique tri qui est correct. Pour un code incorrect, on essayera de donner à chaque fois un contre-exemple indiquant la provenance du dysfonctionnement observé.

Bien entendu, il faut jouer le jeu et ne pas regarder le code des différentes classes fournies.

Déposer le fichier TestSort.java :

Tester des files d'entiers

De la même façon, on va tester ici des files contenant des entiers. On fournit un fichier intfifo.zip à décompresser dans le répertoire src/ (par exemple avec la commande unzip intfifo.zip). Il contient notamment une interface FIFO dont la spécification est la suivante : Pour faciliter la gestion des exceptions dans les tests, écrire une classe FIFOWrapper dans le paquet default contenant (entre autres) :

Déposer le fichier FIFOWrapper.java :

À l'aide de la classe FIFOWrapper, écrire une classe TestFIFO à même de tester une implémentation de FIFO.

L'appliquer sur les différents programmes fournis (Queue1.java, Queue2.java, etc.) pour déterminer l'unique code qui est correct. Pour un code incorrect, on essayera de donner à chaque fois un contre-exemple indiquant la provenance du dysfonctionnement observé.

Bien entendu, il faut là encore jouer le jeu et ne pas regarder le code des différentes classes fournies.

Déposer le fichier TestFIFO.java :


Une solution vous est proposée.

les réponses