Sujet Easymow
Documentation du Projet
Elaad FURREEDAN
Master 2 - Logiciel
UPEM - 2018/2019
Gérer le déplacement de tondeuse à gazon sur un terrain cadrillé via une liste de commande prédéfinie dans un ficher qui décrit les positions initiales, les déplacements et les directions. Le projet indique la position finale et initiale de chaque tondeuse et log les évenements comme par exemple la collision avec une autre tondeuse à gazon ou un mur.
Les erreurs de syntaxes du fichier de description des commandes seront détectées et loggées.
lancer le programme :
sbt run
lancer les tests :
sbt test
lancer les tests avec coverage :
clean coverage test coverageReport
Une fois le programme lancé, il vous demandera de sélectionner un fichier, un fichier d'exemple est founit et se situe dans
src/main/resources/input
Le programme vous afichera la nouvelle position de chaque tondeuse valide
Exemple :
$ sbt run
> Select a file : src/main/resources/input
[RESULT] 2019-01-02 21:29:31.840 [main] Easymow$ - (0, 5, West) => (1, 5, North)
[RESULT] 2019-01-02 21:29:31.840 [main] Easymow$ - (2, 5, West) => (2, 5, West)
[RESULT] 2019-01-02 21:29:31.840 [main] Easymow$ - (4, 1, East) => (5, 1, East)
- Dans le programme une tondeuse est considérée valide lorsque :
- est bien à l'intérieur du terrain
- si elle ne possède pas la même position avec une autre tondeuse
- Chaque tondeuse est positionnée dès le début si elles respectent les règles précédentes
- Si une tondeuse rencontre un obstacle (mur ou tondeuse) elle ignorera alors l'action et passera à la suivante
- Les cases du terrain sont numérotées à partir de 0, donc "5 5" permet de créer un terrain de taille 6 par 6 (36 cases)
Syntaxe :
- Terrain :
[\t ]*(\d+)[\t ]+(\d+)[\t ]*
- Tondeuse :
^[\t ]*(\d+)[\t ]+(\d+)[\t ]+([newsNEWS]{1})[\t ]*$
- Instructions :
[agdAGD]+
Le programme utilise l'API log4j afin de gérer le système de logger
A chaque execution du programme, un fichier de log retrace alors en détail chaque execution avec les étapes
Ce fichier ce situe dans logs/record.log
il retrace chaque execution du programme et contient tous les niveaux de logs.
Le projet afficher 4 niveaux de logs actuellement:
Code | Int level |
---|---|
RESULT | 450 |
INFO | 400 |
WARN | 300 |
ERROR | 200 |
Note: RESULT est un custom log afin d'afficher les résultats liés au déplacement de tondeuse
le fichier de configuration log4j2.xml permet de décrire ce qui est affiché ou non sur la console, ce qui est
redirigé vers le fichier logs/record.log
ansi que le format des logs.
[RESULT] 2019-01-02 21:29:31.840 [main] Easymow$ - (0, 5, West) => (1, 5, North)
Note: Seuls les logs RESULT et ERROR sont affichés sur la console (
stdout
etstderr
respectivement)
Création du terrain avec ses dimensions
[INFO ] 2019-01-05 19:44:12.987 [main] Log$ - Field : length : 6, width : 6
Etat d'avancement de la tondeuse, coordonnées, direction et instructions
[INFO ] 2019-01-02 21:29:31.838 [main] Easymow$ - Position : (0, 5, West) Instructions : DAADAGA
Regroupe les informations non dangeureuses pour la vie du programme
Exemples:
Un véhicule est hors des limites du terrain
[WARN ] 2019-01-02 21:29:31.827 [main] Easymow$ - Location (87,2) is out of bound: vehicles ignored
Lorsque plusieurs tondeuses veulent être positionnées à la même coordonnée sur le terrain, elles sont donc non prises en compte
[WARN ] 2019-01-02 21:29:31.832 [main] Easymow$ - Conflict between two vehicles location at (2,1): vehicles ignored
Lorsqu'une tondeuse essaye d'avancer alors qu'elle fait face à un mur
[WARN ] 2019-01-02 21:29:31.839 [main] Easymow$ - Vehicle hit a wall at (0,5): instruction ignored
Lorsqu'une tondeuse essaye d'avancer dans la direction d'une autre tondeuse
[WARN ] 2019-01-02 21:29:31.839 [main] Easymow$ - Vehicle hit another vehicle at (1,5): instruction ignored
Les erreurs qui empêchent le bon fonctionnement du programme, et donc qui ne peut pas continuer de fonctionner
Exemples:
Lorsque le format d'initialisation du terrain n'est pas valide
[ERROR] 2019-01-02 21:40:43.355 [main] Easymow$ - Field size definition 5 is incorrect
Lorsque l'ouverture du fichier n'a pas fonctionné
[ERROR] 2019-01-02 22:00:45.102 [main] Easymow$ - Read File failed : java.io.FileNotFoundException: fe (Aucun fichier ou dossier de ce type)
Note: Les ERROR sont afichées sur
stderr
sur la console et aussi enregistré dans le fichier de log
Afin d'afiner mes tests j'ai essayé d'utiliser l'api Mockito afin de tester que mes logger fonctionnaient bien. Malheureusement je ne suis pas arrivé à mes fins, en effet ma démarche était de surcharger la variable logger afin d'y placer un mock, mais comme mon objet Log contient des surcharge et des typeclass je ne n'ai pas réussi à instancier un objet Log afin de surcharger logger et ansi pouver tester le fonctionnement de mes logs. C'est pourquoi le coverage est faible.
Dû au charactère immuable du langage, il n'est pas naturel d'ajouter des element dans une liste puis de la renvoyer. Pour cela il est necessaire d'utiliser des méthodes récursives afin de modifier ma liste et ansi la garder à jour au sein d'une méthode.