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()); } }
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); }
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); }
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; } }
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(); }); }
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 } }); } }