Aligne les thèmes sur le point-virgule des auteurs

Le champ des auteurs se saisit au point-virgule depuis toujours ; celui des
thèmes se saisissait à la virgule. Deux champs voisins du même formulaire ne
doivent pas se saisir de deux façons.

La virgule reste acceptée en repli : c'était l'habitude, et un thème n'en
contient jamais — contrairement à un titre d'article à la une, qui arrive au lot
suivant et pour lequel elle couperait le titre en deux. D'où le paramètre de
`ListeSaisie` plutôt qu'une règle unique.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-21 11:24:57 +02:00
co-authored by Claude Opus 5
parent 58d4ebc44b
commit ad00fd5116
4 changed files with 121 additions and 17 deletions
+59
View File
@@ -0,0 +1,59 @@
using MaBibli.Shared.Dtos;
using MaBibli.Shared.Textes;
namespace MaBibli.Tests;
/// <summary>
/// Découpage des champs qui portent plusieurs valeurs : thèmes d'un livre, articles à la une
/// d'un numéro (lot O2).
/// </summary>
public class ListeSaisieTests
{
/// <summary>
/// ⚠️ Le cas qui a tranché le séparateur : un titre d'article contient souvent une virgule,
/// et elle le couperait en deux.
/// </summary>
[Fact]
public void Un_titre_darticle_garde_ses_virgules()
{
var articles = ListeSaisie.Decouper(
"Ukraine, deux ans après ; Le retour du train de nuit", virguleAussi: false);
Assert.Equal(["Ukraine, deux ans après", "Le retour du train de nuit"], articles);
}
/// <summary>
/// Les thèmes acceptent la virgule en repli : elle était le séparateur jusqu'au 2026-08-21,
/// et un thème n'en contient jamais.
/// </summary>
[Fact]
public void Un_theme_se_saisit_aux_deux_separateurs()
{
Assert.Equal(
["Fantasy", "aventure", "space opera"],
EnregistrementLivre.DecouperThemes("Fantasy ; aventure, space opera"));
}
[Fact]
public void Le_premier_libelle_tape_est_celui_qui_reste()
{
// « Fantasy » et « fantasy » sont la même étiquette au sens de la normalisation.
Assert.Equal(["Fantasy"], EnregistrementLivre.DecouperThemes("Fantasy ; fantasy ; FANTASY"));
}
[Fact]
public void Les_entrees_vides_disparaissent()
{
Assert.Empty(ListeSaisie.Decouper(" ; ; ", virguleAussi: false));
Assert.Empty(ListeSaisie.Decouper(null, virguleAussi: true));
}
/// <summary>La ligne recomposée se redécoupe à l'identique : c'est ce que fait le formulaire.</summary>
[Fact]
public void Joindre_puis_decouper_ne_perd_rien()
{
List<string> articles = ["Ukraine, deux ans après", "Le retour du train de nuit"];
Assert.Equal(articles, ListeSaisie.Decouper(ListeSaisie.Joindre(articles), virguleAussi: false));
}
}