diff --git a/.github/workflows/maven-package.yml b/.github/workflows/maven-package.yml index 5002f3c..ffafaf8 100644 --- a/.github/workflows/maven-package.yml +++ b/.github/workflows/maven-package.yml @@ -19,15 +19,11 @@ jobs: id: get_version run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\/v/} - - name: Set up JDK 11 for deploy to OSSRH + - name: Set up JDK 11 for deploy to github packages uses: actions/setup-java@v1 with: java-version: 11 - server-id: ossrh - server-username: MAVEN_USERNAME - server-password: MAVEN_CENTRAL_TOKEN - gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} - gpg-passphrase: MAVEN_GPG_PASSPHRASE + server-id: github - name: Build with Maven run: mvn -B package --file pom.xml @@ -35,20 +31,25 @@ jobs: - name: Update package version run: mvn versions:set -DnewVersion=${{ steps.get_version.outputs.VERSION }} - - name: Publish to Apache Maven Central - run: mvn deploy -PossrhDeploy + - name: Publish to GitHub Packages Apache Maven + run: mvn deploy -PgithubDeploy env: - MAVEN_USERNAME: ${{ secrets.NEXUS_USERNAME }} - MAVEN_CENTRAL_TOKEN: ${{ secrets.NEXUS_PASSWORD }} - MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Set up JDK 11 for deploy to github packages + - name: Set up JDK 11 for deploy to OSSRH uses: actions/setup-java@v1 with: java-version: 11 - server-id: github + server-id: ossrh + server-username: MAVEN_USERNAME + server-password: MAVEN_CENTRAL_TOKEN + gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE - - name: Publish to GitHub Packages Apache Maven - run: mvn deploy -PgithubDeploy + - name: Publish to Apache Maven Central + run: mvn deploy -PossrhDeploy env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MAVEN_USERNAME: ${{ secrets.NEXUS_USERNAME }} + MAVEN_CENTRAL_TOKEN: ${{ secrets.NEXUS_PASSWORD }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 682e7b3..e7dc291 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -22,3 +22,5 @@ jobs: java-version: 11 - name: Build with Maven run: mvn -B package --file pom.xml + - name: Javadoc with Maven + run: mvn -PossrhDeploy javadoc:javadoc diff --git a/.gitignore b/.gitignore index 38e9997..c9e6f34 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ # Compiled class file *.class -Test.java #VSCode .project diff --git a/README.md b/README.md index b4e3a55..2598049 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ +[![Maven Central](https://img.shields.io/maven-central/v/com.github.devlab-umontp/edt-iut-umontp.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22com.github.devlab-umontp%22%20AND%20a:%22edt-iut-umontp%22) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=DevLab-umontp_API-JAVA-EDT&metric=alert_status)](https://sonarcloud.io/dashboard?id=DevLab-umontp_API-JAVA-EDT) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=DevLab-umontp_API-JAVA-EDT&metric=coverage)](https://sonarcloud.io/dashboard?id=DevLab-umontp_API-JAVA-EDT) ![GitHub Actions](https://github.com/DevLab-umontp/API-JAVA-EDT/workflows/Java%20CI%20with%20Maven/badge.svg) [![Javadoc](https://img.shields.io/badge/JavaDoc-Online-green)](https://mathieusoysal.github.io/stats/api-java-edt) [![Gitmoji.dev](https://img.shields.io/badge/gitmoji-%20😜%20😍-FFDD67.svg?style=flat-square)](https://gitmoji.dev) -[![GitHub](https://img.shields.io/github/license/DevLab-umontp/API-JAVA-EDT)](https://github.com/DevLab-umontp/API-JAVA-EDT/blob/master/LICENSE) -# ![](ressources/devicon.png) Librairie Java : EDT IUT Montpellier + +# ![](ressources/devicon.png) Librairie Java : EDT IUT Montpellier [![GitHub](https://img.shields.io/github/license/DevLab-umontp/API-JAVA-EDT)](https://github.com/DevLab-umontp/API-JAVA-EDT/blob/master/LICENSE) ### IUT Montpellier-SĂšte – DĂ©partement Informatique * **Colaborateurs:** [Ă©tudiants du dĂ©partement informatique](https://iut-montpellier-sete.edu.umontpellier.fr/dut-informatique/) @@ -64,6 +65,7 @@ class ExempleDeCode { } } ``` +>*Voir plus d'[exemples de code](ressources/ExempleDeCode.java)* ## Contribution Les suggestions et contributions sont toujours les bienvenues! Veuillez discuter des modifications plus importantes via un [issue](https://github.com/DevLab-umontp/Librarie-Java-EDT/issues) avant de soumettre une demande. diff --git a/ressources/ExempleDeCode.java b/ressources/ExempleDeCode.java new file mode 100644 index 0000000..bd24d84 --- /dev/null +++ b/ressources/ExempleDeCode.java @@ -0,0 +1,49 @@ +import java.time.LocalDate; + +import fr.umontp.edt.*; + +class ExempleDeCode { + public static void main(String[] args) { + + // RĂ©cupĂ©rer l'emploi du temps de l'ent + EmploiDuTempsProxy emploiDuTempsProxy = EmploiDuTempsProxy.getInstance(); + + // RĂ©cupĂ©rer le planning d'aujourd'hui + Planning planningDate = emploiDuTempsProxy.getPlanningOf(LocalDate.now()); + + // RĂ©cupĂ©rer le planning du groupe S3 + Planning planningGroupe = emploiDuTempsProxy.getPlanningOf(Groupe.S3); + + // RĂ©cupĂ©rer le planning d'aujourd'hui du groupe S2 + Planning planningDateGroupe = emploiDuTempsProxy.getPlanningOf(LocalDate.now(), Groupe.S2); + + // Parcourir les cours d'un planning + for (Cours cours : planningGroupe) { + System.out.println(cours.getIntitule()); + } + + // Actualiser votre emploi du temps local avec celui de l'ent + emploiDuTempsProxy.actualiser(); + + // RĂ©cupĂ©rer le planning d'un professeur + Planning planningProfesseur = emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Dupuis", "Jacques")); + + // RĂ©cupĂ©rer le planning de plusieurs groupes + Planning planningGroupes = emploiDuTempsProxy.getPlanningOf(Groupe.S3, Groupe.S4); + + // RĂ©cupĂ©rer le planning de plusieurs dates + Planning planningDates = emploiDuTempsProxy.getPlanningOf(LocalDate.now(), LocalDate.now().plusDays(1)); + + // RĂ©cupĂ©rer le planning de plusieurs professeurs + Professeur prof1 = RepertoireProfesseur.get("Dupuis", "Jacques"); + Professeur prof2 = RepertoireProfesseur.get("Dupuis", "Jacqueline"); + Planning planningProfesseurs = emploiDuTempsProxy.getPlanningOf(prof1, prof2); + + // RĂ©cupĂ©rer un planning via le PlanningFiltreur pour faire des combinaisons entre professeur, groupe et date + PlanningFiltreur plusieursGroupesDatesEtProfesseurs = PlanningFiltreur.filtrer() + .par(Groupe.S2, Groupe.S3) + .par(LocalDate.now(), LocalDate.now().plusDays(1)) + .par(prof1, prof2); + Planning planningAvecFiltreur = emploiDuTempsProxy.getPlanningOf(plusieursGroupesDatesEtProfesseurs); + } +} diff --git a/src/main/java/fr/umontp/edt/Cours.java b/src/main/java/fr/umontp/edt/Cours.java index 7583b28..17a7b0b 100644 --- a/src/main/java/fr/umontp/edt/Cours.java +++ b/src/main/java/fr/umontp/edt/Cours.java @@ -4,12 +4,8 @@ import java.time.Duration; import java.time.LocalDate; import java.time.LocalTime; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import net.fortuna.ical4j.model.Component; import net.fortuna.ical4j.model.DateTime; @@ -33,11 +29,11 @@ * * @author emerick-biron * @author MathieuSoysal - * @version 1.0.0 + * @version 1.1.0 */ public class Cours implements Comparable { private LocalDate date; - private String[] prof; + private Professeur[] professeurs; private LocalTime heureDebut; private LocalTime heureFin; private String lieu; @@ -45,10 +41,10 @@ public class Cours implements Comparable { private Groupe[] groupes; private String intitule; - public Cours(LocalDate date, String[] prof, LocalTime heureDebut, LocalTime heureFin, String lieu, Groupe[] groupe, - String intitule) { + public Cours(LocalDate date, Professeur[] professeurs, LocalTime heureDebut, LocalTime heureFin, String lieu, + Groupe[] groupe, String intitule) { this.date = date; - this.prof = prof; + this.professeurs = professeurs; this.heureDebut = heureDebut; this.heureFin = heureFin; this.lieu = lieu; @@ -90,27 +86,27 @@ public Cours(LocalDate date, String[] prof, LocalTime heureDebut, LocalTime heur heureFin = LocalTime.of(dateFin.getHours(), dateFin.getMinutes()); lieu = location.getValue(); intitule = summary.getValue(); - prof = getProfFromDesc(description.getValue()); + professeurs = RepertoireProfesseur.getProfesseurDepuisDescriptionEtAjouterSiNonPresent(description.getValue()); groupes = Groupe.getGroupeDepuisTexte(description.getValue()); duree = (int) Duration.between(heureDebut, heureFin).toMinutes(); } /** - * Permet d'obtenir le(s) professeur(s) d'un VENVENT a partir de la description - * de ce dernier - * - * @param desc description du VENVENT - * @return {@code String[]} le(s) professeur(s) du present dans la description - * @since 1.0 + * Permet de vĂ©rfier si un professeur est assignĂ© Ă  ce cours. + * + * @param professeur dont on veut vĂ©rier s'il est assignĂ© au cour. + * @return {@code true} si le professeur est assigne Ă  ce cours, sinon + * {@code false}. + * + * @see Cours#professeurs + * + * @since 1.1.0 */ - static String[] getProfFromDesc(String desc) { - String regex = "(?<=\\n)[- A-Z]* [- A-Z]*(?=\\n)"; - Matcher m = Pattern.compile(regex).matcher(desc); - final List matches = new ArrayList<>(); - while (m.find()) { - matches.add(m.group(0)); - } - return matches.toArray(new String[matches.size()]); + public boolean estEnseignePar(Professeur professeur) { + for (Professeur professeurAssigne : professeurs) + if (professeurAssigne == professeur) + return true; + return false; } @Override @@ -124,12 +120,16 @@ public int compareTo(Cours o) { result = Integer.compare(duree, o.duree); if (result != 0) return result; - for (Groupe groupe : groupes) - for (Groupe autreGroupe : o.groupes) { - result = groupe.getIntitule().compareTo(autreGroupe.getIntitule()); + result = Integer.compare(groupes.length, o.groupes.length); + if (result != 0) + return result; + for (int i = 0; i < groupes.length; i++) { + if (groupes[i] != o.groupes[i]) { + result = groupes[i].getIntitule().compareTo(o.groupes[i].getIntitule()); if (result != 0) return result; } + } return intitule.compareTo(o.intitule); } @@ -143,8 +143,8 @@ public LocalDate getDate() { /** * @return {@code String[]} les professeurs organisant le cours */ - public String[] getProf() { - return prof; + public Professeur[] getProfesseurs() { + return professeurs; } /** @@ -194,8 +194,8 @@ public String getIntitule() { @Override public String toString() { return intitule.toUpperCase(Locale.ROOT) + " :\n Date : " + date + "\n Commence Ă  " + heureDebut + ", finit Ă  " - + heureFin + "\n Enseignant :" + Arrays.toString(prof) + " \n Localisation : " + lieu + " \n Groupe : " - + Arrays.toString(groupes); + + heureFin + "\n Enseignant :" + Arrays.toString(professeurs) + " \n Localisation : " + lieu + + " \n Groupe : " + Arrays.toString(groupes); } /* diff --git a/src/main/java/fr/umontp/edt/EmploiDuTemps.java b/src/main/java/fr/umontp/edt/EmploiDuTemps.java index 4ac98d9..0efe13d 100644 --- a/src/main/java/fr/umontp/edt/EmploiDuTemps.java +++ b/src/main/java/fr/umontp/edt/EmploiDuTemps.java @@ -34,7 +34,7 @@ * * @author emerick-biron * @author MathieuSoysal - * @version 1.0.0 + * @version 1.2.0 */ @Deprecated(forRemoval = false) public final class EmploiDuTemps implements InterfaceEmploiDuTemps { @@ -134,17 +134,16 @@ public void actualiser() { } /** - * Permet d'obtenir le planning correspondant Ă  une date + * Permet d'obtenir le planning correspondant Ă  une date ou plusieurs dates. * - * @param date date pour laquelle on veut obtenir le planning + * @param dates dates pour lesquelles on veut obtenir le planning. * @return {@code Planning} correspondant - * @since 1.0 - * * @see Planning + * @see Planning#getPlanningOf(LocalDate...) */ @Override - public Planning getPlanningOf(LocalDate date) { - return planningEmploisDuTemps.getPlanningOf(date); + public Planning getPlanningOf(LocalDate... dates) { + return planningEmploisDuTemps.getPlanningOf(dates); } /** @@ -164,17 +163,48 @@ public Planning getPlanningOf(LocalDate date, Groupe groupe) { } /** - * Permet d'obtenir le planning correspondant Ă  un groupe + * Permet d'obtenir le planning correspondant Ă  un groupe ou plusieurs groupe. * - * @param groupe groupe dont on veut obtenir le planning + * @param groupes groupes dont on veut obtenir le planning * @return planning correspondant - * @since 1.0 - * * @see Groupe * @see Planning + * @see Planning#getPlanningOf(Groupe...) + */ + @Override + public Planning getPlanningOf(Groupe... groupes) { + return planningEmploisDuTemps.getPlanningOf(groupes); + } + + /** + * Permet d'obtenir le planning correspondant Ă  un professeur ou plusieurs + * professeurs + * + * @param professeurs professeurs dont on veut obtenir le planning + * @return planning correspondant + * @since 1.1 + * + * @see Professeur + * @see Planning + * @see Planning#getPlanningOf(Professeur...) + */ + @Override + public Planning getPlanningOf(Professeur... professeurs) { + return planningEmploisDuTemps.getPlanningOf(professeurs); + } + + /** + * Permet d'obtenir le planning correspondant au {@link PlanningFiltreur} + * + * @param planningFiltreur filtrant le planning + * @return planning correspondant au filtre + * @since 1.2.0 + * + * @see PlanningFiltreur + * @see Planning */ @Override - public Planning getPlanningOf(Groupe groupe) { - return planningEmploisDuTemps.getPlanningOf(groupe); + public Planning getPlanningOf(PlanningFiltreur planningFiltreur) { + return planningEmploisDuTemps.getPlanningOf(planningFiltreur); } } diff --git a/src/main/java/fr/umontp/edt/EmploiDuTempsProxy.java b/src/main/java/fr/umontp/edt/EmploiDuTempsProxy.java index 6bc5a47..602e5fe 100644 --- a/src/main/java/fr/umontp/edt/EmploiDuTempsProxy.java +++ b/src/main/java/fr/umontp/edt/EmploiDuTempsProxy.java @@ -1,8 +1,11 @@ package fr.umontp.edt; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collection; import java.util.EnumMap; import java.util.HashMap; +import java.util.IdentityHashMap; /** * EmploiDuTempsProxy est la classe reprĂ©sentant le proxy de la class @@ -12,7 +15,7 @@ * * @author emerick-biron * @author MathieuSoysal - * @version 1.0.0 + * @version 1.4.0 * @see EmploiDuTemps * @see InterfaceEmploiDuTemps */ @@ -21,8 +24,9 @@ public final class EmploiDuTempsProxy implements InterfaceEmploiDuTemps { @SuppressWarnings("deprecation") private EmploiDuTemps emploiDuTemps; private EnumMap cacheGroupe; + private IdentityHashMap cacheProfesseur; private HashMap cacheDate; - private HashMap, Planning> cacheDateGroupe; + private HashMap cachePlanningFiltreur; @SuppressWarnings("deprecation") private EmploiDuTempsProxy() { @@ -30,6 +34,19 @@ private EmploiDuTempsProxy() { actualiser(); } + /** + * Permet d'actualiser l'emploi du temps avec celui de l'ent. + */ + @SuppressWarnings("deprecation") + @Override + public void actualiser() { + cacheDate = new HashMap<>(); + cacheProfesseur = new IdentityHashMap<>(); + cacheGroupe = new EnumMap<>(Groupe.class); + cachePlanningFiltreur = new HashMap<>(); + emploiDuTemps.actualiser(); + } + /** * @return l'instance de {@link EmploiDuTempsProxy}. * @@ -48,18 +65,20 @@ public static EmploiDuTempsProxy getInstance() { } /** - * Permet d'obtenir le planning correspondant Ă  une date + * Permet d'obtenir le planning correspondant Ă  une date ou plusieurs dates. * - * @param date date pour laquelle on veut obtenir le planning + * @param dates dates pour lesquelles on veut obtenir le planning. * @return {@code Planning} correspondant - * @since 1.0 - * * @see Planning + * @since 1.3.0 */ @SuppressWarnings("deprecation") @Override - public Planning getPlanningOf(LocalDate date) { - return cacheDate.computeIfAbsent(date, k -> emploiDuTemps.getPlanningOf(k)); + public Planning getPlanningOf(LocalDate... dates) { + Collection cours = new ArrayList<>(); + for (LocalDate date : dates) + cours.addAll(cacheDate.computeIfAbsent(date, k -> emploiDuTemps.getPlanningOf(k)).getCours()); + return new Planning(cours); } /** @@ -75,77 +94,62 @@ public Planning getPlanningOf(LocalDate date) { */ @Override public Planning getPlanningOf(LocalDate date, Groupe groupe) { - MultiKey multiKey = new MultiKey<>(date, groupe); - return cacheDateGroupe.computeIfAbsent(multiKey, k -> getPlanningOf(k.key1).getPlanningOf(k.key2)); + return getPlanningOf(PlanningFiltreur.filtrer().par(date).par(groupe)); } /** - * Permet d'obtenir le planning correspondant Ă  un groupe + * Permet d'obtenir le planning correspondant Ă  un groupe ou plusieurs groupe. * - * @param groupe groupe dont on veut obtenir le planning + * @param groupes groupes dont on veut obtenir le planning * @return planning correspondant - * @since 1.0 - * * @see Groupe * @see Planning + * @since 1.2.0 */ @SuppressWarnings("deprecation") @Override - public Planning getPlanningOf(Groupe groupe) { - return cacheGroupe.computeIfAbsent(groupe, k -> emploiDuTemps.getPlanningOf(k)); + public Planning getPlanningOf(Groupe... groupes) { + Collection cours = new ArrayList<>(); + for (Groupe groupe : groupes) + cours.addAll(cacheGroupe.computeIfAbsent(groupe, k -> emploiDuTemps.getPlanningOf(k)).getCours()); + return new Planning(cours); } /** - * Permet d'actualiser l'emploi du temps avec celui de l'ent. + * Permet d'obtenir le planning correspondant Ă  un professeur ou plusieurs + * professeurs + * + * @param professeurs professeurs dont on veut obtenir le planning + * @return planning correspondant + * @since 1.1 + * + * @see Professeur + * @see Planning */ @SuppressWarnings("deprecation") @Override - public void actualiser() { - cacheDate = new HashMap<>(); - cacheGroupe = new EnumMap<>(Groupe.class); - cacheDateGroupe = new HashMap<>(); - emploiDuTemps.actualiser(); + public Planning getPlanningOf(Professeur... professeurs) { + Collection cours = new ArrayList<>(); + for (Professeur professeur : professeurs) + cours.addAll(cacheProfesseur.computeIfAbsent(professeur, k -> emploiDuTemps.getPlanningOf(k)).getCours()); + return new Planning(cours); } /** - * Cette classe reprĂ©sente une combinaison de clefs + * Permet d'obtenir le planning correspondant au {@link PlanningFiltreur} + * + * @param planningFiltreur filtrant le planning + * @return planning correspondant au filtre + * @since 1.4.0 + * + * @see PlanningFiltreur + * @see Planning */ - private class MultiKey { - private K1 key1; - private K2 key2; - - public MultiKey(K1 key1, K2 key2) { - this.key1 = key1; - this.key2 = key2; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - - MultiKey key = (MultiKey) o; - - if (key1 != null ? !key1.equals(key.key1) : key.key1 != null) - return false; - if (key2 != null ? !key2.equals(key.key2) : key.key2 != null) - return false; - - return true; - } - - @Override - public int hashCode() { - int result = key1 != null ? key1.hashCode() : 0; - result = 31 * result + (key2 != null ? key2.hashCode() : 0); - return result; - } - - @Override - public String toString() { - return "[" + key1 + ", " + key2 + "]"; - } + @SuppressWarnings("deprecation") + @Override + public Planning getPlanningOf(PlanningFiltreur planningFiltreur) { + return cachePlanningFiltreur.computeIfAbsent(planningFiltreur, + k -> emploiDuTemps.getPlanningOf(planningFiltreur)); } + } diff --git a/src/main/java/fr/umontp/edt/Groupe.java b/src/main/java/fr/umontp/edt/Groupe.java index 91f0adf..34cd505 100644 --- a/src/main/java/fr/umontp/edt/Groupe.java +++ b/src/main/java/fr/umontp/edt/Groupe.java @@ -278,8 +278,8 @@ private boolean possedeGroupeParent() { /** * Permet de savoir si ce groupe est contenu dans {@code autreGroupe} * - * @param autreGroupes Les {@link Groupe} auquel on vĂ©rifie s'ils contiennent le groupe - * actuel (this) + * @param autreGroupes Les {@link Groupe} auquel on vĂ©rifie s'ils contiennent le + * groupe actuel (this) * * @return {@code boolean} * @since 1.0 diff --git a/src/main/java/fr/umontp/edt/InterfaceEmploiDuTemps.java b/src/main/java/fr/umontp/edt/InterfaceEmploiDuTemps.java index 13801eb..b673a01 100644 --- a/src/main/java/fr/umontp/edt/InterfaceEmploiDuTemps.java +++ b/src/main/java/fr/umontp/edt/InterfaceEmploiDuTemps.java @@ -1,7 +1,8 @@ package fr.umontp.edt; /** - * InterfaceEmploisDuTemps est un interface proposant des mĂ©thodes pour un emploi du temps + * InterfaceEmploisDuTemps est un interface proposant des mĂ©thodes pour un + * emploi du temps * * @author emerick-biron * @author MathieuSoysal diff --git a/src/main/java/fr/umontp/edt/Planifiable.java b/src/main/java/fr/umontp/edt/Planifiable.java index c5fea40..561e70e 100644 --- a/src/main/java/fr/umontp/edt/Planifiable.java +++ b/src/main/java/fr/umontp/edt/Planifiable.java @@ -8,36 +8,59 @@ * * @author emerick-biron * @author MathieuSoysal - * @version 1.0 + * @version 1.4.0 */ interface Planifiable { + /** - * Permet d'obtenir le planning correspondant Ă  une date + * Permet d'obtenir le planning correspondant Ă  une date ou plusieurs dates. * - * @param date date pour laquelle on veut obtenir le planning + * @param dates dates pour lesquelles on veut obtenir le planning. * @return {@code Planning} correspondant - * @since 1.0 - * * @see Planning + * @since 1.3.0 */ - public Planning getPlanningOf(LocalDate date); + public Planning getPlanningOf(LocalDate... dates); /** - * Permet d'obtenir le planning correspondant Ă  une date et un groupe + * Permet d'obtenir le planning correspondant Ă  un groupe ou plusieurs groupe. * - * @param date date dont on veut obtenir le planning - * @param groupe groupe dont on veut obtenir le planning + * @param groupes groupes dont on veut obtenir le planning * @return planning correspondant - * @since 1.0 + * @see Groupe + * @see Planning + * @since 1.2.0 + */ + public Planning getPlanningOf(Groupe... groupes); + + /** + * Permet d'obtenir le planning correspondant Ă  un professeur + * + * @param professeur professeur dont on veut obtenir le planning + * @return planning correspondant + * @since 1.1.0 * * @see Groupe * @see Planning */ - public Planning getPlanningOf(LocalDate date, Groupe groupe); + public Planning getPlanningOf(Professeur... professeurs); + + /** + * Permet d'obtenir le planning correspondant au {@link PlanningFiltreur} + * + * @param planningFiltreur filtrant le planning + * @return planning correspondant au filtre + * @since 1.4.0 + * + * @see PlanningFiltreur + * @see Planning + */ + public Planning getPlanningOf(PlanningFiltreur planningFiltreur); /** - * Permet d'obtenir le planning correspondant Ă  un groupe + * Permet d'obtenir le planning correspondant Ă  une date et un groupe * + * @param date date dont on veut obtenir le planning * @param groupe groupe dont on veut obtenir le planning * @return planning correspondant * @since 1.0 @@ -45,6 +68,6 @@ interface Planifiable { * @see Groupe * @see Planning */ - public Planning getPlanningOf(Groupe groupe); + public Planning getPlanningOf(LocalDate date, Groupe groupe); } diff --git a/src/main/java/fr/umontp/edt/Planning.java b/src/main/java/fr/umontp/edt/Planning.java index 2708d88..bd119d0 100644 --- a/src/main/java/fr/umontp/edt/Planning.java +++ b/src/main/java/fr/umontp/edt/Planning.java @@ -10,20 +10,21 @@ import java.util.function.Consumer; import java.util.stream.Collectors; +import edu.emory.mathcs.backport.java.util.Arrays; + /** * Planning est la classe reprĂ©sentant un planning de {@link Cours} de * l'empois du temps de l'universitĂ©. *

* Une instance de Planning est caractérisé par une liste de {@link Cours} *

- * + * + * @author emerick-biron + * @author MathieuSoysal + * @version 1.4.2 * @see Iterable * @see Planifiable * @see Cours - * - * @author emerick-biron - * @author MathieuSoysal - * @version 1.0.0 */ public class Planning implements Iterable, Planifiable { private SortedSet cours; @@ -32,60 +33,34 @@ public class Planning implements Iterable, Planifiable { * Permet de crĂ©er un objet Planning a partir d'une collection de cours * * @param cours collection de cours - * @since 1.0 - * * @see Cours + * @since 1.0 */ public Planning(Collection cours) { - this.cours = new TreeSet(cours); + this.cours = new TreeSet<>(cours); } - @Override - public Iterator iterator() { - return cours.iterator(); - } - - @Override - public void forEach(Consumer action) { - cours.forEach(action); - } - - @Override - public Spliterator spliterator() { - return cours.spliterator(); - } - - @Override - public String toString() { - String res = "EDT :\n\n"; - for (Cours c : cours) { - res += c.toString() + "\n\n"; - } - return res; + private Planning() { + cours = new TreeSet<>(); } /** - * Permet d'obtenir le planning correspondant Ă  une date + * Permet d'obtenir le planning correspondant Ă  une date ou plusieurs dates. * - * @param date date pour laquelle on veut obtenir le planning + * @param dates dates pour lesquelles on veut obtenir le planning. * @return {@code Planning} correspondant - * @since 1.0 - * * @see Planning + * @since 1.3.0 */ @Override - public Planning getPlanningOf(LocalDate date) { + public Planning getPlanningOf(LocalDate... dates) { + SortedSet sortedDates = new TreeSet<>(Arrays.asList(dates)); ArrayList result = new ArrayList<>(); LocalDate lastDate = cours.last().getDate(); - if (!lastDate.isBefore(date)) { - for (Cours c : cours) { - int compare = c.getDate().compareTo(date); - if (compare < 0) - continue; - if (compare == 0) - result.add(c); - else - return new Planning(result); + if (!lastDate.isBefore(sortedDates.first())) { + Iterator iteratorCours = cours.iterator(); + for (LocalDate date : sortedDates) { + result.addAll(getCoursOf(date, iteratorCours)); } } return new Planning(result); @@ -97,10 +72,9 @@ public Planning getPlanningOf(LocalDate date) { * @param date date dont on veut obtenir le planning * @param groupe groupe dont on veut obtenir le planning * @return planning correspondant - * @since 1.0 - * * @see Groupe * @see Planning + * @since 1.0 */ @Override public Planning getPlanningOf(LocalDate date, Groupe groupe) { @@ -108,19 +82,92 @@ public Planning getPlanningOf(LocalDate date, Groupe groupe) { } /** - * Permet d'obtenir le planning correspondant Ă  un groupe + * Permet d'obtenir le planning correspondant Ă  un groupe ou plusieurs groupe. * - * @param groupe groupe dont on veut obtenir le planning + * @param groupes groupes dont on veut obtenir le planning * @return planning correspondant - * @since 1.0 - * * @see Groupe * @see Planning + * @since 1.4.1 */ @Override - public Planning getPlanningOf(Groupe groupe) { - return new Planning( - cours.stream().filter(c -> groupe.estContenuDans(c.getGroupes())).collect(Collectors.toList())); + public Planning getPlanningOf(Groupe... groupes) { + Planning result = new Planning(); + for (Cours c : cours) + for (Groupe g : groupes) + if (g.estContenuDans(c.getGroupes())) + result.cours.add(c); + return result; + } + + /** + * Permet d'obtenir le planning correspondant Ă  un professeur ou plusieurs + * professeurs + * + * @param professeurs professeurs dont on veut obtenir le planning + * @return planning correspondant + * @since 1.4.2 + * + * @see Professeur + * @see Planning + */ + @Override + public Planning getPlanningOf(Professeur... professeurs) { + Planning result = new Planning(); + for (Cours c : cours) + for (Professeur p : professeurs) + if (c.estEnseignePar(p)) + result.cours.add(c); + return result; + } + + /** + * Permet d'obtenir le planning correspondant au {@link PlanningFiltreur} + * + * @param planningFiltreur filtrant le planning + * @return planning correspondant au filtre + * @since 1.4.0 + * + * @see PlanningFiltreur + * @see Planning + */ + public Planning getPlanningOf(PlanningFiltreur planningFiltreur) { + Planning result = new Planning(cours); + if (planningFiltreur.getDates() != null) + result = result.getPlanningOf(planningFiltreur.getDates()); + if (planningFiltreur.getGroupes() != null) + result = result.getPlanningOf(planningFiltreur.getGroupes()); + if (planningFiltreur.getProfesseurs() != null) + result = result.getPlanningOf(planningFiltreur.getProfesseurs()); + return result; + } + + @Override + public Iterator iterator() { + return cours.iterator(); + } + + @Override + public void forEach(Consumer action) { + cours.forEach(action); + } + + @Override + public Spliterator spliterator() { + return cours.spliterator(); + } + + @Override + public String toString() { + String res = "EDT :\n\n"; + if (cours.isEmpty()) { + res += "Aucun cours"; + } else { + for (Cours c : cours) { + res += c.toString() + "\n\n"; + } + } + return res; } /** @@ -129,4 +176,30 @@ public Planning getPlanningOf(Groupe groupe) { Collection getCours() { return cours; } + + /** + * Retourne les cours d'{@code iteratorCours} correspondant Ă  la {@code date} + * donnĂ©e en paramĂštre. + * + * @return {@code Collection} correspondant + * + * @param date au quelle les cours doivent corespondre + * @param iteratorCours est liste au quelles les cours doivent ĂȘtre cherchĂ©s + * + * @see Cours + */ + private Collection getCoursOf(final LocalDate date, Iterator iteratorCours) { + final LocalDate lastDate = cours.last().getDate(); + Collection result = new ArrayList<>(); + if (!lastDate.isBefore(date) && iteratorCours.hasNext()) { + Cours c; + do { + c = iteratorCours.next(); + if (c.getDate().isEqual(date)) + result.add(c); + } while (iteratorCours.hasNext() && !c.getDate().isAfter(date)); + } + return result; + } + } diff --git a/src/main/java/fr/umontp/edt/PlanningFiltreur.java b/src/main/java/fr/umontp/edt/PlanningFiltreur.java new file mode 100644 index 0000000..06e8b10 --- /dev/null +++ b/src/main/java/fr/umontp/edt/PlanningFiltreur.java @@ -0,0 +1,197 @@ +package fr.umontp.edt; + +import static java.util.Comparator.comparing; + +import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; + +/** + * PlanningFiltreur est la classe reprĂ©sentant un filtrage pour un + * Planning. + *

+ * Une instance du planning est peut ĂȘtre caractĂ©risĂ© par les informations + * suivantes : + *

+ *
    + *
  • Une ou plusieurs date.
  • + *
  • Un ou plusieurs groupe.
  • + *
  • Un ou plusieurs professeurs.
  • + *
+ *

+ * Par défauts toutes ces attributs sont à {@code null}. + *

+ * + * @see Planning + * + * @author MathieuSoysal + * @version 1.2.0 + */ +public class PlanningFiltreur { + private LocalDate[] dates; + private Groupe[] groupes; + private Professeur[] professeurs; + + private PlanningFiltreur() { + dates = null; + groupes = null; + professeurs = null; + } + + /** + * Instanciation de PlanningFiltreur. + *

+ * A la l'instanciation d'un objet PlanningFiltreur, toutes les variables de + * filtrage sont par défaut à {@code null}. + *

+ * + * @return {@code PlanningFiltreur} instancié + * + * @since 1.1.0 + * + * @see PlanningFiltreur#par(LocalDate...) + */ + public static PlanningFiltreur filtrer() { + return new PlanningFiltreur(); + } + + /** + * Ajoute un filtrage par un ou plusieurs date. + * + * @param dates qui doivent filtrer le planning + * + * @return {@code PlanningFiltreur} résultant + * + * @see LocalDate + */ + public PlanningFiltreur par(LocalDate... dates) { + this.dates = dates; + return this; + } + + /** + * Ajoute un filtrage par un ou plusieurs groupe. + * + * @return {@code PlanningFiltreur} résultant + * + * @param groupes qui doivent filtrer le planning + * + * @see Groupe + */ + public PlanningFiltreur par(Groupe... groupes) { + this.groupes = groupes; + return this; + } + + /** + * Ajoute un filtrage par un ou plusieurs Professeur. + * + * @return {@code PlanningFiltreur} résultant + * + * @param professeurs qui doivent filtrer le planning + * + * @see Professeur + */ + public PlanningFiltreur par(Professeur... professeurs) { + this.professeurs = professeurs; + return this; + } + + /** + * @return {@code LocalDate[]} tableau des dates + * + * @see LocalDate + */ + public LocalDate[] getDates() { + return dates; + } + + /** + * @return {@code LocalDate[]} tableau des groupes + * + * @see Groupe + */ + public Groupe[] getGroupes() { + return groupes; + } + + /** + * @return {@code LocalDate[]} tableau des professeurs + * + * @see Professeur + */ + public Professeur[] getProfesseurs() { + return professeurs; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + Arrays.hashCode(dates); + if (groupes != null) { + List lGroupes = Arrays.asList(groupes); + lGroupes.sort(comparing(Groupe::getIntitule)); + result = prime * result + lGroupes.hashCode(); + } else + result = prime * result + Arrays.hashCode(groupes); + if (professeurs != null) { + List lProfesseurs = Arrays.asList(professeurs); + lProfesseurs.sort(comparing(Professeur::getDenomination)); + result = prime * result + lProfesseurs.hashCode(); + } else + result = prime * result + Arrays.hashCode(professeurs); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + PlanningFiltreur other = (PlanningFiltreur) obj; + if (!Arrays.equals(dates, other.dates)) + return false; + if (!memeGroupes(other.groupes)) + return false; + if (!Arrays.equals(professeurs, other.professeurs)) { + if (professeurs.length == other.professeurs.length) { + List listProfesseurs = Arrays.asList(professeurs); + List listOtherProflistProfesseurs = Arrays.asList(other.professeurs); + if (!(listProfesseurs.containsAll(listOtherProflistProfesseurs) + && listOtherProflistProfesseurs.containsAll(listProfesseurs))) + return false; + } else + return false; + } + return true; + } + + private boolean memeGroupes(Groupe[] oGroupes) { + if (!Arrays.equals(groupes, oGroupes)) { + if (groupes.length == oGroupes.length) { + List listGroupes = Arrays.asList(groupes); + List listOtherGroupes = Arrays.asList(oGroupes); + if (!(listGroupes.containsAll(listOtherGroupes) && listOtherGroupes.containsAll(listGroupes))) + return false; + } else + return false; + } + return true; + } +} diff --git a/src/main/java/fr/umontp/edt/Professeur.java b/src/main/java/fr/umontp/edt/Professeur.java new file mode 100644 index 0000000..0861166 --- /dev/null +++ b/src/main/java/fr/umontp/edt/Professeur.java @@ -0,0 +1,106 @@ +package fr.umontp.edt; + +import java.util.Locale; + +/** + * Professeur est la classe représentant un professeur au sein de l'emploi du + * temps. Un professeur est caractérisé par les informations suivantes : + *
    + *
  • Une dĂ©nomination (dĂ©nomination utilisĂ© dans la description d'un + * cours).
  • + *
  • Un nom.
  • + *
  • Un pĂ©nom.
  • + *
+ *

+ * Pour pouvoir instancier une Professeur il est conseillé de passé par la class + * {@link RepertoireProfesseur}. + *

+ * + * @see RepertoireProfesseur + * + * @author MathieuSoysal + * @version 1.0.0 + */ +public class Professeur { + private String denomination; + private String nom; + private String prenom; + + /** + * Ce constructeur est essentiellement utilisé pour instancier un professeur + * depuis un evenement de l'emploi du temps. + * + * @param nomPrenom {@code String} contenant le nom et le prenom du professeur. + */ + Professeur(String nomPrenom) { + String[] infosProf = nomPrenom.split(" "); + nom = infosProf[0]; + prenom = infosProf[1]; + denomination = formater(nom, prenom); + } + + static String formater(String nom, String prenom) { + return formater(nom + " " + prenom); + } + + static String formater(String nomPrenom) { + return nomPrenom.toUpperCase(Locale.FRANCE).replaceAll("[^A-Z ]", " "); + } + + /** + * @return le nom du professeur + */ + public String getNom() { + return nom; + } + + /** + * @return le prenom du professeur + */ + public String getPrenom() { + return prenom; + } + + /** + * @return la denomination + */ + String getDenomination() { + return denomination; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((denomination == null) ? 0 : denomination.hashCode()); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Professeur other = (Professeur) obj; + if (denomination == null) { + if (other.denomination != null) + return false; + } else if (!denomination.equals(other.denomination)) + return false; + return true; + } +} diff --git a/src/main/java/fr/umontp/edt/RepertoireProfesseur.java b/src/main/java/fr/umontp/edt/RepertoireProfesseur.java new file mode 100644 index 0000000..c8f9116 --- /dev/null +++ b/src/main/java/fr/umontp/edt/RepertoireProfesseur.java @@ -0,0 +1,67 @@ +package fr.umontp.edt; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * RepertoireProfesseur est la classe qui repertorie tous les professeurs de + * l'emploi du temps. + *

+ * + * @see Professeur + * + * @author MathieuSoysal + * @version 1.0.1 + */ +public final class RepertoireProfesseur { + private static HashMap repertoire = new HashMap<>(); + + /** + * La class RepertoireProfesseur est une class utilitaire est ne doit pas ĂȘtre instanciĂ©. + * + * @since 1.0.1 + * + * @see RepertoireProfesseur#get(String, String) + */ + private RepertoireProfesseur() { + throw new IllegalStateException("Class utilitaire"); + } + + /** + * Permet d'obtenir le(s) professeur(s) d'un VENVENT a partir de la description + * de ce dernier + * + * @param description description du VENVENT + * @return {@code String[]} le(s) professeur(s) du present dans la description + * @since 1.0 + */ + static Professeur[] getProfesseurDepuisDescriptionEtAjouterSiNonPresent(String description) { + String regex = "(?<=\\n).* .*(?=\\n)"; + Matcher m = Pattern.compile(regex).matcher(description); + final List matches = new ArrayList<>(); + while (m.find()) { + String nomPrenomProf = Professeur.formater(m.group(0)); + matches.add(repertoire.computeIfAbsent(nomPrenomProf, k -> new Professeur(nomPrenomProf))); + } + return matches.toArray(new Professeur[matches.size()]); + } + + /** + * Retourne le professeur correspondant aux variables nom et prĂ©nom donnĂ© en + * paramĂštre. + * + * @param nom du professeur devant ĂȘtre cherchĂ© + * @param prenom du professeur devant ĂȘtre cherchĂ© + * @return {@code Professeur} correspondant sinon retourne {@code null} si aucun + * professeur ne correspond. + * + * @see java.util.HashMap#get(java.lang.Object) + */ + public static Professeur get(String nom, String prenom) { + return repertoire.get(Professeur.formater(nom, prenom)); + } + +} diff --git a/src/test/java/fr/umontp/edt/CoursTest.java b/src/test/java/fr/umontp/edt/CoursTest.java index 67321a2..5e197f0 100644 --- a/src/test/java/fr/umontp/edt/CoursTest.java +++ b/src/test/java/fr/umontp/edt/CoursTest.java @@ -1,14 +1,14 @@ package fr.umontp.edt; import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.text.ParseException; import java.time.LocalDate; import java.time.LocalTime; -import java.util.Arrays; import java.util.stream.Stream; import org.junit.jupiter.api.BeforeEach; @@ -84,10 +84,17 @@ void test_constructeur_VEvent_groupe_Bon() { @Test void test_constructeur_VEvent_profs_Bon() { - String[] expected = { "BELMECHERI NASSIM", "HAETTEL THOMAS", "LA XUAN HOANG", - "CHIROUZE ANNE" }; + Professeur[] expected = { new Professeur("BELMECHERI NASSIM"), + new Professeur("HAETTEL THOMAS"), new Professeur("LA XUAN HOANG"), + new Professeur("CHIROUZE ANNE") }; Cours cours = new Cours(component); - assertEquals(Arrays.toString(expected), Arrays.toString(cours.getProf())); + assertArrayEquals(expected, cours.getProfesseurs()); + } + + @Test + void test_constructeur_VEvent_methode_estEnseignePar_doitRetournerTrue() { + Cours cours = new Cours(component); + assertTrue(cours.estEnseignePar(RepertoireProfesseur.get("LA", "Xuan-Hoang"))); } @Test @@ -103,13 +110,6 @@ void test_constructeur_VEvent_intitule_Bon() { } } - @Test - void test_getProfFromDdesc_Desc_NomsDesProfs() { - String desc = "\n\nA2-Semestre-3\nBELMECHERI NASSIM\nHAETTEL THOMAS\nLA XUAN HOANG\nCHIROUZE ANNE\nA valider\n(ExportĂ© le:18/01/2021 10:51)\n"; - String[] expected = { "BELMECHERI NASSIM", "HAETTEL THOMAS", "LA XUAN HOANG", "CHIROUZE ANNE" }; - assertEquals(Arrays.toString(expected), Arrays.toString(Cours.getProfFromDesc(desc))); - } - @ParameterizedTest(name = "Lorsque l'on compare le cours {0} au cours {1} les rĂ©sultat doit ĂȘtre {2} ") @MethodSource("genererArgumentsPourtestCompareTo_avecDate") void testCompareTo_avecDate(Cours cours1, Cours cours2, int excepted) { @@ -119,24 +119,30 @@ void testCompareTo_avecDate(Cours cours1, Cours cours2, int excepted) { private static Stream genererArgumentsPourtestCompareTo_avecDate() { return Stream.of(// - Arguments.of(new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + Arguments.of(new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), - new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), 0), // - Arguments.of(new Cours(LocalDate.of(2021, 1, 19), new String[] { "prof" }, + Arguments.of(new Cours(LocalDate.of(2021, 1, 19), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), - new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), -1), // - Arguments.of(new Cours(LocalDate.of(2021, 1, 21), new String[] { "prof" }, + Arguments.of(new Cours(LocalDate.of(2021, 1, 21), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), - new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), 1)); @@ -150,38 +156,48 @@ void testCompareTo_avecHeure(Cours cours1, Cours cours2, int excepted) { private static Stream genererArgumentsPourtestCompareTo_avecHeure() { return Stream.of(// - Arguments.of(new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + Arguments.of(new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), - new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), 0), // - Arguments.of(new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + Arguments.of(new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(12, 30), LocalTime.of(13, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), - new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), -1), // - Arguments.of(new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + Arguments.of(new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 29), LocalTime.of(13, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), - new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), -1), // - Arguments.of(new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + Arguments.of(new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 31), LocalTime.of(13, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), - new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), 1), // - Arguments.of(new Cours(LocalDate.of(2021, 1, 21), new String[] { "prof" }, + Arguments.of(new Cours(LocalDate.of(2021, 1, 21), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(14, 30), LocalTime.of(15, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), - new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, + new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"), 1)); @@ -189,19 +205,34 @@ private static Stream genererArgumentsPourtestCompareTo_avecHeure() { @Test void test_equals() { - Cours cours1 = new Cours(LocalDate.of(2021, 1, 21), new String[] { "prof" }, LocalTime.of(14, 30), - LocalTime.of(15, 30), "K133", new Groupe[] { Groupe.S4 }, "Compta4"); - Cours cours2 = new Cours(LocalDate.of(2021, 1, 21), new String[] { "prof" }, LocalTime.of(14, 30), - LocalTime.of(15, 30), "K133", new Groupe[] { Groupe.S3 }, "Compta4"); - assertFalse(cours1.equals(cours2)); + Cours cours1 = new Cours(LocalDate.of(2021, 1, 21), new Professeur[] { new Professeur("prof prof") }, + LocalTime.of(14, 30), LocalTime.of(15, 30), "K133", new Groupe[] { Groupe.S4 }, + "Compta4"); + Cours cours2 = new Cours(LocalDate.of(2021, 1, 21), new Professeur[] { new Professeur("prof prof") }, + LocalTime.of(14, 30), LocalTime.of(15, 30), "K133", new Groupe[] { Groupe.S3 }, + "Compta4"); + assertNotEquals(cours1, cours2); + } + + @Test + void test_compareTo() { + Cours cours1 = new Cours(LocalDate.of(2021, 1, 21), new Professeur[] { new Professeur("prof prof") }, + LocalTime.of(14, 30), LocalTime.of(15, 30), "K133", + new Groupe[] { Groupe.S4, Groupe.S2 }, "Compta4"); + Cours cours2 = new Cours(LocalDate.of(2021, 1, 21), new Professeur[] { new Professeur("prof prof") }, + LocalTime.of(14, 30), LocalTime.of(15, 30), "K133", + new Groupe[] { Groupe.S4, Groupe.S2 }, "Compta4"); + assertEquals(0, cours1.compareTo(cours2)); } @Test void test_hashcode() { - Cours cours1 = new Cours(LocalDate.of(2021, 1, 21), new String[] { "prof" }, LocalTime.of(14, 30), - LocalTime.of(15, 30), "K133", new Groupe[] { Groupe.S4 }, "Compta4"); - Cours cours2 = new Cours(LocalDate.of(2021, 1, 21), new String[] { "prof" }, LocalTime.of(14, 30), - LocalTime.of(15, 30), "K133", new Groupe[] { Groupe.S3 }, "Compta4"); + Cours cours1 = new Cours(LocalDate.of(2021, 1, 21), new Professeur[] { new Professeur("prof prof") }, + LocalTime.of(14, 30), LocalTime.of(15, 30), "K133", new Groupe[] { Groupe.S4 }, + "Compta4"); + Cours cours2 = new Cours(LocalDate.of(2021, 1, 21), new Professeur[] { new Professeur("prof prof") }, + LocalTime.of(14, 30), LocalTime.of(15, 30), "K133", new Groupe[] { Groupe.S3 }, + "Compta4"); assertNotEquals(cours1.hashCode(), cours2.hashCode()); } diff --git a/src/test/java/fr/umontp/edt/EmploiDuTempsProxyTest.java b/src/test/java/fr/umontp/edt/EmploiDuTempsProxyTest.java index 68d3804..ac85c28 100644 --- a/src/test/java/fr/umontp/edt/EmploiDuTempsProxyTest.java +++ b/src/test/java/fr/umontp/edt/EmploiDuTempsProxyTest.java @@ -9,7 +9,8 @@ import org.junit.jupiter.api.Test; class EmploiDuTempsProxyTest { - + // Attention les tests de cette classe ne peuvent ĂȘtre executĂ© que dans un + // environement stable comme le runner Github Actions private EmploiDuTempsProxy emploiDuTempsProxy; @AfterEach @@ -44,8 +45,8 @@ private long rapiditeGetPlanningOfDate() { emploiDuTempsProxy.getPlanningOf(LocalDate.now().plusDays(7)); emploiDuTempsProxy.getPlanningOf(LocalDate.now().plusDays(8)); emploiDuTempsProxy.getPlanningOf(LocalDate.now().plusDays(9)); - emploiDuTempsProxy.getPlanningOf(LocalDate.now().plusDays(10)); emploiDuTempsProxy.getPlanningOf(LocalDate.now().plusDays(1)); - emploiDuTempsProxy.getPlanningOf(LocalDate.now().plusDays(11)); emploiDuTempsProxy.getPlanningOf(LocalDate.now().plusDays(1)); + emploiDuTempsProxy.getPlanningOf(LocalDate.now().plusDays(10)); + emploiDuTempsProxy.getPlanningOf(LocalDate.now().plusDays(11)); emploiDuTempsProxy.getPlanningOf(LocalDate.now().plusDays(12)); emploiDuTempsProxy.getPlanningOf(LocalDate.now().plusDays(13)); emploiDuTempsProxy.getPlanningOf(LocalDate.now().plusDays(14)); @@ -58,6 +59,28 @@ private long rapiditeGetPlanningOfDate() { return System.currentTimeMillis() - startTime; } + @Test + void test_getPlanningOf_plusieursDates_plusRapideInteligent() { + emploiDuTempsProxy = EmploiDuTempsProxy.getInstance(); + + long tempsExecution1 = rapiditeGetPlanningOfDate(); + long tempsExecution2 = rapiditeGetPlanningOfDateBrut(); + + assertTrue(tempsExecution1 > tempsExecution2); + } + + private long rapiditeGetPlanningOfDateBrut() { + long startTime = System.currentTimeMillis(); + emploiDuTempsProxy.getPlanningOf(LocalDate.now(), LocalDate.now().plusDays(1), LocalDate.now().plusDays(2), + LocalDate.now().plusDays(3), LocalDate.now().plusDays(4), LocalDate.now().plusDays(5), + LocalDate.now().plusDays(6), LocalDate.now().plusDays(7), LocalDate.now().plusDays(8), + LocalDate.now().plusDays(9), LocalDate.now().plusDays(10), LocalDate.now().plusDays(11), + LocalDate.now().plusDays(12), LocalDate.now().plusDays(13), LocalDate.now().plusDays(14), + LocalDate.now().plusDays(15), LocalDate.now().plusDays(16), LocalDate.now().plusDays(17), + LocalDate.now().plusDays(18), LocalDate.now().plusDays(19)); + return System.currentTimeMillis() - startTime; + } + @Test void test_getPlanningOf_Groupe_plusRapide() { emploiDuTempsProxy = EmploiDuTempsProxy.getInstance(); @@ -87,6 +110,23 @@ private long rapiditeGetPlanningOfGroupe() { return System.currentTimeMillis() - startTime; } + @Test + void test_getPlanningOf_Groupe_plusRapideInteligent() { + emploiDuTempsProxy = EmploiDuTempsProxy.getInstance(); + + long tempsExecution1 = rapiditeGetPlanningOfGroupe(); + long tempsExecution2 = rapiditeGetPlanningOfGroupeBrut(); + + assertTrue(tempsExecution1 > tempsExecution2); + } + + private long rapiditeGetPlanningOfGroupeBrut() { + long startTime = System.currentTimeMillis(); + emploiDuTempsProxy.getPlanningOf(Groupe.S1, Groupe.S2, Groupe.S3, Groupe.S4, Groupe.A1, Groupe.Q1, Groupe.Q2, + Groupe.Q3, Groupe.Q4, Groupe.G1, Groupe.G2, Groupe.G3, Groupe.G4, Groupe.A2); + return System.currentTimeMillis() - startTime; + } + @Test void test_getPlanningOf_DateGroupe_plusRapide() { emploiDuTempsProxy = EmploiDuTempsProxy.getInstance(); @@ -133,4 +173,105 @@ void test_getPlanningOf_DateGroupe_plusRapideInteligent() { assertTrue(tempsExecution1 > tempsExecution2); } + @Test + void test_getPlanningOf_Professeur_plusRapide() { + emploiDuTempsProxy = EmploiDuTempsProxy.getInstance(); + + long tempsExecution1 = rapiditeGetPlanningOfProfesseur(); + long tempsExecution2 = rapiditeGetPlanningOfProfesseur(); + + assertTrue(tempsExecution1 > tempsExecution2); + } + + private long rapiditeGetPlanningOfProfesseur() { + long startTime = System.currentTimeMillis(); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Marie-Jeanne", "Alain")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Valicov", "Petru")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Bougeret", "Marin")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Garcia", "Francis")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Lazaar", "Nadjib")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("lebreton", "romain")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("messaoui", "anita")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Gouaich", "Abdelkader")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Chollet", "Antoine")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Ouherrou", "Nihal")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Rosenfeld", "Matthieu")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Chirouze", "Anne")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Weber", "Marie-Laure")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Palleja", "Nathalie")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Molnar", "Miklos")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Delebarre", "Justine")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Nabitz", "Sophie")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Poupet", "Victor")); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Coletta", "RĂ©mi")); + return System.currentTimeMillis() - startTime; + } + + @Test + void test_getPlanningOf_Professeur_plusRapideInteligent() { + emploiDuTempsProxy = EmploiDuTempsProxy.getInstance(); + + long tempsExecution1 = rapiditeGetPlanningOfProfesseur(); + long tempsExecution2 = rapiditeGetPlanningOfProfesseurBrut(); + + assertTrue(tempsExecution1 > tempsExecution2); + } + + private long rapiditeGetPlanningOfProfesseurBrut() { + long startTime = System.currentTimeMillis(); + emploiDuTempsProxy.getPlanningOf(RepertoireProfesseur.get("Marie-Jeanne", "Alain"), + RepertoireProfesseur.get("Valicov", "Petru"), RepertoireProfesseur.get("Bougeret", "Marin"), + RepertoireProfesseur.get("Garcia", "Francis"), RepertoireProfesseur.get("Lazaar", "Nadjib"), + RepertoireProfesseur.get("lebreton", "romain"), RepertoireProfesseur.get("messaoui", "anita"), + RepertoireProfesseur.get("Gouaich", "Abdelkader"), RepertoireProfesseur.get("Chollet", "Antoine"), + RepertoireProfesseur.get("Ouherrou", "Nihal"), RepertoireProfesseur.get("Rosenfeld", "Matthieu"), + RepertoireProfesseur.get("Chirouze", "Anne"), RepertoireProfesseur.get("Weber", "Marie-Laure"), + RepertoireProfesseur.get("Palleja", "Nathalie"), RepertoireProfesseur.get("Molnar", "Miklos"), + RepertoireProfesseur.get("Delebarre", "Justine"), RepertoireProfesseur.get("Nabitz", "Sophie"), + RepertoireProfesseur.get("Poupet", "Victor"), RepertoireProfesseur.get("Coletta", "RĂ©mi")); + return System.currentTimeMillis() - startTime; + } + + @Test + void test_getPlanningOf_ProfesseurAvecPlanningFiltreur_plusRapide() { + emploiDuTempsProxy = EmploiDuTempsProxy.getInstance(); + + long tempsExecution1 = rapiditeGetPlanningOfProfesseurAvecPlanningFiltreur(); + long tempsExecution2 = rapiditeGetPlanningOfProfesseurAvecPlanningFiltreur(); + + assertTrue(tempsExecution1 > tempsExecution2); + } + + private long rapiditeGetPlanningOfProfesseurAvecPlanningFiltreur() { + long startTime = System.currentTimeMillis(); + emploiDuTempsProxy + .getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Marie-Jeanne", "Alain"))); + emploiDuTempsProxy.getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Valicov", "Petru"))); + emploiDuTempsProxy.getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Bougeret", "Marin"))); + emploiDuTempsProxy.getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Garcia", "Francis"))); + emploiDuTempsProxy.getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Lazaar", "Nadjib"))); + emploiDuTempsProxy + .getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("lebreton", "romain"))); + emploiDuTempsProxy.getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("messaoui", "anita"))); + emploiDuTempsProxy + .getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Gouaich", "Abdelkader"))); + emploiDuTempsProxy + .getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Chollet", "Antoine"))); + emploiDuTempsProxy.getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Ouherrou", "Nihal"))); + emploiDuTempsProxy + .getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Rosenfeld", "Matthieu"))); + emploiDuTempsProxy.getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Chirouze", "Anne"))); + emploiDuTempsProxy + .getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Weber", "Marie-Laure"))); + emploiDuTempsProxy + .getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Palleja", "Nathalie"))); + emploiDuTempsProxy.getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Molnar", "Miklos"))); + emploiDuTempsProxy + .getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Delebarre", "Justine"))); + emploiDuTempsProxy.getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Nabitz", "Sophie"))); + emploiDuTempsProxy.getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Poupet", "Victor"))); + emploiDuTempsProxy.getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Coletta", "RĂ©mi"))); + return System.currentTimeMillis() - startTime; + } + } diff --git a/src/test/java/fr/umontp/edt/EmploiDuTempsTest.java b/src/test/java/fr/umontp/edt/EmploiDuTempsTest.java index d151b51..9de47f2 100644 --- a/src/test/java/fr/umontp/edt/EmploiDuTempsTest.java +++ b/src/test/java/fr/umontp/edt/EmploiDuTempsTest.java @@ -21,15 +21,62 @@ void test_getPlanningOf_date_verifierRetourneAucuneErreur() { assertAll(() -> emploiDuTemps.getPlanningOf(LocalDate.now())); } + @Test + void test_getPlanningOf_plusieursDate_verifierRetourneAucuneErreur() { + EmploiDuTemps emploiDuTemps = EmploiDuTemps.getInstance(); + assertAll(() -> emploiDuTemps.getPlanningOf(LocalDate.now(), LocalDate.now().plusDays(1))); + } + @Test void test_getPlanningOf_groupe_verifierRetourneAucuneErreur() { EmploiDuTemps emploiDuTemps = EmploiDuTemps.getInstance(); assertAll(() -> emploiDuTemps.getPlanningOf(Groupe.A1)); } + @Test + void test_getPlanningOf_plusieursGroupes_verifierRetourneAucuneErreur() { + EmploiDuTemps emploiDuTemps = EmploiDuTemps.getInstance(); + assertAll(() -> emploiDuTemps.getPlanningOf(Groupe.S4, Groupe.S2)); + } + @Test void test_getPlanningOf_groupe_verifierRetournePasDeListeVide() { EmploiDuTemps emploiDuTemps = EmploiDuTemps.getInstance(); assertTrue(emploiDuTemps.getPlanningOf(Groupe.A1).iterator().hasNext()); } + + @Test + void test_getPlanningOf_professeur_verifierRetourneAucuneErreur() { + EmploiDuTemps emploiDuTemps = EmploiDuTemps.getInstance(); + assertAll(() -> emploiDuTemps.getPlanningOf(RepertoireProfesseur.get("Marie-jeanne", "Alain"))); + } + + @Test + void test_getPlanningOf_plusieursProfesseurs_verifierRetourneAucuneErreur() { + EmploiDuTemps emploiDuTemps = EmploiDuTemps.getInstance(); + assertAll(() -> emploiDuTemps.getPlanningOf(RepertoireProfesseur.get("Marie-jeanne", "Alain"), + RepertoireProfesseur.get("messaoui", "anita"))); + } + + @Test + void test_getPlanningOf_professeur_verifierRetournePasDeListeVide() { + EmploiDuTemps emploiDuTemps = EmploiDuTemps.getInstance(); + assertTrue(emploiDuTemps.getPlanningOf(RepertoireProfesseur.get("Marie-jeanne", "Alain")).iterator().hasNext()); + } + + @Test + void test_getPlanningOf_PlanningFiltreurParProfesseur_verifierRetourneAucuneErreur() { + EmploiDuTemps emploiDuTemps = EmploiDuTemps.getInstance(); + assertAll(() -> emploiDuTemps + .getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Marie-jeanne", "Alain"))) + .iterator().hasNext()); + } + + @Test + void test_getPlanningOf_PlanningFiltreurParProfesseur_verifierRetournePasDeListeVide() { + EmploiDuTemps emploiDuTemps = EmploiDuTemps.getInstance(); + assertTrue(emploiDuTemps + .getPlanningOf(PlanningFiltreur.filtrer().par(RepertoireProfesseur.get("Marie-jeanne", "Alain"))) + .iterator().hasNext()); + } } diff --git a/src/test/java/fr/umontp/edt/PlanningFiltreurTest.java b/src/test/java/fr/umontp/edt/PlanningFiltreurTest.java new file mode 100644 index 0000000..7919d4d --- /dev/null +++ b/src/test/java/fr/umontp/edt/PlanningFiltreurTest.java @@ -0,0 +1,102 @@ +package fr.umontp.edt; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.time.LocalDate; + +import org.junit.jupiter.api.Test; + +class PlanningFiltreurTest { + + @Test + void test_PlanningFiltreur_par_date() { + PlanningFiltreur planningFiltreur = PlanningFiltreur.filtrer().par(LocalDate.now()); + + assertEquals(LocalDate.now(), planningFiltreur.getDates()[0]); + } + + @Test + void test_PlanningFiltreur_par_plusieursDates() { + PlanningFiltreur planningFiltreur = PlanningFiltreur.filtrer().par(LocalDate.now(), LocalDate.now().plusDays(1), + LocalDate.now().plusDays(2)); + LocalDate[] excepted = { LocalDate.now(), LocalDate.now().plusDays(1), LocalDate.now().plusDays(2) }; + assertArrayEquals(excepted, planningFiltreur.getDates()); + } + + @Test + void test_PlanningFiltreur_par_groupe() { + PlanningFiltreur planningFiltreur = PlanningFiltreur.filtrer().par(Groupe.S1); + assertEquals(Groupe.S1, planningFiltreur.getGroupes()[0]); + } + + @Test + void test_PlanningFiltreur_par_plusieursGroupes() { + PlanningFiltreur planningFiltreur = PlanningFiltreur.filtrer().par(Groupe.S1, Groupe.S3, Groupe.S4); + Groupe[] excepted = { Groupe.S1, Groupe.S3, Groupe.S4 }; + assertArrayEquals(excepted, planningFiltreur.getGroupes()); + } + + @Test + void test_PlanningFiltreur_par_Professeur() { + Professeur professeur = new Professeur("Duipuis Jean"); + PlanningFiltreur planningFiltreur = PlanningFiltreur.filtrer().par(professeur); + assertEquals(professeur, planningFiltreur.getProfesseurs()[0]); + } + + @Test + void test_PlanningFiltreur_par_plusieursProfesseur() { + Professeur professeu1 = new Professeur("Duipuis Jean"); + Professeur professeur2 = new Professeur("Dupres Annie"); + Professeur professeur3 = new Professeur("Fanfonne Juan"); + PlanningFiltreur planningFiltreur = PlanningFiltreur.filtrer().par(professeu1, professeur2, professeur3); + Professeur[] excepted = { professeu1, professeur2, professeur3 }; + assertArrayEquals(excepted, planningFiltreur.getProfesseurs()); + } + + @Test + void test_Equals_contenueIdentiqueEtOrdreIdentique() { + PlanningFiltreur planningFiltreur1 = PlanningFiltreur.filtrer().par(Groupe.A1, Groupe.S2).par(LocalDate.now()); + PlanningFiltreur planningFiltreur2 = PlanningFiltreur.filtrer().par(Groupe.A1, Groupe.S2).par(LocalDate.now()); + assertEquals(planningFiltreur1, planningFiltreur2); + } + + @Test + void test_Equals_contenueIdentiqueEtOrdreGroupeDifferent() { + PlanningFiltreur planningFiltreur1 = PlanningFiltreur.filtrer().par(Groupe.A1, Groupe.S2).par(LocalDate.now()); + PlanningFiltreur planningFiltreur2 = PlanningFiltreur.filtrer().par(Groupe.S2, Groupe.A1).par(LocalDate.now()); + assertEquals(planningFiltreur1, planningFiltreur2); + } + + @Test + void test_HashCode_contenueIdentiqueEtOrdreGroupeDifferent() { + PlanningFiltreur planningFiltreur1 = PlanningFiltreur.filtrer().par(Groupe.A1, Groupe.S2).par(LocalDate.now()); + PlanningFiltreur planningFiltreur2 = PlanningFiltreur.filtrer().par(Groupe.S2, Groupe.A1).par(LocalDate.now()); + assertEquals(planningFiltreur1.hashCode(), planningFiltreur2.hashCode()); + } + + @Test + void test_Equals_contenueIdentiqueEtOrdreProfesseurDifferent() { + Professeur professeur1 = new Professeur("Dupuis Jean"); + Professeur professeur2 = new Professeur("Dupres Michel"); + + PlanningFiltreur planningFiltreur1 = PlanningFiltreur.filtrer().par(professeur1, professeur2) + .par(LocalDate.now()); + PlanningFiltreur planningFiltreur2 = PlanningFiltreur.filtrer().par(professeur2, professeur1) + .par(LocalDate.now()); + assertEquals(planningFiltreur1, planningFiltreur2); + } + + @Test + void test_HashCode_contenueIdentiqueEtOrdreProfesseurDifferent() { + Professeur professeur1 = new Professeur("Dupuis Jean"); + Professeur professeur2 = new Professeur("Dupres Michel"); + + PlanningFiltreur planningFiltreur1 = PlanningFiltreur.filtrer().par(professeur1, professeur2) + .par(LocalDate.now()); + PlanningFiltreur planningFiltreur2 = PlanningFiltreur.filtrer().par(professeur2, professeur1) + .par(LocalDate.now()); + assertEquals(planningFiltreur1.hashCode(), planningFiltreur2.hashCode()); + } + +} diff --git a/src/test/java/fr/umontp/edt/PlanningTest.java b/src/test/java/fr/umontp/edt/PlanningTest.java index 1de2879..e579c7e 100644 --- a/src/test/java/fr/umontp/edt/PlanningTest.java +++ b/src/test/java/fr/umontp/edt/PlanningTest.java @@ -25,13 +25,17 @@ class PlanningTest { private ArrayList coursEnsemble; - private Cours cours1 = new Cours(LocalDate.of(2021, 1, 20), new String[] { "prof" }, LocalTime.of(13, 30), + private Cours cours1 = new Cours(LocalDate.of(2021, 1, 20), + new Professeur[] { new Professeur("Dupuis Jean") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta1"); - private Cours cours2 = new Cours(LocalDate.of(2021, 1, 21), new String[] { "prof" }, LocalTime.of(14, 30), + private Cours cours2 = new Cours(LocalDate.of(2021, 1, 21), + new Professeur[] { new Professeur("Lemaire Marie") }, LocalTime.of(14, 30), LocalTime.of(15, 30), "K133", new Groupe[] { Groupe.S3 }, "Compta2"); - private Cours cours3 = new Cours(LocalDate.of(2021, 1, 21), new String[] { "prof" }, LocalTime.of(13, 30), + private Cours cours3 = new Cours(LocalDate.of(2021, 1, 21), + new Professeur[] { new Professeur("Roule Mathieu") }, LocalTime.of(13, 30), LocalTime.of(14, 30), "K133", new Groupe[] { Groupe.S2 }, "Compta3"); - private Cours cours4 = new Cours(LocalDate.of(2021, 1, 22), new String[] { "prof" }, LocalTime.of(11, 30), + private Cours cours4 = new Cours(LocalDate.of(2021, 1, 22), + new Professeur[] { new Professeur("Lebouche Alice") }, LocalTime.of(11, 30), LocalTime.of(12, 30), "K133", new Groupe[] { Groupe.S1 }, "Compta4"); @BeforeEach @@ -49,12 +53,23 @@ void test_getPlanningOf_date() { assertEquals(cours4, planning.getPlanningOf(cours4.getDate()).iterator().next()); } + @Test + void test_getPlanningOf_plusieursDate() { + assertEquals(2, planning.getPlanningOf(cours4.getDate(), cours1.getDate()).getCours().size()); + } + @Test void test_getPlanningOf_groupe_simpleGroupe() { Planning planningS3 = planning.getPlanningOf(Groupe.S3); assertEquals(cours2, planningS3.iterator().next()); } - + + @Test + void test_getPlanningOf_plusieursGroupe_simpleGroupe() { + Planning planningS3S2 = planning.getPlanningOf(Groupe.S3, Groupe.S2); + assertEquals(2, planningS3S2.getCours().size()); + } + @Test void test_getPlanningOf_groupe_groupeCompose() { Planning planningA1 = planning.getPlanningOf(Groupe.A1); @@ -63,7 +78,8 @@ void test_getPlanningOf_groupe_groupeCompose() { @Test void test_getPlanningOf_sousGroupeDeA1_doitRetournerLeCoursA1() { - coursEnsemble.add(new Cours(LocalDate.of(2021, 1, 21), new String[] { "prof" }, LocalTime.of(14, 30), + coursEnsemble.add(new Cours(LocalDate.of(2021, 1, 21), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(14, 30), LocalTime.of(15, 30), "K133", new Groupe[] { Groupe.A1 }, "Compta4")); planning = new Planning(coursEnsemble); assertEquals(1, planning.getPlanningOf(Groupe.S4).getCours().size()); @@ -84,14 +100,22 @@ void test_getPlanningOf_date_and_groupe() { @Test void test_constructeur_Planning_casPlusieursCoursCommenceEnMemeTemps_neDoitSupprimerAucunCours() { - coursEnsemble.add(new Cours(LocalDate.of(2021, 1, 21), new String[] { "prof" }, LocalTime.of(14, 30), + coursEnsemble.add(new Cours(LocalDate.of(2021, 1, 21), + new Professeur[] { new Professeur("prof prof") }, LocalTime.of(14, 30), LocalTime.of(15, 30), "K133", new Groupe[] { Groupe.S4 }, "Compta4")); planning = new Planning(coursEnsemble); assertEquals(coursEnsemble.size(), planning.getCours().size()); } @Test - void test_getPlanningOf_groupe_doitRetournerPlusieursGroupe() { + void test_getPlanningOf_groupe_viaComponentCalendar_doitRetournerPlusieursGroupe() { + Planning planning = createPlanningViaComponent(); + + assertTrue(planning.getPlanningOf(Groupe.A1).iterator().hasNext()); + assertTrue(planning.getPlanningOf(Groupe.A2).iterator().hasNext()); + } + + private Planning createPlanningViaComponent() { Component component; DateTime startTime, endTime; try { @@ -104,15 +128,66 @@ void test_getPlanningOf_groupe_doitRetournerPlusieursGroupe() { } component = new VEvent(startTime, endTime, "intitule"); component.getProperties().add(new Description( - "\n\nA2-Semestre-3 A1\nBELMECHERI NASSIM\nHAETTEL THOMAS\nLA XUAN HOANG\nCHIROUZE ANNE\nA valider\n(ExportĂ© le:18/01/2021 10:51)\n")); + "\n\nA2-Semestre-3 A1\nBELMECHERI NASSIM\nHAETTEL THOMAS\nLebouche Alice\nLA XUAN HOANG\nCHIROUZE ANNE\nA valider\n(ExportĂ© le:18/01/2021 10:51)\n")); component.getProperties().add(new Location("K133")); Cours cours = new Cours(component); ArrayList coursList = new ArrayList<>(); coursList.add(cours); Planning planning = new Planning(coursList); + return planning; + } - assertTrue(planning.getPlanningOf(Groupe.A1).iterator().hasNext()); - assertTrue(planning.getPlanningOf(Groupe.A2).iterator().hasNext()); + @Test + void test_getPlanningOf_professeur_retournUnCours() { + Planning planning = createPlanningViaComponent(); + Planning planningAlice = planning.getPlanningOf(RepertoireProfesseur.get("LEBOUCHE", "Alice")); + assertTrue(planningAlice.iterator().hasNext()); + } + + @Test + void test_getPlanningOf_plusieurProfesseurs_retournUnCours() { + Planning planning = createPlanningViaComponent(); + Planning planningAlice = planning.getPlanningOf(RepertoireProfesseur.get("LEBOUCHE", "Alice"), + RepertoireProfesseur.get("BELMECHERI", "NASSIM")); + assertEquals(1, planningAlice.getCours().size()); + } + + @Test + void test_getPlanningOf_PlanningFiltreur_parDate() { + assertEquals(cours4, planning.getPlanningOf(PlanningFiltreur.filtrer().par(cours4.getDate())).iterator() + .next()); + } + + @Test + void test_getPlanningOf_PlanningFiltreur_parGroupe() { + assertEquals(cours2, planning.getPlanningOf(PlanningFiltreur.filtrer().par(cours2.getGroupes())) + .iterator().next()); + } + + @Test + void test_getPlanningOf_PlanningFiltreur_parProfesseur() { + assertEquals(cours2, planning.getPlanningOf(PlanningFiltreur.filtrer().par(cours2.getProfesseurs())) + .iterator().next()); } + @Test + void test_getPlanningOf_PlanningFiltreur_parDateEtGroupe() { + assertEquals(1, planning.getPlanningOf( + PlanningFiltreur.filtrer().par(LocalDate.of(2021, 1, 21)).par(cours2.getGroupes())) + .getCours().size()); + } + + @Test + void test_getPlanningOf_PlanningFiltreur_parDateEtProfesseur() { + assertEquals(1, planning.getPlanningOf( + PlanningFiltreur.filtrer().par(LocalDate.of(2021, 1, 21)).par(cours2.getProfesseurs())) + .getCours().size()); + } + + @Test + void test_getPlanningOf_PlanningFiltreur_parGroupeEtProfesseur() { + assertEquals(1, planning + .getPlanningOf(PlanningFiltreur.filtrer().par(Groupe.S1).par(cours4.getProfesseurs())) + .getCours().size()); + } } diff --git a/src/test/java/fr/umontp/edt/ProfesseurTest.java b/src/test/java/fr/umontp/edt/ProfesseurTest.java new file mode 100644 index 0000000..dfb4aed --- /dev/null +++ b/src/test/java/fr/umontp/edt/ProfesseurTest.java @@ -0,0 +1,23 @@ +package fr.umontp.edt; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +class ProfesseurTest { + + @Test + void testConstructeur_UnStrings_prenomNomCombine() { + Professeur professeur = new Professeur("Dupuis Jean"); + assertEquals("Dupuis", professeur.getNom()); + assertEquals("Jean", professeur.getPrenom()); + } + + @Test + void testEquals_deuxProfesseursIdentiqueAvecConstructeurDifferent_avecDifferenceMajuscule() { + Professeur professeur1 = new Professeur("DUpuis JeAN"); + Professeur professeur2 = new Professeur("DupUis JEan"); + assertEquals(professeur1, professeur2); + } + +} diff --git a/src/test/java/fr/umontp/edt/RepertoireProfesseurTest.java b/src/test/java/fr/umontp/edt/RepertoireProfesseurTest.java new file mode 100644 index 0000000..77b2cc6 --- /dev/null +++ b/src/test/java/fr/umontp/edt/RepertoireProfesseurTest.java @@ -0,0 +1,47 @@ +package fr.umontp.edt; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; + +import org.junit.jupiter.api.Test; + +class RepertoireProfesseurTest { + + @Test + void test_getProfesseurDepuisDescription_DoitTrouverTousLesProfesseurs() { + String description = "\n\nA2-Semestre-3\nBELMECHERI NASSIM\nHAETTEL THOMAS\nLA XUAN HOANG\nCHIROUZE ANNE\nA valider\n(ExportĂ© le:18/01/2021 10:51)\n"; + Professeur[] expected = { new Professeur("BELMECHERI NASSIM"), new Professeur("HAETTEL THOMAS"), + new Professeur("LA XUAN HOANG"), new Professeur("CHIROUZE ANNE") }; + assertArrayEquals(expected, + RepertoireProfesseur.getProfesseurDepuisDescriptionEtAjouterSiNonPresent(description)); + } + + @Test + void test_get_avecDescription_doitRetournerUnProfesseur() { + String description = "\n\nA2-Semestre-3\nBELMECHERI NASSIM\nHAETTEL THOMAS\nLA XUAN HOANG\nDUPUIS JEAN JEAN\nCHIROUZE ANNE\nA valider\n(ExportĂ© le:18/01/2021 10:51)\n"; + RepertoireProfesseur.getProfesseurDepuisDescriptionEtAjouterSiNonPresent(description); + assertNotNull(RepertoireProfesseur.get("Dupuis", "JEAN-JEAN")); + } + + @Test + void test_get_avecDescription_doiventAvoirLaMemeAdresse() { + String description = "\n\nA2-Semestre-3\nDUPUIS JEAN JEAN\nA valider\n(ExportĂ© le:18/01/2021 10:51)\n"; + Professeur excepted = RepertoireProfesseur.getProfesseurDepuisDescriptionEtAjouterSiNonPresent(description)[0]; + assertSame(excepted, RepertoireProfesseur.get("Dupuis", "JEAN-JEAN")); + } + + @Test + void test_getProfesseurDepuisDescription_testLaXuanHuang_doitTrouverLeBonProfesseur() { + String description = "\n\nA2-Semestre-3\nBELMECHERI NASSIM\nHAETTEL THOMAS\nLA XUAN HOANG\nCHIROUZE ANNE\nA valider\n(ExportĂ© le:18/01/2021 10:51)\n"; + RepertoireProfesseur.getProfesseurDepuisDescriptionEtAjouterSiNonPresent(description); + assertNotNull(RepertoireProfesseur.get("LA", "Xuan-Hoang")); + } + + @Test + void test_get_avecDescriptionContenantDesCaracteresSpeciaux() { + String description = "\n\nA2-Semestre-3\nDUPÛIS JEAN-JEAN\nA valider\n(ExportĂ© le:18/01/2021 10:51)\n"; + RepertoireProfesseur.getProfesseurDepuisDescriptionEtAjouterSiNonPresent(description); + assertNotNull(RepertoireProfesseur.get("DupĂ»is", "JEAN-JEAN")); + } +}