feat(contacts): ajout de la classe Contact.java, ContactMap.java, gestion des objets Contact dans l'interface graphique

This commit is contained in:
bouclyma 2024-12-10 21:34:55 +01:00
parent 45f18e9309
commit e9480590a7
14 changed files with 649 additions and 36 deletions

View file

@ -0,0 +1,155 @@
package rtgre.modeles;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import java.lang.reflect.*;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.junit.jupiter.params.provider.Arguments.arguments;
/** Tests unitaires du modèle de base de Contact (étape 1) */
class ContactBaseTest1 {
static Class<?> classe = Contact.class;
static String module = "rtgre.modeles";
@DisplayName("01-Structure de la classe Contact")
@Nested
class StructureTest {
static List<String> constructeursSignatures;
static List<String> methodesSignatures;
@BeforeAll
static void init() {
Constructor<?>[] constructeurs = classe.getConstructors();
constructeursSignatures = Arrays.stream(constructeurs).map(Constructor::toString).collect(Collectors.toList());
Method[] methodes = classe.getDeclaredMethods();
methodesSignatures = Arrays.stream(methodes).map(Method::toString).collect(Collectors.toList());
}
/**
* Attributs
*/
static Stream<Arguments> attributsProvider() {
return Stream.of(
arguments("login", "java.lang.String", Modifier.PROTECTED),
arguments("avatar", "java.awt.Image", Modifier.PROTECTED),
arguments("connected", "boolean", Modifier.PROTECTED),
arguments("currentRoom", "java.lang.String", Modifier.PROTECTED)
);
}
@DisplayName("Déclaration des attributs : nom, type et visibilité")
@ParameterizedTest
@MethodSource("attributsProvider")
void testDeclarationAttributs(String nom, String type, int modifier) throws NoSuchFieldException {
Field field = classe.getDeclaredField(nom);
Assertions.assertEquals(type, field.getType().getName(),
"Type " + nom + " erroné : doit être " + type);
Assertions.assertEquals(modifier, field.getModifiers(),
"Visibilité " + nom + " erronée : doit être " + modifier);
}
/**
* Constructeurs
*/
static Stream<Arguments> constructeursProvider() {
return Stream.of(
arguments("public %s.Contact(java.lang.String,java.awt.Image)")
);
}
@DisplayName("Déclaration des constructeurs (base)")
@ParameterizedTest
@MethodSource("constructeursProvider")
void testConstructeurs1(String signature) {
Assertions.assertTrue(constructeursSignatures.contains(String.format(signature, module)),
String.format("Constructeur non déclaré : doit être %s\nalors que sont déclarés %s",
signature, constructeursSignatures));
}
/**
* Méthodes
*/
static Stream<Arguments> methodesProvider1() {
return Stream.of(
arguments("getLogin", "public java.lang.String %s.Contact.getLogin()"),
arguments("getAvatar", "public java.awt.Image %s.Contact.getAvatar()"),
arguments("isConnected", "public boolean %s.Contact.isConnected()"),
arguments("toString", "public boolean %s.Contact.isConnected()"),
arguments("setConnected", "public java.lang.String %s.Contact.toString()"),
arguments("equals", "public boolean %s.Contact.equals(java.lang.Object)")
);
}
@DisplayName("Déclaration des méthodes (base)")
@ParameterizedTest
@MethodSource("methodesProvider1")
void testDeclarationMethodes1(String nom, String signature) {
Assertions.assertTrue(methodesSignatures.contains(String.format(signature, module, module)),
String.format("Méthode non déclarée : doit être %s\nalors que sont déclarés %s",
signature, methodesSignatures));
}
@DisplayName("02-Instanciation et getters")
@Nested
class InstanciationContactTest {
@Test
@DisplayName("sans avatar : getters de login, connected")
void TestConstructeurParDefautSansAvatar() {
Contact riri = new Contact("riri", null);
Assertions.assertEquals("riri", riri.getLogin(), "Login erroné");
Assertions.assertFalse(riri.isConnected(), "Etat par défaut erroné");
}
}
@DisplayName("03-Modification")
@Nested
class ModificationContactTest {
@Test
@DisplayName("Setter de connexion")
void TestEtatConnexion() {
Contact riri = new Contact("riri", null);
riri.setConnected(true);
Assertions.assertTrue(riri.isConnected(), "Changement d'état erroné");
riri.setConnected(false);
Assertions.assertFalse(riri.isConnected(), "Changement d'état erroné");
}
}
@Test
@DisplayName("04-Représentation textuelle")
void TestToString() {
Contact riri = new Contact("riri", null);
Assertions.assertEquals("@riri", riri.toString(),
"Représentation textuelle erronée");
}
@Test
@DisplayName("05-Egalité")
void TestEquals() {
Contact riri = new Contact("riri", null);
Contact riri2 = new Contact("riri", null);
Contact fifi = new Contact("fifi", null);
Assertions.assertEquals(riri, riri2, "Comparaison erronée");
Assertions.assertNotEquals(riri, fifi, "Comparaison erronée");
}
}
}

