using MaBibli.Shared.Isbn;

namespace MaBibli.Tests;

/// <summary>
/// Mise en forme d'un ISSN (lot K2).
/// </summary>
/// <remarks>
/// Le contraste avec <see cref="FormatageIsbnTests"/> est tout l'intérêt de ce fichier : un
/// ISSN se coupe <b>toujours</b> au même endroit, il n'y a donc aucune table à embarquer et
/// aucune coupure ne peut être fausse.
/// </remarks>
public class FormatageIssnTests
{
    [Theory]
    [InlineData("24666718", "2466-6718")]
    [InlineData("2466-6718", "2466-6718")]
    [InlineData(" 2466 6718 ", "2466-6718")]
    [InlineData("0317847X", "0317-847X")]
    [InlineData("0317847x", "0317-847X")]
    public void Un_issn_prend_son_tiret(string saisie, string attendu) =>
        Assert.Equal(attendu, FormatageIssn.Afficher(saisie));

    /// <summary>
    /// Ce qui n'est pas un ISSN ressort <b>intact</b> : un code mal recopié doit se voir mal
    /// recopié, pas déguisé par un tiret. C'est la règle déjà tenue pour l'ISBN.
    /// </summary>
    [Theory]
    [InlineData("2466671")]      // sept caractères
    [InlineData("246667181")]    // neuf
    [InlineData("2466-671A")]    // une lettre qui n'est pas la clé
    [InlineData("X4666718")]     // le X n'est admis qu'en dernière position
    public void Ce_qui_nest_pas_un_issn_nest_pas_deguise(string saisie)
    {
        Assert.Null(FormatageIssn.Normaliser(saisie));
        Assert.Equal(saisie, FormatageIssn.Afficher(saisie));
    }

    [Fact]
    public void Le_vide_reste_vide()
    {
        Assert.Null(FormatageIssn.Canonique(null));
        Assert.Null(FormatageIssn.Canonique("   "));
    }

    /// <summary>
    /// ⚠️ L'invariant qui donne son intérêt à la canonisation : la forme rangée en base est
    /// celle que produit le code-barres, donc un ISSN tapé à la main s'y rapproche.
    /// </summary>
    [Fact]
    public void La_forme_canonique_est_celle_du_code_barres()
    {
        var depuisLeCodeBarres = CodePeriodique.IssnDepuis("9772466671438");

        Assert.Equal(depuisLeCodeBarres, FormatageIssn.Canonique("24666718"));
    }
}
