Beispiel #1
0
        public async Task FrameChildren()
        {
            var tracer = await _session.TraceExecutionAsync();

            _session.IsHostRunning.Should().BeTrue(because: "Host is not running.");

            using (var sf = new SourceFile("x <- 1; y <- 2; browser()")) {
                await sf.Source(_session);

                await _session.NextPromptShouldBeBrowseAsync();

                var frame         = (await _session.TracebackAsync()).Last();
                var frameChildren = await frame.DescribeChildrenAsync(REvaluationResultProperties.None, null);

                var frameEnv = await frame.DescribeEnvironmentAsync();

                var frameEnvChildren = await frameEnv.DescribeChildrenAsync(REvaluationResultProperties.None, null);

                frameEnv.Length.Should().Be(2);
                frameChildren.Should().HaveCount(2);
                frameChildren.Should().Contain(info => info.Name == "x");
                frameChildren.Should().Contain(info => info.Name == "y");
                frameChildren.ShouldAllBeEquivalentTo(frameEnvChildren, options => options.WithStrictOrdering());
            }
        }
Beispiel #2
0
        public static async Task ShouldBeAtAsync(this IRSession session, string fileName, int lineNumber)
        {
            var actual = (await session.TracebackAsync()).Last();

            actual.FileName.Should().Be(fileName);
            actual.LineNumber.Should().Be(lineNumber);
        }
Beispiel #3
0
        public static async Task <IRStackFrame[]> ShouldHaveTracebackAsync(this IRSession session, TracebackBuilder builder)
        {
            var expected = builder.ToArray();
            var actual   = (await session.TracebackAsync()).ToArray();

            actual.ShouldBeEquivalentTo(expected, options => builder.Configure(options));
            return(actual);
        }
Beispiel #4
0
        public async Task BacktickNames()
        {
            var tracer = await _session.TraceExecutionAsync();

            await _session.ExecuteAsync("`123` <- list(`name with spaces` = 42)");

            var stackFrames = (await _session.TracebackAsync()).ToArray();

            stackFrames.Should().NotBeEmpty();

            var children = await stackFrames.Last().DescribeChildrenAsync(ExpressionProperty | LengthProperty, RValueRepresentations.Deparse());

            var parent = children.Should().Contain(er => er.Name == "`123`")
                         .Which.Should().BeAssignableTo <IRValueInfo>().Which;

            parent.Expression.Should().Be("`123`");

            children = await parent.DescribeChildrenAsync(ExpressionProperty, RValueRepresentations.Deparse());

            children.Should().Contain(er => er.Name == "$`name with spaces`")
            .Which.Should().BeAssignableTo <IRValueInfo>()
            .Which.Expression.Should().Be("`123`$`name with spaces`");
        }
        private async Task UpdateList()
        {
            if (_updating)
            {
                return;
            }

            try {
                _updating = true;
                // May be null in tests
                IRSession session = Workflow.RSession;
                if (session.IsHostRunning)
                {
                    var stackFrames = await session.TracebackAsync();

                    var globalStackFrame = stackFrames.FirstOrDefault(s => s.IsGlobal);
                    if (globalStackFrame != null)
                    {
                        const REvaluationResultProperties properties =
                            ExpressionProperty |
                            AccessorKindProperty |
                            TypeNameProperty |
                            ClassesProperty |
                            LengthProperty |
                            SlotCountProperty |
                            AttributeCountProperty |
                            DimProperty |
                            FlagsProperty;
                        var evaluation = await globalStackFrame.TryEvaluateAndDescribeAsync("base::environment()", "Global Environment", properties, RValueRepresentations.Str());

                        var e = new RSessionDataObject(evaluation, _coreShell.Services);  // root level doesn't truncate children and return every variables

                        _topLevelVariables.Clear();

                        var children = await e.GetChildrenAsync();

                        if (children != null)
                        {
                            foreach (var x in children)
                            {
                                _topLevelVariables[x.Name] = x; // TODO: BUGBUG: this doesn't address removed variables
                            }
                        }
                    }
                }
            } catch (REvaluationException) { } finally {
                _updating = false;
            }
        }
Beispiel #6
0
        public async Task RefreshEnvironmentsAsync()
        {
            await TaskUtilities.SwitchToBackgroundThread();

            var  envs    = new List <REnvironment>();
            bool success = false;

            try {
                var traceback = (await _rSession.TracebackAsync())
                                .Skip(1) // skip global - it's in the search path already
                                .Select(frame => new REnvironment(frame))
                                .Reverse();
                if (traceback.Any())
                {
                    envs.AddRange(traceback);
                    envs.Add(null);
                }

                var searchPath = (await _rSession.EvaluateAsync <string[]>("as.list(search())", REvaluationKind.BaseEnv))
                                 .Except(_hiddenEnvironments)
                                 .Select(name => new REnvironment(name));
                envs.AddRange(searchPath);

                success = true;
            } catch (RException) {
            } catch (MessageTransportException) {
            } catch (OperationCanceledException) {
            }

            VsAppShell.Current.DispatchOnUIThread(() => {
                var oldSelection = _selectedEnvironment;
                _environments.ReplaceWith(success ? envs : _errorEnvironments);

                IREnvironment newSelection = null;
                if (oldSelection != null)
                {
                    newSelection = _environments?.FirstOrDefault(env => env?.Name == oldSelection.Name);
                }
                SelectedEnvironment = newSelection ?? _environments.FirstOrDefault();
            });
        }
Beispiel #7
0
        public async Task BreakContinue()
        {
            const string code =
                @"x <- 0
  browser()
  while (x >= 0) {
    x <- x + 1
  }
  browser()";

            var tracer = await _session.TraceExecutionAsync();

            using (var sf = new SourceFile(code)) {
                await sf.Source(_session);

                await _session.NextPromptShouldBeBrowseAsync();

                await tracer.ContinueAsync();

                await Task.Delay(100);

                await tracer.BreakAsync();

                await _session.NextPromptShouldBeBrowseAsync();

                var frame = (await _session.TracebackAsync()).Single();
                frame.FileName.Should().Be(sf.FilePath);
                frame.LineNumber.Should().BeInRange(3, 5);

                await _session.ExecuteAsync("x <- -42");

                await tracer.ContinueAsync();

                await _session.NextPromptShouldBeBrowseAsync();

                await _session.ShouldHaveTracebackAsync(new TracebackBuilder {
                    { sf, 6 }
                });
            }
        }