ATTENTION ce TP sera évalué et devra être rendu sur moodle

Un projet Java pour proposer une librairie de formes géométriques simple est en cours de réalisation, l'étudiant stagiaire en ayant la charge etant parti on vous demande de reprendre son développement.

Pour le moment deux classes ont été spécifiées :

  1. Une classe \(Point\) qui représente un point dans le plan (voir la javadoc). Cette classe a été complétement implémentée, par contre les test unitaires réalisés ne sont pas totalement terminés.

  2. Une classe \(SegmentDeDroite\) qui représente un segment dans le plan et dont la spécification est la suivante :

    • Un segment de droite est défini par deux points (ses extrémités) qui ne peuvent être confondus.

    • On appelle \(origine\) du segment, celui de ces deux points qui a l'abscisse \(x\) la plus petite et si le segment est vertical (abscisses identiques) celui qui a l'ordonnée \(y\) la plus petite.

    • On appelle \(extremité\) du segment, celui de ces deux points qui a l'abscisse \(x\) la plus grande et si le segment est vertical (abscisses identiques) celui qui a l'ordonnée \(y\) la plus grande.

      exécution des test
      origine et extrémité d'un segment.
    • Les constructeurs proposés par la classe \(SegmentDeDroite\) permettent de définir un segment en spécifiant ses extrémités

      • soit par leurs coordonnées \((x1,y1)\) et \((x2,y2)\),

      • soit par deux Points \(p1\) et \(p2\).

      • l'ordre dans lequels ces points sont passés au constructeur n'a pas d'importance. Les instructions \(new\ SegmentDeDroite(x1,y1,x2,y2)\), \(new\ SegmentDeDroite(x2,y2,x1,y1)\), \(new\ SegmentDeDroite(p1,p2)\) ou \(new\ SegmentDeDroite(p2,p1)\) devront toutes produire le même objet \(SegmentDeDroite\).

      • ces constructeurs doivent garantir le fait que le segment créé n'est pas "dégénéré", c'est à dire que ses points extrémités ne sont pas confondus. Dans le cas contraire l'objet n'est pas créé et une exception de type java.lang.IllegalArgumentException doit être lancée.

    • Les méthodes de cette classe sont :

      • \(getOrigine()\) qui retourne un point correspondant à l'origine du segment.

      • \(getExtremite()\) qui retourne un point correspondant à l'extremité du segment.

      • \(longueur()\) qui calcule et retourne la longueur du segment.

      • \(translater(double\ dx,\ double\ dy)\) qui permet de translater le segment dans le plan selon un vecteur \((dx,dy)\).

      • \(estVertical()\) et \(estHorizontal()\) qui permettent de tester si le segment est respectivment vertical ou horizontal.

      • \(toString()\) qui renvoie une représentation textuelle (chaîne de caractères) du segment, plus précisément les coordonnées des deux points le définissant, les coordonnées de son origine en premier, celles de son extremité en second. Par exemple pour un segment défini par les points \(P1(12,24)\) et \(P2(32,-7)\), la chaîne retournée par cette méthode sera SegmentDeDroite[(12.0,24.0);(32.0,-7.0)]

      • \(egale(SegmentDeDroite\ s)\) qui permet de tester l'égalité du segment avec un autre segment.

Cette classe n'est pas encore impléméntée, seul un squelette avec les signature des constructeurs et méthodes publiques a été écrit (voir la javadoc).

le projet Géométrie
organisation du projet Java maven Géométrie.

1. Terminer tester la classe Point.

Question 1 :

  1. Téléchargez le projet maven TP08_XXX.zip sur votre machine, et extrayez le contenu de cette archive.

  2. Renommez le dossier TP08_XXX en TP08_votreloginAgalan (le TP sera évalué et devra être rendu sur moodle).

  3. En utilisant l'outil de couverture de code jaCoCo, vérifiez le taux de couverture du code qu'assure la classe de test unitaire \(PointTest\). Complétez les tests pour obtenir un taux de converture à 100%.

2. Implémenter la classe \(SegmentDeDroite\)

Adepte du TDD (Test Driven Development ou en français Développement Piloté par les Tests), le chef de projet a pris le soin de faire écrire par un autre développeur chargé des tests, un programme de tests unitaires (en utilisant le framework Junit 5) avant de vous confier la tâche de coder la classe \(SegmentDeDroite\) , Ce programme, \(SegmentDeDroiteTest\) est maintenant terminé, vous allez pouvoir commencer l'implémentation de la classe \(SegmentDeDroite\)

