using MaBibli.Api.Services.Isbn; namespace MaBibli.Tests; public class NettoyageIsbdTests { [Theory] [InlineData("Germinal / Émile Zola ; préface d'Armand Lanoux", "Germinal")] [InlineData("Germinal / Émile Zola ; préf., dossier et notes par Colette Becker", "Germinal")] [InlineData("Le Horla / Guy de Maupassant", "Le Horla")] public void Titre_coupe_a_la_mention_de_responsabilite(string brut, string attendu) => Assert.Equal(attendu, NettoyageIsbd.Titre(brut)); [Theory] [InlineData("Germinal", "Germinal")] [InlineData("Le Petit Prince", "Le Petit Prince")] [InlineData("Introduction to Algorithms", "Introduction to Algorithms")] // Le sous-titre ISBD (« : ») n'est pas de la ponctuation à retirer : on le garde. [InlineData("Voyage au bout de la nuit : roman", "Voyage au bout de la nuit : roman")] // Un « / » sans espaces autour appartient au titre, il ne doit pas servir de coupure. [InlineData("Entrée/sortie", "Entrée/sortie")] public void Titre_laisse_passer_ce_qui_est_deja_propre(string brut, string attendu) => Assert.Equal(attendu, NettoyageIsbd.Titre(brut)); [Theory] [InlineData("Zola, Émile (1840-1902). Auteur du texte", "Émile Zola")] [InlineData("Saint-Exupéry, Antoine de (1900-1944). Auteur du texte", "Antoine de Saint-Exupéry")] [InlineData("Maupassant, Guy de (1850-1893). Auteur du texte", "Guy de Maupassant")] [InlineData("Becker, Colette (1932-....). Éditeur scientifique", "Colette Becker")] [InlineData("Zola, Émile (1840-1902)", "Émile Zola")] [InlineData("Zola, Émile. Auteur du texte", "Émile Zola")] public void Auteur_retire_dates_et_role_puis_inverse(string brut, string attendu) => Assert.Equal(attendu, NettoyageIsbd.Auteur(brut)); [Theory] [InlineData("Émile Zola", "Émile Zola")] [InlineData("Antoine de Saint-Exupéry", "Antoine de Saint-Exupéry")] [InlineData("Molière", "Molière")] public void Auteur_laisse_passer_ce_qui_est_deja_propre(string brut, string attendu) => Assert.Equal(attendu, NettoyageIsbd.Auteur(brut)); [Fact] public void Auteur_ne_coupe_pas_sur_une_initiale() { // « H. » est une initiale, pas un séparateur de rôle : la couper amputerait le prénom. Assert.Equal("Thomas H. Cormen", NettoyageIsbd.Auteur("Cormen, Thomas H.")); } [Theory] [InlineData("le Livre de poche (Paris)", "le Livre de poche")] [InlineData("Librairie générale française (Paris)", "Librairie générale française")] [InlineData("Gallimard (Paris)", "Gallimard")] public void Editeur_retire_la_ville_finale(string brut, string attendu) => Assert.Equal(attendu, NettoyageIsbd.Editeur(brut)); [Theory] [InlineData("Gallimard", "Gallimard")] [InlineData("The MIT Press", "The MIT Press")] // Parenthèses en milieu de chaîne : ce n'est pas la ville, on n'y touche pas. [InlineData("Presses (universitaires) de France", "Presses (universitaires) de France")] public void Editeur_laisse_passer_ce_qui_est_deja_propre(string brut, string attendu) => Assert.Equal(attendu, NettoyageIsbd.Editeur(brut)); [Theory] [InlineData(null)] [InlineData("")] [InlineData(" ")] public void Champs_vides_donnent_null(string? brut) { Assert.Null(NettoyageIsbd.Titre(brut)); Assert.Null(NettoyageIsbd.Auteur(brut)); Assert.Null(NettoyageIsbd.Editeur(brut)); } }