Forge
csharp4405de34
1using CascadeIDE.Models.Intercom;
2using CascadeIDE.Services.Intercom;
3using Xunit;
4
5namespace CascadeIDE.Tests;
6
7public sealed class IntercomAttachSymbolCacheTests
8{
9 private const string SampleSource =
10 """
11 namespace Sample;
12
13 public class Worker
14 {
15 public void Run() { }
16 }
17 """;
18
19 [Fact]
20 public void ScopeKey_IsStableForSameWorkspaceAndSolution()
21 {
22 var a = IntercomAttachResolveScopeKey.From(@"D:\ws", @"D:\ws\a.sln");
23 var b = IntercomAttachResolveScopeKey.From(@"D:\ws", @"D:\ws\a.sln");
24 Assert.Equal(a, b);
25 Assert.NotEqual(a, IntercomAttachResolveScopeKey.From(@"D:\ws", @"D:\ws\b.sln"));
26 }
27
28 [Fact]
29 public void WorkspaceCache_ReusesParseAcrossCalls()
30 {
31 var dir = createWorkspace();
32 var path = Path.Combine(dir, "Worker.cs");
33 File.WriteAllText(path, SampleSource);
34 var scope = IntercomAttachResolveScopeKey.From(dir, null);
35 var cache = IntercomAttachResolveCacheContext.From(dir, null, "Worker.cs");
36
37 Assert.True(
38 AttachmentAnchorRoslynResolver.TryGetOrCreateEntry(null, path, cache, out var first, out var d1),
39 d1);
40 Assert.True(
41 IntercomAttachmentRoslynWorkspaceCache.TryGet(scope, path, out var cached));
42 Assert.Same(first.Tree, cached.Tree);
43
44 File.WriteAllText(path, SampleSource + "\n// touch");
45 Assert.False(IntercomAttachmentRoslynWorkspaceCache.TryGet(scope, path, out _));
46 }
47
48 [Fact]
49 public void SymbolSidecar_ResolvesMemberAfterIndex()
50 {
51 var dir = createWorkspace();
52 var path = Path.Combine(dir, "Worker.cs");
53 File.WriteAllText(path, SampleSource);
54 var cache = IntercomAttachResolveCacheContext.From(dir, null, "Worker.cs");
55
56 IntercomSymbolLineIndexBuilder.IndexFile(cache, path, "Worker.cs");
57
58 Assert.True(
59 IntercomSymbolLineIndex.TryResolveMemberLines(cache, path, "Run", out var lines, out var detail),
60 detail);
61 Assert.True(lines.Start.Value >= 5);
62 }
63
64 [Fact]
65 public void TryResolveLineRange_UsesSymbolSidecarBeforeParse()
66 {
67 var dir = createWorkspace();
68 var path = Path.Combine(dir, "Worker.cs");
69 File.WriteAllText(path, SampleSource);
70 var cache = IntercomAttachResolveCacheContext.From(dir, null, "Worker.cs");
71 IntercomSymbolLineIndexBuilder.IndexFile(cache, path, "Worker.cs");
72
73 Assert.True(
74 AttachmentAnchorRoslynResolver.TryResolveLineRange(
75 null,
76 path,
77 "Run",
78 null,
79 cache,
80 out var lines,
81 out var detail),
82 detail);
83 Assert.Contains("symbol_cache", detail, StringComparison.Ordinal);
84 }
85
86 private static string createWorkspace()
87 {
88 var dir = Path.Combine(
89 Path.GetTempPath(),
90 nameof(IntercomAttachSymbolCacheTests) + "_" + Guid.NewGuid().ToString("N"));
91 Directory.CreateDirectory(dir);
92 return dir;
93 }
94}
95
View only · write via MCP/CIDE