public async Task RazorRangeFormattingAsync_ValidRequest_InvokesLanguageServer() { // Arrange var filePath = "c:/Some/path/to/file.razor"; var uri = new Uri(filePath); var virtualDocument = new CSharpVirtualDocumentSnapshot(new Uri($"{filePath}.g.cs"), Mock.Of <ITextSnapshot>(MockBehavior.Strict), 1); LSPDocumentSnapshot document = new TestLSPDocumentSnapshot(uri, 1, new[] { virtualDocument }); var documentManager = new Mock <TrackingLSPDocumentManager>(MockBehavior.Strict); documentManager.Setup(manager => manager.TryGetDocument(It.IsAny <Uri>(), out document)) .Returns(true); var expectedEdit = new TextEdit() { NewText = "SomeEdit", Range = new Range() { Start = new Position(), End = new Position() } }; var requestInvoker = new Mock <LSPRequestInvoker>(MockBehavior.Strict); requestInvoker .Setup(r => r.ReinvokeRequestOnServerAsync <DocumentRangeFormattingParams, TextEdit[]>(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <DocumentRangeFormattingParams>(), It.IsAny <CancellationToken>())) .Returns(Task.FromResult(new[] { expectedEdit })); var uIContextManager = new Mock <RazorUIContextManager>(MockBehavior.Strict); var disposable = new Mock <IDisposable>(MockBehavior.Strict); var clientOptionsMonitor = new Mock <RazorLSPClientOptionsMonitor>(MockBehavior.Strict); var target = new DefaultRazorLanguageServerCustomMessageTarget( documentManager.Object, JoinableTaskContext, requestInvoker.Object, uIContextManager.Object, disposable.Object, clientOptionsMonitor.Object); var request = new RazorDocumentRangeFormattingParams() { HostDocumentFilePath = filePath, Kind = RazorLanguageKind.CSharp, ProjectedRange = new Range() { Start = new Position(), End = new Position() }, Options = new FormattingOptions() { TabSize = 4, InsertSpaces = true } }; // Act var result = await target.RazorRangeFormattingAsync(request, CancellationToken.None).ConfigureAwait(false); // Assert Assert.NotNull(result); var edit = Assert.Single(result.Edits); Assert.Equal("SomeEdit", edit.NewText); }
public async Task ResolveCodeActionsAsync_ReturnsSingleCodeAction() { // Arrange var requestInvoker = new Mock <LSPRequestInvoker>(MockBehavior.Strict); var csharpVirtualDocument = new CSharpVirtualDocumentSnapshot(new Uri("C:/path/to/file.razor.g.cs"), TextBuffer.CurrentSnapshot, hostDocumentSyncVersion: 0); var documentManager = new TestDocumentManager(); var razorUri = new Uri("C:/path/to/file.razor"); documentManager.AddDocument(razorUri, new TestLSPDocumentSnapshot(razorUri, version: 0, "Some Content", csharpVirtualDocument)); var expectedCodeAction = new VSInternalCodeAction() { Title = "Something", Data = new object() }; var unexpectedCodeAction = new VSInternalCodeAction() { Title = "Something Else", Data = new object() }; async IAsyncEnumerable <ReinvocationResponse <VSInternalCodeAction> > GetExpectedResultsAsync() { yield return(new ReinvocationResponse <VSInternalCodeAction>("languageClient", expectedCodeAction)); yield return(new ReinvocationResponse <VSInternalCodeAction>("languageClient", unexpectedCodeAction)); await Task.CompletedTask; } var expectedResponses = GetExpectedResultsAsync(); requestInvoker.Setup(invoker => invoker.ReinvokeRequestOnMultipleServersAsync <VSInternalCodeAction, VSInternalCodeAction>( It.IsAny <ITextBuffer>(), Methods.CodeActionResolveName, It.IsAny <Func <JToken, bool> >(), It.IsAny <VSInternalCodeAction>(), It.IsAny <CancellationToken>() )).Returns(expectedResponses); var uIContextManager = new Mock <RazorUIContextManager>(MockBehavior.Strict); var disposable = new Mock <IDisposable>(MockBehavior.Strict); var clientOptionsMonitor = new Mock <RazorLSPClientOptionsMonitor>(MockBehavior.Strict); var documentSynchronizer = new Mock <LSPDocumentSynchronizer>(MockBehavior.Strict); var target = new DefaultRazorLanguageServerCustomMessageTarget( documentManager, JoinableTaskContext, requestInvoker.Object, uIContextManager.Object, disposable.Object, clientOptionsMonitor.Object, documentSynchronizer.Object); var codeAction = new VSInternalCodeAction() { Title = "Something", }; var request = new RazorResolveCodeActionParams(razorUri, codeAction); // Act var result = await target.ResolveCodeActionsAsync(request, CancellationToken.None).ConfigureAwait(false); // Assert Assert.Equal(expectedCodeAction.Title, result.Title); }
public async Task ProvideCodeActionsAsync_ReturnsCodeActionsAsync() { // Arrange var testDocUri = new Uri("C:/path/to/file.razor"); var testVirtualDocUri = new Uri("C:/path/to/file2.razor.g"); var testCSharpDocUri = new Uri("C:/path/to/file.razor.g.cs"); var testVirtualDocument = new TestVirtualDocumentSnapshot(testVirtualDocUri, 0); var csharpVirtualDocument = new CSharpVirtualDocumentSnapshot(testCSharpDocUri, Mock.Of <ITextSnapshot>(MockBehavior.Strict), 0); LSPDocumentSnapshot testDocument = new TestLSPDocumentSnapshot(testDocUri, 0, testVirtualDocument, csharpVirtualDocument); var documentManager = new Mock <TrackingLSPDocumentManager>(MockBehavior.Strict); documentManager.Setup(manager => manager.TryGetDocument(It.IsAny <Uri>(), out testDocument)) .Returns(true); var languageServer1Response = new[] { new VSCodeAction() { Title = "Response 1" } }; var languageServer2Response = new[] { new VSCodeAction() { Title = "Response 2" } }; IEnumerable <VSCodeAction[]> expectedResults = new List <VSCodeAction[]>() { languageServer1Response, languageServer2Response }; var requestInvoker = new Mock <LSPRequestInvoker>(MockBehavior.Strict); requestInvoker.Setup(invoker => invoker.ReinvokeRequestOnMultipleServersAsync <CodeActionParams, VSCodeAction[]>( Methods.TextDocumentCodeActionName, LanguageServerKind.CSharp.ToContentType(), It.IsAny <Func <JToken, bool> >(), It.IsAny <CodeActionParams>(), It.IsAny <CancellationToken>() )).Returns(Task.FromResult(expectedResults)); var uIContextManager = new Mock <RazorUIContextManager>(MockBehavior.Strict); var disposable = new Mock <IDisposable>(MockBehavior.Strict); var target = new DefaultRazorLanguageServerCustomMessageTarget(documentManager.Object, JoinableTaskContext, requestInvoker.Object, uIContextManager.Object, disposable.Object); var request = new CodeActionParams() { TextDocument = new LanguageServer.Protocol.TextDocumentIdentifier() { Uri = testDocUri } }; // Act var result = await target.ProvideCodeActionsAsync(request, CancellationToken.None); // Assert Assert.Collection(result, r => Assert.Equal(languageServer1Response[0].Title, r.Title), r => Assert.Equal(languageServer2Response[0].Title, r.Title)); }
public async Task ProvideSemanticTokensAsync_ReturnsSemanticTokensAsync() { // Arrange var testDocUri = new Uri("C:/path/to - project/file.razor"); var testVirtualDocUri = new Uri("C:/path/to - project/file2.razor.g"); var testCSharpDocUri = new Uri("C:/path/to - project/file.razor.g.cs"); var documentVersion = 0; var testVirtualDocument = new TestVirtualDocumentSnapshot(testVirtualDocUri, 0); var csharpVirtualDocument = new CSharpVirtualDocumentSnapshot(testCSharpDocUri, TextBuffer.CurrentSnapshot, 0); LSPDocumentSnapshot testDocument = new TestLSPDocumentSnapshot(testDocUri, documentVersion, testVirtualDocument, csharpVirtualDocument); var documentManager = new Mock <TrackingLSPDocumentManager>(MockBehavior.Strict); documentManager.Setup(manager => manager.TryGetDocument(testDocUri, out testDocument)) .Returns(true); var expectedcSharpResults = new VSSemanticTokensResponse(); var requestInvoker = new Mock <LSPRequestInvoker>(MockBehavior.Strict); requestInvoker.Setup(invoker => invoker.ReinvokeRequestOnServerAsync <OmniSharp.Extensions.LanguageServer.Protocol.Models.SemanticTokensParams, VSSemanticTokensResponse>( TextBuffer, Methods.TextDocumentSemanticTokensFullName, LanguageServerKind.CSharp.ToLanguageServerName(), It.IsAny <OmniSharp.Extensions.LanguageServer.Protocol.Models.SemanticTokensParams>(), It.IsAny <CancellationToken>() )).Returns(Task.FromResult(new ReinvocationResponse <VSSemanticTokensResponse>("languageClient", expectedcSharpResults))); var uIContextManager = new Mock <RazorUIContextManager>(MockBehavior.Strict); var disposable = new Mock <IDisposable>(MockBehavior.Strict); var clientOptionsMonitor = new Mock <RazorLSPClientOptionsMonitor>(MockBehavior.Strict); var documentSynchronizer = new Mock <LSPDocumentSynchronizer>(MockBehavior.Strict); documentSynchronizer.Setup(r => r.TrySynchronizeVirtualDocumentAsync(0, It.IsAny <CSharpVirtualDocumentSnapshot>(), It.IsAny <CancellationToken>())) .Returns(Task.FromResult(true)); var target = new DefaultRazorLanguageServerCustomMessageTarget( documentManager.Object, JoinableTaskContext, requestInvoker.Object, uIContextManager.Object, disposable.Object, clientOptionsMonitor.Object, documentSynchronizer.Object); var request = new ProvideSemanticTokensParams() { TextDocument = new OmniSharpTextDocumentIdentifier() { Uri = new Uri("C:/path/to%20-%20project/file.razor") }, RequiredHostDocumentVersion = 0, }; var expectedResults = new ProvideSemanticTokensResponse( expectedcSharpResults.ResultId, expectedcSharpResults.Data, expectedcSharpResults.IsFinalized, documentVersion); // Act var result = await target.ProvideSemanticTokensAsync(request, CancellationToken.None); // Assert Assert.Equal(expectedResults, result); }
public async Task RazorServerReadyAsync_ReportsReadyAsync() { // Arrange var testDocUri = new Uri("C:/path/to/file.razor"); var testVirtualDocUri = new Uri("C:/path/to/file2.razor.g"); var testCSharpDocUri = new Uri("C:/path/to/file.razor.g.cs"); var testVirtualDocument = new TestVirtualDocumentSnapshot(testVirtualDocUri, 0); var csharpVirtualDocument = new CSharpVirtualDocumentSnapshot(testCSharpDocUri, TextBuffer.CurrentSnapshot, 0); LSPDocumentSnapshot testDocument = new TestLSPDocumentSnapshot(testDocUri, 0, testVirtualDocument, csharpVirtualDocument); var documentManager = new Mock <TrackingLSPDocumentManager>(MockBehavior.Strict); documentManager.Setup(manager => manager.TryGetDocument(It.IsAny <Uri>(), out testDocument)) .Returns(true); var expectedResults = new SemanticTokens { }; var requestInvoker = new Mock <LSPRequestInvoker>(MockBehavior.Strict); requestInvoker.Setup(invoker => invoker.ReinvokeRequestOnServerAsync <SemanticTokensParams, SemanticTokens>( TextBuffer, Methods.TextDocumentSemanticTokensFullName, LanguageServerKind.CSharp.ToContentType(), It.IsAny <SemanticTokensParams>(), It.IsAny <CancellationToken>() )).Returns(Task.FromResult(new ReinvocationResponse <SemanticTokens>("languageClient", expectedResults))); var uIContextManager = new Mock <RazorUIContextManager>(MockBehavior.Strict); uIContextManager.Setup(m => m.SetUIContextAsync(RazorLSPConstants.RazorActiveUIContextGuid, true, It.IsAny <CancellationToken>())) .Returns(() => Task.CompletedTask) .Verifiable(); var disposable = new Mock <IDisposable>(MockBehavior.Strict); disposable .Setup(d => d.Dispose()) .Verifiable(); var clientOptionsMonitor = new Mock <RazorLSPClientOptionsMonitor>(MockBehavior.Strict); var documentSynchronizer = new Mock <LSPDocumentSynchronizer>(MockBehavior.Strict); var target = new DefaultRazorLanguageServerCustomMessageTarget( documentManager.Object, JoinableTaskContext, requestInvoker.Object, uIContextManager.Object, disposable.Object, clientOptionsMonitor.Object, documentSynchronizer.Object); // Act await target.RazorServerReadyAsync(CancellationToken.None); // Assert uIContextManager.Verify(); disposable.Verify(); }
public async Task ProvideSemanticTokensAsync_ReturnsSemanticTokensAsync() { // Arrange var testDocUri = new Uri("C:/path/to - project/file.razor"); var testVirtualDocUri = new Uri("C:/path/to - project/file2.razor.g"); var testCSharpDocUri = new Uri("C:/path/to - project/file.razor.g.cs"); var documentVersion = 0; var testVirtualDocument = new TestVirtualDocumentSnapshot(testVirtualDocUri, 0); var csharpVirtualDocument = new CSharpVirtualDocumentSnapshot(testCSharpDocUri, Mock.Of <ITextSnapshot>(MockBehavior.Strict), 0); LSPDocumentSnapshot testDocument = new TestLSPDocumentSnapshot(testDocUri, documentVersion, testVirtualDocument, csharpVirtualDocument); var documentManager = new Mock <TrackingLSPDocumentManager>(MockBehavior.Strict); documentManager.Setup(manager => manager.TryGetDocument(testDocUri, out testDocument)) .Returns(true); var expectedcSharpResults = new OmniSharp.Extensions.LanguageServer.Protocol.Models.Proposals.SemanticTokens(); var requestInvoker = new Mock <LSPRequestInvoker>(MockBehavior.Strict); requestInvoker.Setup(invoker => invoker.ReinvokeRequestOnServerAsync <SemanticTokensParams, OmniSharp.Extensions.LanguageServer.Protocol.Models.Proposals.SemanticTokens>( LanguageServerConstants.LegacyRazorSemanticTokensEndpoint, LanguageServerKind.CSharp.ToContentType(), It.IsAny <SemanticTokensParams>(), It.IsAny <CancellationToken>() )).Returns(Task.FromResult(expectedcSharpResults)); var uIContextManager = new Mock <RazorUIContextManager>(MockBehavior.Strict); var disposable = new Mock <IDisposable>(MockBehavior.Strict); var clientOptionsMonitor = new Mock <RazorLSPClientOptionsMonitor>(MockBehavior.Strict); var target = new DefaultRazorLanguageServerCustomMessageTarget( documentManager.Object, JoinableTaskContext, requestInvoker.Object, uIContextManager.Object, disposable.Object, clientOptionsMonitor.Object); var request = new SemanticTokensParams() { TextDocument = new TextDocumentIdentifier() { Uri = new Uri("C:/path/to%20-%20project/file.razor") } }; var expectedResults = new ProvideSemanticTokensResponse(expectedcSharpResults, documentVersion); // Act var result = await target.ProvideSemanticTokensAsync(request, CancellationToken.None); // Assert Assert.Equal(expectedResults, result); }
public override VirtualDocumentSnapshot Update(IReadOnlyList <TextChange> changes, long hostDocumentVersion) { if (changes is null) { throw new ArgumentNullException(nameof(changes)); } _hostDocumentSyncVersion = hostDocumentVersion; TextBuffer.SetHostDocumentSyncVersion(_hostDocumentSyncVersion.Value); if (changes.Count == 0) { // Even though nothing changed here, we want the synchronizer to be aware of the host document version change. // So, let's make an empty edit to invoke the text buffer Changed events. TextBuffer.MakeEmptyEdit(); _currentSnapshot = UpdateSnapshot(); return(_currentSnapshot); } using var edit = TextBuffer.CreateEdit(EditOptions.None, reiteratedVersionNumber: null, InviolableEditTag.Instance); for (var i = 0; i < changes.Count; i++) { var change = changes[i]; if (change.IsDelete()) { edit.Delete(change.Span.Start, change.Span.Length); } else if (change.IsReplace()) { edit.Replace(change.Span.Start, change.Span.Length, change.NewText); } else if (change.IsInsert()) { edit.Insert(change.Span.Start, change.NewText); } else { throw new InvalidOperationException("Unknown edit type when updating LSP C# buffer."); } } edit.Apply(); _currentSnapshot = UpdateSnapshot(); return(_currentSnapshot); }
public CSharpVirtualDocument(Uri uri, ITextBuffer textBuffer) { if (uri is null) { throw new ArgumentNullException(nameof(uri)); } if (textBuffer is null) { throw new ArgumentNullException(nameof(textBuffer)); } Uri = uri; TextBuffer = textBuffer; _currentSnapshot = UpdateSnapshot(); }
public async Task ProvideSemanticTokensAsync_ReturnsSemanticTokensAsync() { // Arrange var testDocUri = new Uri("C:/path/to/file.razor"); var testVirtualDocUri = new Uri("C:/path/to/file2.razor.g"); var testCSharpDocUri = new Uri("C:/path/to/file.razor.g.cs"); var testVirtualDocument = new TestVirtualDocumentSnapshot(testVirtualDocUri, 0); var csharpVirtualDocument = new CSharpVirtualDocumentSnapshot(testCSharpDocUri, Mock.Of <ITextSnapshot>(), 0); LSPDocumentSnapshot testDocument = new TestLSPDocumentSnapshot(testDocUri, 0, testVirtualDocument, csharpVirtualDocument); var documentManager = new Mock <TrackingLSPDocumentManager>(MockBehavior.Strict); documentManager.Setup(manager => manager.TryGetDocument(It.IsAny <Uri>(), out testDocument)) .Returns(true); var expectedResults = new SemanticTokens { }; var requestInvoker = new Mock <LSPRequestInvoker>(MockBehavior.Strict); requestInvoker.Setup(invoker => invoker.ReinvokeRequestOnServerAsync <SemanticTokensParams, SemanticTokens>( LanguageServerConstants.LegacyRazorSemanticTokensEndpoint, LanguageServerKind.CSharp.ToContentType(), It.IsAny <SemanticTokensParams>(), It.IsAny <CancellationToken>() )).Returns(Task.FromResult(expectedResults)); var uIContextManager = new Mock <RazorUIContextManager>(MockBehavior.Strict); var target = new DefaultRazorLanguageServerCustomMessageTarget(documentManager.Object, JoinableTaskContext, requestInvoker.Object, uIContextManager.Object); var request = new SemanticTokensParams() { TextDocument = new TextDocumentIdentifier() { Uri = testDocUri } }; // Act var result = await target.ProvideSemanticTokensAsync(request, CancellationToken.None); // Assert Assert.Equal(expectedResults, result); }
public override VirtualDocumentSnapshot Update(IReadOnlyList <TextChange> changes, long hostDocumentVersion) { if (changes is null) { throw new ArgumentNullException(nameof(changes)); } _hostDocumentSyncVersion = hostDocumentVersion; if (changes.Count == 0) { _currentSnapshot = UpdateSnapshot(); return(_currentSnapshot); } using var edit = TextBuffer.CreateEdit(EditOptions.None, reiteratedVersionNumber: null, InviolableEditTag.Instance); for (var i = 0; i < changes.Count; i++) { var change = changes[i]; if (change.IsDelete()) { edit.Delete(change.Span.Start, change.Span.Length); } else if (change.IsReplace()) { edit.Replace(change.Span.Start, change.Span.Length, change.NewText); } else if (change.IsInsert()) { edit.Insert(change.Span.Start, change.NewText); } else { throw new InvalidOperationException("Unknown edit type when updating LSP C# buffer."); } } edit.Apply(); _currentSnapshot = UpdateSnapshot(); return(_currentSnapshot); }
public async Task RazorServerReadyAsync_SetsUIContext() { // Arrange var testDocUri = new Uri("C:/path/to/file.razor"); var testVirtualDocUri = new Uri("C:/path/to/file2.razor.g"); var testCSharpDocUri = new Uri("C:/path/to/file.razor.g.cs"); var testVirtualDocument = new TestVirtualDocumentSnapshot(testVirtualDocUri, 0); var csharpVirtualDocument = new CSharpVirtualDocumentSnapshot(testCSharpDocUri, Mock.Of <ITextSnapshot>(), 0); LSPDocumentSnapshot testDocument = new TestLSPDocumentSnapshot(testDocUri, 0, testVirtualDocument, csharpVirtualDocument); var documentManager = new Mock <TrackingLSPDocumentManager>(MockBehavior.Strict); documentManager.Setup(manager => manager.TryGetDocument(It.IsAny <Uri>(), out testDocument)) .Returns(true); var expectedResults = new SemanticTokens { }; var requestInvoker = new Mock <LSPRequestInvoker>(MockBehavior.Strict); requestInvoker.Setup(invoker => invoker.ReinvokeRequestOnServerAsync <SemanticTokensParams, SemanticTokens>( LanguageServerConstants.LegacyRazorSemanticTokensEndpoint, LanguageServerKind.CSharp.ToContentType(), It.IsAny <SemanticTokensParams>(), It.IsAny <CancellationToken>() )).Returns(Task.FromResult(expectedResults)); var uIContextManager = new Mock <RazorUIContextManager>(MockBehavior.Strict); uIContextManager.Setup(m => m.SetUIContextAsync(RazorLSPConstants.RazorActiveUIContextGuid, true, It.IsAny <CancellationToken>())) .Returns(() => Task.CompletedTask) .Verifiable(); var target = new DefaultRazorLanguageServerCustomMessageTarget(documentManager.Object, JoinableTaskContext, requestInvoker.Object, uIContextManager.Object); // Act await target.RazorServerReadyAsync(CancellationToken.None); // Assert uIContextManager.Verify(); }
public void DocumentManager_Changed_VirtualDocumentChanged_UpdatesFileInfo() { // Arrange var csharpSnapshot = new CSharpVirtualDocumentSnapshot(new Uri("C:/path/to/something.razor.g.cs"), Mock.Of <ITextSnapshot>(), hostDocumentSyncVersion: 1337); var lspDocument = new TestLSPDocumentSnapshot(new Uri("C:/path/to/something.razor"), 1337, csharpSnapshot); var fileInfoProvider = new Mock <RazorDynamicFileInfoProvider>(MockBehavior.Strict); fileInfoProvider.Setup(provider => provider.UpdateLSPFileInfo(lspDocument.Uri, It.IsAny <DynamicDocumentContainer>())) .Verifiable(); var publisher = new CSharpVirtualDocumentPublisher(fileInfoProvider.Object); var args = new LSPDocumentChangeEventArgs( old: Mock.Of <LSPDocumentSnapshot>(), @new: lspDocument, virtualOld: Mock.Of <VirtualDocumentSnapshot>(), virtualNew: csharpSnapshot, LSPDocumentChangeKind.VirtualDocumentChanged); // Act publisher.DocumentManager_Changed(sender: null, args); // Assert fileInfoProvider.VerifyAll(); }
public async void ProvideCodeActionsAsync_ReturnsCodeActions() { // Arrange var testDocUri = new Uri("C:/path/to/file.razor"); var testVirtualDocUri = new Uri("C:/path/to/file2.razor.g"); var testCSharpDocUri = new Uri("C:/path/to/file.razor.g.cs"); var testVirtualDocument = new TestVirtualDocumentSnapshot(testVirtualDocUri, 0); var csharpVirtualDocument = new CSharpVirtualDocumentSnapshot(testCSharpDocUri, Mock.Of <ITextSnapshot>(), 0); LSPDocumentSnapshot testDocument = new TestLSPDocumentSnapshot(testDocUri, 0, testVirtualDocument, csharpVirtualDocument); var documentManager = new Mock <TrackingLSPDocumentManager>(); documentManager.Setup(manager => manager.TryGetDocument(It.IsAny <Uri>(), out testDocument)) .Returns(true); var expectedResults = new[] { new VSCodeAction() }; var requestInvoker = new Mock <LSPRequestInvoker>(); requestInvoker.Setup(invoker => invoker.ReinvokeRequestOnServerAsync <CodeActionParams, VSCodeAction[]>( Methods.TextDocumentCodeActionName, LanguageServerKind.CSharp.ToContentType(), It.IsAny <CodeActionParams>(), It.IsAny <CancellationToken>() )).Returns(Task.FromResult(expectedResults)); var target = new DefaultRazorLanguageServerCustomMessageTarget(documentManager.Object, JoinableTaskContext, requestInvoker.Object); var request = new CodeActionParams() { TextDocument = new TextDocumentIdentifier() { Uri = testDocUri } }; // Act var result = await target.ProvideCodeActionsAsync(request, CancellationToken.None); // Assert Assert.Equal(expectedResults, result); }
public async Task ProvideCodeActionsAsync_ReturnsCodeActionsAsync() { // Arrange var testDocUri = new Uri("C:/path/to/file.razor"); var testVirtualDocUri = new Uri("C:/path/to/file2.razor.g"); var testCSharpDocUri = new Uri("C:/path/to/file.razor.g.cs"); var testVirtualDocument = new TestVirtualDocumentSnapshot(testVirtualDocUri, 0); var csharpVirtualDocument = new CSharpVirtualDocumentSnapshot(testCSharpDocUri, TextBuffer.CurrentSnapshot, 0); LSPDocumentSnapshot testDocument = new TestLSPDocumentSnapshot(testDocUri, 0, testVirtualDocument, csharpVirtualDocument); var documentManager = new Mock <TrackingLSPDocumentManager>(MockBehavior.Strict); documentManager.Setup(manager => manager.TryGetDocument(It.IsAny <Uri>(), out testDocument)) .Returns(true); var languageServer1Response = new[] { new VSInternalCodeAction() { Title = "Response 1" } }; var languageServer2Response = new[] { new VSInternalCodeAction() { Title = "Response 2" } }; async IAsyncEnumerable <ReinvocationResponse <IReadOnlyList <VSInternalCodeAction> > > GetExpectedResultsAsync() { yield return(new ReinvocationResponse <IReadOnlyList <VSInternalCodeAction> >("languageClient", languageServer1Response)); yield return(new ReinvocationResponse <IReadOnlyList <VSInternalCodeAction> >("languageClient", languageServer2Response)); await Task.CompletedTask; } var expectedResults = GetExpectedResultsAsync(); var requestInvoker = new Mock <LSPRequestInvoker>(MockBehavior.Strict); requestInvoker.Setup(invoker => invoker.ReinvokeRequestOnMultipleServersAsync <CodeActionParams, IReadOnlyList <VSInternalCodeAction> >( TextBuffer, Methods.TextDocumentCodeActionName, It.IsAny <Func <JToken, bool> >(), It.IsAny <CodeActionParams>(), It.IsAny <CancellationToken>() )).Returns(expectedResults); var uIContextManager = new Mock <RazorUIContextManager>(MockBehavior.Strict); var disposable = new Mock <IDisposable>(MockBehavior.Strict); var documentSynchronizer = new Mock <LSPDocumentSynchronizer>(MockBehavior.Strict); var target = new DefaultRazorLanguageServerCustomMessageTarget( documentManager.Object, JoinableTaskContext, requestInvoker.Object, uIContextManager.Object, disposable.Object, EditorSettingsManager, documentSynchronizer.Object); var request = new CodeActionParams() { TextDocument = new LanguageServer.Protocol.TextDocumentIdentifier() { Uri = testDocUri } }; // Act var result = await target.ProvideCodeActionsAsync(request, CancellationToken.None); // Assert Assert.Collection(result, r => Assert.Equal(languageServer1Response[0].Title, r.Title), r => Assert.Equal(languageServer2Response[0].Title, r.Title)); }