Files
mabibli/MaBibli.Tests/TriNaturelTests.cs
T
mathieu 42dec0dbd1 - Catalogage rapide (douchette, code-barres)
- Cataloguer en rafale — nouvel écran /ajout/rafale : on scanne une pile de livres à la suite dans une zone de texte, chaque code est traité (BnF puis OpenLibrary), les doublons connus sont passés automatiquement. La collecte marche même hors-ligne. Le compte rendu liste maintenant les livres créés, en lien vers leur fiche, et reste consultable en revenant sur l'écran même après une rafale entièrement réussie. Le catalogue reconnaît un ISBN dans sa barre de recherche (13 ou 10 chiffres, avec ou sans tirets) : scanner un livre en main ouvre directement sa fiche s'il n'y en a qu'un. Un bouton « Scanner » l'alimente, actif hors-ligne.
- Ajouter un tome à une série accepte aussi un ISBN dans le champ manuel : le catalogue est cherché d'abord (rattachement direct si un seul exemplaire), sinon la BnF prend le relais.
Séries et sagas
- Numéro de tome distinct de la position de lecture : on peut indiquer « c'est le tome 7 » même si on ne possède pas les six premiers ; l'ordre de lecture reste un réglage séparé (utile pour les préquelles).
- Tri par numéro en plus du tri par ordre de lecture quand des tomes en portent un.
- Panneau « Ajouter » regroupé et repliable sur la fiche d'une série (manuellement / en rafale / depuis le catalogue / depuis les envies), au lieu de quatre formulaires ouverts en permanence.
- Filtre catalogue « sans couverture » pour repérer les livres à illustrer.
Le catalogue groupe les tomes d'une même série sous un bloc repliable, avec un décompte plus clair (affichés / possédés / total).
- Corrections directes sur la fiche
- Effacer un prêt saisi par erreur (bouton ✕ sur chaque ligne, avec confirmation), sans passer par « rendre ».
- Corriger une couverture manquante ou cassée en cliquant dessus : le champ d'adresse s'ouvre focalisé, Entrée enregistre. Étendu aux numéros de revue dans la dernière modification.
- Les thèmes déjà utilisés dans la bibliothèque sont proposés à la frappe.
- La recherche d'un livre à rattacher montre des suggestions dès le focus, sans attendre de taper.

- Visuel : un rendu manquant après une écriture asynchrone dans le formulaire de livre, une bascule de rôle cassée, des débordements à 320 px, et le style d'un bouton-lien qui restait souligné.
2026-09-09 00:05:26 +02:00

93 lines
2.9 KiB
C#

using MaBibli.Shared.Textes;
namespace MaBibli.Tests;
/// <summary>
/// Le tri des numéros de tome — celui qui range « 2 » avant « 10 ».
/// </summary>
public class TriNaturelTests
{
private static List<string?> 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)));
}
}
}
}