public async Task ShouldRouteToCorrect_Request() { var textDocumentSyncHandler = TextDocumentSyncHandlerExtensions.With(DocumentSelector.ForPattern("**/*.cs")); textDocumentSyncHandler.Handle(Arg.Any <DidSaveTextDocumentParams>()).Returns(Task.CompletedTask); var codeActionHandler = Substitute.For <ICodeActionHandler>(); codeActionHandler.GetRegistrationOptions().Returns(new TextDocumentRegistrationOptions() { DocumentSelector = DocumentSelector.ForPattern("**/*.cs") }); codeActionHandler .Handle(Arg.Any <CodeActionParams>(), Arg.Any <CancellationToken>()) .Returns(new CommandContainer()); var collection = new HandlerCollection { textDocumentSyncHandler, codeActionHandler }; var mediator = new LspRequestRouter(collection, _testLoggerFactory); var id = Guid.NewGuid().ToString(); var @params = new DidSaveTextDocumentParams() { TextDocument = new TextDocumentIdentifier(new Uri("file:///c:/test/123.cs")) }; var request = new Request(id, "textDocument/codeAction", JObject.Parse(JsonConvert.SerializeObject(@params))); await mediator.RouteRequest(mediator.GetDescriptor(request), request); await codeActionHandler.Received(1).Handle(Arg.Any <CodeActionParams>(), Arg.Any <CancellationToken>()); }
public async Task RequestsCancellation() { var executeCommandHandler = Substitute.For <IExecuteCommandHandler>(); executeCommandHandler .Handle(Arg.Any <ExecuteCommandParams>(), Arg.Any <CancellationToken>()) .Returns(async(c) => { await Task.Delay(1000, c.Arg <CancellationToken>()); throw new XunitException("Task was not cancelled in time!"); }); var collection = new HandlerCollection { executeCommandHandler }; var mediator = new LspRequestRouter(collection, _testLoggerFactory); var id = Guid.NewGuid().ToString(); var @params = new ExecuteCommandParams() { Command = "123" }; var request = new Request(id, "workspace/executeCommand", JObject.Parse(JsonConvert.SerializeObject(@params))); var response = ((IRequestRouter)mediator).RouteRequest(request); mediator.CancelRequest(id); var result = await response; result.IsError.Should().BeTrue(); result.Error.ShouldBeEquivalentTo(new RequestCancelled()); }
public async Task ShouldRouteToCorrect_Notification_WithManyHandlers() { var textDocumentSyncHandler = TextDocumentSyncHandlerExtensions.With(DocumentSelector.ForPattern("**/*.cs")); var textDocumentSyncHandler2 = TextDocumentSyncHandlerExtensions.With(DocumentSelector.ForPattern("**/*.cake")); textDocumentSyncHandler.Handle(Arg.Any <DidSaveTextDocumentParams>()).Returns(Task.CompletedTask); textDocumentSyncHandler2.Handle(Arg.Any <DidSaveTextDocumentParams>()).Returns(Task.CompletedTask); var collection = new HandlerCollection { textDocumentSyncHandler, textDocumentSyncHandler2 }; var mediator = new LspRequestRouter(collection, _testLoggerFactory); var @params = new DidSaveTextDocumentParams() { TextDocument = new TextDocumentIdentifier(new Uri("file:///c:/test/123.cake")) }; var request = new Notification("textDocument/didSave", JObject.Parse(JsonConvert.SerializeObject(@params))); await mediator.RouteNotification(mediator.GetDescriptor(request), request); await textDocumentSyncHandler.Received(0).Handle(Arg.Any <DidSaveTextDocumentParams>()); await textDocumentSyncHandler2.Received(1).Handle(Arg.Any <DidSaveTextDocumentParams>()); }
public void Should_Contain_AllDefinedMethods_OnLanguageServer_WithDifferentKeys(Type requestHandler, Type type2, string key, string key2, int count) { var handler = new HandlerCollection(); var sub = (IJsonRpcHandler)Substitute.For(new Type[] { requestHandler, type2 }, new object[0]); if (sub is IRegistration <TextDocumentRegistrationOptions> reg) { reg.GetRegistrationOptions() .Returns(new TextDocumentRegistrationOptions() { DocumentSelector = new DocumentSelector() }); } var sub2 = (IJsonRpcHandler)Substitute.For(new Type[] { requestHandler, type2 }, new object[0]); if (sub2 is IRegistration <TextDocumentRegistrationOptions> reg2) { reg2.GetRegistrationOptions() .Returns(new TextDocumentRegistrationOptions() { DocumentSelector = new DocumentSelector() }); } handler.Add(sub); handler.Add(sub2); handler._handlers.Should().Contain(x => x.Method == key); handler._handlers.Should().Contain(x => x.Method == key2); handler._handlers.Count.Should().Be(count); }
public void Should_Contain_AllDefinedTextDocumentSyncMethods(string key, int count) { var handler = new HandlerCollection(); var sub = (IJsonRpcHandler)TextDocumentSyncHandlerExtensions.With(DocumentSelector.ForPattern("**/*.something")); handler.Add(sub); handler._handlers.Should().Contain(x => x.Method == key); handler._handlers.Count.Should().Be(count); }
public void Should_Contain_AllDefinedMethods(Type requestHandler, string key, int count) { var handler = new HandlerCollection(); var sub = (IJsonRpcHandler)Substitute.For(new Type[] { requestHandler }, new object[0]); handler.Add(sub); handler._handlers.Should().Contain(x => x.Method == key); handler._handlers.Count.Should().Be(count); }
public void Should_DisallowNullSupportedCapabilities(IJsonRpcHandler handler, object instance) { var textDocumentSyncHandler = TextDocumentSyncHandlerExtensions.With(DocumentSelector.ForPattern("**/*.cs")); var collection = new HandlerCollection { textDocumentSyncHandler, handler }; var provider = new ClientCapabilityProvider(collection); HasHandler(provider, instance).Should().BeFalse(); }
public void Should_AllowSpecificHandlers_ToBeAdded(string method, Type handlerType) { var handler = new HandlerCollection(); var sub = (IJsonRpcHandler)Substitute.For(new Type[] { handlerType }, new object[0]); var sub2 = (IJsonRpcHandler)Substitute.For(new Type[] { handlerType }, new object[0]); handler.Add(method, sub); handler.Add(method, sub2); handler._handlers.Should().Contain(x => x.Method == method); handler._handlers.Should().Contain(x => x.Method == method); handler._handlers.Count.Should().Be(1); }
public void Should_Contain_AllDefinedMethods_ForDifferentKeys(string key, int count) { var handler = new HandlerCollection(); var sub = TextDocumentSyncHandlerExtensions.With(DocumentSelector.ForPattern("**/*.cs")); var sub2 = TextDocumentSyncHandlerExtensions.With(DocumentSelector.ForPattern("**/*.cake")); handler.Add(sub); handler.Add(sub2); handler._handlers.Should().Contain(x => x.Method == key); handler._handlers.Count.Should().Be(count); }
public void Should_Contain_AllDefinedLanguageServerMethods(string key, int count) { var handler = new HandlerCollection(); handler.Add( Substitute.For <IInitializeHandler>(), Substitute.For <IInitializedHandler>(), Substitute.For <IExitHandler>(), Substitute.For <IShutdownHandler>() ); handler._handlers.Should().Contain(x => x.Method == key); handler._handlers.Count.Should().Be(count); }
public void Should_Contain_AllConcreteDefinedMethods() { var handler = new HandlerCollection(); handler.Add( Substitute.For <IExitHandler>(), Substitute.For <IInitializeHandler>(), Substitute.For <IInitializedHandler>(), Substitute.For <IShutdownHandler>() ); handler._handlers.Should().Contain(x => x.Method == "exit"); handler._handlers.Should().Contain(x => x.Method == "shutdown"); handler._handlers.Count.Should().Be(4); }
public async Task RequestsCancellation() { var textDocumentSyncHandler = TextDocumentSyncHandlerExtensions.With(DocumentSelector.ForPattern("**/*.cs")); textDocumentSyncHandler.Handle(Arg.Any <DidSaveTextDocumentParams>()).Returns(Task.CompletedTask); var codeActionHandler = Substitute.For <ICodeActionHandler>(); codeActionHandler.GetRegistrationOptions().Returns(new TextDocumentRegistrationOptions() { DocumentSelector = DocumentSelector.ForPattern("**/*.cs") }); codeActionHandler .Handle(Arg.Any <CodeActionParams>(), Arg.Any <CancellationToken>()) .Returns(async(c) => { await Task.Delay(1000, c.Arg <CancellationToken>()); throw new XunitException("Task was not cancelled in time!"); return(new CommandContainer()); }); var collection = new HandlerCollection { textDocumentSyncHandler, codeActionHandler }; var mediator = new LspRequestRouter(collection, _testLoggerFactory); var id = Guid.NewGuid().ToString(); var @params = new CodeActionParams() { TextDocument = new TextDocumentIdentifier(new Uri("file:///c:/test/123.cs")), Range = new Range(new Position(1, 1), new Position(2, 2)), Context = new CodeActionContext() { Diagnostics = new Container <Diagnostic>() } }; var request = new Request(id, "textDocument/codeAction", JObject.Parse(JsonConvert.SerializeObject(@params))); var response = ((IRequestRouter)mediator).RouteRequest(request); mediator.CancelRequest(id); var result = await response; result.IsError.Should().BeTrue(); result.Error.ShouldBeEquivalentTo(new RequestCancelled()); }