Gorm pose les questions

Exercice 3 sur 6 du chapitre 11 · 270 XP · 5 objectifs vérifiés par des tests

Notions abordées : Mode interactif#[Ask]#[Interact]$io->choice()$io->confirm()--no-interaction

Gorm veut, lui aussi, ajouter des plats en ligne de commande. Mais il ne se souvient jamais de l'ordre des arguments, ni du nom exact des catégories. Il voudrait taper app:plat:ajouter, tout court, et que la commande lui pose les questions.

Le mode interactif

Une commande tournée vers un humain peut demander ce qui lui manque :

La même commande doit rester utilisable par un script. Avec --no-interaction (-n), aucune question n'est posée, et la valeur par défaut des confirmations s'applique.

Votre mission

Rendez app:plat:ajouter interactive :

  1. sans arguments, elle demande « Le nom du plat ? », « Son prix, en pièces d'or ? », puis « Dans quelle catégorie ? », à choisir dans la liste de la carte ;
  2. une réponse hors de la liste est refusée, et la question reposée ;
  3. avant d'écrire, elle demande « Ajouter « Tarte aux mûres » (4,50 po, Desserts) à la carte ? ». Si Gorm répond non : « Rien n'a été ajouté. », et rien n'est enregistré ;
  4. ce qui est déjà donné en argument ou en option n'est pas redemandé ;
  5. un prix qui n'est pas un nombre est refusé (« Le prix est un nombre… ») ; « 4,5 » avec une virgule est accepté.

Dans la console de l'aperçu

La console du navigateur tourne comme un script, sans personne pour répondre : elle ne pose jamais de questions. Essayez-y le mode non interactif, avec tous les arguments. Ce sont les tests qui répondent aux questions, avec CommandTester::setInputs(), exactement comme on teste une commande interactive dans un vrai projet.