public async Task NestedInteraction() { string topLevelPrompt; using (var inter = await _session.BeginInteractionAsync()) { topLevelPrompt = inter.Prompt; var evalTask = _session.EvaluateAsync <string>("readline('2')", REvaluationKind.Reentrant); using (var inter2 = await _session.BeginInteractionAsync()) { inter2.Prompt.Should().Be("2"); var evalTask2 = _session.EvaluateAsync <string>("readline('3')", REvaluationKind.Reentrant); using (var inter3 = await _session.BeginInteractionAsync()) { inter3.Prompt.Should().Be("3"); inter3.RespondAsync("0 + 3\n").DoNotWait(); } await evalTask2; evalTask2.Result.Should().Be("0 + 3"); inter2.RespondAsync("0 + 2\n").DoNotWait(); } await evalTask; evalTask.Result.Should().Be("0 + 2"); await inter.RespondAsync("0 + 1"); } using (var inter = await _session.BeginInteractionAsync()) { inter.Prompt.Should().Be(topLevelPrompt); } }
public async Task StopReentrantLoop() { var callback = new RSessionCallbackStub(); var session = new RSession(0, _testMethod.FileSystemSafeName, _brokerClient, new AsyncReaderWriterLock().CreateExclusiveReaderLock(), () => { }); await session.StartHostAsync(new RHostStartupInfo(), callback, 50000); var testMrs = new AsyncManualResetEvent(); callback.PlotHandler = (message, ct) => { testMrs.Set(); return(session.EvaluateAsync("x <- 1\n")); }; Task responceTask; using (var interaction = await session.BeginInteractionAsync()) { responceTask = interaction.RespondAsync("plot(1)\n"); } await testMrs.WaitAsync().Should().BeCompletedAsync(); await session.StopHostAsync().Should().BeCompletedAsync(20000); session.IsHostRunning.Should().BeFalse(); await responceTask.Should().BeCanceledAsync(); }
public async Task EvaluateAsync_DisconnectedFromTheStart() { using (var session = new RSession(0, _brokerConnector, () => { })) { // ReSharper disable once AccessToDisposedClosure Func <Task> f = () => session.EvaluateAsync("x <- 1"); await f.ShouldThrowAsync <RHostDisconnectedException>(); } }
public async Task EvaluateAsync_DisconnectedFromTheStart() { using (var session = new RSession(0, _testMethod.FileSystemSafeName, _fileSystem, _brokerClient, new AsyncReaderWriterLock().CreateExclusiveReaderLock(), () => { })) { // ReSharper disable once AccessToDisposedClosure Func <Task> f = () => session.EvaluateAsync("x <- 1"); await f.ShouldThrowAsync <RHostDisconnectedException>(); } }
public async Task BreakAsync(CancellationToken ct = default(CancellationToken)) { await TaskUtilities.SwitchToBackgroundThread(); // Evaluation will not end until after Browse> is responded to, but this method must indicate completion // as soon as the prompt appears. So don't wait for this, but wait for the prompt instead. RSession.EvaluateAsync("browser()", REvaluationKind.Reentrant, ct) .SilenceException <MessageTransportException>().DoNotWait(); // Wait until prompt appears, but don't actually respond to it. using (var inter = await RSession.BeginInteractionAsync(true, ct)) { } }
public async Task StartupOptions() { var session = new RSession(0, _testMethod.FileSystemSafeName, _fileSystem, _brokerClient, new AsyncReaderWriterLock().CreateExclusiveReaderLock(), () => { }); var info = new RHostStartupInfo(string.Empty, null, 1251, 80, false, false, false, true); await session.StartHostAsync(info, new RHostOptionsTestCallback(), HostStartTimeout); var result = await session.EvaluateAsync("rtvs:::view_env$view_mode"); result.Result.ToObject <int>().Should().Be(1); result = await session.EvaluateAsync("Sys.getlocale()"); result.Result.ToObject <string>().Should().Contain("1251"); result = await session.EvaluateAsync("as.list(getOption('repos'))"); var urls = result.Result.ToObject <IDictionary <string, string> >(); Uri.TryCreate(urls.First().Value, UriKind.Absolute, out Uri uri).Should().BeTrue(); uri.Host.Should().Be("test.cran.info"); }