mirror of
https://github.com/Akomry/sae302_applicom.git
synced 2025-12-06 11:43:53 +00:00
feat(message): Création de la classe Message, méthodes pour générer du JSON à partir de l'objet et inversement
This commit is contained in:
parent
5805e55209
commit
63c165f024
4 changed files with 222 additions and 0 deletions
|
|
@ -54,8 +54,14 @@
|
||||||
<version>${junit.version}</version>
|
<version>${junit.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.json</groupId>
|
||||||
|
<artifactId>json</artifactId>
|
||||||
|
<version>20240303</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ module rtgre.chat {
|
||||||
requires java.desktop;
|
requires java.desktop;
|
||||||
requires javafx.swing;
|
requires javafx.swing;
|
||||||
requires net.synedra.validatorfx;
|
requires net.synedra.validatorfx;
|
||||||
|
requires org.json;
|
||||||
|
|
||||||
|
|
||||||
opens rtgre.chat to javafx.fxml;
|
opens rtgre.chat to javafx.fxml;
|
||||||
|
|
|
||||||
57
chat/src/main/java/rtgre/modeles/Message.java
Normal file
57
chat/src/main/java/rtgre/modeles/Message.java
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
package rtgre.modeles;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
|
||||||
|
public class Message {
|
||||||
|
/**
|
||||||
|
* Un message décrit sous la forme :
|
||||||
|
* @serialField : String to: Le destinataire
|
||||||
|
* @serialField : String body: le corps du message
|
||||||
|
*/
|
||||||
|
protected String to;
|
||||||
|
protected String body;
|
||||||
|
|
||||||
|
public Message(String to, String body) {
|
||||||
|
|
||||||
|
this.to = to;
|
||||||
|
this.body = body;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTo() {
|
||||||
|
return to;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBody() {
|
||||||
|
return body;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Message{" +
|
||||||
|
"to=" + to +
|
||||||
|
", body=" + body +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSONObject toJsonObject() {
|
||||||
|
/**
|
||||||
|
* Transforme le message courant en objet JSON
|
||||||
|
*/
|
||||||
|
return new JSONObject("{to:%s,body:%s}".formatted( this.to, this.body));
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toJson() {
|
||||||
|
/**
|
||||||
|
* Transforme l'objet courant en String JSON
|
||||||
|
*/
|
||||||
|
return toJsonObject().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Message fromJson(JSONObject json) {
|
||||||
|
/**
|
||||||
|
* Crée un objet message à partir d'un objet JSON
|
||||||
|
* @param: JSONObject json: l'objet JSON à transformer
|
||||||
|
*/
|
||||||
|
return new Message(json.getString("to"), json.getString("body"));
|
||||||
|
}
|
||||||
|
}
|
||||||
158
chat/src/test/java/rtgre/modeles/MessageTest.java
Normal file
158
chat/src/test/java/rtgre/modeles/MessageTest.java
Normal file
|
|
@ -0,0 +1,158 @@
|
||||||
|
package rtgre.modeles;
|
||||||
|
|
||||||
|
import org.json.JSONObject;
|
||||||
|
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.Constructor;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
import static org.junit.jupiter.params.provider.Arguments.arguments;
|
||||||
|
|
||||||
|
class MessageTest {
|
||||||
|
|
||||||
|
static Class<?> classe = Message.class;
|
||||||
|
static String module = "rtgre.modeles";
|
||||||
|
|
||||||
|
|
||||||
|
@DisplayName("01-Structure")
|
||||||
|
@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("to", "java.lang.String", Modifier.PROTECTED),
|
||||||
|
arguments("body", "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.Message(java.lang.String,java.lang.String)")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@DisplayName("Déclaration des constructeurs (base)")
|
||||||
|
@ParameterizedTest
|
||||||
|
@MethodSource("constructeursProvider")
|
||||||
|
void testConstructeurs(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> methodesProvider() {
|
||||||
|
return Stream.of(
|
||||||
|
arguments("getTo", "public java.lang.String %s.Message.getTo()"),
|
||||||
|
arguments("getBody", "public java.lang.String %s.Message.getBody()"),
|
||||||
|
arguments("toString", "public java.lang.String %s.Message.toString()"),
|
||||||
|
arguments("toJsonObject", "public org.json.JSONObject %s.Message.toJsonObject()"),
|
||||||
|
arguments("toJSON", "public java.lang.String %s.Message.toJson()"),
|
||||||
|
arguments("fromJson", "public static %s.Message %s.Message.fromJson(org.json.JSONObject)")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@DisplayName("Déclaration des méthodes (base)")
|
||||||
|
@ParameterizedTest
|
||||||
|
@MethodSource("methodesProvider")
|
||||||
|
void testDeclarationMethodes(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")
|
||||||
|
@Test
|
||||||
|
void testGetToBody() {
|
||||||
|
String erreur = "Getter erroné";
|
||||||
|
Message m = new Message("riri", "bonjour");
|
||||||
|
assertEquals("riri", m.getTo(), erreur);
|
||||||
|
assertEquals("bonjour", m.getBody(), erreur);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("03-Représentation textuelle")
|
||||||
|
void testToString() {
|
||||||
|
Message m = new Message("riri", "bonjour");
|
||||||
|
assertEquals("Message{to=riri, body=bonjour}", m.toString(), "Représentation textuelle erronée");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
@DisplayName("04-Représentation JSON")
|
||||||
|
class JSONTest {
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("Objet JSON")
|
||||||
|
void testClesToJSONObject() {
|
||||||
|
Message m = new Message("riri", "bonjour");
|
||||||
|
JSONObject obj = m.toJsonObject();
|
||||||
|
Assertions.assertTrue(obj.has("to"), "Clé manquante");
|
||||||
|
Assertions.assertTrue(obj.has("body"), "Clé manquante");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("Sérialisation de la représentation JSON")
|
||||||
|
void testToJson() {
|
||||||
|
Message m = new Message("riri", "bonjour");
|
||||||
|
String chaine = m.toJson();
|
||||||
|
Assertions.assertTrue(chaine.contains("\"to\":\"riri\""), "to erroné dans " + m);
|
||||||
|
Assertions.assertTrue(chaine.contains("\"body\":\"bonjour\""), "body erroné dans " + m);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("Instanciation à partir d'un objet JSON")
|
||||||
|
void testMessageFromJSON() {
|
||||||
|
JSONObject json = new JSONObject("{\"to\":\"riri\",\"body\":\"bonjour\"}");
|
||||||
|
Message m = Message.fromJson(json);
|
||||||
|
Assertions.assertEquals("riri", m.getTo(), "Constructeur erroné");
|
||||||
|
Assertions.assertEquals("bonjour", m.getBody(), "Constructeur erroné");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue