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);
}