init
This commit is contained in:
commit
edb95af291
7
.vscode/settings.json
vendored
Normal file
7
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"java.project.referencedLibraries": [
|
||||
"lib/**/*.jar",
|
||||
"/usr/share/java/hamcrest-core.jar",
|
||||
"/usr/share/java/junit.jar"
|
||||
]
|
||||
}
|
233
Cercle.java
Normal file
233
Cercle.java
Normal file
|
@ -0,0 +1,233 @@
|
|||
import java.awt.Color;
|
||||
|
||||
/**
|
||||
* Cercle modélise un cercle géométrique dans un plan équipé d'un
|
||||
* repère cartésien. Un cercle peut être affiché et translaté.
|
||||
*/
|
||||
public class Cercle implements Mesurable2D {
|
||||
|
||||
//@ public invariant getRayon() > 0;
|
||||
//@ public invariant getDiametre() > 0;
|
||||
//@ private invariant rayon == getRayon();
|
||||
//@ private invariant 2*rayon == getDiametre();
|
||||
//@ private invariant couleur == getCouleur();
|
||||
//@ private invariant centre.getX() == getCentre().getX();
|
||||
//@ private invariant centre.getY() == getCentre().getY();
|
||||
|
||||
// Constantes
|
||||
|
||||
/** constante mathématique π. */
|
||||
public static final double PI = Math.PI;
|
||||
|
||||
// Attributs
|
||||
|
||||
/** centre du cercle. */
|
||||
private Point centre;
|
||||
/** rayon du cercle. */
|
||||
private double rayon;
|
||||
/** couleur du cercle. */
|
||||
private Color couleur = Color.BLUE;
|
||||
|
||||
// Constructeurs
|
||||
|
||||
/**
|
||||
* Construire un cercle à partir de son centre et de son rayon.
|
||||
* @param centre centre du cercle
|
||||
* @param rayon rayon du cercle
|
||||
*/
|
||||
//@ requires centre != null;
|
||||
//@ requires rayon > 0;
|
||||
public Cercle(Point centre, double rayon) {
|
||||
assert centre != null;
|
||||
assert rayon > 0;
|
||||
this.centre = new Point(centre.getX(),
|
||||
centre.getY());
|
||||
this.rayon = rayon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construire un cercle à partir de deux points diamétralement opposés.
|
||||
* @param p1 point n°1
|
||||
* @param p2 point n°2
|
||||
*/
|
||||
//@ requires p1 != null;
|
||||
//@ requires p2 != null;
|
||||
//@ requires p1.getX() != p2.getX() && p1.getY() != p2.getY();
|
||||
//@ ensures getRayon() > 0;
|
||||
public Cercle(Point p1, Point p2) {
|
||||
assert p1 != null;
|
||||
assert p2 != null;
|
||||
assert p1.getX() != p2.getX()
|
||||
|| p1.getY() != p2.getY();
|
||||
this.centre = new Point((p1.getX() + p2.getX()) / 2,
|
||||
(p1.getY() + p2.getY()) / 2);
|
||||
this.rayon = p1.distance(p2) / 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construire un cercle coloré à partir de deux points diamétralement opposés.
|
||||
* @param p1 point n°1
|
||||
* @param p2 point n°2
|
||||
* @param couleur couleur du cercle
|
||||
*/
|
||||
//@ requires couleur != null;
|
||||
public Cercle(Point p1, Point p2, Color couleur) {
|
||||
this(p1, p2);
|
||||
assert couleur != null;
|
||||
this.couleur = couleur;
|
||||
}
|
||||
|
||||
// GETs
|
||||
|
||||
/**
|
||||
* Obtenir le rayon du cercle.
|
||||
* @return rayon du cercle
|
||||
*/
|
||||
//@ ensures \result > 0;
|
||||
public /*@ pure @*/ double getRayon() {
|
||||
return this.rayon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtenir le diamètre du cercle.
|
||||
* @return diamètre du cercle
|
||||
*/
|
||||
//@ ensures \result > 0;
|
||||
public /*@ pure @*/ double getDiametre() {
|
||||
return 2 * this.rayon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtenir le centre du cercle.
|
||||
* @return centre du cercle
|
||||
*/
|
||||
public /*@ pure @*/ Point getCentre() {
|
||||
return new Point(this.centre.getX(),
|
||||
this.centre.getY());
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtenir la couleur du cercle.
|
||||
* @return couleur du cercle
|
||||
*/
|
||||
public /*@ pure @*/ Color getCouleur() {
|
||||
return this.couleur;
|
||||
}
|
||||
|
||||
// SETs
|
||||
|
||||
/**
|
||||
* Changer le rayon du cercle.
|
||||
* @param rayon nouveau rayon
|
||||
*/
|
||||
//@ requires rayon > 0;
|
||||
//@ ensures getRayon() == rayon
|
||||
public void setRayon(double rayon) {
|
||||
assert rayon > 0;
|
||||
this.rayon = rayon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changer le diamètre du cercle.
|
||||
* @param d nouveau diamètre
|
||||
*/
|
||||
//@ requires d > 0;
|
||||
//@ ensures getDiametre() == d
|
||||
public void setDiametre(double d) {
|
||||
assert d > 0;
|
||||
this.rayon = d / 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changer le centre du cercle.
|
||||
* @param centre nouveau centre
|
||||
*/
|
||||
//@ requires centre != null;
|
||||
public void setCentre(Point centre) {
|
||||
assert centre != null;
|
||||
this.centre = centre;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changer la couleur du cercle.
|
||||
* @param nouvelleCouleur nouvelle couleur
|
||||
*/
|
||||
//@ requires nouvelleCouleur != null;
|
||||
public void setCouleur(Color nouvelleCouleur) {
|
||||
assert nouvelleCouleur != null;
|
||||
this.couleur = nouvelleCouleur;
|
||||
}
|
||||
|
||||
// Prints
|
||||
|
||||
/**
|
||||
* Convertir le Cercle en un String pour son affichage.
|
||||
* @return String associée au Cercle
|
||||
*/
|
||||
public String toString() {
|
||||
return "C" + this.rayon
|
||||
+ "@" + this.centre;
|
||||
}
|
||||
|
||||
/**
|
||||
* Afficher le cercle.
|
||||
*/
|
||||
public void afficher() {
|
||||
System.out.print(this);
|
||||
}
|
||||
|
||||
// Méthodes
|
||||
|
||||
/**
|
||||
* Translater le cercle.
|
||||
* @param dx déplacement suivant l'axe des X
|
||||
* @param dy déplacement suivant l'axe des Y
|
||||
*/
|
||||
public void translater(double dx, double dy) {
|
||||
this.centre.translater(dx, dy);
|
||||
}
|
||||
|
||||
/**
|
||||
* Vérifier si un point est à l'intérieur du cercle.
|
||||
* @param p point que l'on souhaite tester
|
||||
* @return true si p ∈ 𝒞
|
||||
*/
|
||||
//@ requires p != null;
|
||||
public boolean contient(Point p) {
|
||||
assert p != null;
|
||||
return p.distance(this.centre) <= this.rayon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renvoie le périmètre du cercle.
|
||||
* @return perimètre du cercle
|
||||
*/
|
||||
public double perimetre() {
|
||||
return 2 * PI * this.rayon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renvoie l'aire du cercle.
|
||||
* @return aire du cercle
|
||||
*/
|
||||
public double aire() {
|
||||
return PI * this.rayon * this.rayon;
|
||||
}
|
||||
|
||||
// Méthodes de classe
|
||||
|
||||
/**
|
||||
* Renvoie un Cercle créé à partir du centre et d'un point du cercle.
|
||||
* @param centre centre du Cercle
|
||||
* @param circ Point situé sur le cercle
|
||||
* @return objet Cercle
|
||||
*/
|
||||
//@ requires centre != null;
|
||||
//@ requires circ != null;
|
||||
public static Cercle creerCercle(Point centre, Point circ) {
|
||||
assert centre != null;
|
||||
assert circ != null;
|
||||
return new Cercle(centre, centre.distance(circ));
|
||||
}
|
||||
|
||||
}
|
105
CercleTest.java
Normal file
105
CercleTest.java
Normal file
|
@ -0,0 +1,105 @@
|
|||
import org.junit.*;
|
||||
import java.awt.Color;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Programme de test de la classe Cercle.
|
||||
*/
|
||||
public class CercleTest {
|
||||
|
||||
public static final double EPSILON = 1e-6;
|
||||
// précision pour la comparaison entre réels.
|
||||
|
||||
/** Vérifier si deux points ont mêmes coordonnées.
|
||||
* @param p1 le premier point
|
||||
* @param p2 le deuxième point
|
||||
*/
|
||||
static void memesCoordonnees(Point p1, Point p2) {
|
||||
assertEquals(p1.getX(), p2.getX(), EPSILON);
|
||||
assertEquals(p1.getY(), p2.getY(), EPSILON);
|
||||
}
|
||||
|
||||
private Point p_0 = new Point(0, 0);
|
||||
private Point p_pp = new Point(3, 4);
|
||||
private Point p_pm = new Point(3, -4);
|
||||
private Point p_mm = new Point(-3, -4);
|
||||
private Point p_mp = new Point(-3, 4);
|
||||
|
||||
private Cercle[] c12a = {new Cercle(p_pp, p_mm),
|
||||
new Cercle(p_pm, p_mp),
|
||||
new Cercle(p_mp, p_pm),
|
||||
new Cercle(p_mm, p_pp)};
|
||||
|
||||
private Cercle[] c12b = {new Cercle(p_pp, p_pm),
|
||||
new Cercle(p_pm, p_mm),
|
||||
new Cercle(p_mm, p_mp),
|
||||
new Cercle(p_mp, p_pp)};
|
||||
|
||||
private Cercle[] c13 = {new Cercle(p_pp, p_mm, Color.RED),
|
||||
new Cercle(p_pm, p_mp, Color.GREEN),
|
||||
new Cercle(p_mp, p_pm, Color.WHITE),
|
||||
new Cercle(p_mm, p_pp, Color.BLACK)};
|
||||
|
||||
private Cercle[] c14 = {Cercle.creerCercle(p_0, p_pp),
|
||||
Cercle.creerCercle(p_0, p_pm),
|
||||
Cercle.creerCercle(p_0, p_mp),
|
||||
Cercle.creerCercle(p_0, p_mm)};
|
||||
|
||||
@Test
|
||||
public void testE12a() {
|
||||
for (Cercle c : c12a) {
|
||||
assertNotNull(c);
|
||||
assertEquals(5, c.getRayon(), EPSILON);
|
||||
assertEquals(10, c.getDiametre(), EPSILON);
|
||||
memesCoordonnees(p_0, c.getCentre());
|
||||
assertTrue(c.getCouleur() == Color.BLUE);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testE12b() {
|
||||
for (Cercle c : c12b) {
|
||||
assertNotNull(c);
|
||||
assertTrue(c.getCouleur() == Color.BLUE);
|
||||
}
|
||||
assertEquals(4, c12b[0].getRayon(), EPSILON);
|
||||
assertEquals(8, c12b[0].getDiametre(), EPSILON);
|
||||
assertEquals(3, c12b[1].getRayon(), EPSILON);
|
||||
assertEquals(6, c12b[1].getDiametre(), EPSILON);
|
||||
assertEquals(4, c12b[2].getRayon(), EPSILON);
|
||||
assertEquals(8, c12b[2].getDiametre(), EPSILON);
|
||||
assertEquals(3, c12b[3].getRayon(), EPSILON);
|
||||
assertEquals(6, c12b[3].getDiametre(), EPSILON);
|
||||
|
||||
memesCoordonnees(new Point(3, 0), c12b[0].getCentre());
|
||||
memesCoordonnees(new Point(0, -4), c12b[1].getCentre());
|
||||
memesCoordonnees(new Point(-3, 0), c12b[2].getCentre());
|
||||
memesCoordonnees(new Point(0, 4), c12b[3].getCentre());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testE13() {
|
||||
for (Cercle c : c13) {
|
||||
assertNotNull(c);
|
||||
assertEquals(5, c.getRayon(), EPSILON);
|
||||
assertEquals(10, c.getDiametre(), EPSILON);
|
||||
memesCoordonnees(p_0, c.getCentre());
|
||||
}
|
||||
assertTrue(c13[0].getCouleur() == Color.RED);
|
||||
assertTrue(c13[1].getCouleur() == Color.GREEN);
|
||||
assertTrue(c13[2].getCouleur() == Color.WHITE);
|
||||
assertTrue(c13[3].getCouleur() == Color.BLACK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testE14() {
|
||||
for (Cercle c : c14) {
|
||||
assertNotNull(c);
|
||||
assertEquals(5, c.getRayon(), EPSILON);
|
||||
assertEquals(10, c.getDiametre(), EPSILON);
|
||||
memesCoordonnees(p_0, c.getCentre());
|
||||
assertTrue(c.getCouleur() == Color.BLUE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
95
ComplementsCercleTest.java
Normal file
95
ComplementsCercleTest.java
Normal file
|
@ -0,0 +1,95 @@
|
|||
import org.junit.*;
|
||||
import java.awt.Color;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Programme de test de la classe Cercle.
|
||||
*/
|
||||
public class ComplementsCercleTest {
|
||||
|
||||
public static final double EPSILON = 1e-6;
|
||||
// précision pour la comparaison entre réels.
|
||||
|
||||
private Point p0 = new Point(0, 0);
|
||||
private Point p1 = new Point(3, 4);
|
||||
private Point p2 = new Point(-3, -4);
|
||||
|
||||
private Cercle c1;
|
||||
private Cercle c2;
|
||||
private Cercle c3;
|
||||
private Cercle c4;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
c1 = new Cercle(p0, 1);
|
||||
c2 = new Cercle(p1, p2);
|
||||
c3 = new Cercle(p1, p2, Color.MAGENTA);
|
||||
c4 = Cercle.creerCercle(p0, p1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetRayon() {
|
||||
c1.setRayon(10);
|
||||
assertEquals(10, c1.getRayon(), EPSILON);
|
||||
assertEquals(20, c1.getDiametre(), EPSILON);
|
||||
c2.setRayon(10);
|
||||
assertEquals(10, c2.getRayon(), EPSILON);
|
||||
assertEquals(20, c2.getDiametre(), EPSILON);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetDiametre() {
|
||||
c1.setDiametre(20);
|
||||
assertEquals(20, c1.getDiametre(), EPSILON);
|
||||
assertEquals(10, c1.getRayon(), EPSILON);
|
||||
c3.setDiametre(20);
|
||||
assertEquals(20, c3.getDiametre(), EPSILON);
|
||||
assertEquals(10, c3.getRayon(), EPSILON);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetCouleur() {
|
||||
c1.setCouleur(Color.RED);
|
||||
c3.setCouleur(Color.ORANGE);
|
||||
assertEquals(Color.RED, c1.getCouleur());
|
||||
assertEquals(Color.ORANGE, c3.getCouleur());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetCentre() {
|
||||
c1.setCentre(new Point(10, 10));
|
||||
assertEquals(10, c1.getCentre().getX(), EPSILON);
|
||||
assertEquals(10, c1.getCentre().getY(), EPSILON);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTranslater() {
|
||||
c1.translater(100, 100);
|
||||
assertEquals(100, c1.getCentre().getX(), EPSILON);
|
||||
assertEquals(100, c1.getCentre().getY(), EPSILON);
|
||||
|
||||
c1.translater(-50, -150);
|
||||
assertEquals( 50, c1.getCentre().getX(), EPSILON);
|
||||
assertEquals(-50, c1.getCentre().getY(), EPSILON);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testContient() {
|
||||
assertTrue(c4.contient(p0));
|
||||
assertTrue(c4.contient(p1));
|
||||
assertTrue(c4.contient(p2));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPerimetre() {
|
||||
assertEquals(2*Math.PI, c1.perimetre(), EPSILON);
|
||||
assertEquals(10*Math.PI, c2.perimetre(), EPSILON);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAire() {
|
||||
assertEquals(Math.PI, c1.aire(), EPSILON);
|
||||
assertEquals(25*Math.PI, c2.aire(), EPSILON);
|
||||
}
|
||||
|
||||
}
|
191
FormeCercleTest.java
Normal file
191
FormeCercleTest.java
Normal file
|
@ -0,0 +1,191 @@
|
|||
import java.awt.Color;
|
||||
import java.lang.reflect.*;
|
||||
import org.junit.*;
|
||||
import static org.junit.Assert.*;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* L'objectif de cette classe est de vérifier que la classe Cercle a été
|
||||
* correctement programmée.
|
||||
*
|
||||
* @author Xavier Crégut
|
||||
* @version $Revision$
|
||||
*/
|
||||
|
||||
public class FormeCercleTest {
|
||||
|
||||
// précision pour les comparaisons réelle
|
||||
public final static double EPSILON = 0.001;
|
||||
|
||||
final static private Class<Cercle> cercle = Cercle.class;
|
||||
|
||||
private static Method getMethode(Class<?> c, String name, Class<?>... types)
|
||||
throws NoSuchMethodException
|
||||
{
|
||||
Method resultat = c.getMethod(name, types);
|
||||
assertNotNull("méthode " + name + "(" + types + ") non déclarée !", resultat);
|
||||
return resultat;
|
||||
}
|
||||
|
||||
private void verifierTypeRetour(Method m, Class<?> expected)
|
||||
{
|
||||
// TODO : définir une méthode signatureToString() pour construire la
|
||||
// signature de la méthode plutôt que d'utiliser getName
|
||||
assertEquals("Erreur sur le type de retour de " + m.getName() + ".",
|
||||
expected, m.getReturnType());
|
||||
}
|
||||
|
||||
private static Field getAttribut(Class c, String name)
|
||||
throws NoSuchFieldException
|
||||
{
|
||||
try {
|
||||
return c.getDeclaredField(name);
|
||||
} catch (NoSuchFieldException e) {
|
||||
fail("attribut non déclaré : " + name);
|
||||
return null; // jamais atteint
|
||||
}
|
||||
}
|
||||
|
||||
private static List<Field> getAttributsInstance(Class c) {
|
||||
ArrayList<Field> result = new ArrayList<Field>(5);
|
||||
for (Field f : c.getDeclaredFields()) {
|
||||
if (! Modifier.isStatic(f.getModifiers())) {
|
||||
result.add(f);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void verifierConstanteClasse(Class c, String name)
|
||||
throws NoSuchFieldException
|
||||
{
|
||||
Field attr = getAttribut(c, name);
|
||||
assertTrue(name + " : devrait être une constante !",
|
||||
Modifier.isFinal(attr.getModifiers()));
|
||||
assertTrue(name + " : doit être une constante de *classe* !",
|
||||
Modifier.isStatic(attr.getModifiers()));
|
||||
assertTrue(name + " : Pourquoi pas public ?",
|
||||
Modifier.isPublic(attr.getModifiers()));
|
||||
}
|
||||
|
||||
@Test public void testerE5() throws NoSuchMethodException {
|
||||
// TODO : Il faudrait que getMethode signale le problème !
|
||||
// On peut en effet construire le message à partir des paramètres reçus
|
||||
Method contient = getMethode(cercle, "contient", Point.class);
|
||||
verifierTypeRetour(contient, boolean.class);
|
||||
}
|
||||
|
||||
@Test public void testerC12() throws Exception {
|
||||
verifierConstanteClasse(cercle, "PI");
|
||||
}
|
||||
|
||||
@Test public void testerC12ValeurPI() throws Exception {
|
||||
Field pi = getAttribut(cercle, "PI");
|
||||
pi.setAccessible(true);
|
||||
assertTrue("Le type de PI doit être double",
|
||||
double.class.equals(pi.getType()));
|
||||
if (Modifier.isStatic(pi.getModifiers())) {
|
||||
assertEquals("Pas d'utilisation de Math.PI pour initialiser PI ?",
|
||||
Math.PI, pi.getDouble(null), 0.0);
|
||||
} else {
|
||||
Cercle c = new Cercle(new Point(1, 2), 10);
|
||||
assertEquals("Pas d'utilisation de Math.PI pour initialiser PI ?",
|
||||
Math.PI, pi.getDouble(c), 0.0);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Test public void testerNombreAttributs() throws Exception {
|
||||
int attendu = 3; // nombre d'attributs d'instance attendus
|
||||
int nbReel = getAttributsInstance(cercle).size();
|
||||
assertFalse("Trop d'attributs d'instance : " + nbReel
|
||||
+ " au lieu de " + attendu + " !", nbReel > attendu);
|
||||
assertFalse("Pas assez d'attributs d'instance : " + nbReel
|
||||
+ " au lieu de " + attendu + " !", nbReel < attendu);
|
||||
}
|
||||
|
||||
@Test public void testAttributsPrives() throws Exception {
|
||||
for (Field f : cercle.getDeclaredFields()) {
|
||||
if (! Modifier.isFinal(f.getModifiers())) {
|
||||
if (! Modifier.isFinal(f.getModifiers())) {
|
||||
assertFalse("L'attribut " + f.getName() + " ne devrait pas être public !",
|
||||
Modifier.isPublic(f.getModifiers()));
|
||||
assertFalse("Attribut " + f + " : Pourquoi protected ?",
|
||||
Modifier.isPublic(f.getModifiers()));
|
||||
assertTrue("Attribut " + f + " : Droit d'accès oublié ?",
|
||||
Modifier.isPrivate(f.getModifiers()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test public void testAttributsNomsAssezLongs() throws Exception {
|
||||
for (Field f : cercle.getDeclaredFields()) {
|
||||
String nom = f.getName();
|
||||
assertTrue("C3: Nom trop court pour l'attribut " + nom, nom.length() > 1);
|
||||
}
|
||||
}
|
||||
|
||||
private final static Set<String> nomsPeuSiginificatifs;
|
||||
static {
|
||||
nomsPeuSiginificatifs = new TreeSet<String>();
|
||||
Collections.addAll(nomsPeuSiginificatifs, "p1", "p2", "a", "b",
|
||||
"point1", "point2", "c", "r", "c_aux");
|
||||
}
|
||||
|
||||
@Test public void testAttributsNomsPeuSignificatifs() throws Exception {
|
||||
for (Field f : cercle.getDeclaredFields()) {
|
||||
String nom = f.getName();
|
||||
assertFalse("C3: Nom pas assez significatif pour l'attribut " + nom,
|
||||
nomsPeuSiginificatifs.contains(nom.toLowerCase()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test public void testerE6() {
|
||||
assertTrue("Cercle devrait être un Mesurable2D !",
|
||||
Mesurable2D.class.isAssignableFrom(cercle));
|
||||
}
|
||||
|
||||
@Test public void testerE6bis() {
|
||||
boolean trouve = false;
|
||||
for (Class<?> i : cercle.getInterfaces()) {
|
||||
trouve = trouve || i == Mesurable2D.class;
|
||||
}
|
||||
assertTrue("Cercle doit directement réaliser Mesurable2D !", trouve);
|
||||
}
|
||||
|
||||
@Test public void testerNbConstructeurs() {
|
||||
int nbAttendu = 3;
|
||||
int nbConstructeurs = cercle.getConstructors().length;
|
||||
assertFalse("Trop de constructeurs : " + nbConstructeurs,
|
||||
nbConstructeurs > nbAttendu);
|
||||
assertFalse("Pas assez de constructeurs : " + nbConstructeurs,
|
||||
nbConstructeurs < nbAttendu);
|
||||
}
|
||||
|
||||
@Test public void testerE14() throws Exception {
|
||||
Method creerCercle = null;
|
||||
try {
|
||||
creerCercle = getMethode(cercle, "creerCercle", Point.class,
|
||||
Point.class);
|
||||
} catch (NoSuchMethodException e) {
|
||||
fail("La méthode creerCercle(Point, Point) n'existe pas !");
|
||||
}
|
||||
int modifieurs = creerCercle.getModifiers();
|
||||
assertTrue("creerCercle devrait être publique !",
|
||||
Modifier.isPublic(modifieurs));
|
||||
assertTrue("creerCercle doit être une méthode de classe !",
|
||||
Modifier.isStatic(modifieurs));
|
||||
}
|
||||
|
||||
@Test public void testerContructeurDefaut() {
|
||||
try {
|
||||
Constructor<Cercle> defaut = cercle.getConstructor();
|
||||
fail("Pourquoi définir un constructeur par défaut sur Cercle ?");
|
||||
} catch (NoSuchMethodException e) {
|
||||
// OK
|
||||
}
|
||||
}
|
||||
|
||||
}
|
49
LISEZ-MOI.txt
Normal file
49
LISEZ-MOI.txt
Normal file
|
@ -0,0 +1,49 @@
|
|||
Nom : FAINSIN
|
||||
Prénom : Laurent
|
||||
Groupe TP : I
|
||||
|
||||
|
||||
Consigne : Ci-dessous, répondre à la place des « ... ».
|
||||
|
||||
|
||||
=====[ Temps ]==================================================================
|
||||
|
||||
Temps consacré au projet pour rendre la V1 : 05 heures 00 minutes
|
||||
Temps consacré au projet pour rendre la V2 : 00 heures 15 minutes
|
||||
Pour la V2 on ne tiendra pas compte du temps passé sur la V1.
|
||||
Bien sûr, Les temps renseignés ici ne sont pas pris en compte dans la notation.
|
||||
|
||||
|
||||
=====[ Questions ]==============================================================
|
||||
|
||||
Indiquer la relation UML entre Cercle et le Point centre du cercle.
|
||||
-------------------------------------------------------------------
|
||||
|
||||
Il y a une relation de composition entre Cercle et Point.
|
||||
|
||||
|
||||
Comment est réalisée l'exigence E18 ?
|
||||
-------------------------------------
|
||||
|
||||
On rappelle E18 : "On ne doit pas pouvoir changer les caractéristiques d’un
|
||||
cercle sans passer par les opérations de modification que la classe propose
|
||||
(translater, setRayon, setDiametre, setCouleur...)."
|
||||
|
||||
Dans un premier temps on restreint les modifications extérieures des attributs via
|
||||
le mot-clé "private", placé devant leur déclaration. Cela force l'utilisateur de la
|
||||
classe à utiliser les fonctions SETs (qui vérifient de plus la validité des nouvelles
|
||||
valeurs).
|
||||
|
||||
De même, il faut faire attention à ce que l'on renvoie avec les fonctions GETS.
|
||||
En effet si l'on souhaite renvoyer le point correspondant au centre du cercle,
|
||||
il faut renvoyer une copie de celui-ci au lieu de renvoyer directement this.centre.
|
||||
On fait cela puisque renvoyer un objet Point revient à renvoyer un pointeur vers
|
||||
une structure de données, qui est modifiable.
|
||||
|
||||
|
||||
=====[ Explications ]===========================================================
|
||||
|
||||
(Facultatif) Donner ici les explications supplémentaires utiles à la
|
||||
compréhension du travail rendu.
|
||||
|
||||
...
|
17
Mesurable2D.java
Normal file
17
Mesurable2D.java
Normal file
|
@ -0,0 +1,17 @@
|
|||
/** Définir les propriétés d'un élément fermé du plan.
|
||||
* @author Xavier Crégut
|
||||
* @version 1.3
|
||||
*/
|
||||
public interface Mesurable2D {
|
||||
|
||||
/** Obtenir le perimètre de l'élément.
|
||||
* @return le perimètre
|
||||
*/
|
||||
double perimetre();
|
||||
|
||||
/** Obtenir l'aire de l'élément.
|
||||
* @return l'aire
|
||||
*/
|
||||
double aire();
|
||||
|
||||
}
|
95
Point.java
Normal file
95
Point.java
Normal file
|
@ -0,0 +1,95 @@
|
|||
import java.awt.Color;
|
||||
|
||||
/** Point modélise un point géométrique dans un plan équipé d'un
|
||||
* repère cartésien. Un point peut être affiché et translaté.
|
||||
* Sa distance par rapport à un autre point peut être obtenue.
|
||||
*
|
||||
* @author Xavier Crégut <Prénom.Nom@enseeiht.fr>
|
||||
*/
|
||||
public class Point {
|
||||
private double x; // abscisse
|
||||
private double y; // ordonnée
|
||||
private Color couleur; // couleur du point
|
||||
|
||||
/** Construire un point à partir de son abscisse et de son ordonnée.
|
||||
* @param vx abscisse
|
||||
* @param vy ordonnée
|
||||
*/
|
||||
public Point(double vx, double vy) {
|
||||
this.x = vx;
|
||||
this.y = vy;
|
||||
this.couleur = Color.green;
|
||||
}
|
||||
|
||||
/** Obtenir l'abscisse du point.
|
||||
* @return abscisse du point
|
||||
*/
|
||||
public double getX() {
|
||||
return this.x;
|
||||
}
|
||||
|
||||
/** Obtenir l'ordonnée du point.
|
||||
* @return ordonnée du point
|
||||
*/
|
||||
public double getY() {
|
||||
return this.y;
|
||||
}
|
||||
|
||||
/** Changer l'abscisse du point.
|
||||
* @param vx nouvelle abscisse
|
||||
*/
|
||||
public void setX(double vx) {
|
||||
this.x = vx;
|
||||
}
|
||||
|
||||
/** Changer l'ordonnée du point.
|
||||
* @param vy nouvelle ordonnée
|
||||
*/
|
||||
public void setY(double vy) {
|
||||
this.y = vy;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "(" + this.x + ", " + this.y + ")";
|
||||
}
|
||||
|
||||
/** Afficher le point. */
|
||||
public void afficher() {
|
||||
System.out.print(this);
|
||||
}
|
||||
|
||||
/** Distance par rapport à un autre point.
|
||||
* @param autre l'autre point
|
||||
* @return distance entre this et autre
|
||||
*/
|
||||
public double distance(Point autre) {
|
||||
return Math.sqrt(Math.pow(autre.x - this.x, 2)
|
||||
+ Math.pow(autre.y - this.y, 2));
|
||||
}
|
||||
|
||||
/** Translater le point.
|
||||
* @param dx déplacement suivant l'axe des X
|
||||
* @param dy déplacement suivant l'axe des Y
|
||||
*/
|
||||
public void translater(double dx, double dy) {
|
||||
this.x += dx;
|
||||
this.y += dy;
|
||||
}
|
||||
|
||||
// Gestion de la couleur
|
||||
|
||||
/** Obtenir la couleur du point.
|
||||
* @return la couleur du point
|
||||
*/
|
||||
public Color getCouleur() {
|
||||
return this.couleur;
|
||||
}
|
||||
|
||||
/** Changer la couleur du point.
|
||||
* @param nouvelleCouleur nouvelle couleur
|
||||
*/
|
||||
public void setCouleur(Color nouvelleCouleur) {
|
||||
this.couleur = nouvelleCouleur;
|
||||
}
|
||||
|
||||
}
|
125
RobustesseCercleTest.java
Normal file
125
RobustesseCercleTest.java
Normal file
|
@ -0,0 +1,125 @@
|
|||
import java.awt.Color;
|
||||
import org.junit.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/** Classe de test pour la robustesse de la classe Cercle.
|
||||
* @author Xavier Crégut <Prenom.Nom@enseeiht.fr>
|
||||
*/
|
||||
public class RobustesseCercleTest {
|
||||
|
||||
protected Cercle c1;
|
||||
|
||||
@Before public void setUp() {
|
||||
c1 = new Cercle(new Point(1, 2), 10);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testerOptionEnableAssertion() {
|
||||
try {
|
||||
assert false;
|
||||
} catch (AssertionError e) {
|
||||
// C'est normal !
|
||||
return;
|
||||
} catch (Throwable e) {
|
||||
// C'est pas normal !
|
||||
}
|
||||
fail("Il faut exécuter avec l'option -ea de java !");
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE5a() {
|
||||
this.c1.contient(null);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE10a() {
|
||||
this.c1.setCouleur(null);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE11a() {
|
||||
this.c1 = new Cercle(null, 10);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE11b() {
|
||||
this.c1 = new Cercle(new Point(1, 2), -10);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE11c() {
|
||||
this.c1 = new Cercle(new Point(1, 2), 0);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE12a() {
|
||||
this.c1 = new Cercle(new Point(1, 2), null);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE12b() {
|
||||
this.c1 = new Cercle(null, new Point(1, 2));
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE12c() {
|
||||
this.c1 = new Cercle(new Point(1, 2), new Point(1, 2));
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE13a() {
|
||||
this.c1 = new Cercle(new Point(1, 2), null, Color.red);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE13b() {
|
||||
this.c1 = new Cercle(null, new Point(1, 2), Color.red);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE13c() {
|
||||
this.c1 = new Cercle(new Point(1, 2), new Point(1, 2), Color.red);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE13d() {
|
||||
this.c1 = new Cercle(new Point(1, 2), new Point(1, 2), null);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE14a() {
|
||||
this.c1 = Cercle.creerCercle(new Point(1, 2), null);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE14b() {
|
||||
this.c1 = Cercle.creerCercle(null, new Point(1, 2));
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE14c() {
|
||||
this.c1 = Cercle.creerCercle(new Point(1, 2), new Point(1, 2));
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE16a() {
|
||||
this.c1.setRayon(-10);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE16b() {
|
||||
this.c1.setRayon(0);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE17a() {
|
||||
this.c1.setDiametre(-10);
|
||||
}
|
||||
|
||||
@Test(expected=AssertionError.class)
|
||||
public void testerE17b() {
|
||||
this.c1.setDiametre(0);
|
||||
}
|
||||
|
||||
}
|
135
SujetCercleTest.java
Normal file
135
SujetCercleTest.java
Normal file
|
@ -0,0 +1,135 @@
|
|||
import java.awt.Color;
|
||||
import org.junit.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Classe de test (incomplète) de la classe Cercle.
|
||||
* @author Xavier Crégut
|
||||
* @version $Revision$
|
||||
*/
|
||||
public class SujetCercleTest {
|
||||
|
||||
// précision pour les comparaisons réelle
|
||||
public final static double EPSILON = 0.001;
|
||||
|
||||
// Les points du sujet
|
||||
private Point A, B, C, D, E;
|
||||
|
||||
// Les cercles du sujet
|
||||
private Cercle C1, C2;
|
||||
|
||||
@Before public void setUp() {
|
||||
// Construire les points
|
||||
A = new Point(1, 2);
|
||||
B = new Point(2, 1);
|
||||
C = new Point(4, 1);
|
||||
D = new Point(8, 1);
|
||||
E = new Point(8, 4);
|
||||
|
||||
// Construire les cercles
|
||||
C1 = new Cercle(A, 2.5);
|
||||
C2 = new Cercle(new Point(6, 1), 2);
|
||||
C2.setCouleur(Color.yellow);
|
||||
}
|
||||
|
||||
/** Vérifier si deux points ont mêmes coordonnées.
|
||||
* @param p1 le premier point
|
||||
* @param p2 le deuxième point
|
||||
*/
|
||||
static void memesCoordonnees(String message, Point p1, Point p2) {
|
||||
assertEquals(message + " (x)", p1.getX(), p2.getX(), EPSILON);
|
||||
assertEquals(message + " (y)", p1.getY(), p2.getY(), EPSILON);
|
||||
}
|
||||
|
||||
@Test public void testerE11C1() {
|
||||
memesCoordonnees("E11 : Centre de C1 incorrect", A, C1.getCentre());
|
||||
assertEquals("E11 : Rayon de C1 incorrect",
|
||||
2.5, C1.getRayon(), EPSILON);
|
||||
assertEquals(Color.blue, C1.getCouleur());
|
||||
}
|
||||
|
||||
@Test public void testerE1() {
|
||||
C1.translater(10, 20);
|
||||
memesCoordonnees("E1 sur C1", new Point(11, 22), C1.getCentre());
|
||||
C2.translater(3, -1);
|
||||
memesCoordonnees("E1 sur C2", new Point(9, 0), C2.getCentre());
|
||||
}
|
||||
|
||||
@Test public void testerE1negatifs() {
|
||||
C2.translater(-10, -7);
|
||||
memesCoordonnees("E1 sur C2", new Point(-4, -6), C2.getCentre());
|
||||
}
|
||||
|
||||
@Test public void testerE2() {
|
||||
memesCoordonnees("E2 sur C1", A, C1.getCentre());
|
||||
memesCoordonnees("E2 sur C2", new Point(6, 1), C2.getCentre());
|
||||
}
|
||||
|
||||
@Test public void testerE3() {
|
||||
assertEquals("E3 sur C1", 2.5, C1.getRayon(), EPSILON);
|
||||
assertEquals("E3 sur C2", 2.0, C2.getRayon(), EPSILON);
|
||||
}
|
||||
|
||||
@Test public void testerE4() {
|
||||
assertEquals("E4 sur C1", 5.0, C1.getDiametre(), EPSILON);
|
||||
assertEquals("E4 sur C2", 4.0, C2.getDiametre(), EPSILON);
|
||||
}
|
||||
|
||||
@Test public void testerE5() {
|
||||
assertTrue("E5", C1.contient(A));
|
||||
assertTrue("E5", C1.contient(B));
|
||||
assertFalse("E5", C1.contient(C));
|
||||
assertFalse("E5", C1.contient(D));
|
||||
assertFalse("E5", C1.contient(E));
|
||||
assertFalse("E5", C1.contient(C));
|
||||
assertFalse("E5", C1.contient(new Point(3, 4)));
|
||||
assertTrue("E5", new Cercle(D, 3).contient(E));
|
||||
}
|
||||
|
||||
@Test public void testerE6() {
|
||||
assertEquals("E6", 5*Math.PI, C1.perimetre(), EPSILON);
|
||||
assertEquals("E6", 4*Math.PI, C2.perimetre(), EPSILON);
|
||||
assertEquals("E6", 6.25*Math.PI, C1.aire(), EPSILON);
|
||||
assertEquals("E6", 4*Math.PI, C2.aire(), EPSILON);
|
||||
}
|
||||
|
||||
@Test public void testerE9() {
|
||||
assertEquals("E9", Color.blue, C1.getCouleur());
|
||||
assertEquals("E9", Color.yellow, C2.getCouleur());
|
||||
}
|
||||
|
||||
@Test public void testerE10() {
|
||||
C1.setCouleur(Color.red);
|
||||
assertEquals("E10", Color.red, C1.getCouleur());
|
||||
}
|
||||
|
||||
@Test public void testerToString() {
|
||||
assertEquals("E15: toString() redéfinie ? Correctement ?",
|
||||
"C2.5@(1.0, 2.0)", C1.toString());
|
||||
}
|
||||
|
||||
@Test public void testerE16() {
|
||||
C1.setRayon(10);
|
||||
assertEquals(10, C1.getRayon(), EPSILON);
|
||||
C1.setRayon(20);
|
||||
assertEquals(20, C1.getRayon(), EPSILON);
|
||||
}
|
||||
|
||||
@Test public void testerE17() {
|
||||
C1.setDiametre(10);
|
||||
assertEquals(5, C1.getRayon(), EPSILON);
|
||||
C1.setDiametre(20);
|
||||
assertEquals(10, C1.getRayon(), EPSILON);
|
||||
}
|
||||
|
||||
@Test public void testerE18() {
|
||||
C1.getCentre().translater(10, 20);
|
||||
memesCoordonnees("E18 : erreur si translation du centre",
|
||||
new Point(1, 2), C1.getCentre());
|
||||
A.translater(10, 20);
|
||||
memesCoordonnees("E18 : erreur si translation de A",
|
||||
new Point(1, 2), C1.getCentre());
|
||||
}
|
||||
|
||||
|
||||
}
|
BIN
to-1sn-2020-pr-01-sujet.pdf
Normal file
BIN
to-1sn-2020-pr-01-sujet.pdf
Normal file
Binary file not shown.
Loading…
Reference in a new issue