byebug 3.1.2 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
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