inlines = InlinesPremierBloc(
$"{Img("image/png", Png)}{Img("image/jpeg", [0xFF, 0xD8, 0xFF, 0xE0])}
");
Assert.Equal(2, inlines.OfType().Count());
}
// TEST 5 : Base64 invalide → pas de crash, pas d'image
[Fact]
public void Image_Base64Invalide_SansCrash()
{
IReadOnlyList inlines = InlinesPremierBloc(
"
");
Assert.DoesNotContain(inlines, i => i is HtmlImage);
}
// TEST 6 : texte + image + texte → ordre conservé
[Fact]
public void Texte_Image_Texte_OrdreConserve()
{
IReadOnlyList inlines = InlinesPremierBloc(
$"Avant{Img("image/png", Png)}Après
");
Assert.Equal(3, inlines.Count);
Assert.Equal("Avant", Assert.IsType(inlines[0]).Text);
Assert.IsType(inlines[1]);
Assert.Equal("Après", Assert.IsType(inlines[2]).Text);
}
// TEST 7 : image dans une cellule de tableau → bonne cellule
[Fact]
public void Image_DansCelluleTableau()
{
HtmlTable table = Assert.IsType(Assert.Single(EmailHtmlParser.Parser(
$"| {Img("image/png", Png)} | 30/01/2026 |
")));
Assert.Single(table.Rows);
Assert.Contains(table.Rows[0].Cells[0].Inlines, i => i is HtmlImage);
Assert.Equal("30/01/2026", Assert.IsType(Assert.Single(table.Rows[0].Cells[1].Inlines)).Text);
}
// TEST 8 : aucune balise HTML brute affichée (entités décodées)
[Fact]
public void AucuneBaliseHtmlBrute_EntitesDecodees()
{
IReadOnlyList inlines = InlinesPremierBloc("Bonjour & bienvenue <test>
");
HtmlRun run = Assert.IsType(Assert.Single(inlines));
Assert.Equal("Bonjour & bienvenue ", run.Text);
Assert.DoesNotContain("&", run.Text);
Assert.DoesNotContain("", run.Text);
}
// Gras / italique / souligné propagés
[Fact]
public void Formatage_GrasItalique_Souligne()
{
IReadOnlyList inlines = InlinesPremierBloc(
"Gras Italique Souligné
");
Assert.Equal(5, inlines.Count);
Assert.True(Assert.IsType(inlines[0]).Bold);
Assert.True(Assert.IsType(inlines[2]).Italic);
Assert.True(Assert.IsType(inlines[4]).Underline);
}
}