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);
                }
            }
示例#2
0
        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>();
     }
 }
示例#4
0
 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>();
     }
 }
示例#5
0
        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)) { }
        }
示例#6
0
        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");
        }