Skip to content

Commit 0e9cd77

Browse files
Clean up and fix unit test infrastructure (#11774)
This change represents a bit of a "rabbit hole" that I went down when I found that a number of language server tests were failing at random. It turns out that this was caused by a bad disposal order between our `TestLanguageServer` and the `CSharpTestLspServer` it uses. Once this was addressed, I audited every place `TestLanguageServer` and `CSharpTestLspServer` were used. This resulted in cleaning up a fair amount of dead code and essentially rewriting the "delegated completion" tests.
2 parents f22b494 + 131c136 commit 0e9cd77

File tree

41 files changed

+679
-796
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+679
-796
lines changed

src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/OnAutoInsertEndpointTest.NetFx.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public async Task Handle_SingleProvider_InvokesProvider()
2121
var codeDocument = CreateCodeDocument();
2222
var razorFilePath = "file://path/test.razor";
2323
var uri = new Uri(razorFilePath);
24-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
24+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
2525
var documentContext = CreateDocumentContext(uri, codeDocument);
2626
var optionsMonitor = GetOptionsMonitor();
2727
var insertProvider = new TestOnAutoInsertProvider(">", canResolve: true);
@@ -63,7 +63,7 @@ public async Task Handle_MultipleProviderSameTrigger_UsesSuccessful()
6363
var codeDocument = CreateCodeDocument();
6464
var razorFilePath = "file://path/test.razor";
6565
var uri = new Uri(razorFilePath);
66-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
66+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
6767
var documentContext = CreateDocumentContext(uri, codeDocument);
6868
var optionsMonitor = GetOptionsMonitor();
6969
var insertProvider1 = new TestOnAutoInsertProvider(">", canResolve: false)
@@ -115,7 +115,7 @@ public async Task Handle_MultipleProviderSameTrigger_UsesFirstSuccessful()
115115
var codeDocument = CreateCodeDocument();
116116
var razorFilePath = "file://path/test.razor";
117117
var uri = new Uri(razorFilePath);
118-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
118+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
119119
var documentContext = CreateDocumentContext(uri, codeDocument);
120120
var optionsMonitor = GetOptionsMonitor();
121121
var insertProvider1 = new TestOnAutoInsertProvider(">", canResolve: true)
@@ -166,7 +166,7 @@ public async Task Handle_NoApplicableProvider_CallsProviderAndReturnsNull()
166166
var codeDocument = CreateCodeDocument();
167167
var razorFilePath = "file://path/test.razor";
168168
var uri = new Uri(razorFilePath);
169-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
169+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
170170
var documentContext = CreateDocumentContext(uri, codeDocument);
171171
var optionsMonitor = GetOptionsMonitor();
172172
var insertProvider = new TestOnAutoInsertProvider(">", canResolve: false);
@@ -208,7 +208,7 @@ public async Task Handle_OnTypeFormattingOff_Html_CallsLanguageServer()
208208
var codeDocument = CreateCodeDocument();
209209
var razorFilePath = "file://path/test.razor";
210210
var uri = new Uri(razorFilePath);
211-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
211+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
212212
var documentContext = CreateDocumentContext(uri, codeDocument);
213213
var optionsMonitor = GetOptionsMonitor(formatOnType: false);
214214
var insertProvider = new TestOnAutoInsertProvider("<", canResolve: false);
@@ -248,7 +248,7 @@ public async Task Handle_AutoInsertAttributeQuotesOff_Html_DoesNotCallLanguageSe
248248
var codeDocument = CreateCodeDocument();
249249
var razorFilePath = "file://path/test.razor";
250250
var uri = new Uri(razorFilePath);
251-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
251+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
252252
var documentContext = CreateDocumentContext(uri, codeDocument);
253253
var optionsMonitor = GetOptionsMonitor(autoInsertAttributeQuotes: false);
254254
var insertProvider = new TestOnAutoInsertProvider("<", canResolve: false);
@@ -393,7 +393,7 @@ private async Task VerifyCSharpOnAutoInsertAsync(string input, string expected,
393393

394394
var codeDocument = CreateCodeDocument(input);
395395
var razorFilePath = "C:/path/test.razor";
396-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
396+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
397397

398398
var optionsMonitor = GetOptionsMonitor();
399399
var insertProvider = new TestOnAutoInsertProvider("!!!", canResolve: false);

src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/OnAutoInsertEndpointTest.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
using System.Diagnostics.CodeAnalysis;
66
using System.Threading.Tasks;
77
using Microsoft.AspNetCore.Razor.Language;
8-
using Microsoft.AspNetCore.Razor.LanguageServer.Formatting;
9-
using Microsoft.AspNetCore.Razor.LanguageServer.Test;
108
using Microsoft.CodeAnalysis.Razor.AutoInsert;
119
using Xunit;
1210
using Xunit.Abstractions;
@@ -22,7 +20,7 @@ public async Task Handle_MultipleProviderUnmatchingTrigger_ReturnsNull()
2220
var codeDocument = CreateCodeDocument();
2321
var razorFilePath = "file://path/test.razor";
2422
var uri = new Uri(razorFilePath);
25-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
23+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
2624
var documentContext = CreateDocumentContext(uri, codeDocument);
2725
var optionsMonitor = GetOptionsMonitor();
2826
var insertProvider1 = new TestOnAutoInsertProvider(">", canResolve: true);
@@ -65,7 +63,7 @@ public async Task Handle_DocumentNotFound_ReturnsNull()
6563
// Arrange
6664
var codeDocument = CreateCodeDocument();
6765
var razorFilePath = "file://path/test.razor";
68-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
66+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
6967

7068
var optionsMonitor = GetOptionsMonitor();
7169
var insertProvider = new TestOnAutoInsertProvider(">", canResolve: true);
@@ -107,7 +105,7 @@ public async Task Handle_OnTypeFormattingOff_CSharp_ReturnsNull()
107105
var codeDocument = CreateCodeDocument();
108106
var razorFilePath = "file://path/test.razor";
109107
var uri = new Uri(razorFilePath);
110-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
108+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
111109
var documentContext = CreateDocumentContext(uri, codeDocument);
112110
var optionsMonitor = GetOptionsMonitor(formatOnType: false);
113111
var insertProvider = new TestOnAutoInsertProvider(">", canResolve: false);

src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/AutoInsert/PreferHtmlInAttributeValuesDocumentPositionInfoStrategyTest.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ internal async Task TryGetPositionInfoAsync_AtVariousPosition_ReturnsCorrectLang
4343
var razorFilePath = "file://path/test.razor";
4444
var codeDocument = CreateCodeDocument(documentText, filePath: razorFilePath);
4545
var position = codeDocument.Source.Text.GetPosition(cursorPosition);
46-
var uri = new Uri(razorFilePath);
47-
_ = await CreateLanguageServerAsync(codeDocument, razorFilePath);
46+
await using var _ = await CreateLanguageServerAsync(codeDocument, razorFilePath);
4847

4948
// Act
5049
var result = PreferHtmlInAttributeValuesDocumentPositionInfoStrategy.Instance.GetPositionInfo(DocumentMappingService, codeDocument, cursorPosition);

src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CodeActionEndToEndTest.NetFx.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,7 @@ public async Task Handle_GenerateMethod_SetEventParameter_DoesNothing(string par
748748
var codeDocument = CreateCodeDocument(input, filePath: razorFilePath, tagHelpers: CreateTagHelperDescriptors());
749749
var razorSourceText = codeDocument.Source.Text;
750750
var uri = new Uri(razorFilePath);
751-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
751+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
752752
var documentContext = CreateDocumentContext(uri, codeDocument);
753753
var requestContext = new RazorRequestContext(documentContext, null!, "lsp/method", uri: null);
754754

@@ -787,7 +787,7 @@ public void Exists()
787787
var codeDocument = CreateCodeDocument(input, filePath: razorFilePath, tagHelpers: CreateTagHelperDescriptors());
788788
var razorSourceText = codeDocument.Source.Text;
789789
var uri = new Uri(razorFilePath);
790-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
790+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
791791
var documentContext = CreateDocumentContext(uri, codeDocument);
792792
var requestContext = new RazorRequestContext(documentContext, null!, "lsp/method", uri: null);
793793

src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/CodeActionEndToEndTestBase.NetFx.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ internal async Task ValidateCodeBehindFileAsync(
5555
var codeDocument = CreateCodeDocument(input.Text, filePath: razorFilePath, rootNamespace: "Test", tagHelpers: CreateTagHelperDescriptors());
5656
var razorSourceText = codeDocument.Source.Text;
5757
var uri = new Uri(razorFilePath);
58-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
58+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
5959
var documentContext = CreateDocumentContext(uri, codeDocument);
6060
var requestContext = new RazorRequestContext(documentContext, null!, "lsp/method", uri: null);
6161
File.Create(codeBehindFilePath).Close();
@@ -145,7 +145,7 @@ internal async Task ValidateCodeActionAsync(
145145
var codeDocument = CreateCodeDocument(input.Text, filePath: razorFilePath, tagHelpers: CreateTagHelperDescriptors());
146146
var sourceText = codeDocument.Source.Text;
147147
var uri = new Uri(razorFilePath);
148-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
148+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
149149
var documentContext = CreateDocumentContext(uri, codeDocument);
150150
var requestContext = new RazorRequestContext(documentContext, null!, "lsp/method", uri: null);
151151

src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToCodeBehindCodeActionResolverTest.cs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
using System.Text.Json;
88
using System.Threading.Tasks;
99
using Microsoft.AspNetCore.Razor.Language;
10-
using Microsoft.AspNetCore.Razor.LanguageServer.Test;
10+
using Microsoft.AspNetCore.Razor.LanguageServer.Hosting;
1111
using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer;
1212
using Microsoft.AspNetCore.Razor.Test.Common.Workspaces;
1313
using Microsoft.CodeAnalysis;
@@ -24,9 +24,9 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.CodeActions;
2424

2525
public class ExtractToCodeBehindCodeActionResolverTest(ITestOutputHelper testOutput) : LanguageServerTestBase(testOutput)
2626
{
27-
private readonly TestLanguageServer _languageServer = new TestLanguageServer(new Dictionary<string, Func<object?, Task<object>>>()
27+
private readonly IClientConnection _clientConnection = TestClientConnection.Create(builder =>
2828
{
29-
[CustomMessageNames.RazorFormatNewFileEndpointName] = c => Task.FromResult<object>(null!),
29+
builder.Add(CustomMessageNames.RazorFormatNewFileEndpointName, (string?)null);
3030
});
3131

3232
[Fact]
@@ -41,7 +41,7 @@ public async Task Handle_InvalidFileKind()
4141
var codeDocument = CreateCodeDocument(contents, fileKind: RazorFileKind.Legacy);
4242

4343
var documentContext = CreateDocumentContext(documentPath, codeDocument);
44-
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_languageServer);
44+
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_clientConnection);
4545
var resolver = new ExtractToCodeBehindCodeActionResolver(TestLanguageServerFeatureOptions.Instance, roslynCodeActionHelpers);
4646
var data = JsonSerializer.SerializeToElement(CreateExtractToCodeBehindCodeActionParams(contents, "@code", "Test"));
4747

@@ -68,7 +68,7 @@ public async Task Handle_ExtractCodeBlock()
6868
Assert.True(codeDocument.TryComputeNamespace(fallbackToRootNamespace: true, out var @namespace));
6969

7070
var documentContext = CreateDocumentContext(documentPath, codeDocument);
71-
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_languageServer);
71+
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_clientConnection);
7272
var resolver = new ExtractToCodeBehindCodeActionResolver(TestLanguageServerFeatureOptions.Instance, roslynCodeActionHelpers);
7373
var actionParams = CreateExtractToCodeBehindCodeActionParams(contents, "@code", @namespace);
7474
var data = JsonSerializer.SerializeToElement(actionParams);
@@ -133,7 +133,7 @@ public async Task Handle_ExtractCodeBlock2()
133133
Assert.True(codeDocument.TryComputeNamespace(fallbackToRootNamespace: true, out var @namespace));
134134

135135
var documentContext = CreateDocumentContext(documentPath, codeDocument);
136-
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_languageServer);
136+
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_clientConnection);
137137
var resolver = new ExtractToCodeBehindCodeActionResolver(TestLanguageServerFeatureOptions.Instance, roslynCodeActionHelpers);
138138
var actionParams = CreateExtractToCodeBehindCodeActionParams(contents, "@code", @namespace);
139139
var data = JsonSerializer.SerializeToElement(actionParams);
@@ -206,7 +206,7 @@ private void M()
206206
Assert.True(codeDocument.TryComputeNamespace(fallbackToRootNamespace: true, out var @namespace));
207207

208208
var documentContext = CreateDocumentContext(documentPath, codeDocument);
209-
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_languageServer);
209+
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_clientConnection);
210210
var resolver = new ExtractToCodeBehindCodeActionResolver(TestLanguageServerFeatureOptions.Instance, roslynCodeActionHelpers);
211211
var actionParams = CreateExtractToCodeBehindCodeActionParams(contents, "@code", @namespace);
212212
var data = JsonSerializer.SerializeToElement(actionParams);
@@ -289,7 +289,7 @@ private void M()
289289
Assert.True(codeDocument.TryComputeNamespace(fallbackToRootNamespace: true, out var @namespace));
290290

