using MaBibli.Shared.Isbn;
namespace MaBibli.Tests;
///
/// Reconnaissance d'un code dans le champ de recherche du catalogue.
///
///
/// L'enjeu n'est pas de trouver un ISBN — c'est de ne pas en voir un là où il n'y en a
/// pas : « 1984 » est un titre, et le confondre avec un fragment de code remplacerait une
/// réponse par du bruit.
///
public class RechercheIsbnTests
{
[Theory]
[InlineData("Germinal")]
[InlineData("Zola 1984")]
[InlineData("1984")]
[InlineData("2026")]
[InlineData("1234567")] // sept chiffres : sous le seuil
[InlineData("")]
[InlineData(" ")]
[InlineData(null)]
public void Ce_qui_n_est_pas_un_code_reste_une_recherche_de_mots(string? terme)
=> Assert.Null(RechercheIsbn.Formes(terme));
[Fact]
public void Un_ean13_est_cherche_sous_ses_deux_formes()
{
// ⚠️ Le cœur de la fonctionnalité : la douchette lit toujours un 13, alors qu'un livre
// paru avant 2007 est rangé sous son 10.
var formes = RechercheIsbn.Formes("9782253004226");
Assert.NotNull(formes);
Assert.Equal(["9782253004226", "2253004227"], formes);
}
[Fact]
public void Les_tirets_de_l_affichage_se_recollent()
=> Assert.Equal(
RechercheIsbn.Formes("9782253004226"),
RechercheIsbn.Formes("978-2-25-300422-6"));
[Fact]
public void Un_fragment_assez_long_reste_un_code_mais_sans_seconde_forme()
{
// La conversion 13 → 10 n'a pas de sens sur un fragment : elle exige un ISBN complet.
var formes = RechercheIsbn.Formes("97822530");
Assert.Equal(["97822530"], formes);
}
[Fact]
public void Un_isbn_10_terminant_par_X_est_reconnu()
{
var formes = RechercheIsbn.Formes("2-266-11156-X");
Assert.Equal(["226611156X"], formes);
}
[Theory]
[InlineData("9782253004226", true)]
[InlineData("978-2-25-300422-6", true)]
[InlineData("2253004227", true)]
[InlineData("9782253004227", false)] // clé fausse : ce n'est pas une édition, c'est une faute
[InlineData("97822530", false)] // fragment : le résultat unique serait un hasard
[InlineData("Germinal", false)]
public void Seul_un_code_complet_et_valide_autorise_l_ouverture_directe(string terme, bool attendu)
=> Assert.Equal(attendu, RechercheIsbn.EstCodeComplet(terme));
}