| 1 | #nullable enable |
| 2 | |
| 3 | using CascadeIDE.Services.Intercom; |
| 4 | using Xunit; |
| 5 | |
| 6 | namespace CascadeIDE.Tests; |
| 7 | |
| 8 | public sealed class AnchorDraftPreviewResolverTests |
| 9 | { |
| 10 | [Fact] |
| 11 | public void TryResolve_MemberOnly_InfersFileFromSidecar() |
| 12 | { |
| 13 | var dir = createWorkspace(); |
| 14 | seedMember(dir, "src/A.cs", "Foo.Bar", 10, 20); |
| 15 | |
| 16 | Assert.True( |
| 17 | AnchorDraftPreviewResolver.TryResolve( |
| 18 | "[M:Foo.Bar]", |
| 19 | activeFilePath: null, |
| 20 | workspaceRoot: dir, |
| 21 | solutionPath: null, |
| 22 | indexDirectoryRelative: null, |
| 23 | out var preview, |
| 24 | out var error), |
| 25 | error); |
| 26 | |
| 27 | Assert.Equal(Path.Combine(dir, "src", "A.cs").Replace('\\', '/'), preview.AbsoluteFilePath.Replace('\\', '/')); |
| 28 | Assert.Equal(10, preview.StartLine); |
| 29 | Assert.Equal(20, preview.EndLine); |
| 30 | } |
| 31 | |
| 32 | private static void seedMember(string workspace, string relativePath, string memberKey, int lineStart, int lineEnd) |
| 33 | { |
| 34 | var cache = IntercomAttachResolveCacheContext.From(workspace, null, relativePath); |
| 35 | var absolute = Path.Combine(workspace, relativePath.Replace('/', Path.DirectorySeparatorChar)); |
| 36 | Directory.CreateDirectory(Path.GetDirectoryName(absolute)!); |
| 37 | if (!File.Exists(absolute)) |
| 38 | File.WriteAllText(absolute, "// stub\n"); |
| 39 | |
| 40 | var mtime = File.GetLastWriteTimeUtc(absolute).Ticks; |
| 41 | IntercomSymbolLineIndex.ReplaceFileSymbols( |
| 42 | cache, |
| 43 | relativePath, |
| 44 | mtime, |
| 45 | [new IntercomSymbolLineEntry("docid", memberKey, lineStart, lineEnd)]); |
| 46 | } |
| 47 | |
| 48 | private static string createWorkspace() |
| 49 | { |
| 50 | var dir = Path.Combine(Path.GetTempPath(), nameof(AnchorDraftPreviewResolverTests) + "_" + Guid.NewGuid().ToString("N")); |
| 51 | Directory.CreateDirectory(dir); |
| 52 | return dir; |
| 53 | } |
| 54 | } |
| 55 | |