Forge
csharpdeeb25a2
1using CascadeIDE.Features.Agent.Environment;
2using Xunit;
3
4namespace CascadeIDE.Tests;
5
6public sealed class AgentDiagnoseFilesCsScopeParserTests
7{
8 [Fact]
9 public void Merge_git_name_only_keeps_cs_and_order()
10 {
11 var merged = AgentDiagnoseFilesCsScopeParser.MergeGitNameOnlyOutputs(
12 "a.cs\nmisc.txt\nsubdir/b.cs",
13 "subdir/b.cs\nc.cs");
14
15 Assert.Equal(["a.cs", "subdir/b.cs", "c.cs"], merged);
16 }
17
18 [Fact]
19 public void TryResolve_rejects_traversal_or_outside_root()
20 {
21 var ws = OperatingSystem.IsWindows() ? @"C:\demo\repo" : "/tmp/demo/repo";
22 try
23 {
24 Directory.CreateDirectory(ws);
25 var okCs = Path.Combine(ws, "X.cs");
26 File.WriteAllText(okCs, "//");
27
28 Assert.True(AgentDiagnoseFilesCsScopeParser.TryResolveWorkspaceCs(ws, "X.cs", out var fullOk));
29 Assert.Equal(Path.GetFullPath(okCs), fullOk);
30
31 var parent = Directory.GetParent(ws)!.FullName;
32 var escaped = Path.Combine(parent, "EscapedOutside.cs");
33 File.WriteAllText(escaped, "//");
34 Assert.False(AgentDiagnoseFilesCsScopeParser.TryResolveWorkspaceCs(
35 ws,
36 Path.Combine("..", "EscapedOutside.cs").Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar),
37 out _));
38
39 Directory.CreateDirectory(Path.Combine(ws, "nested"));
40 var nestedCs = Path.Combine(ws, "nested", "z.cs");
41 File.WriteAllText(nestedCs, "//");
42 Assert.True(AgentDiagnoseFilesCsScopeParser.TryResolveWorkspaceCs(ws, "nested/z.cs", out var zn));
43 Assert.Equal(Path.GetFullPath(nestedCs), zn);
44 }
45 finally
46 {
47 try { Directory.Delete(ws, recursive: true); }
48 catch { /* best-effort */ }
49 try
50 {
51 var parent = OperatingSystem.IsWindows() ? @"C:\demo" : "/tmp/demo";
52 var escaped = Path.Combine(parent, "EscapedOutside.cs");
53 if (File.Exists(escaped))
54 File.Delete(escaped);
55 }
56 catch { /* best-effort */ }
57 }
58 }
59
60 [Theory]
61 [InlineData("open_tabs", false)]
62 [InlineData("open_tabs_and_git_dirty_cs", true)]
63 [InlineData("OPEN_TABS_AND_GIT_DIRTY_CS", true)]
64 public void IncludesGitDirtyWorktreeCs_recognizes_scope(string scope, bool expected) =>
65 Assert.Equal(expected, AgentDiagnoseFilesCsScopeParser.IncludesGitDirtyWorktreeCs(scope));
66}
67
View only · write via MCP/CIDE