Cas mesure, ISBN 9782749942636 : dc:title = "Le plus grand defi ... (Nouvelle ed. augmentee) Aurélien Barrau" dc:creator = "Barrau, Aurélien (1973-....). Auteur du texte" Le nom est recolle en fin de titre sans le separateur ISBD « / », donc la regle de nettoyage existante ne peut rien y faire : la notice est sale a la source. L'heuristique est volontairement stricte — comparaison en fin de chaine uniquement, contre un auteur deja nettoye, et seulement si le nom commence sur une frontiere de mot. « Lettre a Émile Zola » n'est pas touche, et un titre qui EST le nom de l'auteur (biographie, recueil) est laisse intact plutot que reduit a rien. La comparaison passe par CompareOptions.IgnoreNonSpace plutot que par une normalisation NFD : elle ignore les accents sans changer les longueurs, donc les indices calcules restent valables sur la chaine d'origine. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
121 lines
5.6 KiB
C#
121 lines
5.6 KiB
C#
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));
|
|
|
|
/// <summary>
|
|
/// Cas réel mesuré sur l'ISBN <c>9782749942636</c> : la BnF recolle le nom de l'auteur en
|
|
/// fin de titre <b>sans</b> le séparateur ISBD, ce que <see cref="NettoyageIsbd.Titre"/> ne
|
|
/// peut donc pas voir.
|
|
/// </summary>
|
|
[Fact]
|
|
public void Titre_retire_le_nom_de_lauteur_colle_en_fin()
|
|
{
|
|
const string brut = "Le plus grand défi de l'histoire de l'humanité : face à la "
|
|
+ "catastrophe écologique et sociale (Nouvelle éd. augmentée) Aurélien Barrau";
|
|
|
|
var titre = NettoyageIsbd.RetirerAuteurEnFin(brut, ["Aurélien Barrau"]);
|
|
|
|
Assert.Equal(
|
|
"Le plus grand défi de l'histoire de l'humanité : face à la catastrophe écologique "
|
|
+ "et sociale (Nouvelle éd. augmentée)",
|
|
titre);
|
|
}
|
|
|
|
[Theory]
|
|
// Contre-exemple central : le nom est bien là, mais pas en fin de chaîne. On n'y touche pas.
|
|
[InlineData("Lettre à Émile Zola", "Guy de Maupassant")]
|
|
[InlineData("Émile Zola et son temps", "Émile Zola")]
|
|
// Le titre EST le nom de l'auteur (biographie, recueil) : le retirer ne laisserait rien.
|
|
[InlineData("Aurélien Barrau", "Aurélien Barrau")]
|
|
// Fin de mot fortuite : « Zola » ne doit pas être découpé dans « Gorgonzola ».
|
|
[InlineData("Éloge du gorgonzola", "Zola")]
|
|
// Auteur inconnu du titre.
|
|
[InlineData("Germinal", "Émile Zola")]
|
|
public void Titre_ne_mutile_pas_un_nom_legitime(string titre, string auteur)
|
|
=> Assert.Equal(titre, NettoyageIsbd.RetirerAuteurEnFin(titre, [auteur]));
|
|
|
|
[Fact]
|
|
public void Titre_tolere_une_difference_daccent_ou_de_casse_sur_le_nom()
|
|
=> Assert.Equal(
|
|
"Le grand défi",
|
|
NettoyageIsbd.RetirerAuteurEnFin("Le grand défi AURELIEN BARRAU", ["Aurélien Barrau"]));
|
|
|
|
[Fact]
|
|
public void Titre_sans_auteur_connu_reste_intact()
|
|
{
|
|
Assert.Equal("Germinal", NettoyageIsbd.RetirerAuteurEnFin("Germinal", []));
|
|
Assert.Equal("Germinal", NettoyageIsbd.RetirerAuteurEnFin("Germinal", [null, " "]));
|
|
Assert.Null(NettoyageIsbd.RetirerAuteurEnFin(null, ["Émile Zola"]));
|
|
}
|
|
|
|
[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));
|
|
}
|
|
}
|