byebug 3.1.2 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -2
  3. data/CHANGELOG.md +15 -0
  4. data/GUIDE.md +17 -35
  5. data/Gemfile +8 -5
  6. data/LICENSE +1 -1
  7. data/README.md +10 -22
  8. data/Rakefile +1 -1
  9. data/ext/byebug/byebug.c +3 -2
  10. data/lib/byebug.rb +3 -38
  11. data/lib/byebug/commands/break.rb +83 -0
  12. data/lib/byebug/commands/catchpoint.rb +0 -1
  13. data/lib/byebug/commands/condition.rb +10 -6
  14. data/lib/byebug/commands/continue.rb +3 -6
  15. data/lib/byebug/commands/delete.rb +38 -0
  16. data/lib/byebug/commands/edit.rb +0 -2
  17. data/lib/byebug/commands/enable.rb +7 -8
  18. data/lib/byebug/commands/finish.rb +0 -2
  19. data/lib/byebug/commands/frame.rb +13 -15
  20. data/lib/byebug/commands/help.rb +1 -3
  21. data/lib/byebug/commands/history.rb +3 -3
  22. data/lib/byebug/commands/info.rb +4 -13
  23. data/lib/byebug/commands/interrupt.rb +25 -0
  24. data/lib/byebug/commands/kill.rb +0 -2
  25. data/lib/byebug/commands/list.rb +2 -4
  26. data/lib/byebug/commands/method.rb +2 -8
  27. data/lib/byebug/commands/quit.rb +0 -2
  28. data/lib/byebug/commands/reload.rb +2 -15
  29. data/lib/byebug/commands/repl.rb +0 -3
  30. data/lib/byebug/commands/{control.rb → restart.rb} +2 -26
  31. data/lib/byebug/commands/save.rb +0 -1
  32. data/lib/byebug/commands/set.rb +4 -7
  33. data/lib/byebug/commands/show.rb +0 -3
  34. data/lib/byebug/commands/source.rb +0 -3
  35. data/lib/byebug/commands/stepping.rb +3 -4
  36. data/lib/byebug/commands/trace.rb +0 -1
  37. data/lib/byebug/commands/variables.rb +3 -4
  38. data/lib/byebug/context.rb +0 -1
  39. data/lib/byebug/helper.rb +23 -0
  40. data/lib/byebug/interfaces/script_interface.rb +1 -1
  41. data/lib/byebug/processors/command_processor.rb +9 -9
  42. data/lib/byebug/remote.rb +2 -2
  43. data/lib/byebug/setting.rb +3 -1
  44. data/lib/byebug/settings/autoeval.rb +3 -1
  45. data/lib/byebug/settings/autoirb.rb +3 -1
  46. data/lib/byebug/settings/autolist.rb +3 -1
  47. data/lib/byebug/settings/autoreload.rb +1 -3
  48. data/lib/byebug/settings/autosave.rb +1 -3
  49. data/lib/byebug/settings/callstyle.rb +2 -4
  50. data/lib/byebug/settings/fullpath.rb +1 -3
  51. data/lib/byebug/settings/histfile.rb +1 -3
  52. data/lib/byebug/settings/histsize.rb +0 -4
  53. data/lib/byebug/settings/listsize.rb +1 -3
  54. data/lib/byebug/settings/post_mortem.rb +14 -1
  55. data/lib/byebug/settings/width.rb +1 -17
  56. data/lib/byebug/version.rb +1 -1
  57. data/test/break_test.rb +376 -0
  58. data/test/condition_test.rb +82 -0
  59. data/test/continue_test.rb +27 -30
  60. data/test/debugger_alias_test.rb +4 -4
  61. data/test/delete_test.rb +26 -0
  62. data/test/display_test.rb +80 -102
  63. data/test/edit_test.rb +28 -31
  64. data/test/eval_test.rb +50 -80
  65. data/test/finish_test.rb +23 -23
  66. data/test/frame_test.rb +172 -186
  67. data/test/help_test.rb +27 -37
  68. data/test/history_test.rb +32 -41
  69. data/test/info_test.rb +198 -230
  70. data/test/interrupt_test.rb +17 -36
  71. data/test/irb_test.rb +47 -0
  72. data/test/kill_test.rb +19 -19
  73. data/test/list_test.rb +126 -133
  74. data/test/method_test.rb +21 -54
  75. data/test/post_mortem_test.rb +44 -46
  76. data/test/pry_test.rb +42 -0
  77. data/test/quit_test.rb +17 -15
  78. data/test/reload_test.rb +23 -28
  79. data/test/restart_test.rb +35 -63
  80. data/test/save_test.rb +46 -62
  81. data/test/set_test.rb +93 -144
  82. data/test/show_test.rb +50 -71
  83. data/test/source_test.rb +23 -26
  84. data/test/stepping_test.rb +125 -153
  85. data/test/support/matchers.rb +1 -6
  86. data/test/support/test_interface.rb +1 -1
  87. data/test/support/{test_dsl.rb → utils.rb} +17 -64
  88. data/test/test_helper.rb +25 -7
  89. data/test/thread_test.rb +101 -89
  90. data/test/trace_test.rb +48 -85
  91. data/test/variables_test.rb +43 -80
  92. metadata +18 -13
  93. data/lib/byebug/commands/breakpoints.rb +0 -137
  94. data/lib/byebug/commands/skip.rb +0 -30
  95. data/test/breakpoints_test.rb +0 -474
  96. data/test/conditions_test.rb +0 -82
  97. data/test/repl_test.rb +0 -75
