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