Index: test/mjsunit/harmony/debug-stepin-collections-foreach.js |
diff --git a/test/mjsunit/harmony/debug-stepin-collections-foreach.js b/test/mjsunit/harmony/debug-stepin-collections-foreach.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..30fa8c00492667d2ec404da87c0f39a10120d5b0 |
--- /dev/null |
+++ b/test/mjsunit/harmony/debug-stepin-collections-foreach.js |
@@ -0,0 +1,118 @@ |
+// Copyright 2014 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+// |
+// Flags: --expose-debug-as debug --harmony-collections |
+ |
+Debug = debug.Debug |
+ |
+var exception = false; |
+ |
+function listener(event, exec_state, event_data, data) { |
+ try { |
+ if (event == Debug.DebugEvent.Break) { |
+ if (breaks == 0) { |
+ exec_state.prepareStep(Debug.StepAction.StepIn, 2); |
+ breaks = 1; |
+ } else if (breaks <= 3) { |
+ breaks++; |
+ // Check whether we break at the expected line. |
+ print(event_data.sourceLineText()); |
+ assertTrue(event_data.sourceLineText().indexOf("Expected to step") > 0); |
+ exec_state.prepareStep(Debug.StepAction.StepIn, 3); |
+ } |
+ } |
+ } catch (e) { |
+ exception = true; |
+ } |
+} |
+ |
+function cb_set(num) { |
+ print("element " + num); // Expected to step to this point. |
+ return true; |
+} |
+ |
+function cb_map(key, val) { |
+ print("key " + key + ", value " + val); // Expected to step to this point. |
+ return true; |
+} |
+ |
+var s = new Set(); |
+s.add(1); |
+s.add(2); |
+s.add(3); |
+s.add(4); |
+ |
+var m = new Map(); |
+m.set('foo', 1); |
+m.set('bar', 2); |
+m.set('baz', 3); |
+m.set('bat', 4); |
+ |
+Debug.setListener(listener); |
+ |
+var breaks = 0; |
+debugger; |
+s.forEach(cb_set); |
+assertFalse(exception); |
+assertEquals(4, breaks); |
+ |
+breaks = 0; |
+debugger; |
+m.forEach(cb_map); |
+assertFalse(exception); |
+assertEquals(4, breaks); |
+ |
+Debug.setListener(null); |
+ |
+ |
+// Test two levels of builtin callbacks: |
+// Array.forEach calls a callback function, which by itself uses |
+// Array.forEach with another callback function. |
+ |
+function second_level_listener(event, exec_state, event_data, data) { |
+ try { |
+ if (event == Debug.DebugEvent.Break) { |
+ if (breaks == 0) { |
+ exec_state.prepareStep(Debug.StepAction.StepIn, 3); |
+ breaks = 1; |
+ } else if (breaks <= 16) { |
+ breaks++; |
+ // Check whether we break at the expected line. |
+ assertTrue(event_data.sourceLineText().indexOf("Expected to step") > 0); |
+ // Step two steps further every four breaks to skip the |
+ // forEach call in the first level of recurision. |
+ var step = (breaks % 4 == 1) ? 6 : 3; |
+ exec_state.prepareStep(Debug.StepAction.StepIn, step); |
+ } |
+ } |
+ } catch (e) { |
+ exception = true; |
+ } |
+} |
+ |
+function cb_set_foreach(num) { |
+ s.forEach(cb_set); |
+ print("back to the first level of recursion."); |
+} |
+ |
+function cb_map_foreach(key, val) { |
+ m.forEach(cb_set); |
+ print("back to the first level of recursion."); |
+} |
+ |
+Debug.setListener(second_level_listener); |
+ |
+breaks = 0; |
+debugger; |
+s.forEach(cb_set_foreach); |
+assertFalse(exception); |
+assertEquals(17, breaks); |
+ |
+breaks = 0; |
+debugger; |
+m.forEach(cb_map_foreach); |
+assertFalse(exception); |
+assertEquals(17, breaks); |
+ |
+Debug.setListener(null); |