@@ -1,5 +1,5 @@
1
- module FinishTest
2
- class Example
1
+ module Byebug
2
+ class FinishExample
3
3
  def a
4
4
  b
5
5
  end
@@ -19,46 +19,46 @@ module FinishTest
19
19
  end
20
20
  end
21
21
 
22
- class FinishTestCase < TestDsl::TestCase
23
- before do
22
+ class FinishTestCase < TestCase
23
+ def setup
24
24
  @example = -> do
25
25
  byebug
26
- Example.new.a
26
+ FinishExample.new.a
27
27
  end
28
+
29
+ super
28
30
  enter 'break 18', 'cont'
29
31
  end
30
32
 
31
- it 'must stop after current frame is finished when without arguments' do
33
+ def test_finish_stops_after_current_frame_is_finished
32
34
  enter 'finish'
33
- debug_proc(@example) { state.line.must_equal 14 }
35
+ debug_proc(@example) { assert_equal 14, state.line }
34
36
  end
35
37
 
36
- it 'must stop before current frame finishes if 0 specified as argument' do
38
+ def test_finish_0_stops_before_current_frame_finishes
37
39
  enter 'finish 0'
38
- debug_proc(@example) { state.line.must_equal 19 }
40
+ debug_proc(@example) { assert_equal 19, state.line }
39
41
  end
40
42
 
41
- it 'must stop after current frame is finished if 1 specified as argument' do
43
+ def test_finish_1_stops_after_current_frame_is_finished
42
44
  enter 'finish 1'
43
- debug_proc(@example) { state.line.must_equal 14 }
45
+ debug_proc(@example) { assert_equal 14, state.line }
44
46
  end
45
47
 
46
- it 'must behave consistenly even if current frame has been changed' do
48
+ def test_finish_behaves_consistenly_even_if_current_frame_has_been_changed
47
49
  enter 'up', 'finish'
48
- debug_proc(@example) { state.line.must_equal 9 }
50
+ debug_proc(@example) { assert_equal 9, state.line }
49
51
  end
50
52
 
51
- describe 'not a number is specified for frame' do
52
- before { enter 'finish foo' }
53
-
54
- it 'must show an error' do
55
- debug_proc(@example)
56
- check_output_includes '"finish" argument "foo" needs to be a number'
57
- end
53
+ def test_finish_shows_an_error_if_incorrect_frame_number_specified
54
+ enter 'finish foo'
55
+ debug_proc(@example)
56
+ check_output_includes '"finish" argument "foo" needs to be a number'
57
+ end
58
58
 
59
- it 'must be on the same line' do
60
- debug_proc(@example) { state.line.must_equal 18 }
61
- end
59
+ def test_finish_stays_at_the_same_line_if_incorrect_frame_number_specified
60
+ enter 'finish foo'
61
+ debug_proc(@example) { assert_equal 18, state.line }
62
62
  end
63
63
  end
64
64
  end
@@ -1,241 +1,227 @@
1
- module FrameTest
2
- class Example
1
+ module Byebug
2
+ class FrameExample
3
3
  def initialize(f)
