public void ExecutionStepOverWhenNextOperationIsNotAnExpression() { var host = new LispHost(); host.RootFrame.FunctionReturned += (s, e) => { if (e.Frame.FunctionSymbol.Value == "COMMON-LISP-USER:TEST-METHOD") { e.HaltExecution = true; } }; var evalResult = host.Eval(@" (defun test-method () (+ 1 2)) (test-method) (+ 4 5) "); Assert.False(evalResult.ExecutionState.IsExecutionComplete); Assert.Equal(3, ((LispInteger)evalResult.LastResult).Value); Assert.Null(evalResult.ExecutionState.PeekCurrentExpression()); host.StepOver(evalResult.ExecutionState); // nothing to step over; it's really a step out Assert.False(evalResult.ExecutionState.IsExecutionComplete); Assert.Equal("s: (+ 4 5)", evalResult.ExecutionState.PeekOperation().ToString()); host.EvalContinue(evalResult.ExecutionState); Assert.True(evalResult.ExecutionState.IsExecutionComplete); Assert.Equal(9, ((LispInteger)evalResult.LastResult).Value);; }
public void ExecutionCanStepOver(bool useTailCalls) { var host = new LispHost(useTailCalls: useTailCalls); var hasHalted = false; host.RootFrame.EvaluatingExpression += (s, e) => { if (!hasHalted && e.Expression.ToString() == "(+ 2 (- 5 3))") { e.HaltExecution = true; hasHalted = true; } }; var evalResult = host.Eval(@" (defun test-method () (+ 1 1) (+ 2 (- 5 3)) ; initial halt here (+ 3 3)) (test-method) (+ 4 4) "); Assert.False(evalResult.ExecutionState.IsExecutionComplete); Assert.Equal("s: (+ 2 (- 5 3))", evalResult.ExecutionState.PeekOperation().ToString()); host.StepOver(evalResult.ExecutionState); Assert.False(evalResult.ExecutionState.IsExecutionComplete); Assert.Equal("s: (+ 3 3)", evalResult.ExecutionState.PeekOperation().ToString()); host.StepOver(evalResult.ExecutionState); // end of function, this was really a step out Assert.False(evalResult.ExecutionState.IsExecutionComplete); Assert.Equal("s: (+ 4 4)", evalResult.ExecutionState.PeekOperation().ToString()); host.StepOver(evalResult.ExecutionState); // execution complete; this was the last operation Assert.True(evalResult.ExecutionState.IsExecutionComplete); Assert.Equal(8, ((LispInteger)evalResult.LastResult).Value); }