Forge
csharpdeeb25a2
1using CascadeIDE.Services;
2using Microsoft.CodeAnalysis.Text;
3using Xunit;
4using TestContext = Xunit.TestContext;
5
6namespace CascadeIDE.Tests.MonacoForward;
7
8[Trait("Category", "MonacoForward")]
9public sealed class CSharpLanguageServiceFormatReferencesTests
10{
11 [Fact]
12 public void FormatDocument_normalizes_spacing()
13 {
14 const string path = @"D:\Fake\Fmt.cs";
15 const string src = "class C{void M(){int x=1;}}";
16 var svc = new CSharpLanguageService();
17 var formatted = svc.FormatDocument(path, src, TestContext.Current.CancellationToken);
18
19 Assert.Contains("class C", formatted);
20 Assert.Contains("void M", formatted);
21 Assert.NotEqual(src, formatted);
22 }
23
24 [Fact]
25 public void OrganizeUsings_sorts_directives()
26 {
27 const string path = @"D:\Fake\Usings.cs";
28 const string src = """
29 using System.Text;
30 using System;
31 class C { }
32 """;
33 var svc = new CSharpLanguageService();
34 var organized = svc.OrganizeUsings(path, src, TestContext.Current.CancellationToken);
35
36 var systemIdx = organized.IndexOf("using System;", StringComparison.Ordinal);
37 var textIdx = organized.IndexOf("using System.Text;", StringComparison.Ordinal);
38 Assert.True(systemIdx >= 0);
39 Assert.True(textIdx > systemIdx);
40 }
41
42 [Fact]
43 public void FindReferencesInFile_on_record_declaration_finds_type_usages()
44 {
45 const string path = @"D:\Fake\FieldStateLoader.cs";
46 var src = """
47 namespace Casa;
48
49 public sealed record FieldGrid(int W, int H);
50
51 public sealed record FieldStateSnapshot(FieldGrid? Grid, int Tick);
52
53 public sealed record ClaimNavItem(string Id);
54 """;
55 var index = src.IndexOf("record FieldGrid", StringComparison.Ordinal);
56 var nameStart = index + "record ".Length;
57 var pos = SourceText.From(src).Lines.GetLinePosition(nameStart);
58 var svc = new CSharpLanguageService();
59 var refs = svc.FindReferencesInFile(path, src, pos.Line + 1, pos.Character + 1, TestContext.Current.CancellationToken);
60
61 Assert.True(refs.Count >= 2, $"Expected >=2 refs, got {refs.Count}");
62 Assert.Contains(refs, r => r.Line > 0 && r.Column > 0);
63 }
64
65 [Fact]
66 public void FindReferencesInFile_finds_local_usages()
67 {
68 const string path = @"D:\Fake\Refs.cs";
69 var src = """
70 class C
71 {
72 void M()
73 {
74 int count = 1;
75 count = count + 1;
76 }
77 }
78 """;
79 var (line, column) = AfterMarker(src, "count = count");
80 var svc = new CSharpLanguageService();
81 var refs = svc.FindReferencesInFile(path, src, line, column, TestContext.Current.CancellationToken);
82
83 Assert.True(refs.Count >= 2);
84 Assert.Contains(refs, r => r.Line > 0 && r.Column > 0);
85 }
86
87 private static (int Line, int Column) AfterMarker(string source, string marker)
88 {
89 var index = source.IndexOf(marker, StringComparison.Ordinal);
90 Assert.True(index >= 0, $"Marker '{marker}' not found.");
91 var tokenStart = index;
92 while (tokenStart > 0 && char.IsLetterOrDigit(source[tokenStart - 1]))
93 tokenStart--;
94 var location = SourceText.From(source).Lines.GetLinePosition(tokenStart);
95 return (location.Line + 1, location.Character + 1);
96 }
97}
98
View only · write via MCP/CIDE