Beispiel #1
0
        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);
        }
Beispiel #2
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`");
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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>();
            }
        }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
        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");
            }
        }
Beispiel #7
0
        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");
            }
        }