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