public async Task StepInto() { const string code = @"f <- function(x) { x + 1 } x <- f(1) print(x)"; using (var debugSession = new DebugSession(_session)) using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); var bp = await debugSession.CreateBreakpointAsync(sf, 4); var bpHit = new BreakpointHitDetector(bp); await sf.Source(_session); await bpHit.ShouldBeHitAtNextPromptAsync(); (await debugSession.GetStackFramesAsync()).Should().HaveTail(new MatchDebugStackFrames { { bp.Location } }); (await debugSession.StepIntoAsync()).Should().Be(true); (await debugSession.GetStackFramesAsync()).Should().HaveTail(new MatchDebugStackFrames { { sf, 4, "f(1)" }, { sf, 1, MatchAny<string>.Instance }, }); } }
public async Task MultilinePromise() { const string code = @" f <- function(p, d) { force(d) browser() } x <- quote({{{}}}) eval(substitute(f(P, x), list(P = x))) "; using (var debugSession = new DebugSession(_session)) using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); var browseTask = EventTaskSources.DebugSession.Browse.Create(debugSession); await sf.Source(_session); await browseTask; var stackFrames = (await debugSession.GetStackFramesAsync()).ToArray(); stackFrames.Should().NotBeEmpty(); var frame = (await stackFrames.Last().GetEnvironmentAsync()).As<DebugValueEvaluationResult>(); var children = (await frame.GetChildrenAsync()).ToDictionary(er => er.Name); var p = children.Should().ContainKey("p").WhichValue.As<DebugPromiseEvaluationResult>(); var d = children.Should().ContainKey("d").WhichValue.As<DebugValueEvaluationResult>(); p.Code.Should().Be(d.GetRepresentation(DebugValueRepresentationKind.Raw).Deparse); } }
public async Task MultilinePromise() { const string code = @" f <- function(p, d) { force(d) browser() } x <- quote({{{}}}) eval(substitute(f(P, x), list(P = x))) "; using (var sessionProvider = new RSessionProvider()) { var session = sessionProvider.GetOrCreate(Guid.NewGuid(), new RHostClientTestApp()); await session.StartHostAsync(new RHostStartupInfo { Name = _testMethod.Name, RBasePath = RUtilities.FindExistingRBasePath() }, 50000); using (var debugSession = new DebugSession(session)) { using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); var paused = new TaskCompletionSource<bool>(); debugSession.Browse += delegate { paused.SetResult(true); }; await sf.Source(session); await paused.Task; var stackFrames = (await debugSession.GetStackFramesAsync()).Reverse().ToArray(); stackFrames.Should().NotBeEmpty(); var evalResult = await stackFrames[0].GetEnvironmentAsync(); evalResult.Should().BeAssignableTo<DebugValueEvaluationResult>(); var frame = (DebugValueEvaluationResult)evalResult; var children = (await frame.GetChildrenAsync()).ToDictionary(er => er.Name); children.Should().ContainKey("p"); children["p"].Should().BeAssignableTo<DebugPromiseEvaluationResult>(); var p = (DebugPromiseEvaluationResult)children["p"]; children.Should().ContainKey("d"); children["d"].Should().BeAssignableTo<DebugValueEvaluationResult>(); var d = (DebugValueEvaluationResult)children["d"]; p.Code.Should().Be(d.GetRepresentation(DebugValueRepresentationKind.Raw).Deparse); } } await session.StopHostAsync(); } }
public async Task CallStack() { using (var debugSession = new DebugSession(_session)) { const string code1 = @"f <- function(n) { if (n > 0) { g(n - 1) } else { return() } }"; const string code2 = @"g <- function(n) { if (n > 0) { f(n - 1) } else { return() } }"; using (var sf1 = new SourceFile(code1)) using (var sf2 = new SourceFile(code2)) { await debugSession.EnableBreakpointsAsync(true); await sf1.Source(_session); await sf2.Source(_session); var bp = await debugSession.CreateBreakpointAsync(sf1, 5); var bpHit = new BreakpointHitDetector(bp); using (var inter = await _session.BeginInteractionAsync()) { await inter.RespondAsync("f(4)\n"); } await bpHit.ShouldBeHitAtNextPromptAsync(); (await debugSession.GetStackFramesAsync()).Should().HaveTail(new MatchDebugStackFrames { { (string)null, null, "f(4)" }, { sf1, 3, "g(n - 1)" }, { sf2, 3, "f(n - 1)" }, { sf1, 3, "g(n - 1)" }, { sf2, 3, "f(n - 1)" }, { sf1, 5, MatchAny<string>.Instance }, }); } } }
public async Task SetAndHitToplevelBreakpoint() { const string code = @"x <- 1 y <- 2 z <- 3"; using (var debugSession = new DebugSession(_session)) using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); var bp = await debugSession.CreateBreakpointAsync(new DebugBreakpointLocation(sf.FilePath, 2)); var bpHit = new BreakpointHitDetector(bp); await sf.Source(_session); await bpHit.ShouldBeHitAtNextPromptAsync(); } }
public async Task StepOver() { const string code = @"f <- function(x) { x + 1 } x <- f(1) print(x)"; using (var debugSession = new DebugSession(_session)) using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); var bp = await debugSession.CreateBreakpointAsync(sf, 4); var bpHit = new BreakpointHitDetector(bp); await sf.Source(_session); await bpHit.ShouldBeHitAtNextPromptAsync(); (await debugSession.GetStackFramesAsync()).Should().BeAt(bp.Location); (await debugSession.StepOverAsync()).Should().Be(true); (await debugSession.GetStackFramesAsync()).Should().BeAt(bp.Location, +1); } }
public async Task StepOutToFunction() { const string code = @"f <- function() { 1 } g <- function() { f() 1 } g()"; using (var debugSession = new DebugSession(_session)) using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); var bp = await debugSession.CreateBreakpointAsync(sf, 2); var bpHit = new BreakpointHitDetector(bp); await sf.Source(_session); await bpHit.ShouldBeHitAtNextPromptAsync(); (await debugSession.GetStackFramesAsync()).Should().HaveTail(new MatchDebugStackFrames { { sf, 8, "g()" }, { sf, 5, "f()" }, { bp.Location }, }); (await debugSession.StepOutAsync()).Should().Be(true); (await debugSession.GetStackFramesAsync()).Should().HaveTail(new MatchDebugStackFrames { { sf, 8, "g()" }, { sf, 6, MatchAny <string> .Instance }, }); } }
public async Task BreakpointsInDifferentFiles() { using (var debugSession = new DebugSession(_session)) using (var sf1 = new SourceFile("1")) using (var sf2 = new SourceFile($"eval(parse({sf1.FilePath.ToRStringLiteral()}))")) { await debugSession.EnableBreakpointsAsync(true); var bp1Loc = new DebugBreakpointLocation(sf1.FilePath, 1); var bp1 = await debugSession.CreateBreakpointAsync(bp1Loc); bp1.Location.Should().Be(bp1Loc); var bp2Loc = new DebugBreakpointLocation(sf2.FilePath, 1); var bp2 = await debugSession.CreateBreakpointAsync(bp2Loc); bp2.Location.Should().Be(bp2Loc); debugSession.Breakpoints.Should().HaveCount(2); var bp1Hit = new BreakpointHitDetector(bp1); var bp2Hit = new BreakpointHitDetector(bp2); await sf2.Source(_session); await bp2Hit.ShouldBeHitAtNextPromptAsync(); bp1Hit.WasHit.Should().BeFalse(); bp2Hit.Reset(); await debugSession.ContinueAsync(); await bp1Hit.ShouldBeHitAtNextPromptAsync(); bp2Hit.WasHit.Should().BeFalse(); } }
public async Task RemovedBreakpointNotHit() { const string code = @"f <- function() { 0 }"; using (var debugSession = new DebugSession(_session)) using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); await sf.Source(_session); var bp = await debugSession.CreateBreakpointAsync(new DebugBreakpointLocation(sf.FilePath, 2)); var bpHit = new BreakpointHitDetector(bp); using (var inter = await _session.BeginInteractionAsync()) { await inter.RespondAsync("f()\n"); } await bpHit.ShouldBeHitAtNextPromptAsync(); await bp.DeleteAsync(); await debugSession.ContinueAsync(); using (var inter = await _session.BeginInteractionAsync()) { await inter.RespondAsync("f()\n"); } using (var inter = await _session.BeginInteractionAsync()) { inter.Contexts.IsBrowser().Should().BeFalse(); } } }
public async Task SetAndHitBreakpointInsideLoadedFunction() { const string code = @"f <- function() { 0 }"; using (var debugSession = new DebugSession(_session)) using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); await sf.Source(_session); var bp = await debugSession.CreateBreakpointAsync(new DebugBreakpointLocation(sf.FilePath, 2)); var bpHit = new BreakpointHitDetector(bp); using (var inter = await _session.BeginInteractionAsync()) { await inter.RespondAsync("f()\n"); } await bpHit.ShouldBeHitAtNextPromptAsync(); } }
public async Task SetAndHitBreakpointInsideUnloadedFunction() { const string code = @"f <- function() { 0 } f()"; using (var debugSession = new DebugSession(_session)) using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); var bp = await debugSession.CreateBreakpointAsync(new DebugBreakpointLocation(sf.FilePath, 2)); var bpHit = new BreakpointHitDetector(bp); await sf.Source(_session); await bpHit.ShouldBeHitAtNextPromptAsync(); } }
public async Task StepOutFromGlobal() { const string code = @"x <- 1 y <- 2"; using (var debugSession = new DebugSession(_session)) using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); var bp1 = await debugSession.CreateBreakpointAsync(sf, 1); var bp2 = await debugSession.CreateBreakpointAsync(sf, 2); var bp1Hit = new BreakpointHitDetector(bp1); await sf.Source(_session); await bp1Hit.ShouldBeHitAtNextPromptAsync(); (await debugSession.GetStackFramesAsync()).Should().HaveTail(new MatchDebugStackFrames { { bp1.Location } }); (await debugSession.StepOutAsync()).Should().Be(false); (await debugSession.GetStackFramesAsync()).Should().HaveTail(new MatchDebugStackFrames { { bp2.Location } }); } }
public async Task StepOntoBreakpoint() { const string code = @"x <- 1 y <- 2"; using (var debugSession = new DebugSession(_session)) using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); var bp1 = await debugSession.CreateBreakpointAsync(sf, 1); var bp2 = await debugSession.CreateBreakpointAsync(sf, 2); var bp1Hit = new BreakpointHitDetector(bp1); var bp2Hit = new BreakpointHitDetector(bp2); await sf.Source(_session); await bp1Hit.ShouldBeHitAtNextPromptAsync(); (await debugSession.StepOverAsync()).Should().Be(false); await bp2Hit.ShouldBeHitAtNextPromptAsync(); } }
public async Task StepOutToFunction() { const string code = @"f <- function() { 1 } g <- function() { f() 1 } g()"; using (var debugSession = new DebugSession(_session)) using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); var bp = await debugSession.CreateBreakpointAsync(sf, 2); var bpHit = new BreakpointHitDetector(bp); await sf.Source(_session); await bpHit.ShouldBeHitAtNextPromptAsync(); (await debugSession.GetStackFramesAsync()).Should() .BeAt(bp.Location, "f()") .At(sf, 5, "g()"); (await debugSession.StepOutAsync()).Should().Be(true); (await debugSession.GetStackFramesAsync()).Should().BeAt(sf, 6, "g()"); } }
public async Task OverlappingBreakpoints() { const string code = @"f <- function() { 1 }"; using (var debugSession = new DebugSession(_session)) using (var sf = new SourceFile(code)) { await debugSession.EnableBreakpointsAsync(true); await sf.Source(_session); var bp1 = await debugSession.CreateBreakpointAsync(sf, 1); var bp2 = await debugSession.CreateBreakpointAsync(sf, 1); bp1.Should().BeSameAs(bp2); debugSession.Breakpoints.Should().HaveCount(1); var bp1Hit = new BreakpointHitDetector(bp1); var bp2Hit = new BreakpointHitDetector(bp2); using (var inter = await _session.BeginInteractionAsync()) { await inter.RespondAsync("f()\n"); } await bp1Hit.ShouldBeHitAtNextPromptAsync(); bp2Hit.WasHit.Should().BeTrue(); await debugSession.ContinueAsync(); await bp1.DeleteAsync(); debugSession.Breakpoints.Should().HaveCount(1); debugSession.Breakpoints.Should().Contain(bp2); using (var inter = await _session.BeginInteractionAsync()) { await inter.RespondAsync("f()\n"); } await bp2Hit.ShouldBeHitAtNextPromptAsync(); await debugSession.ContinueAsync(); await bp2.DeleteAsync(); debugSession.Breakpoints.Should().HaveCount(0); using (var inter = await _session.BeginInteractionAsync()) { await inter.RespondAsync("f()\n"); } using (var inter = await _session.BeginInteractionAsync()) { inter.Contexts.IsBrowser().Should().BeFalse(); } } }