291291
var documentContext = CreateDocumentContext(documentPath, codeDocument);
292-
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_languageServer);
292+
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_clientConnection);
293293
var resolver = new ExtractToCodeBehindCodeActionResolver(TestLanguageServerFeatureOptions.Instance, roslynCodeActionHelpers);
294294
var actionParams = CreateExtractToCodeBehindCodeActionParams(contents, "@code", @namespace);
295295
var data = JsonSerializer.SerializeToElement(actionParams);
@@ -374,7 +374,7 @@ private void M()
374374
Assert.True(codeDocument.TryComputeNamespace(fallbackToRootNamespace: true, out var @namespace));
375375

376376
var documentContext = CreateDocumentContext(documentPath, codeDocument);
377-
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_languageServer);
377+
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_clientConnection);
378378
var resolver = new ExtractToCodeBehindCodeActionResolver(TestLanguageServerFeatureOptions.Instance, roslynCodeActionHelpers);
379379
var actionParams = CreateExtractToCodeBehindCodeActionParams(contents, "@code", @namespace);
380380
var data = JsonSerializer.SerializeToElement(actionParams);
@@ -447,7 +447,7 @@ public async Task Handle_ExtractFunctionsBlock()
447447
Assert.True(codeDocument.TryComputeNamespace(fallbackToRootNamespace: true, out var @namespace));
448448

