public async Task Handle_OneCodeActionProviderWithMultipleCodeActions() { // Arrange var documentPath = "C:/path/to/Page.razor"; var codeDocument = CreateCodeDocument("@code {}"); var documentResolver = CreateDocumentResolver(documentPath, codeDocument); var codeActionEndpoint = new CodeActionEndpoint( _documentMappingService, new RazorCodeActionProvider[] { new MockMultipleRazorCodeActionProvider(), }, Array.Empty <CSharpCodeActionProvider>(), LegacyDispatcher, documentResolver, _languageServer, _languageServerFeatureOptions) { _supportsCodeActionResolve = false }; var request = new CodeActionParams() { TextDocument = new TextDocumentIdentifier(new Uri(documentPath)), Range = new Range(new Position(0, 1), new Position(0, 1)), Context = new OmniSharpVSCodeActionContext() }; // Act var commandOrCodeActionContainer = await codeActionEndpoint.Handle(request, default); // Assert Assert.Equal(2, commandOrCodeActionContainer.Count()); }
public async Task Handle_NoProviders() { // Arrange var documentPath = "C:/path/to/Page.razor"; var codeDocument = CreateCodeDocument("@code {}"); var documentResolver = CreateDocumentResolver(documentPath, codeDocument); var codeActionEndpoint = new CodeActionEndpoint( DocumentMappingService, Array.Empty <RazorCodeActionProvider>(), Array.Empty <CSharpCodeActionProvider>(), Dispatcher, documentResolver, LanguageServer, LanguageServerFeatureOptions) { _supportsCodeActionResolve = false }; var request = new RazorCodeActionParams() { TextDocument = new TextDocumentIdentifier(new Uri(documentPath)), Range = new Range(new Position(0, 1), new Position(0, 1)), Context = new ExtendedCodeActionContext() }; // Act var commandOrCodeActionContainer = await codeActionEndpoint.Handle(request, default); // Assert Assert.Null(commandOrCodeActionContainer); }
public async Task GetCSharpCodeActionsFromLanguageServerAsync_ReturnsCodeActions() { // Arrange var documentPath = "C:/path/to/Page.razor"; var codeDocument = CreateCodeDocument("@code {}"); var documentResolver = CreateDocumentResolver(documentPath, codeDocument); var projectedRange = new Range(new Position(15, 2), new Position(15, 2)); var documentMappingService = CreateDocumentMappingService(projectedRange); var languageServer = CreateLanguageServer(); var codeActionEndpoint = new CodeActionEndpoint( documentMappingService, Array.Empty <RazorCodeActionProvider>(), new CSharpCodeActionProvider[] { new MockCSharpCodeActionProvider() }, Dispatcher, documentResolver, languageServer, _languageServerFeatureOptions) { _supportsCodeActionResolve = false }; var initialRange = new Range(new Position(0, 1), new Position(0, 1)); var request = new CodeActionParams() { TextDocument = new TextDocumentIdentifier(new Uri(documentPath)), Range = initialRange, Context = new OmniSharpVSCodeActionContext() { SelectionRange = initialRange } }; var context = await codeActionEndpoint.GenerateRazorCodeActionContextAsync(request, default); // Act var results = await codeActionEndpoint.GetCSharpCodeActionsFromLanguageServerAsync(context, default); // Assert Assert.Single(results); var diagnostics = results.Single().Diagnostics.ToArray(); Assert.Equal(2, diagnostics.Length); // Diagnostic ranges contain the projected range for // 1. Range // 2. SelectionRange // // This helps verify that the CodeActionEndpoint is mapping the // ranges correctly using the mapping service Assert.Equal(projectedRange, diagnostics[0].Range); Assert.Equal(projectedRange, diagnostics[1].Range); }
public async Task Handle_MultipleMixedProvider_SupportsCodeActionResolveTrue() { // Arrange var documentPath = "C:/path/to/Page.razor"; var codeDocument = CreateCodeDocument("@code {}"); var documentResolver = CreateDocumentResolver(documentPath, codeDocument); var codeActionEndpoint = new CodeActionEndpoint( DocumentMappingService, new RazorCodeActionProvider[] { new MockRazorCodeActionProvider(), new MockRazorCommandProvider(), new MockNullRazorCodeActionProvider() }, Array.Empty <CSharpCodeActionProvider>(), Dispatcher, documentResolver, LanguageServer, LanguageServerFeatureOptions) { _supportsCodeActionResolve = true }; var request = new RazorCodeActionParams() { TextDocument = new TextDocumentIdentifier(new Uri(documentPath)), Range = new Range(new Position(0, 1), new Position(0, 1)), Context = new ExtendedCodeActionContext() }; // Act var commandOrCodeActionContainer = await codeActionEndpoint.Handle(request, default); // Assert Assert.Collection(commandOrCodeActionContainer, c => { Assert.True(c.IsCodeAction); Assert.True(c.CodeAction is RazorCodeAction); }, c => { Assert.True(c.IsCodeAction); Assert.True(c.CodeAction is RazorCodeAction); }); }
public async Task Handle_MultipleMixedProvider_SupportsCodeActionResolveFalse() { // Arrange var documentPath = "C:/path/to/Page.razor"; var codeDocument = CreateCodeDocument("@code {}"); var documentResolver = CreateDocumentResolver(documentPath, codeDocument); var codeActionEndpoint = new CodeActionEndpoint( _documentMappingService, new RazorCodeActionProvider[] { new MockRazorCodeActionProvider(), new MockRazorCommandProvider(), new MockNullRazorCodeActionProvider() }, Array.Empty <CSharpCodeActionProvider>(), LegacyDispatcher, documentResolver, _languageServer, _languageServerFeatureOptions) { _supportsCodeActionResolve = false }; var request = new CodeActionParams() { TextDocument = new TextDocumentIdentifier(new Uri(documentPath)), Range = new Range(new Position(0, 1), new Position(0, 1)), Context = new OmniSharpVSCodeActionContext() }; // Act var commandOrCodeActionContainer = await codeActionEndpoint.Handle(request, default); // Assert Assert.Collection(commandOrCodeActionContainer, c => { Assert.True(c.IsCommand); var command = Assert.IsType <Command>(c.Command); var codeActionParams = command.Arguments.First().ToObject <RazorCodeActionResolutionParams>(); Assert.Equal(LanguageServerConstants.CodeActions.EditBasedCodeActionCommand, codeActionParams.Action); }, c => Assert.True(c.IsCommand)); }
public async Task GetCSharpCodeActionsFromLanguageServerAsync_InvalidRangeMapping() { // Arrange var documentPath = "C:/path/to/Page.razor"; var codeDocument = CreateCodeDocument("@code {}"); var documentResolver = CreateDocumentResolver(documentPath, codeDocument); Range projectedRange = null; var documentMappingService = Mock.Of <DefaultRazorDocumentMappingService>( d => d.TryMapToProjectedDocumentRange(It.IsAny <RazorCodeDocument>(), It.IsAny <Range>(), out projectedRange) == false , MockBehavior.Strict); var codeActionEndpoint = new CodeActionEndpoint( documentMappingService, Array.Empty <RazorCodeActionProvider>(), new CSharpCodeActionProvider[] { new MockCSharpCodeActionProvider() }, Dispatcher, documentResolver, LanguageServer, LanguageServerFeatureOptions) { _supportsCodeActionResolve = false }; var initialRange = new Range(new Position(0, 1), new Position(0, 1)); var request = new RazorCodeActionParams() { TextDocument = new TextDocumentIdentifier(new Uri(documentPath)), Range = initialRange, Context = new ExtendedCodeActionContext() }; var context = await codeActionEndpoint.GenerateRazorCodeActionContextAsync(request, default); // Act var results = await codeActionEndpoint.GetCSharpCodeActionsFromLanguageServerAsync(context, default); // Assert Assert.Empty(results); Assert.Equal(initialRange, context.Request.Range); }
public async Task Handle_MultipleMixedProvider() { // Arrange var documentPath = "C:/path/to/Page.razor"; var codeDocument = CreateCodeDocument("@code {}"); var documentResolver = CreateDocumentResolver(documentPath, codeDocument); var documentMappingService = CreateDocumentMappingService(); var languageServer = CreateLanguageServer(); var codeActionEndpoint = new CodeActionEndpoint( documentMappingService, new RazorCodeActionProvider[] { new MockRazorCodeActionProvider(), new MockNullRazorCodeActionProvider(), new MockRazorCodeActionProvider(), new MockNullRazorCodeActionProvider(), }, new CSharpCodeActionProvider[] { new MockCSharpCodeActionProvider(), new MockCSharpCodeActionProvider() }, Dispatcher, documentResolver, languageServer, LanguageServerFeatureOptions) { _supportsCodeActionResolve = false }; var request = new RazorCodeActionParams() { TextDocument = new TextDocumentIdentifier(new Uri(documentPath)), Range = new Range(new Position(0, 1), new Position(0, 1)), Context = new ExtendedCodeActionContext() }; // Act var commandOrCodeActionContainer = await codeActionEndpoint.Handle(request, default); // Assert Assert.Equal(4, commandOrCodeActionContainer.Count()); }
public async Task GetCSharpCodeActionsFromLanguageServerAsync_ReturnsCodeActions() { // Arrange var documentPath = "C:/path/to/Page.razor"; var codeDocument = CreateCodeDocument("@code {}"); var documentResolver = CreateDocumentResolver(documentPath, codeDocument); var projectedRange = new Range(new Position(15, 2), new Position(15, 2)); var documentMappingService = CreateDocumentMappingService(projectedRange); var languageServer = CreateLanguageServer(); var codeActionEndpoint = new CodeActionEndpoint( documentMappingService, Array.Empty <RazorCodeActionProvider>(), new CSharpCodeActionProvider[] { new MockCSharpCodeActionProvider() }, Dispatcher, documentResolver, languageServer, LanguageServerFeatureOptions) { _supportsCodeActionResolve = false }; var initialRange = new Range(new Position(0, 1), new Position(0, 1)); var request = new RazorCodeActionParams() { TextDocument = new TextDocumentIdentifier(new Uri(documentPath)), Range = initialRange, Context = new ExtendedCodeActionContext() }; var context = await codeActionEndpoint.GenerateRazorCodeActionContextAsync(request, default); // Act var results = await codeActionEndpoint.GetCSharpCodeActionsFromLanguageServerAsync(context, default); // Assert Assert.Single(results); Assert.Equal(projectedRange, context.Request.Range); }
public async Task GenerateRazorCodeActionContextAsync_WithSelectionRange() { // Arrange var documentPath = "C:/path/to/Page.razor"; var codeDocument = CreateCodeDocument("@code {}"); var documentResolver = CreateDocumentResolver(documentPath, codeDocument); var codeActionEndpoint = new CodeActionEndpoint( DocumentMappingService, new RazorCodeActionProvider[] { new MockRazorCodeActionProvider() }, Array.Empty <CSharpCodeActionProvider>(), Dispatcher, documentResolver, LanguageServer, LanguageServerFeatureOptions) { _supportsCodeActionResolve = false }; var initialRange = new Range(new Position(0, 1), new Position(0, 1)); var selectionRange = new Range(new Position(0, 5), new Position(0, 5)); var request = new RazorCodeActionParams() { TextDocument = new TextDocumentIdentifier(new Uri(documentPath)), Range = initialRange, Context = new ExtendedCodeActionContext() { SelectionRange = selectionRange, } }; // Act var razorCodeActionContext = await codeActionEndpoint.GenerateRazorCodeActionContextAsync(request, default); // Assert Assert.NotNull(razorCodeActionContext); Assert.Equal(selectionRange, razorCodeActionContext.Request.Range); }