Forge
csharpdeeb25a2
1using CascadeIDE.Features.Workspace;
2using CascadeIDE.Features.WorkspaceNavigation.Application;
3using CascadeIDE.Services;
4using Xunit;
5
6namespace CascadeIDE.Tests;
7
8public sealed class WorkspaceCorrespondenceCodeAnchorsLoaderTests
9{
10 [Fact]
11 public void Toml_deserializes_code_anchors_array()
12 {
13 const string toml = """
14 [[workspace.correspondence.code_anchors]]
15 doc = "docs/adr/0099-sample.md"
16 file = "src/Foo.cs"
17 line_start = 10
18 kind = "documents"
19 """;
20
21 var model = CascadeTomlSerializer.Deserialize<RepositoryWorkspaceToml>(toml);
22 Assert.NotNull(model?.Workspace?.Correspondence?.CodeAnchors);
23 Assert.Single(model!.Workspace!.Correspondence!.CodeAnchors);
24 Assert.Equal("docs/adr/0099-sample.md", model.Workspace.Correspondence.CodeAnchors[0].Doc);
25 Assert.Equal(10, model.Workspace.Correspondence.CodeAnchors[0].LineStart);
26 }
27
28 [Fact]
29 public void Explicit_anchor_wins_over_doc_body_scan()
30 {
31 var root = Path.Combine(Path.GetTempPath(), "crs-toml-" + Guid.NewGuid().ToString("N"));
32 Directory.CreateDirectory(root);
33 try
34 {
35 var anchorAbs = Path.Combine(root, "src", "Foo.cs");
36 Directory.CreateDirectory(Path.GetDirectoryName(anchorAbs)!);
37 File.WriteAllText(anchorAbs, "//");
38
39 const string docRel = "docs/adr/x.md";
40 var docAbs = Path.Combine(root, docRel.Replace('/', Path.DirectorySeparatorChar));
41 Directory.CreateDirectory(Path.GetDirectoryName(docAbs)!);
42 File.WriteAllText(docAbs, "Also `[F:src/Foo.cs]` in prose.");
43
44 var toml = new RepositoryWorkspaceToml
45 {
46 Workspace = new RepositoryWorkspaceSectionToml
47 {
48 Correspondence = new RepositoryCorrespondenceToml
49 {
50 CodeAnchors =
51 [
52 new RepositoryCorrespondenceCodeAnchorToml
53 {
54 Doc = docRel,
55 File = "src/Foo.cs",
56 LineStart = 5,
57 Kind = "documents"
58 }
59 ]
60 }
61 }
62 };
63
64 var explicitAnchors = WorkspaceCorrespondenceCodeAnchorsLoader.LoadFromWorkspaceToml(toml, root);
65 var hits = DocReverseAnchorResolver.Resolve(root, anchorAbs, [docRel], explicitAnchors);
66
67 Assert.Single(hits);
68 Assert.Equal(DocReverseAnchorResolver.ProvenanceWorkspaceToml, hits[0].Provenance);
69 Assert.Equal(5, hits[0].CodeAnchor.LineStart);
70 }
71 finally
72 {
73 if (Directory.Exists(root))
74 Directory.Delete(root, recursive: true);
75 }
76 }
77}
78
View only · write via MCP/CIDE