449449
var documentContext = CreateDocumentContext(documentPath, codeDocument);
450-
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_languageServer);
450+
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_clientConnection);
451451
var resolver = new ExtractToCodeBehindCodeActionResolver(TestLanguageServerFeatureOptions.Instance, roslynCodeActionHelpers);
452452
var actionParams = CreateExtractToCodeBehindCodeActionParams(contents, "@functions", @namespace);
453453
var data = JsonSerializer.SerializeToElement(actionParams);
@@ -512,7 +512,7 @@ @using System.Diagnostics
512512
Assert.True(codeDocument.TryComputeNamespace(fallbackToRootNamespace: true, out var @namespace));
513513

514514
var documentContext = CreateDocumentContext(documentPath, codeDocument);
515-
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_languageServer);
515+
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_clientConnection);
516516
var resolver = new ExtractToCodeBehindCodeActionResolver(TestLanguageServerFeatureOptions.Instance, roslynCodeActionHelpers);
517517
var actionParams = CreateExtractToCodeBehindCodeActionParams(contents, "@code", @namespace);
518518
var data = JsonSerializer.SerializeToElement(actionParams);
@@ -579,7 +579,7 @@ public async Task Handle_ExtractCodeBlockWithDirectives()
579579
Assert.True(codeDocument.TryComputeNamespace(fallbackToRootNamespace: true, out var @namespace));
580580

