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 async Task SetBreakpointWhileRunning()
        {
            const string code =
                @"browser()
  f <- function() {
    NULL
  }
  while (TRUE) f()";

            var tracer = await _session.TraceExecutionAsync();

            using (var sf = new SourceFile(code)) {
                await tracer.EnableBreakpointsAsync(true);

                await sf.Source(_session);

                await _session.NextPromptShouldBeBrowseAsync();

                await tracer.ContinueAsync();

                await Task.Delay(100);

                var bp = await tracer.CreateBreakpointAsync(sf, 3);

                await _session.NextPromptShouldBeBrowseAsync();

                await _session.ShouldBeAtAsync(bp.Location);
            }
        }
Beispiel #3
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");
            }
        }
Beispiel #4
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 }
                });
            }
        }