using MaBibli.Shared.Isbn; namespace MaBibli.Tests; /// /// Découpage des ISBN pour l'affichage. /// /// /// Les valeurs attendues ci-dessous ne sont pas devinées : elles ont été calculées à partir du /// RangeMessage.xml officiel de l'agence internationale (version du 2026-08-18), qui est /// aussi la source des tables embarquées. /// public class FormatageIsbnTests { /// /// Le fonds francophone est découpé en entier, éditeur compris. /// [Theory] [InlineData("9782846391009", "978-2-84639-100-9")] // le cas remonté en usage [InlineData("9782070612758", "978-2-07-061275-8")] // Gallimard : éditeur sur 2 chiffres [InlineData("9782253004226", "978-2-253-00422-6")] // Livre de poche : 3 chiffres [InlineData("9782080704092", "978-2-08-070409-2")] // Flammarion : 2 chiffres public void Decoupe_entierement_le_francophone(string nu, string attendu) => Assert.Equal(attendu, FormatageIsbn.Afficher(nu)); /// /// Un ISBN-10 est un ISBN-13 en 978 amputé de son préfixe : mêmes tranches, /// une frontière de moins. /// [Theory] [InlineData("2253004227", "2-253-00422-7")] [InlineData("2080704095", "2-08-070409-5")] public void Decoupe_aussi_les_ISBN10(string nu, string attendu) => Assert.Equal(attendu, FormatageIsbn.Afficher(nu)); /// /// Hors du francophone, on s'arrête au groupe et à la clé : deux frontières toujours /// exactes. Le vrai découpage est 978-0-262-03384-8 — on ne l'invente pas, on /// affiche une tranche de moins. Une coupure absente se lit encore, une coupure fausse trompe. /// [Theory] [InlineData("9780262033848", "978-0-26203384-8")] [InlineData("0262033844", "0-26203384-4")] public void Ne_devine_pas_lediteur_hors_du_francophone(string nu, string attendu) => Assert.Equal(attendu, FormatageIsbn.Afficher(nu)); /// /// Ce qui n'est pas un ISBN valide ressort tel quel : un code mal saisi doit se voir /// mal saisi, pas déguisé en ISBN par des tirets. /// [Theory] [InlineData("9782846391008")] // clé fausse [InlineData("978284639100")] // trop court [InlineData("9772466671438")] // périodique : préfixe 977, aucun ISBN à découper [InlineData("pas un isbn")] public void Laisse_intact_ce_qui_nest_pas_un_ISBN(string brut) => Assert.Equal(brut, FormatageIsbn.Afficher(brut)); [Theory] [InlineData(null)] [InlineData("")] [InlineData(" ")] public void Vide_reste_vide(string? brut) => Assert.Equal(string.Empty, FormatageIsbn.Afficher(brut)); /// /// Un ISBN déjà découpé — recopié d'une page web, par exemple — se redécoupe à l'identique /// plutôt que de cumuler les tirets. /// [Fact] public void Est_idempotent() { var une = FormatageIsbn.Afficher("9782846391009"); Assert.Equal(une, FormatageIsbn.Afficher(une)); } /// /// ⚠️ Le contrat central : la valeur stockée reste nue. Ces tirets sont un habillage, /// et la BnF indexe l'ISBN sans eux — les laisser filer dans une requête casserait le lookup. /// [Fact] public void Le_decoupage_se_defait_par_Normaliser() => Assert.Equal( "9782846391009", IsbnUtils.Normaliser(FormatageIsbn.Afficher("9782846391009"))); }