Forge
csharpdeeb25a2
1using System.Text.Json;
2using Avalonia.Headless.XUnit;
3using CascadeIDE.Services;
4using CascadeIDE.ViewModels;
5using Xunit;
6
7namespace CascadeIDE.Tests;
8
9public sealed class CodeNavigationControlFlowMcpCursorFallbackTests
10{
11 [AvaloniaFact]
12 public async Task GetCodeNavigationContext_ControlFlow_UsesCurrentCursorWhenLineColumnNotProvided()
13 {
14 var vm = new MainWindowViewModel
15 {
16 CurrentFilePath = @"D:\w\Demo.cs",
17 EditorText = """
18class Demo
19{
20 void A()
21 {
22 B();
23 }
24
25 void B() { }
26}
27"""
28 };
29
30 // Курсор внутри A(), на вызове B(); line/column в MCP-вызове не передаём.
31 var offset = vm.EditorText.IndexOf("B();", StringComparison.Ordinal);
32 Assert.True(offset >= 0);
33 vm.EditorSelectionStart = offset;
34
35 IIdeMcpActions mcp = vm.IdeMcp;
36 var json = await mcp.GetCodeNavigationContextAsync(
37 mode: "related",
38 filePath: null,
39 line: null,
40 column: null,
41 maxRelated: null,
42 maxNodes: null,
43 maxEdges: null,
44 preset: null,
45 includeKinds: null,
46 excludeKinds: null,
47 level: "controlFlow");
48
49 using var doc = JsonDocument.Parse(json);
50 var nodes = doc.RootElement.GetProperty("nodes").EnumerateArray().ToList();
51 Assert.True(nodes.Count > 1);
52 Assert.Equal("method A", nodes[0].GetProperty("rationale").GetString());
53 }
54}
55
View only · write via MCP/CIDE