Skip to content

Commit

Permalink
Update the debugger test with a triple-nested block (shows the step-o…
Browse files Browse the repository at this point in the history
…ver bug)
  • Loading branch information
skinny85 committed Dec 29, 2024
1 parent 5a6f777 commit a4fa0c6
Showing 1 changed file with 53 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import org.junit.jupiter.api.Test;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;
Expand All @@ -34,50 +36,71 @@ void tearDown() {
void step_over_global_var_decl_and_into_func_call() {
Source source = Source.create("ezs", "" +
"function fib(unused, num) {\n" +
" if (num <= 1) {\n" +
" var n1 = 0, n2 = 1;\n" +
" if (num > 1) {\n" +
" let i = 1;\n" +
" while (i < num) {\n" +
" const next = n1 + n2;\n" +
" n1 = n2;\n" +
" n2 = next;\n" +
" i = i + 1;\n" +
" }\n" +
" return n2;\n" +
" } else {\n" +
" return Math.abs(num);\n" +
" }\n" +
" let n1 = 0, n2 = 1, i = 1;\n" +
" while (i < num) {\n" +
" const next = n2 + n1;\n" +
" n1 = n2;\n" +
" n2 = next;\n" +
" i = i + 1;\n" +
" }\n" +
" return n2;\n" +
"}\n" +
"const fib2 = fib('unused2', 2);\n" +
"let fib4;\n" +
"fib4 = fib('unused4', 4, 'superfluous4');\n" +
"fib2 + fib4;\n");
"const fibM1 = fib('unused-1', -1);\n" +
"let fib2;\n" +
"fib2 = fib('unused2', 2, 'superfluous2');\n" +
"fibM1 + fib2;\n");
try (DebuggerSession debuggerSession = this.debuggerTester.startSession()) {
debuggerSession.suspendNextExecution();
this.debuggerTester.startEval(source);
this.debuggerTester.expectSuspended(event -> {
assertState(event, ":program", 14, SuspendAnchor.BEFORE, "const fib2 = fib('unused2', 2);");
assertState(event, ":program", 16, SuspendAnchor.BEFORE, "const fibM1 = fib('unused-1', -1);");
event.prepareStepOver(1);
});
this.debuggerTester.expectSuspended(event -> {
assertState(event, ":program", 15, SuspendAnchor.BEFORE, "let fib4;");
assertState(event, ":program", 17, SuspendAnchor.BEFORE, "let fib2;");
event.prepareStepOver(1);
});
this.debuggerTester.expectSuspended(event -> {
assertState(event, ":program", 16, SuspendAnchor.BEFORE, "fib4 = fib('unused4', 4, 'superfluous4');");
assertState(event, ":program", 18, SuspendAnchor.BEFORE, "fib2 = fib('unused2', 2, 'superfluous2');");
event.prepareStepInto(1);
});
this.debuggerTester.expectSuspended(event -> {
assertState(event, "fib", 2, SuspendAnchor.BEFORE, "" +
"" + "if (num <= 1) {\n" +
" return Math.abs(num);\n" +
" }", Map.of("num", "4", "this", "undefined", "n1", "undefined", "n2", "undefined", "i", "undefined"));
event.prepareStepOut(1);
assertState(event, "fib", 2, SuspendAnchor.BEFORE, "var n1 = 0, n2 = 1;",
List.of(Map.of("num", "2", "this", "undefined", "n1", "undefined", "n2", "undefined")));
event.prepareStepOver(1);
});
this.debuggerTester.expectSuspended(event -> {
assertState(event, "fib", 2, SuspendAnchor.BEFORE, "var n1 = 0, n2 = 1;",
List.of(Map.of("num", "2", "this", "undefined", "n1", "0", "n2", "undefined")));
event.prepareStepOver(1);
});
this.debuggerTester.expectSuspended(event -> {
assertState(event, "fib", 3, SuspendAnchor.BEFORE, "if (num > 1) {\n" +
" let i = 1;\n" +
" while (i < num) {\n" +
" const next = n1 + n2;\n" +
" n1 = n2;\n" +
" n2 = next;\n" +
" i = i + 1;\n" +
" }\n" +
" return n2;\n" +
" } else {\n" +
" return Math.abs(num);\n" +
" }",
List.of(Map.of("num", "2", "this", "undefined", "n1", "0", "n2", "1")));
event.prepareStepOver(1);
});
this.debuggerTester.expectSuspended(event -> {
assertState(event, ":program", 16, SuspendAnchor.AFTER, "fib4 = fib('unused4', 4, 'superfluous4');");
assertState(event, ":program", 18, SuspendAnchor.AFTER, "fib2 = fib('unused2', 2, 'superfluous2');");
event.prepareStepInto(1);
});
this.debuggerTester.expectSuspended(event -> {
assertState(event, ":program", 17, SuspendAnchor.BEFORE, "fib2 + fib4;");
assertState(event, ":program", 19, SuspendAnchor.BEFORE, "fibM1 + fib2;");
event.prepareStepOver(1);
});
this.debuggerTester.expectDone();
Expand All @@ -87,12 +110,12 @@ void step_over_global_var_decl_and_into_func_call() {
private static void assertState(
SuspendedEvent suspendedEvent, String frameName, int expectedLineNumber,
SuspendAnchor suspendAnchor, String expectedCode) {
assertState(suspendedEvent, frameName, expectedLineNumber, suspendAnchor, expectedCode, Map.of());
assertState(suspendedEvent, frameName, expectedLineNumber, suspendAnchor, expectedCode, List.of(Map.of()));
}

private static void assertState(
SuspendedEvent suspendedEvent, String frameName, int expectedLineNumber,
SuspendAnchor suspendAnchor, String expectedCode, Map<String, String> expectedFrameValues) {
SuspendAnchor suspendAnchor, String expectedCode, List<Map<String, String>> expectedFrameValues) {
DebugStackFrame frame = suspendedEvent.getTopStackFrame();
assertEquals(frameName, frame.getName());

Expand All @@ -103,15 +126,17 @@ private static void assertState(
assertEquals(expectedFrameValues, scopeValues(frame.getScope()));
}

private static Map<String, String> scopeValues(DebugScope scope) {
Map<String, String> values = new HashMap<>();
private static List<Map<String, String>> scopeValues(DebugScope scope) {
List<Map<String, String>> ret = new LinkedList<>();
DebugScope currentScope = scope;
while (currentScope != null) {
Map<String, String> values = new HashMap<>();
ret.add(0, values);
for (DebugValue value : currentScope.getDeclaredValues()) {
values.put(value.getName(), value.toDisplayString());
}
currentScope = currentScope.getParent();
}
return values;
return ret;
}
}

0 comments on commit a4fa0c6

Please sign in to comment.