Forge
csharpdeeb25a2
1using CascadeIDE.Features.Editor.Application.Monaco;
2using CascadeIDE.Features.IdeMcp.Application;
3using Xunit;
4
5namespace CascadeIDE.Tests.MonacoForward;
6
7[Trait("Category", "MonacoForward")]
8public sealed class MonacoEditorSessionAndApplyEditsTests
9{
10 [Fact]
11 public void SessionState_applyInbound_updates_version_and_text()
12 {
13 var session = new MonacoEditorSessionState();
14 session.Seed("old", version: 1);
15
16 session.ApplyInbound(new CideEditorInboundMessage(
17 CideEditorBusManifest.Editor.DidChange,
18 Version: 2,
19 Text: "new",
20 CaretOffset: 3,
21 SelectionStart: 1,
22 SelectionLength: 2,
23 RequestId: null,
24 Line: null,
25 Column: null,
26 TopLine: null,
27 LensId: null,
28 FilePath: null,
29 Error: null,
30 ActionIndex: null,
31 NewName: null,
32 EndLine: null,
33 EndColumn: null,
34 ShortcutId: null));
35
36 session.ReadSnapshot(out var version, out var text, out var caret, out var selStart, out var selLen);
37 Assert.Equal(2, version);
38 Assert.Equal("new", text);
39 Assert.Equal(3, caret);
40 Assert.Equal(1, selStart);
41 Assert.Equal(2, selLen);
42 }
43
44 [Fact]
45 public void SessionState_version_mismatch_detected_for_stale_push()
46 {
47 var session = new MonacoEditorSessionState();
48 session.Seed("v1", version: 5);
49 session.ReadSnapshot(out var version, out _, out _, out _, out _);
50 Assert.NotEqual(4, version);
51 Assert.Equal(5, version);
52 }
53
54 [Fact]
55 public void TryReplaceTextRange_mcp_edit_replaces_span()
56 {
57 const string text = "line1\nline2\nline3";
58 Assert.True(
59 IdeMcpEditorOrchestrator.TryReplaceTextRange(text, 2, 2, 2, 4, "XX", out var updated));
60 Assert.Equal("line1\nlXXe2\nline3", updated);
61 }
62
63 [Fact]
64 public void TryReplaceTextRange_invalid_range_returns_false()
65 {
66 Assert.False(
67 IdeMcpEditorOrchestrator.TryReplaceTextRange("a", 9, 1, 9, 1, "b", out _));
68 }
69}
70
View only · write via MCP/CIDE