Forge
csharp4405de34
1using CascadeIDE.Features.IdeMcp.Application;
2using Xunit;
3using CascadeIDE.Features.Workspace.DataAcquisition;
4
5namespace CascadeIDE.Tests;
6
7public sealed class WorkspaceDocumentFileIoTests
8{
9 [Fact]
10 public void TryResolvePath_RejectsOutsideWorkspace()
11 {
12 var root = Path.Combine(Path.GetTempPath(), "cide-wsio-root-" + Guid.NewGuid().ToString("N"));
13 Directory.CreateDirectory(root);
14 var outside = Path.GetFullPath(Path.Combine(Path.GetDirectoryName(root)!, "cide-outside-" + Guid.NewGuid().ToString("N"), "a.txt"));
15
16 try
17 {
18 Assert.False(WorkspaceDocumentFileIo.TryResolvePath(root, [root], outside, out _, out var error));
19 Assert.Contains("outside", error, StringComparison.OrdinalIgnoreCase);
20 }
21 finally
22 {
23 try { Directory.Delete(root, recursive: true); } catch { /* ignore */ }
24 }
25 }
26
27 [Fact]
28 public void TryReadText_ReturnsSlice()
29 {
30 var dir = Path.Combine(Path.GetTempPath(), "cide-wsio-" + Guid.NewGuid().ToString("N"));
31 Directory.CreateDirectory(dir);
32 var file = Path.Combine(dir, "sample.txt");
33 File.WriteAllText(file, "line1\nline2\nline3\n");
34
35 try
36 {
37 Assert.True(WorkspaceDocumentFileIo.TryResolvePath(dir, [dir], file, out var full, out _));
38 Assert.True(WorkspaceDocumentFileIo.TryReadText(full, offsetLine: 2, limitLines: 1, maxChars: null, out var json, out _));
39 Assert.Contains("line2", json, StringComparison.Ordinal);
40 }
41 finally
42 {
43 try { Directory.Delete(dir, recursive: true); } catch { /* ignore */ }
44 }
45 }
46
47 [Fact]
48 public void TryReplaceTextRange_ReplacesMiddle()
49 {
50 const string source = "ab\ncd\n";
51 Assert.True(IdeMcpEditorOrchestrator.TryReplaceTextRange(source, 2, 1, 2, 3, "X", out var updated));
52 Assert.Equal("ab\nX\n", updated);
53 }
54}
55
View only · write via MCP/CIDE