581581
var documentContext = CreateDocumentContext(documentPath, codeDocument);
582-
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_languageServer);
582+
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(_clientConnection);
583583
var resolver = new ExtractToCodeBehindCodeActionResolver(TestLanguageServerFeatureOptions.Instance, roslynCodeActionHelpers);
584584
var actionParams = CreateExtractToCodeBehindCodeActionParams(contents, "@code", @namespace);
585585
var data = JsonSerializer.SerializeToElement(actionParams);
@@ -644,13 +644,13 @@ public async Task Handle_ExtractCodeBlock_CallsRoslyn()
644644
var codeDocument = CreateCodeDocument(contents);
645645
Assert.True(codeDocument.TryComputeNamespace(fallbackToRootNamespace: true, out var @namespace));
646646

647-
var languageServer = new TestLanguageServer(new Dictionary<string, Func<object?, Task<object>>>()
647+
var clientConnection = TestClientConnection.Create(builder =>
648648
{
649-
[CustomMessageNames.RazorFormatNewFileEndpointName] = c => Task.FromResult<object>("Hi there! I'm from Roslyn"),
649+
builder.Add(CustomMessageNames.RazorFormatNewFileEndpointName, "Hi there! I'm from Roslyn");
650650
});
651651

652652
var documentContext = CreateDocumentContext(documentPath, codeDocument);
653-
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(languageServer);
653+
var roslynCodeActionHelpers = new RoslynCodeActionHelpers(clientConnection);
654654
var resolver = new ExtractToCodeBehindCodeActionResolver(TestLanguageServerFeatureOptions.Instance, roslynCodeActionHelpers);
655655
var actionParams = CreateExtractToCodeBehindCodeActionParams(contents, "@code", @namespace);
656656
var data = JsonSerializer.SerializeToElement(actionParams);

src/Razor/test/Microsoft.AspNetCore.Razor.LanguageServer.Test/CodeActions/Razor/ExtractToComponentCodeActionResolverTest.NetFx.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ private async Task TestAsync(
287287
var codeDocument = CreateCodeDocument(input, filePath: razorFilePath);
288288
var sourceText = codeDocument.Source.Text;
289289
var uri = new Uri(razorFilePath);
290-
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
290+
await using var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath);
291291
var documentContext = CreateDocumentContext(uri, codeDocument);
292292
var requestContext = new RazorRequestContext(documentContext, null!, "lsp/method", uri: null);
293293

0 commit comments

Comments
 (0)