Skip to content

Commit 76b364e

Browse files
committed
refactor lsp test harness to allow different test workspaces
1 parent 26317e4 commit 76b364e

File tree

8 files changed

+147
-110
lines changed

8 files changed

+147
-110
lines changed

src/EditorFeatures/Test/LanguageServer/VSTypeScriptHandlerTests.cs

Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,27 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System;
6+
using System.Collections.Generic;
67
using System.Composition;
78
using System.IO;
89
using System.Linq;
10+
using System.ServiceModel.Syndication;
911
using System.Threading;
1012
using System.Threading.Tasks;
1113
using System.Xml.Linq;
1214
using Microsoft.CodeAnalysis.ExternalAccess.VSTypeScript;
1315
using Microsoft.CodeAnalysis.ExternalAccess.VSTypeScript.Api;
1416
using Microsoft.CodeAnalysis.Host.Mef;
17+
using Microsoft.CodeAnalysis.LanguageServer;
1518
using Microsoft.CodeAnalysis.Simplification;
1619
using Microsoft.CodeAnalysis.Test.Utilities;
17-
using Roslyn.LanguageServer.Protocol;
20+
using Microsoft.CommonLanguageServerProtocol.Framework;
1821
using Nerdbank.Streams;
22+
using Roslyn.LanguageServer.Protocol;
1923
using Roslyn.Test.Utilities;
2024
using StreamJsonRpc;
2125
using Xunit;
2226
using Xunit.Abstractions;
23-
using Microsoft.CodeAnalysis.LanguageServer;
2427

2528
namespace Microsoft.CodeAnalysis.Editor.UnitTests.LanguageServer;
2629
public class VSTypeScriptHandlerTests : AbstractLanguageServerProtocolTests
@@ -90,43 +93,50 @@ public async Task TestGetSimplifierOptionsOnTypeScriptDocument()
9093
Assert.Same(SimplifierOptions.CommonDefaults, simplifierOptions);
9194
}
9295

93-
private async Task<TestLspServer> CreateTsTestLspServerAsync(string workspaceXml, InitializationOptions? options = null)
96+
private async Task<VSTypeScriptTestLspServer> CreateTsTestLspServerAsync(string workspaceXml, InitializationOptions? options = null)
9497
{
95-
var (clientStream, serverStream) = FullDuplexStream.CreatePair();
96-
9798
var testWorkspace = CreateWorkspace(options, mutatingLspWorkspace: false, workspaceKind: null);
9899
testWorkspace.InitializeDocuments(XElement.Parse(workspaceXml), openDocuments: false);
99100

100-
// Ensure workspace operations are completed so we don't get unexpected workspace changes while running.
101-
await WaitForWorkspaceOperationsAsync(testWorkspace);
102-
var languageServerTarget = CreateLanguageServer(serverStream, serverStream, testWorkspace);
103-
104-
return await TestLspServer.CreateAsync(testWorkspace, new ClientCapabilities(), languageServerTarget, clientStream);
101+
return await VSTypeScriptTestLspServer.CreateAsync(testWorkspace, new InitializationOptions(), TestOutputLspLogger);
105102
}
106103

107-
private static RoslynLanguageServer CreateLanguageServer(Stream inputStream, Stream outputStream, LspTestWorkspace workspace)
104+
private class VSTypeScriptTestLspServer : AbstractTestLspServer<LspTestWorkspace, TestHostDocument, TestHostProject, TestHostSolution>
108105
{
109-
var capabilitiesProvider = workspace.ExportProvider.GetExportedValue<ExperimentalCapabilitiesProvider>();
110-
var servicesProvider = workspace.ExportProvider.GetExportedValue<VSTypeScriptLspServiceProvider>();
111-
112-
var messageFormatter = RoslynLanguageServer.CreateJsonMessageFormatter();
113-
var jsonRpc = new JsonRpc(new HeaderDelimitedMessageHandler(outputStream, inputStream, messageFormatter))
106+
public VSTypeScriptTestLspServer(LspTestWorkspace testWorkspace, Dictionary<string, IList<Roslyn.LanguageServer.Protocol.Location>> locations, InitializationOptions options, AbstractLspLogger logger) : base(testWorkspace, locations, options, logger)
114107
{
115-
ExceptionStrategy = ExceptionProcessing.ISerializable,
116-
};
117-
118-
var logger = NoOpLspLogger.Instance;
108+
}
119109

120-
var languageServer = new RoslynLanguageServer(
121-
servicesProvider, jsonRpc, messageFormatter.JsonSerializerOptions,
122-
capabilitiesProvider,
123-
logger,
124-
workspace.Services.HostServices,
125-
[InternalLanguageNames.TypeScript],
126-
WellKnownLspServerKinds.RoslynTypeScriptLspServer);
110+
protected override RoslynLanguageServer CreateLanguageServer(Stream inputStream, Stream outputStream, WellKnownLspServerKinds serverKind, AbstractLspLogger logger)
111+
{
112+
var capabilitiesProvider = TestWorkspace.ExportProvider.GetExportedValue<ExperimentalCapabilitiesProvider>();
113+
var servicesProvider = TestWorkspace.ExportProvider.GetExportedValue<VSTypeScriptLspServiceProvider>();
114+
115+
var messageFormatter = RoslynLanguageServer.CreateJsonMessageFormatter();
116+
var jsonRpc = new JsonRpc(new HeaderDelimitedMessageHandler(outputStream, inputStream, messageFormatter))
117+
{
118+
ExceptionStrategy = ExceptionProcessing.ISerializable,
119+
};
120+
121+
var languageServer = new RoslynLanguageServer(
122+
servicesProvider, jsonRpc, messageFormatter.JsonSerializerOptions,
123+
capabilitiesProvider,
124+
logger,
125+
TestWorkspace.Services.HostServices,
126+
[InternalLanguageNames.TypeScript],
127+
WellKnownLspServerKinds.RoslynTypeScriptLspServer);
128+
129+
jsonRpc.StartListening();
130+
return languageServer;
131+
}
127132

128-
jsonRpc.StartListening();
129-
return languageServer;
133+
public static async Task<VSTypeScriptTestLspServer> CreateAsync(LspTestWorkspace testWorkspace, InitializationOptions options, AbstractLspLogger logger)
134+
{
135+
var locations = await GetAnnotatedLocationsAsync(testWorkspace, testWorkspace.CurrentSolution);
136+
var server = new VSTypeScriptTestLspServer(testWorkspace, locations, options, logger);
137+
await server.InitializeAsync();
138+
return server;
139+
}
130140
}
131141

132142
internal record TSRequest(Uri Document, string Project);

0 commit comments

Comments
 (0)