4
4
  @f = f
5
5
  end
6
+
6
7
  def a
7
8
  b
8
9
  end
10
+
9
11
  def b
10
12
  c
11
13
  2
12
14
  end
15
+
13
16
  def c
14
17
  d('a')
15
18
  3
16
19
  end
17
- def d(e)
18
- 5
19
- end
20
- end
21
20
 
22
- class DeepExample
23
- def a
24
- z = 1
25
- z += b
26
- end
27
- def b
28
- z = 2
29
- z += c
30
- end
31
- def c
32
- z = 3
33
- byebug
34
- z += d('a')
35
- end
36
21
  def d(e)
37
22
  4
38
23
  end
39
24
  end
40
25
 
41
- class FrameTestCase < TestDsl::TestCase
42
- before do
26
+ class FrameTestCase < TestCase
27
+ def setup
43
28
  @example = -> do
44
29
  byebug
45
- fr_ex = Example.new('f')
30
+ fr_ex = FrameExample.new('f')
46
31
  fr_ex.a()
47
32
  end
33
+
34
+ super
48
35
  end
49
36
 
50
- describe 'when byebug started at the beginning' do
51
- before do
52
- enter "break #{__FILE__}:18", 'cont'
53
- end
37
+ def test_up_moves_up_in_the_callstack
38
+ enter 'break 22', 'cont', 'up'
39
+ debug_proc(@example) { assert_equal 17, state.line }
40
+ end
54
41
 
55
- it 'must go up' do
56
- enter 'up'
57
- debug_proc(@example) { state.line.must_equal 14 }
58
- end
42
+ def test_up_moves_up_in_the_callstack_a_specific_number_of_frames
43
+ enter 'break 22', 'cont', 'up 2'
44
+ debug_proc(@example) { assert_equal 12, state.line }
45
+ end
59
46
 
60
- it 'must go up by specific number of frames' do
61
- enter 'up 2'
62
- debug_proc(@example) { state.line.must_equal 10 }
63
- end
47
+ def test_down_moves_down_in_the_callstack
48
+ enter 'break 22', 'cont', 'up', 'down'
49
+ debug_proc(@example) { assert_equal 22, state.line }
50
+ end
64
51
 
65
- it 'must go down' do
66
- enter 'up', 'down'
67
- debug_proc(@example) { state.line.must_equal 18 }
68
- end
52
+ def test_down_moves_down_in_the_callstack_a_specific_number_of_frames
53
+ enter 'break 22', 'cont', 'up 3', 'down 2'
54
+ debug_proc(@example) { assert_equal 17, state.line }
55
+ end
69
56
 
70
- it 'must go down by specific number of frames' do
71
- enter 'up 3', 'down 2'
72
- debug_proc(@example) { state.line.must_equal 14 }
73
- end
57
+ def test_frame_moves_to_a_specific_frame
58
+ enter 'break 22', 'cont', 'frame 2'
59
+ debug_proc(@example) { assert_equal 12, state.line }
60
+ end
74
61
 
