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")); /// /// La ligature « œ » est ramenée à « oe » — corrigé le 2026-08-19. /// /// /// Le comportement vient de et non d'ici : la décomposition /// NFD sépare les accents mais laisse les ligatures intactes, d'où une table explicite. /// Sans elle, L'Œuvre de Zola — que la BnF écrit avec la ligature — restait /// introuvable à qui tape « oeuvre » au clavier, et n'était pas grisé dans sa bibliographie. /// [Fact] public void Reduit_la_ligature_oe() => Assert.Equal(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")); }