| 1 | #nullable enable |
| 2 | using CascadeIDE.Views.Chat.Skia; |
| 3 | using Xunit; |
| 4 | |
| 5 | namespace CascadeIDE.Tests; |
| 6 | |
| 7 | public sealed class SkiaMarkdownDocumentTests |
| 8 | { |
| 9 | [Fact] |
| 10 | public void Layout_maps_headings_lists_and_hr() |
| 11 | { |
| 12 | const string md = """ |
| 13 | # Title |
| 14 | ## Section |
| 15 | - one **bold** |
| 16 | --- |
| 17 | plain |
| 18 | """; |
| 19 | |
| 20 | var rows = SkiaMarkdownDocument.Layout(md, maxChars: 80); |
| 21 | Assert.Contains(rows, r => r.Kind == SkiaMarkdownBlockKind.Heading1); |
| 22 | Assert.Contains(rows, r => r.Kind == SkiaMarkdownBlockKind.Heading2); |
| 23 | Assert.Contains(rows, r => r.Kind == SkiaMarkdownBlockKind.Bullet); |
| 24 | Assert.Contains(rows, r => r.Kind == SkiaMarkdownBlockKind.HorizontalRule); |
| 25 | Assert.Contains(rows, r => r.Kind == SkiaMarkdownBlockKind.Paragraph); |
| 26 | |
| 27 | var bullet = rows.First(r => r.Kind == SkiaMarkdownBlockKind.Bullet); |
| 28 | Assert.Equal(SkiaMarkdownStyle.Plain, bullet.Runs[0].Style); |
| 29 | Assert.Contains(bullet.Runs, r => r.Style == SkiaMarkdownStyle.Bold && r.Text.Trim() == "bold"); |
| 30 | } |
| 31 | |
| 32 | [Fact] |
| 33 | public void Layout_wraps_long_bullet_continuation() |
| 34 | { |
| 35 | var md = "- " + new string('x', 40); |
| 36 | var rows = SkiaMarkdownDocument.Layout(md, maxChars: 12); |
| 37 | Assert.True(rows.Count(r => r.Kind == SkiaMarkdownBlockKind.Bullet) >= 2); |
| 38 | Assert.StartsWith(" ", rows[^1].Runs[0].Text, StringComparison.Ordinal); |
| 39 | } |
| 40 | } |
| 41 | |