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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -2
- data/CHANGELOG.md +15 -0
- data/GUIDE.md +17 -35
- data/Gemfile +8 -5
- data/LICENSE +1 -1
- data/README.md +10 -22
- data/Rakefile +1 -1
- data/ext/byebug/byebug.c +3 -2
- data/lib/byebug.rb +3 -38
- data/lib/byebug/commands/break.rb +83 -0
- data/lib/byebug/commands/catchpoint.rb +0 -1
- data/lib/byebug/commands/condition.rb +10 -6
- data/lib/byebug/commands/continue.rb +3 -6
- data/lib/byebug/commands/delete.rb +38 -0
- data/lib/byebug/commands/edit.rb +0 -2
- data/lib/byebug/commands/enable.rb +7 -8
- data/lib/byebug/commands/finish.rb +0 -2
- data/lib/byebug/commands/frame.rb +13 -15
- data/lib/byebug/commands/help.rb +1 -3
- data/lib/byebug/commands/history.rb +3 -3
- data/lib/byebug/commands/info.rb +4 -13
- data/lib/byebug/commands/interrupt.rb +25 -0
- data/lib/byebug/commands/kill.rb +0 -2
- data/lib/byebug/commands/list.rb +2 -4
- data/lib/byebug/commands/method.rb +2 -8
- data/lib/byebug/commands/quit.rb +0 -2
- data/lib/byebug/commands/reload.rb +2 -15
- data/lib/byebug/commands/repl.rb +0 -3
- data/lib/byebug/commands/{control.rb → restart.rb} +2 -26
- data/lib/byebug/commands/save.rb +0 -1
- data/lib/byebug/commands/set.rb +4 -7
- data/lib/byebug/commands/show.rb +0 -3
- data/lib/byebug/commands/source.rb +0 -3
- data/lib/byebug/commands/stepping.rb +3 -4
- data/lib/byebug/commands/trace.rb +0 -1
- data/lib/byebug/commands/variables.rb +3 -4
- data/lib/byebug/context.rb +0 -1
- data/lib/byebug/helper.rb +23 -0
- data/lib/byebug/interfaces/script_interface.rb +1 -1
- data/lib/byebug/processors/command_processor.rb +9 -9
- data/lib/byebug/remote.rb +2 -2
- data/lib/byebug/setting.rb +3 -1
- data/lib/byebug/settings/autoeval.rb +3 -1
- data/lib/byebug/settings/autoirb.rb +3 -1
- data/lib/byebug/settings/autolist.rb +3 -1
- data/lib/byebug/settings/autoreload.rb +1 -3
- data/lib/byebug/settings/autosave.rb +1 -3
- data/lib/byebug/settings/callstyle.rb +2 -4
- data/lib/byebug/settings/fullpath.rb +1 -3
- data/lib/byebug/settings/histfile.rb +1 -3
- data/lib/byebug/settings/histsize.rb +0 -4
- data/lib/byebug/settings/listsize.rb +1 -3
- data/lib/byebug/settings/post_mortem.rb +14 -1
- data/lib/byebug/settings/width.rb +1 -17
- data/lib/byebug/version.rb +1 -1
- data/test/break_test.rb +376 -0
- data/test/condition_test.rb +82 -0
- data/test/continue_test.rb +27 -30
- data/test/debugger_alias_test.rb +4 -4
- data/test/delete_test.rb +26 -0
- data/test/display_test.rb +80 -102
- data/test/edit_test.rb +28 -31
- data/test/eval_test.rb +50 -80
- data/test/finish_test.rb +23 -23
- data/test/frame_test.rb +172 -186
- data/test/help_test.rb +27 -37
- data/test/history_test.rb +32 -41
- data/test/info_test.rb +198 -230
- data/test/interrupt_test.rb +17 -36
- data/test/irb_test.rb +47 -0
- data/test/kill_test.rb +19 -19
- data/test/list_test.rb +126 -133
- data/test/method_test.rb +21 -54
- data/test/post_mortem_test.rb +44 -46
- data/test/pry_test.rb +42 -0
- data/test/quit_test.rb +17 -15
- data/test/reload_test.rb +23 -28
- data/test/restart_test.rb +35 -63
- data/test/save_test.rb +46 -62
- data/test/set_test.rb +93 -144
- data/test/show_test.rb +50 -71
- data/test/source_test.rb +23 -26
- data/test/stepping_test.rb +125 -153
- data/test/support/matchers.rb +1 -6
- data/test/support/test_interface.rb +1 -1
- data/test/support/{test_dsl.rb → utils.rb} +17 -64
- data/test/test_helper.rb +25 -7
- data/test/thread_test.rb +101 -89
- data/test/trace_test.rb +48 -85
- data/test/variables_test.rb +43 -80
- metadata +18 -13
- data/lib/byebug/commands/breakpoints.rb +0 -137
- data/lib/byebug/commands/skip.rb +0 -30
- data/test/breakpoints_test.rb +0 -474
- data/test/conditions_test.rb +0 -82
- data/test/repl_test.rb +0 -75
data/test/finish_test.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
module
|
2
|
-
class
|
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 <
|
23
|
-
|
22
|
+
class FinishTestCase < TestCase
|
23
|
+
def setup
|
24
24
|
@example = -> do
|
25
25
|
byebug
|
26
|
-
|
26
|
+
FinishExample.new.a
|
27
27
|
end
|
28
|
+
|
29
|
+
super
|
28
30
|
enter 'break 18', 'cont'
|
29
31
|
end
|
30
32
|
|
31
|
-
|
33
|
+
def test_finish_stops_after_current_frame_is_finished
|
32
34
|
enter 'finish'
|
33
|
-
debug_proc(@example) { state.line
|
35
|
+
debug_proc(@example) { assert_equal 14, state.line }
|
34
36
|
end
|
35
37
|
|
36
|
-
|
38
|
+
def test_finish_0_stops_before_current_frame_finishes
|
37
39
|
enter 'finish 0'
|
38
|
-
debug_proc(@example) { state.line
|
40
|
+
debug_proc(@example) { assert_equal 19, state.line }
|
39
41
|
end
|
40
42
|
|
41
|
-
|
43
|
+
def test_finish_1_stops_after_current_frame_is_finished
|
42
44
|
enter 'finish 1'
|
43
|
-
debug_proc(@example) { state.line
|
45
|
+
debug_proc(@example) { assert_equal 14, state.line }
|
44
46
|
end
|
45
47
|
|
46
|
-
|
48
|
+
def test_finish_behaves_consistenly_even_if_current_frame_has_been_changed
|
47
49
|
enter 'up', 'finish'
|
48
|
-
debug_proc(@example) { state.line
|
50
|
+
debug_proc(@example) { assert_equal 9, state.line }
|
49
51
|
end
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
-
|
60
|
-
|
61
|
-
|
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
|
data/test/frame_test.rb
CHANGED
@@ -1,241 +1,227 @@
|
|
1
|
-
module
|
2
|
-
class
|
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 <
|
42
|
-
|
26
|
+
class FrameTestCase < TestCase
|
27
|
+
def setup
|
43
28
|
@example = -> do
|
44
29
|
byebug
|
45
|
-
fr_ex =
|
30
|
+
fr_ex = FrameExample.new('f')
|
46
31
|
fr_ex.a()
|
47
32
|
end
|
33
|
+
|
34
|
+
super
|
48
35
|
end
|
49
36
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
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
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
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
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
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
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
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
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
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
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
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
|
-
|
87
|
-
|
88
|
-
|
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
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
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
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
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
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
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
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
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
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
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
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
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
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
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
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
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
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
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
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
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
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
end
|
164
|
+
class DeepFrameExample
|
165
|
+
def a
|
166
|
+
z = 1
|
167
|
+
z += b
|
208
168
|
end
|
209
169
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
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
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
175
|
+
def c
|
176
|
+
z = 3
|
177
|
+
byebug
|
178
|
+
z += d('a')
|
179
|
+
end
|
227
180
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
end
|
181
|
+
def d(e)
|
182
|
+
4
|
183
|
+
end
|
184
|
+
end
|
233
185
|
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
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
|