MaBibli 1.0.0

Gestion de bibliothèque personnelle auto-hébergée : catalogue, prêts,
scan de code-barres, consultation hors-ligne.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Mathieu Limonier
2026-08-22 22:36:16 +02:00
co-authored by Claude Opus 5
commit 6a6d745af4
207 changed files with 35543 additions and 0 deletions
+76
View File
@@ -0,0 +1,76 @@
using MaBibli.Shared.Textes;
namespace MaBibli.Tests;
/// <summary>
/// Clé d'œuvre : ce qu'elle réunit, et surtout <b>ce qu'elle rate</b>.
/// </summary>
/// <remarks>
/// 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.
/// </remarks>
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));
/// <summary>
/// Limite assumée : deux œuvres distinctes partageant leur titre principal se confondent.
/// Le risque est borné, la comparaison n'ayant lieu qu'à auteur donné.
/// </summary>
[Fact]
public void Confond_deux_oeuvres_partageant_le_titre_principal() =>
Assert.Equal(
CleOeuvre.Cle("Nouvelles : premier recueil"),
CleOeuvre.Cle("Nouvelles : second recueil"));
/// <summary>
/// La ligature « œ » est ramenée à « oe » — corrigé le 2026-08-19.
/// </summary>
/// <remarks>
/// Le comportement vient de <see cref="NormalisationTexte"/> et non d'ici : la décomposition
/// NFD sépare les accents mais laisse les ligatures intactes, d'où une table explicite.
/// Sans elle, <i>L'Œuvre</i> de Zola — que la BnF écrit avec la ligature — restait
/// introuvable à qui tape « oeuvre » au clavier, et n'était pas grisé dans sa bibliographie.
/// </remarks>
[Fact]
public void Reduit_la_ligature_oe() =>
Assert.Equal(CleOeuvre.Cle("L'Œuvre"), CleOeuvre.Cle("L'oeuvre"));
/// <summary>
/// Limite assumée : un titre retraduit n'est pas rapproché du tout.
/// </summary>
[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));
/// <summary>
/// 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.
/// </summary>
[Fact]
public void Ne_vide_pas_un_titre_qui_commence_par_le_separateur() =>
Assert.NotEqual(string.Empty, CleOeuvre.Cle(": roman"));
}