Question 2 :

Enregistrez la cible de ce lien SegmentDeDroiteTest.java pour enregistrer le code source de la classe des tests unitaires \(SegmentDeDroiteTest\) de dans le projet et vérifiez que son exécution produit un rapport de test où tous les tests échouent.

Question 3:

En respectant les spécifications données précédemment, complétez le code Java de la classe \(SegmentDeDroite\) et vérifiez que les tests unitaires définis dans \(SegmentDeDroiteTest\) sont tous exécutés avec succès.

Procédez de manière incrémentale :

  1. écrivez tout d'abord un constructeur et les méthodes \(getOrigine()\) et \(getExtremite()\) et vérifiez qu'elles sont correctes en jouant les tests (un certain nombre de cas de test devraient être réussis),

  2. ecrivez ensuite le deuxième constructeur et vérifier qu'il est conforme (des tests supplémentaires devraient passer),

  3. ensuite implémentez une nouvelle méthode et verifiez que les tests de celle-ci reussissent

  4. recommencez l'étape 3 jusqu'à ce que tous les tests réussissent.

  5. assurez vous que la couverture de code est de 100%. Si ce n'est pas le cas, c'est que vous n'avez pas complètement respecté les spécifications. Complétez votre si necessaire.

ATTENTION : Dans cette exercice vous ne devez pas modifier le code de \(SegmentDeDroiteTest\).

3. Ajouter de nouvelles fonctionnalités à la classe \(SegmentDeDroite\)

Question 4 :

  1. Réflechissez à la spécification \(SegmentDeDroite\) deux méthodes changerOrigine et changerExtremite qui permettent de remplacer respectivement l'origine ou l'extrémité du segment par un nouveau point.

  2. Rajoutez à la classe \(SegmentDeDroite\) le squelette de ces deux méthodes, c'est à dire pour chaque méthode

    • un commentaire javadaco
    • la signature de la méthode
    • le corps de la méthode qui pour le moment se limitera à une seule instruction
      throw new UnsupportedOperationException("opération non encore implémentée"); afin de permettre que votre code compile.

  3. Ecrivez les tests unitaires permettant de vérifier que vos méthodes ont bien l'effet attendu.

  4. Implémentez et testez les méthodes.

  5. Vérfiez la couverture de code. Eventuellement complétez votre code (impélémentation et/ou tests unitaires) jusqu'à obtenir un taux de couverture de 100%.

Question 5 : rajouter à la classe \(SegmentDeDroite\) une fonctionnalité peremttant de créer à partir d'un segment un nouveau segment qui est le symétrique du premier par rapport à l'Origine.

symétrique d'un segement
symétrique d'un segment par rapport à l'origine.

Si vous le jugez nécessaire, vous pouvez étendre les fonctionnalités de la classe point afin de simplifier l'écriture de cette nouvelle fonctionnalité.

4. Ecrire une application

Question 6 :

Dans une classe AppliSegments ecrivez un programme principal qui :

  1. lit au clavier les coordonnées de deux points définissant un segment,

  2. Si le segment est valide (extrémités non confondues) le programme affiche :

    • le point origine du segment,
    • le point extrémité du segment,
    • la longueur du segment,

    sinon programme affiche un message d'erreur et invite l'utilisateur à recommencer (pour les gestion des exceptions \(IllegalArgumentException\) reportez vous à la correction du TP06 sur les comptes bancaires dont vous pourrez vous inspirer).

  3. demande à l'utilisateur si il veut recommencer en 1. avec un autre point ou si il veut terminer l'exécution du progamme.

Ci dessous une trace de l'exécution attendue, en jaune les données rentrées par l'utilisateur)

donnez les coordonnées (x,y)  du premier point du segment
14 23
donnez les coordonnées (x,y)  du deuxième point du segment
12 45
origine   : (12.0,45.0)
extrémité : (14.0,23.0)
longueur  : 22.090722034374522
Voulez vous continuer O/N ?
O
donnez les coordonnées (x,y)  du premier point du segment
10 10
donnez les coordonnées (x,y)  du deuxième point du segment
10 10
points confondus! recommencez !
donnez les coordonnées (x,y)  du premier point du segment
23 -34
donnez les coordonnées (x,y)  du deuxième point du segment
22 28
origine   : (22.0,28.0)
extrémité : (23.0,-34.0)
longueur  : 62.00806399170998
Voulez vous continuer O/N ?
N
Au revoir !