| 1 | using CascadeIDE.Features.Workspace; |
| 2 | using CascadeIDE.Features.WorkspaceNavigation.Application; |
| 3 | using CascadeIDE.Services; |
| 4 | using Xunit; |
| 5 | |
| 6 | namespace CascadeIDE.Tests; |
| 7 | |
| 8 | public 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 | |