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"));
}