using MaBibli.Shared.Dtos; using MaBibli.Shared.Entites; namespace MaBibli.Tests; /// /// La vue « une seule ligne » du champ des auteurs se relie à chaque frappe : elle /// reconstruit la liste entière à chaque caractère tapé. /// /// /// ⚠️ Sans reprise des rôles déjà choisis, corriger une faute de frappe dans le champ des noms /// remettrait tous les rôles à « non précisé » sous les yeux de l'utilisateur. Le lot Q remonte /// les rôles juste après les auteurs dans le formulaire, ce qui rend la perte d'autant plus /// visible : ces tests verrouillent l'invariant que le réordonnancement ne doit pas entamer. /// public class EnregistrementLivreTests { [Fact] public void Une_frappe_dans_le_champ_des_noms_preserve_les_roles() { var saisie = new EnregistrementLivre { Auteur = "Dobbs ; Christophe Regnault" }; saisie.Auteurs[0] = saisie.Auteurs[0] with { Role = RoleAuteur.Scenario }; saisie.Auteurs[1] = saisie.Auteurs[1] with { Role = RoleAuteur.Dessin }; // L'utilisateur ajoute un troisième auteur : le champ entier est relu. saisie.Auteur = "Dobbs ; Christophe Regnault ; Marie Coloriste"; Assert.Equal(RoleAuteur.Scenario, saisie.Auteurs[0].Role); Assert.Equal(RoleAuteur.Dessin, saisie.Auteurs[1].Role); Assert.Equal(RoleAuteur.NonPrecise, saisie.Auteurs[2].Role); } /// Le rapprochement se fait sur la forme normalisée : un accent ajouté après coup /// ne doit pas coûter son rôle à l'auteur. [Fact] public void Un_accent_ajoute_apres_coup_ne_perd_pas_le_role() { var saisie = new EnregistrementLivre { Auteur = "Dobbs ; Christophe Regnault" }; saisie.Auteurs[1] = saisie.Auteurs[1] with { Role = RoleAuteur.Dessin }; saisie.Auteur = "Dobbs ; Christophé Regnault"; Assert.Equal(RoleAuteur.Dessin, saisie.Auteurs[1].Role); } /// Un nom réellement différent repart à zéro : on ne devine pas que c'est la même /// personne. [Fact] public void Un_nom_different_repart_sans_role() { var saisie = new EnregistrementLivre { Auteur = "Dobbs ; Christophe Regnault" }; saisie.Auteurs[1] = saisie.Auteurs[1] with { Role = RoleAuteur.Dessin }; saisie.Auteur = "Dobbs ; Jean Dupont"; Assert.Equal(RoleAuteur.NonPrecise, saisie.Auteurs[1].Role); } /// /// Les rôles ne s'affichent qu'à partir de deux auteurs (règle actée, inchangée par le lot Q) : /// c'est le nombre d'auteurs qui commande, pas le type de document. /// [Theory] [InlineData("Émile Zola", 1)] [InlineData("Dobbs ; Christophe Regnault", 2)] [InlineData(" ; Dobbs ; ; ", 1)] [InlineData("", 0)] public void Le_nombre_dauteurs_est_celui_des_entrees_non_vides(string ligne, int attendu) => Assert.Equal(attendu, new EnregistrementLivre { Auteur = ligne }.Auteurs.Count); /// Le type de document reste « non précisé » tant que personne ne l'a choisi — le /// lot Q remonte le champ, il ne le préremplit pas. [Fact] public void Le_type_de_document_ne_pretend_rien_par_defaut() => Assert.Equal(TypeDocument.NonPrecise, new EnregistrementLivre().TypeDocument); /// Le format, lui, DOIT rester physique par défaut : dans les listes, l'absence /// d'étiquette signifie « physique ». [Fact] public void Le_format_reste_physique_par_defaut() => Assert.Equal(Format.Physique, new EnregistrementLivre().Format); }