Forge
csharpdeeb25a2
1using Avalonia.Controls;
2using CascadeIDE.Services.MarkdownPreview;
3using Markdig;
4using Xunit;
5
6namespace CascadeIDE.Tests;
7
8public sealed class MarkdigMarkdownPreviewRendererTests
9{
10 private static readonly MarkdownPipeline Pipeline = new MarkdownPipelineBuilder()
11 .UseAdvancedExtensions()
12 .Build();
13
14 [Fact]
15 public void Render_AdrRelatedTable_DoesNotThrow()
16 {
17 const string md = """
18 ## Связанные ADR
19
20 | ADR | Роль |
21 |-----|------|
22 | [0155](0155-documentation-code-correspondence-and-architectural-drift.md) | Слои L0L4 |
23 | [0061](0061-context-aware-adr-map-pfd-knowledge-indicator.md) | L1 map |
24 """;
25
26 var doc = Markdown.Parse(md, Pipeline);
27 var payload = new MarkdownPreviewPayload(
28 "docs/adr/0156-test.md",
29 md,
30 md,
31 "docs/adr/0156-test.md",
32 doc,
33 [],
34 null);
35 var r = new MarkdigMarkdownPreviewRenderer();
36 var control = r.Render(payload, new MarkdownPreviewRenderContext("docs/adr/0156-test.md", null));
37 Assert.NotNull(control);
38 Assert.IsType<ScrollViewer>(control);
39 }
40
41 [Fact]
42 public void Render_DoesNotThrow_OnTypicalDocument()
43 {
44 const string md = """
45 # Title
46
47 **bold** and *italic* and `code`.
48
49 | A | B |
50 |---|---|
51 | 1 | 2 |
52
53 ```text
54 fenced
55 ```
56 """;
57 var doc = Markdown.Parse(md, Pipeline);
58 var payload = new MarkdownPreviewPayload(
59 "t.md",
60 md,
61 md,
62 null,
63 doc,
64 [],
65 null);
66 var r = new MarkdigMarkdownPreviewRenderer();
67 var control = r.Render(payload);
68 Assert.NotNull(control);
69 Assert.IsType<ScrollViewer>(control);
70 }
71
72 [Fact]
73 public void Render_DoesNotStackOverflow_OnMarkdownLink()
74 {
75 const string md = "See [docs](https://example.com) and ![alt](img.png).";
76 var doc = Markdown.Parse(md, Pipeline);
77 var payload = new MarkdownPreviewPayload(
78 "link.md",
79 md,
80 md,
81 null,
82 doc,
83 [],
84 null);
85 var r = new MarkdigMarkdownPreviewRenderer();
86 var control = r.Render(payload);
87 Assert.NotNull(control);
88 }
89
90 [Fact]
91 public void Render_CodeAnchorPreviewLink_DoesNotThrow()
92 {
93 const string md = "Impl [F:Features/Chat/Foo.cs M:RunAsync].";
94 var expanded = MarkdownCodeAnchorPreviewExpander.Expand(md);
95 var doc = Markdown.Parse(expanded, Pipeline);
96 var payload = new MarkdownPreviewPayload(
97 "anchor.md",
98 md,
99 expanded,
100 null,
101 doc,
102 [],
103 null);
104 var r = new MarkdigMarkdownPreviewRenderer();
105 var ctx = new MarkdownPreviewRenderContext(null, null, _ => { });
106 var control = r.Render(payload, ctx);
107 Assert.NotNull(control);
108 }
109
110 [Fact]
111 public void Render_Fallback_OnNullDocument_StillReturnsControl()
112 {
113 var payload = new MarkdownPreviewPayload("x", "", "", null, null, [], "parse error");
114 var r = new MarkdigMarkdownPreviewRenderer();
115 var control = r.Render(payload);
116 Assert.NotNull(control);
117 }
118}
119
View only · write via MCP/CIDE