using MaBibli.Shared.Textes; namespace MaBibli.Tests; /// /// Clé d'œuvre : ce qu'elle réunit, et surtout ce qu'elle rate. /// /// /// Les cas d'échec sont testés au même titre que les réussites : ils documentent la limite du /// rapprochement, que l'interface annonce à l'utilisateur. Si l'un d'eux se met à passer un /// jour, c'est que la règle a changé — et le message affiché doit changer avec. /// public class CleOeuvreTests { [Theory] // Les trois formes rencontrées pour un même roman de Werber. [InlineData("Les thanatonautes", "Les thanatonautes : roman")] [InlineData("Les thanatonautes", "Les thanatonautes / Bernard Werber")] [InlineData("Les thanatonautes : roman", "Les thanatonautes / Bernard Werber")] // Casse et accents, comme partout ailleurs dans le projet. [InlineData("Germinal", "GERMINAL")] public void Reunit_les_variantes_d_un_meme_titre(string a, string b) => Assert.Equal(CleOeuvre.Cle(a), CleOeuvre.Cle(b)); [Theory] [InlineData("Germinal", "La bête humaine")] // Un tome n'est pas rapproché de l'œuvre entière : le point n'est pas coupé. [InlineData("Troisième humanité", "Troisième humanité. Tome 1")] public void Distingue_deux_oeuvres_differentes(string a, string b) => Assert.NotEqual(CleOeuvre.Cle(a), CleOeuvre.Cle(b)); /// /// Limite assumée : deux œuvres distinctes partageant leur titre principal se confondent. /// Le risque est borné, la comparaison n'ayant lieu qu'à auteur donné. /// [Fact] public void Confond_deux_oeuvres_partageant_le_titre_principal() => Assert.Equal( CleOeuvre.Cle("Nouvelles : premier recueil"), CleOeuvre.Cle("Nouvelles : second recueil")); /// /// Limite héritée de , pas propre à la clé d'œuvre : /// la ligature « œ » n'est pas ramenée à « oe ». /// /// /// NormalisationTexte décompose en NFD, qui sépare les accents mais laisse les /// ligatures intactes — seul NFKD les défait. Conséquence concrète : L'Œuvre de Zola, /// que la BnF écrit avec la ligature, n'est pas rapproché d'un « L'oeuvre » saisi au clavier. /// /// Le défaut ne vient pas d'ici et ne se corrige pas ici : la même fonction alimente la /// recherche du catalogue et la clé unique des auteurs, et en changer déplacerait ces deux /// invariants. Consigné dans IDEES.md ; ce test existe pour que la limite soit visible plutôt /// que découverte en usage. /// /// [Fact] public void Ne_reduit_pas_la_ligature_oe() => Assert.NotEqual(CleOeuvre.Cle("L'Œuvre"), CleOeuvre.Cle("L'oeuvre")); /// /// Limite assumée : un titre retraduit n'est pas rapproché du tout. /// [Fact] public void Ne_rapproche_pas_un_titre_retraduit() => Assert.NotEqual(CleOeuvre.Cle("Le Seigneur des anneaux"), CleOeuvre.Cle("The Lord of the Rings")); [Theory] [InlineData(null)] [InlineData("")] [InlineData(" ")] public void Rend_une_cle_vide_pour_une_saisie_vide(string? titre) => Assert.Equal(string.Empty, CleOeuvre.Cle(titre)); /// /// Un titre réduit à son seul sous-titre ne doit pas produire une clé vide : elle se /// confondrait avec toutes les autres clés vides. /// [Fact] public void Ne_vide_pas_un_titre_qui_commence_par_le_separateur() => Assert.NotEqual(string.Empty, CleOeuvre.Cle(": roman")); }