public async Task DeparseLimit() { string expr = "as.double(1:100)"; string fullRepr = (await _session.EvaluateAndDescribeAsync(expr, None, RValueRepresentations.Deparse())).Representation; string expectedRepr = fullRepr.Substring(0, 53); (await _session.EvaluateAndDescribeAsync(expr, None, RValueRepresentations.Deparse(50))) .Representation.Should().Be(expectedRepr); }
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`"); }
public async Task Representation(string expr, string deparse, string str, string toString) { string actualDeparse = (await _session.EvaluateAndDescribeAsync(expr, None, RValueRepresentations.Deparse())).Representation; string actualStr = (await _session.EvaluateAndDescribeAsync(expr, None, RValueRepresentations.Str())).Representation; string actualToString = (await _session.EvaluateAndDescribeAsync(expr, None, RValueRepresentations.ToString)).Representation; actualDeparse.Should().Be(deparse); actualStr.Should().Be(str); actualToString.Should().Be(toString); }
public async Task EnvironmentIndependentResult() { const string code = @"(function(p) { v <- 42 makeActiveBinding('a', function() 42, environment()) browser() })(42)"; var tracer = await _session.TraceExecutionAsync(); using (var sf = new SourceFile(code)) { await tracer.EnableBreakpointsAsync(true); await sf.Source(_session); await _session.NextPromptShouldBeBrowseAsync(); var stackFrames = (await _session.TracebackAsync()).ToArray(); stackFrames.Should().NotBeEmpty(); var env = stackFrames.Last(); var children = (await env.DescribeChildrenAsync(ExpressionProperty | ComputedValueProperty, RValueRepresentations.Deparse())); var v = children.Should().ContainSingle(er => er.Name == "v") .Which.Should().BeAssignableTo <IRValueInfo>() .Which; var p = children.Should().ContainSingle(er => er.Name == "p") .Which.Should().BeAssignableTo <IRPromiseInfo>() .Which; var a = children.Should().ContainSingle(er => er.Name == "a") .Which.Should().BeAssignableTo <IRActiveBindingInfo>() .Which; var e = (await env.TryEvaluateAndDescribeAsync("non_existing_variable", None, null)) .Should().BeAssignableTo <IRErrorInfo>() .Which; var iv = v.ToEnvironmentIndependentResult().Should().BeAssignableTo <IRValueInfo>().Which; (await _session.EvaluateAndDescribeAsync(iv.Expression, ExpressionProperty, RValueRepresentations.Deparse())) .Should().BeAssignableTo <IRValueInfo>().Which.Representation.Should().Be(v.Representation); // When a promise expression is evaluated directly, rather than via children, the promise is forced // and becomes a value. To have something to compare it against, evaluate the original promise in // its original environment as well. var pv = await v.GetValueAsync(ExpressionProperty, RValueRepresentations.Deparse()); var ipv = p.ToEnvironmentIndependentResult().Should().BeAssignableTo <IRPromiseInfo>().Which; (await _session.EvaluateAndDescribeAsync(ipv.Expression, ExpressionProperty, RValueRepresentations.Deparse())) .Should().BeAssignableTo <IRValueInfo>() .Which.Representation.Should().Be(pv.Representation); // When an active binding expression is evaluated directly, rather than via children, its active // binding nature is not discoverable, and it produces a value result. var iav = a.ToEnvironmentIndependentResult().Should().BeAssignableTo <IRActiveBindingInfo>().Which; (await _session.EvaluateAndDescribeAsync(iav.Expression, ExpressionProperty | ComputedValueProperty, RValueRepresentations.Deparse())) .Should().BeAssignableTo <IRValueInfo>().Which.Representation.Should().Be(a.ComputedValue.Representation); var ie = e.ToEnvironmentIndependentResult().Should().BeAssignableTo <IRErrorInfo>().Which; (await _session.TryEvaluateAndDescribeAsync(ie.Expression, ExpressionProperty, RValueRepresentations.Deparse())) .Should().BeAssignableTo <IRErrorInfo>(); } }
public async Task MultilinePromise() { const string code = @"f <- function(p, d) { force(d) browser() } x <- quote({{{}}}) eval(substitute(f(P, x), list(P = x)))"; var tracer = await _session.TraceExecutionAsync(); using (var sf = new SourceFile(code)) { await tracer.EnableBreakpointsAsync(true); await sf.Source(_session); await _session.NextPromptShouldBeBrowseAsync(); var stackFrames = (await _session.TracebackAsync()).ToArray(); stackFrames.Should().NotBeEmpty(); var children = (await stackFrames.Last().DescribeChildrenAsync(REvaluationResultProperties.None, RValueRepresentations.Deparse())); var d = children.Should().ContainSingle(er => er.Name == "d") .Which.Should().BeAssignableTo <IRValueInfo>() .Which; children.Should().ContainSingle(er => er.Name == "p") .Which.Should().BeAssignableTo <IRPromiseInfo>() .Which.Code.Should().Be(d.Representation); } }
public async Task ActiveBindingEvaluate() { const string code = @"makeActiveBinding('x', function() 42, environment()) browser(); "; var tracer = await _session.TraceExecutionAsync(); using (var sf = new SourceFile(code)) { await tracer.EnableBreakpointsAsync(true); await sf.Source(_session); await _session.NextPromptShouldBeBrowseAsync(); var stackFrames = (await _session.TracebackAsync()).ToArray(); stackFrames.Should().NotBeEmpty(); var children = await stackFrames.Last().DescribeChildrenAsync(ComputedValueProperty, RValueRepresentations.Deparse()); children.Should().ContainSingle(er => er.Name == "x") .Which.Should().BeAssignableTo <IRActiveBindingInfo>() .Which.ComputedValue.Representation.Should().Be("42"); } }
public async Task Promise() { const string code = @"f <- function(p) { browser() force(p) browser() } f(1 + 2)"; var tracer = await _session.TraceExecutionAsync(); using (var sf = new SourceFile(code)) { await tracer.EnableBreakpointsAsync(true); await sf.Source(_session); await _session.NextPromptShouldBeBrowseAsync(); var stackFrames = (await _session.TracebackAsync()).ToArray(); stackFrames.Should().NotBeEmpty(); var frame = stackFrames.Last(); var children = await frame.DescribeChildrenAsync(REvaluationResultProperties.None, RValueRepresentations.Deparse()); children.Should().ContainSingle(er => er.Name == "p") .Which.Should().BeAssignableTo <IRPromiseInfo>() .Which.Code.Should().Be("1 + 2"); await tracer.ContinueAsync(); await _session.NextPromptShouldBeBrowseAsync(); children = await frame.DescribeChildrenAsync(REvaluationResultProperties.None, RValueRepresentations.Deparse()); children.Should().ContainSingle(er => er.Name == "p") .Which.Should().BeAssignableTo <IRValueInfo>() .Which.Representation.Should().Be("3"); } }