using MaBibli.Shared.Textes;
namespace MaBibli.Tests;
///
/// Le tri des numéros de tome — celui qui range « 2 » avant « 10 ».
///
public class TriNaturelTests
{
private static List Trier(params string?[] valeurs) =>
valeurs.OrderBy(v => v, TriNaturel.Comparateur).ToList();
[Fact]
public void Les_nombres_se_lisent_comme_des_nombres()
{
// Le défaut que ce comparateur existe pour corriger : un tri ordinal range
// 1, 10, 11, 2, 9 — parce que le caractère « 1 » précède le « 2 ».
Assert.Equal(
["1", "2", "9", "10", "11"],
Trier("11", "2", "10", "1", "9"));
}
[Fact]
public void Les_trois_blocs_sont_dans_l_ordre_decide()
{
// Tranché avec l'utilisateur : vide, puis non-numériques a→z, puis chiffres 0→9.
Assert.Equal(
[null, "", "Hors-série", "Intégrale 1-3", "1", "2", "10"],
Trier("10", "Intégrale 1-3", "2", null, "Hors-série", "1", ""));
}
[Fact]
public void Un_numero_decimal_se_range_entre_ses_voisins()
{
Assert.Equal(["3", "3.5", "4"], Trier("4", "3.5", "3"));
}
[Fact]
public void Le_prefixe_passe_avant_ce_qui_le_prolonge()
{
Assert.Equal(["3", "3 bis"], Trier("3 bis", "3"));
}
[Fact]
public void Les_zeros_de_tete_ne_changent_pas_l_ordre()
{
Assert.Equal(0, TriNaturel.Comparer("007", "7"));
Assert.Equal(["007", "8"], Trier("8", "007"));
}
[Fact]
public void Un_tres_grand_nombre_ne_fait_pas_echouer_le_tri()
{
// ⚠️ Le comparateur ne convertit jamais en int : rien ne borne un numéro saisi
// à la main, et un dépassement serait une exception au milieu d'un affichage.
var enorme = new string('9', 40);
Assert.True(TriNaturel.Comparer("12", enorme) < 0);
}
[Fact]
public void Le_tri_ignore_la_casse_et_les_accents()
{
// Même normalisation que partout ailleurs : « Édition » et « edition » se rencontrent.
Assert.Equal(0, TriNaturel.Comparer("Hors-Série", "hors-serie"));
}
[Fact]
public void Le_texte_se_compare_de_a_a_z()
{
Assert.Equal(
["Alpha", "Hors-série", "Zeta"],
Trier("Zeta", "Alpha", "Hors-série"));
}
[Fact]
public void Le_tri_est_stable_et_symetrique()
{
// Un comparateur incohérent fait lever OrderBy sur de gros jeux : on vérifie que
// comparer(a,b) et comparer(b,a) sont bien opposés sur toutes les paires.
string?[] valeurs = [null, "", "1", "2", "10", "3.5", "3 bis", "Hors-série", "007", "Zeta"];
foreach (var a in valeurs)
{
foreach (var b in valeurs)
{
Assert.Equal(
Math.Sign(TriNaturel.Comparer(a, b)),
-Math.Sign(TriNaturel.Comparer(b, a)));
}
}
}
}