On veut écrire un service web qui indique comment rendre la monnaie sur une somme. Notre service est interrogé par des automates (par exemple, des caisses automatiques) chaque fois qu’ils ont une somme à rendre, afin de connaître le nombre de billets et pièces à rendre. Les sommes sont toujours entières, sans centimes. Notre service doit indiquer la monnaie optimale (par exemple, 1 billet de 10 au lieu de 5 pièces de 2).
Chaque automate a un nom de modèle, qui définit ses caractéristiques et notamment les billets et pièces auxquels il a accès. Les modèles supportés actuellement sont :
- le modèle
mk1
, qui n'a accès qu'aux pièces de 1 ; - le modèle
mk2
, qui n’a accès qu’aux billets de 10, billets de 5 et pièces de 2.
On souhaite que notre application puisse être étendue facilement pour supporter d'autres modèles futurs avec des caractéristiques complètement différentes (par exemple, un automate dont le fonctionnement est décrit par une base de données, ou par une API externe...).
Vous devez écrire une API qui puisse être interrogée par les automates pour déterminer la monnaie à rendre.
- Écrire deux classes
Mk1Calculator
etMk2Calculator
qui implémententAppBundle\Calculator\CalculatorInterface
pour les modèles d'automatesmk1
etmk2
. Les classes doivent passer les tests unitaires danstests/
(executés avecvendor/bin/phpunit
). Ajouter un testMk2CalculatorTest::testGetChangeHard
. - Écrire une classe
CalculatorRegistry
qui implémenteAppBundle\Registry\CalculatorRegistryInterface
. - Écrire le controlleur en utilisant le service
CalculatorRegistry
. Le controlleur doit passer le test fonctionnel dansfeatures/change.feature
(executé avecvendor/bin/behat
).
Le projet peut être installé avec make install
. Vous pouvez utiliser les autres actions du fichier Makefile
pour valider votre solution.
- Utilisez ce dépôt git comme template pour créer votre propre copie publique (bouton "Use this template").
- Mettez à jour votre dépôt avec votre réponse au test dans la branche
master
. - Envoyez-nous l'URL de votre dépôt.
- L'exécution des tests : assurez-vous que le projet peut être installé et que les tests tournent.
- La justesse des algorithmes : le problème est peut-être plus complexe que ce que vous pensez.
- La lisibilité du code : toujours important pour permettre les revues de code et la maintenance.
- La maîtrise de Symfony : il y a de nombreuses manières de répondre aux questions, mais certaines sont meilleures que d'autres.