75
- it 'must set frame' do
76
- enter 'frame 2'
77
- debug_proc(@example) { state.line.must_equal 10 }
78
- end
62
+ def test_frame_prints_the_callstack_when_called_without_arguments
63
+ enter 'break 22', 'cont', 'up', 'frame'
64
+ debug_proc(@example)
65
+ check_output_includes(/#1 Byebug::FrameExample\.c\s+at #{__FILE__}:17/)
66
+ end
79
67
 
80
- it 'must print current stack frame when without arguments' do
81
- enter 'up', 'frame'
82
- debug_proc(@example)
83
- check_output_includes(/#1 FrameTest::Example\.c\s+at #{__FILE__}:14/)
84
- end
68
+ def test_frame_0_sets_frame_to_the_first_one
69
+ enter 'break 22', 'cont', 'up', 'frame 0'
70
+ debug_proc(@example) { assert_equal 22, state.line }
71
+ end
85
72
 
86
- it 'must set frame to the first one' do
87
- enter 'up', 'frame 0'
88
- debug_proc(@example) { state.line.must_equal 18 }
73
+ def test_frame_minus_one_sets_frame_to_the_last_one
74
+ enter 'break 22', 'cont', 'frame -1'
75
+ debug_proc(@example) do
76
+ assert_equal 'test_helper.rb', File.basename(state.file)
89
77
  end
78
+ end
90
79
 
91
- it 'must set frame to the last one' do
92
- enter 'frame -1'
93
- debug_proc(@example) { File.basename(state.file).must_equal 'test_helper.rb' }
94
- end
80
+ def test_down_does_not_move_if_frame_number_to_too_low
81
+ enter 'break 22', 'cont', 'down'
82
+ debug_proc(@example) { assert_equal 22, state.line }
83
+ check_output_includes \
84
+ "Can't navigate beyond the newest frame", interface.error_queue
85
+ end
95
86
 
96
- it 'must not set frame if the frame number is too low' do
97
- enter 'down'
98
- debug_proc(@example) { state.line.must_equal 18 }
99
- check_output_includes \
100
- "Can't navigate beyond the newest frame", interface.error_queue
101
- end
87
+ def test_up_does_not_move_if_frame_number_to_too_high
88
+ enter 'break 22', 'cont', 'up 100'
89
+ debug_proc(@example) { assert_equal 22, state.line }
90
+ check_output_includes \
91
+ "Can't navigate beyond the oldest frame", interface.error_queue
92
+ end
102
93
 
103
- it 'must not set frame if the frame number is too high' do
104
- enter 'up 100'
105
- debug_proc(@example) { state.line.must_equal 18 }
106
- check_output_includes \
107
- "Can't navigate beyond the oldest frame", interface.error_queue
108
- end
94
+ def test_where_displays_current_backtrace_with_fullpaths
95
+ enter 'break 22', 'cont', 'where'
96
+ debug_proc(@example)
97
+ check_output_includes(
98
+ /--> #0 Byebug::FrameExample\.d\(e#String\)\s+at #{__FILE__}:22/,
99
+ /#1 Byebug::FrameExample\.c\s+at #{__FILE__}:17/,
100
+ /#2 Byebug::FrameExample\.b\s+at #{__FILE__}:12/,
101
+ /#3 Byebug::FrameExample\.a\s+at #{__FILE__}:8/)
102
+ end
109
103
 
110
- describe 'fullpath' do
111
- describe 'when set' do
112
- temporary_change_hash Byebug::Setting, :fullpath, true
113
-
114
- it 'must display current backtrace with fullpaths' do
115
- enter 'where'
116
- debug_proc(@example)
117
- check_output_includes(
118
- /--> #0 FrameTest::Example\.d\(e#String\)\s+at #{__FILE__}:18/,
119
- /#1 FrameTest::Example\.c\s+at #{__FILE__}:14/,
120
- /#2 FrameTest::Example\.b\s+at #{__FILE__}:10/,
121
- /#3 FrameTest::Example\.a\s+at #{__FILE__}:7/)
122
- end
123
- end
124
-
125
- describe 'when unset' do
126
- temporary_change_hash Byebug::Setting, :fullpath, false
127
-
128
- it 'must display current backtrace with shortpaths' do
129
- path = shortpath(__FILE__)
130
- enter 'where'
131
- debug_proc(@example)
132
- check_output_includes(
133
- /--> #0 FrameTest::Example\.d\(e#String\)\s+at #{path}:18/,
134
- /#1 FrameTest::Example\.c\s+at #{path}:14/,
135
- /#2 FrameTest::Example\.b\s+at #{path}:10/,
136
- /#3 FrameTest::Example\.a\s+at #{path}:7/)
137
- end
138
- end
139
- end
104
+ def test_where_displays_current_backtrace_w_shorpaths_if_fullpath_disabled
105
+ enter 'break 22', 'cont', 'set nofullpath', 'where'
106
+ debug_proc(@example)
107
+ path = File.basename(__FILE__)
108
+ check_output_includes(
109
+ /--> #0 Byebug::FrameExample\.d\(e#String\)\s+at \.\.\..*#{path}:22/,
110
+ /#1 Byebug::FrameExample\.c\s+at \.\.\..*#{path}:17/,
111
+ /#2 Byebug::FrameExample\.b\s+at \.\.\..*#{path}:12/,
112
+ /#3 Byebug::FrameExample\.a\s+at \.\.\..*#{path}:8/)
113
+ end
140
114
 
141
- describe 'callstyle' do
142
- describe 'long' do
143
- temporary_change_hash Byebug::Setting, :callstyle, :long
144
-
145
- it 'displays current backtrace with callstyle "long"' do
146
- enter 'where'
147
- debug_proc(@example)
148
- check_output_includes(
149
- /--> #0 FrameTest::Example\.d\(e#String\)\s+at #{__FILE__}:18/,
150
- /#1 FrameTest::Example\.c\s+at #{__FILE__}:14/,
151
- /#2 FrameTest::Example\.b\s+at #{__FILE__}:10/,
152
- /#3 FrameTest::Example\.a\s+at #{__FILE__}:7/)
153
- end
154
- end
155
-
156
- describe 'short' do
157
- temporary_change_hash Byebug::Setting, :callstyle, :short
158
-
159
- it 'displays current backtrace with callstyle "short"' do
160
- enter 'where'
161
- debug_proc(@example)
162
- check_output_includes(/--> #0 d\(e\)\s+at #{__FILE__}:18/,
163
- /#1 c\s+at #{__FILE__}:14/,
164
- /#2 b\s+at #{__FILE__}:10/,
165
- /#3 a\s+at #{__FILE__}:7/)
166
- end
167
- end
168
- end
115
+ def test_where_displays_backtraces_using_long_callstyle
116
+ enter 'break 22', 'cont', 'set callstyle long', 'where'
117
+ debug_proc(@example)
118
+ check_output_includes(
119
+ /--> #0 Byebug::FrameExample\.d\(e#String\)\s+at #{__FILE__}:22/,
120
+ /#1 Byebug::FrameExample\.c\s+at #{__FILE__}:17/,
121
+ /#2 Byebug::FrameExample\.b\s+at #{__FILE__}:12/,
122
+ /#3 Byebug::FrameExample\.a\s+at #{__FILE__}:8/)
169
123
  end
170
124
 
171
- describe 'when byebug is started deep in the callstack' do
172
- before do
173
- @deep_example = -> do
174
- DeepExample.new.a
175
- end
176
- enter "break #{__FILE__}:37", 'cont'
177
- end
125
+ def test_where_displays_backtraces_using_short_callstyle
126
+ enter 'break 22', 'cont', 'set callstyle short', 'where'
127
+ debug_proc(@example)
128
+ check_output_includes(/--> #0 d\(e\)\s+at #{__FILE__}:22/,
129
+ /#1 c\s+at #{__FILE__}:17/,
130
+ /#2 b\s+at #{__FILE__}:12/,
131
+ /#3 a\s+at #{__FILE__}:8/)
132
+ end
178
133
 
179
- it 'must print backtrace' do
180
- enter 'where'
181
- debug_proc(@deep_example)
182
- check_output_includes(
183
- /--> #0 FrameTest::DeepExample\.d\(e#String\)\s+at #{__FILE__}:37/,
184
- /#1 FrameTest::DeepExample\.c\s+at #{__FILE__}:34/,
185
- /#2 FrameTest::DeepExample\.b\s+at #{__FILE__}:29/)
186
- end
134
+ def test_where_marks_c_frames_when_printing_the_callstack
135
+ enter 'break 4', 'cont', 'where'
136
+ debug_proc(@example)
137
+ path = __FILE__
138
+ check_output_includes(
139
+ /--> #0 Byebug::FrameExample.initialize\(f#String\)\s+at #{path}:4/,
140
+ /ͱ-- #1 Class.new\(\*args\)\s+at #{__FILE__}:30/,
141
+ /#2 block in Byebug::FrameTestCase.setup\s+at #{path}:30/)
142
+ end
187
143
 
188
- it 'must go up' do
189
- enter 'up'
190
- debug_proc(@deep_example) { state.line.must_equal 34 }
191
- end
144
+ def test_up_skips_c_frames
145
+ enter 'break 4', 'cont', 'where', 'up', 'where'
146
+ debug_proc(@example)
147
+ check_output_includes(
148
+ /--> #2 block in Byebug::FrameTestCase.setup\s+at #{__FILE__}:30/)
149
+ end
192
150
 
193
- it 'must go down' do
194
- enter 'up', 'down'
195
- debug_proc(@deep_example) { state.line.must_equal 37 }
196
- end
151
+ def test_down_skips_c_frames
152
+ enter 'break 4', 'cont', 'up', 'down', 'eval f'
153
+ debug_proc(@example)
154
+ check_output_includes '"f"'
155
+ end
197
156
 
198
- it 'must set frame' do
199
- enter 'frame 2'
200
- debug_proc(@deep_example) { state.line.must_equal 29 }
201
- end
157
+ def test_frame_cannot_navigate_to_c_frames
158
+ enter 'break 4', 'cont', 'frame 1'
159
+ debug_proc(@example)
160
+ check_output_includes "Can't navigate to c-frame", interface.error_queue
161
+ end
162
+ end
202
163
 
203
- it 'must eval properly when scaling the stack' do
204
- enter 'p z', 'up', 'p z', 'up', 'p z'
205
- debug_proc(@deep_example)
206
- check_output_includes 'nil', '3', '2'
207
- end
164
+ class DeepFrameExample
165
+ def a
166
+ z = 1
167
+ z += b
208
168
  end
209
169
 
210
- describe 'c-frames' do
211
- it 'must mark c-frames when printing the stack' do
212
- file = __FILE__
213
- enter "break #{__FILE__}:4", 'cont', 'where'
214
- enter 'where'
215
- debug_proc(@example)
216
- check_output_includes(
217
- /--> #0 FrameTest::Example.initialize\(f#String\)\s+at #{file}:4/,
218
- /ͱ-- #1 Class.new\(\*args\)\s+at #{file}:45/,
219
- /#2 block \(2 levels\) in <class:FrameTestCase>\s+at #{file}:45/)
220
- end
170
+ def b
171
+ z = 2
172
+ z += c
173
+ end
221
174
 
222
- it '"up" skips c-frames' do
223
- enter "break #{__FILE__}:7", 'cont', 'up', 'eval fr_ex.class.to_s'
224
- debug_proc(@example)
225
- check_output_includes '"FrameTest::Example"'
226
- end
175
+ def c
176
+ z = 3
177
+ byebug
178
+ z += d('a')
179
+ end
227
180
 
228
- it '"down" skips c-frames' do
229
- enter "break #{__FILE__}:7", 'cont', 'up', 'down', 'eval @f'
230
- debug_proc(@example)
231
- check_output_includes '"f"'
232
- end
181
+ def d(e)
182
+ 4
183
+ end
184
+ end
233
185
 
234
- it 'must not jump straigh to c-frames' do
235
- enter "break #{__FILE__}:4", 'cont', 'frame 1'
236
- debug_proc(@example)
237
- check_output_includes "Can't navigate to c-frame", interface.error_queue
186
+ class DeepFrameTestCase < TestCase
187
+ def setup
188
+ @deep_example = -> do
189
+ DeepFrameExample.new.a
238
190
  end
191
+
192
+ super
193
+ enter 'break 182', 'cont'
194
+ end
195
+
196
+ def test_where_correctly_prints_the_backtrace
197
+ enter 'where'
198
+ debug_proc(@deep_example)
199
+ check_output_includes(
200
+ /--> #0 Byebug::DeepFrameExample\.d\(e#String\)\s+at #{__FILE__}:182/,
201
+ /#1 Byebug::DeepFrameExample\.c\s+at #{__FILE__}:178/,
202
+ /#2 Byebug::DeepFrameExample\.b\s+at #{__FILE__}:172/,
203
+ /#3 Byebug::DeepFrameExample\.a\s+at #{__FILE__}:167/)
204
+ end
205
+
206
+ def test_up_moves_up_in_the_callstack
207
+ enter 'up'
208
+ debug_proc(@deep_example) { assert_equal 178, state.line }
209
+ end
210
+
211
+ def test_down_moves_down_in_the_callstack
212
+ enter 'up', 'down'
213
+ debug_proc(@deep_example) { assert_equal 182, state.line }
214
+ end
215
+
216
+ def test_frame_moves_to_a_specific_frame
217
+ enter 'frame 2'
218
+ debug_proc(@deep_example) { assert_equal 172, state.line }
219
+ end
220
+
221
+ def test_eval_works_properly_when_moving_through_the_stack
222
+ enter 'p z', 'up', 'p z', 'up', 'p z'
223
+ debug_proc(@deep_example)
224
+ check_output_includes 'nil', '3', '2'
239
225
  end
240
226
  end
241
227
  end