View file

@ -0,0 +1,47 @@
package rtgre.modeles;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.util.TreeMap;
class ContactMapTest {
static Class<?> classe = ContactMap.class;
@DisplayName("01-Structure")
@Nested
class StructureContactMapTest {
@Test
@DisplayName("Heritage")
void testHeritage() {
ContactMap contactMap = new ContactMap();
Assertions.assertInstanceOf(TreeMap.class, contactMap, "doit hériter de TreeMap");
}
}
@DisplayName("02-Ajout")
@Nested
class AddTest {
@Test
@DisplayName("Ajout d'un contact")
void TestAdd() {
Contact riri = new Contact("riri", null);
ContactMap contactMap = new ContactMap();
contactMap.add(riri);
Assertions.assertTrue(contactMap.containsKey("riri"),
"Les clés sont les logins");
Assertions.assertTrue(contactMap.containsValue(riri),
"Les valeurs sont les contacts");
}
}
}

View file

@ -0,0 +1,120 @@
package rtgre.modeles;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.junit.jupiter.params.provider.Arguments.arguments;
/** Tests unitaires du modèle de base de Contact (étape 1) */
class ContactWithAvatarTest2 {
static Class<?> classe = Contact.class;
static String module = "rtgre.modeles";
@DisplayName("01-Structure de la classe Contact")
@Nested
class StructureTest {
static List<String> constructeursSignatures;
static List<String> methodesSignatures;
@BeforeAll
static void init() {
Constructor<?>[] constructeurs = classe.getConstructors();
constructeursSignatures = Arrays.stream(constructeurs).map(Constructor::toString).collect(Collectors.toList());
Method[] methodes = classe.getDeclaredMethods();
methodesSignatures = Arrays.stream(methodes).map(Method::toString).collect(Collectors.toList());
}
static Stream<Arguments> constructeursProvider2() {
return Stream.of(
arguments("public %s.Contact(java.lang.String,boolean,java.io.File)")
);
}
// @Disabled("Jusqu'à ce que soit codé les avatars à partir d'un fichier")
@DisplayName("Déclaration des constructeurs (avec avatars à partir d'un fichier)")
@ParameterizedTest
@MethodSource("constructeursProvider2")
void testConstructeurs2(String signature) {
Assertions.assertTrue(constructeursSignatures.contains(String.format(signature, module)),
String.format("Constructeur non déclaré : doit être %s\nalors que sont déclarés %s",
signature, constructeursSignatures));
}
static Stream<Arguments> methodesProvider2() {
return Stream.of(
arguments("avatarFromLogin", "public static java.awt.image.BufferedImage %s.Contact.avatarFromLogin(java.io.File,java.lang.String) throws java.io.IOException"),
arguments("setAvatarFromFile", "public void %s.Contact.setAvatarFromFile(java.io.File)")
);
}
// @Disabled("Jusqu'à ce que soit codé les avatars à partir d'un fichier")
@DisplayName("Déclaration des méthodes (avec avatars à partir d'un fichier)")
@ParameterizedTest
@MethodSource("methodesProvider2")
void testDeclarationMethodes2(String nom, String signature) {
Assertions.assertTrue(methodesSignatures.contains(String.format(signature, module, module)),
String.format("Méthode non déclarée : doit être %s\nalors que sont déclarés %s",
signature, methodesSignatures));
}
}
@DisplayName("02-Instanciation et getters")
@Nested
class InstanciationContactTest {
// @Disabled("Jusqu'à ce que soit codé les avatars à partir d'un fichier")
@Test
@DisplayName("avec avatar : getters de avatar")
void TestConstructeurParDefautAvecAvatar() throws IOException {
String work_dir = System.getProperty("user.dir");
Assertions.assertTrue(work_dir.endsWith("chat"),
"Le working dir doit être <projet>/chat/ et non : " + work_dir);
File f = new File("src/main/resources/rtgre/chat/anonymous.png");
Assertions.assertTrue(f.canRead(), "Fichier manquant " + f.getAbsolutePath());
Image avatar = ImageIO.read(f);
Contact fifi = new Contact("fifi", avatar);
Assertions.assertEquals(avatar, fifi.getAvatar(), "Avatar erroné");
}
}
// @Disabled("Jusqu'à ce que soit codé les avatars à partir d'un fichier")
@Nested
@DisplayName("06-Avatar à partir d'un fichier")
class AvatarFromFilesTest {
@Test
@DisplayName("A partir d'un fichier")
void TestSetFromFile() throws IOException {
String work_dir = System.getProperty("user.dir");
Assertions.assertTrue(work_dir.endsWith("chat"),
"Le working dir doit être <projet>/chat/ et non : " + work_dir);
File f = new File("src/main/resources/rtgre/chat/avatar1.png");
Assertions.assertTrue(f.canRead(), "Fichier manquant " + f.getAbsolutePath());
Contact fifi = new Contact("fifi", null);
fifi.setAvatarFromFile(f);
Assertions.assertNotNull(fifi.getAvatar(), "Avatar non chargé");
}
}
}