byebug 3.0.0 → 3.1.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/CHANGELOG.md +15 -0
- data/GUIDE.md +2 -2
- data/LICENSE +3 -3
- data/README.md +5 -4
- data/byebug.gemspec +1 -1
- data/ext/byebug/byebug.c +20 -19
- data/lib/byebug.rb +2 -53
- data/lib/byebug/command.rb +9 -109
- data/lib/byebug/commands/breakpoints.rb +1 -1
- data/lib/byebug/commands/control.rb +20 -21
- data/lib/byebug/commands/display.rb +2 -3
- data/lib/byebug/commands/eval.rb +6 -16
- data/lib/byebug/commands/finish.rb +1 -1
- data/lib/byebug/commands/frame.rb +9 -9
- data/lib/byebug/commands/help.rb +2 -3
- data/lib/byebug/commands/history.rb +28 -0
- data/lib/byebug/commands/info.rb +3 -3
- data/lib/byebug/commands/list.rb +2 -13
- data/lib/byebug/commands/method.rb +5 -45
- data/lib/byebug/commands/reload.rb +1 -12
- data/lib/byebug/commands/repl.rb +6 -15
- data/lib/byebug/commands/save.rb +2 -7
- data/lib/byebug/commands/set.rb +45 -116
- data/lib/byebug/commands/show.rb +22 -126
- data/lib/byebug/commands/stepping.rb +1 -1
- data/lib/byebug/commands/trace.rb +14 -25
- data/lib/byebug/commands/variables.rb +3 -41
- data/lib/byebug/helper.rb +11 -42
- data/lib/byebug/history.rb +5 -13
- data/lib/byebug/processors/command_processor.rb +6 -6
- data/lib/byebug/setting.rb +82 -0
- data/lib/byebug/settings/autoeval.rb +20 -0
- data/lib/byebug/settings/autoirb.rb +19 -0
- data/lib/byebug/settings/autolist.rb +19 -0
- data/lib/byebug/settings/autoreload.rb +11 -0
- data/lib/byebug/settings/autosave.rb +11 -0
- data/lib/byebug/settings/basename.rb +7 -0
- data/lib/byebug/settings/callstyle.rb +15 -0
- data/lib/byebug/settings/forcestep.rb +11 -0
- data/lib/byebug/settings/fullpath.rb +11 -0
- data/lib/byebug/settings/histfile.rb +16 -0
- data/lib/byebug/settings/histsize.rb +18 -0
- data/lib/byebug/settings/linetrace.rb +15 -0
- data/lib/byebug/settings/listsize.rb +15 -0
- data/lib/byebug/settings/post_mortem.rb +15 -0
- data/lib/byebug/settings/stack_on_error.rb +7 -0
- data/lib/byebug/settings/testing.rb +7 -0
- data/lib/byebug/settings/tracing_plus.rb +7 -0
- data/lib/byebug/settings/verbose.rb +7 -0
- data/lib/byebug/settings/width.rb +29 -0
- data/lib/byebug/version.rb +1 -1
- data/test/breakpoints_test.rb +345 -324
- data/test/conditions_test.rb +61 -48
- data/test/continue_test.rb +38 -27
- data/test/debugger_alias_test.rb +5 -3
- data/test/display_test.rb +103 -92
- data/test/edit_test.rb +42 -34
- data/test/eval_test.rb +91 -75
- data/test/finish_test.rb +51 -40
- data/test/frame_test.rb +197 -184
- data/test/help_test.rb +47 -38
- data/test/history_test.rb +54 -0
- data/test/info_test.rb +306 -293
- data/test/interrupt_test.rb +44 -38
- data/test/kill_test.rb +40 -31
- data/test/list_test.rb +166 -133
- data/test/method_test.rb +67 -60
- data/test/post_mortem_test.rb +56 -48
- data/test/quit_test.rb +44 -35
- data/test/reload_test.rb +36 -24
- data/test/repl_test.rb +57 -47
- data/test/restart_test.rb +56 -69
- data/test/save_test.rb +62 -53
- data/test/set_test.rb +140 -118
- data/test/show_test.rb +68 -201
- data/test/source_test.rb +39 -29
- data/test/stepping_test.rb +163 -136
- data/test/support/test_dsl.rb +9 -11
- data/test/test_helper.rb +2 -7
- data/test/thread_test.rb +121 -107
- data/test/trace_test.rb +86 -83
- data/test/variables_test.rb +104 -98
- metadata +27 -86
- data/test/examples/breakpoint.rb +0 -6
- data/test/examples/breakpoint_deep.rb +0 -4
- data/test/examples/conditions.rb +0 -4
- data/test/examples/continue.rb +0 -5
- data/test/examples/display.rb +0 -5
- data/test/examples/edit.rb +0 -4
- data/test/examples/eval.rb +0 -4
- data/test/examples/finish.rb +0 -3
- data/test/examples/frame.rb +0 -4
- data/test/examples/frame_deep.rb +0 -1
- data/test/examples/gcd.rb +0 -15
- data/test/examples/hanoi.rb +0 -34
- data/test/examples/help.rb +0 -1
- data/test/examples/info.rb +0 -6
- data/test/examples/info2.rb +0 -3
- data/test/examples/interrupt.rb +0 -8
- data/test/examples/kill.rb +0 -2
- data/test/examples/list.rb +0 -23
- data/test/examples/method.rb +0 -4
- data/test/examples/post_mortem.rb +0 -4
- data/test/examples/primes.rb +0 -25
- data/test/examples/quit.rb +0 -2
- data/test/examples/reload.rb +0 -6
- data/test/examples/repl.rb +0 -6
- data/test/examples/restart.rb +0 -6
- data/test/examples/save.rb +0 -3
- data/test/examples/set.rb +0 -3
- data/test/examples/settings.rb +0 -1
- data/test/examples/show.rb +0 -1
- data/test/examples/source.rb +0 -3
- data/test/examples/stepping.rb +0 -8
- data/test/examples/stepping_raise_from_c_method.rb +0 -3
- data/test/examples/stepping_raise_from_ruby_method.rb +0 -3
- data/test/examples/test-triangle.rb +0 -14
- data/test/examples/thread.rb +0 -5
- data/test/examples/tmate.rb +0 -10
- data/test/examples/trace.rb +0 -8
- data/test/examples/tri3.rb +0 -6
- data/test/examples/triangle.rb +0 -13
- data/test/examples/variables.rb +0 -4
- data/test/timeout_test.rb +0 -9
data/test/help_test.rb
CHANGED
@@ -1,50 +1,59 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module HelpTest
|
2
|
+
class HelpTestCase < TestDsl::TestCase
|
3
|
+
include Columnize
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
temporary_change_hash Byebug.settings, :width, 50
|
9
|
-
|
10
|
-
it 'must show self help when typed alone' do
|
11
|
-
enter 'help'
|
12
|
-
debug_file 'help'
|
13
|
-
check_output_includes \
|
14
|
-
'Type "help <command-name>" for help on a specific command',
|
15
|
-
'Available commands:', columnize(available_commands, 50)
|
5
|
+
before do
|
6
|
+
@example = -> do
|
7
|
+
byebug
|
8
|
+
end
|
16
9
|
end
|
17
10
|
|
18
|
-
|
19
|
-
|
20
|
-
debug_file 'help'
|
21
|
-
check_output_includes \
|
22
|
-
'Type "help <command-name>" for help on a specific command'
|
11
|
+
let(:available_cmds) do
|
12
|
+
Byebug::Command.commands.map(&:names).flatten.uniq.sort
|
23
13
|
end
|
24
|
-
end
|
25
14
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
15
|
+
describe 'when typed alone' do
|
16
|
+
temporary_change_hash Byebug::Setting, :width, 50
|
17
|
+
|
18
|
+
it 'must show self help when typed alone' do
|
19
|
+
enter 'help'
|
20
|
+
debug_proc(@example)
|
21
|
+
check_output_includes \
|
22
|
+
'Type "help <command-name>" for help on a specific command',
|
23
|
+
'Available commands:', columnize(available_cmds, 50)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'must work when shortcut used' do
|
27
|
+
enter 'h'
|
28
|
+
debug_proc(@example)
|
29
|
+
check_output_includes \
|
30
|
+
'Type "help <command-name>" for help on a specific command'
|
31
|
+
end
|
31
32
|
end
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
describe 'when typed with a command' do
|
35
|
+
it 'must show an error if an undefined command is specified' do
|
36
|
+
enter 'help foobar'
|
37
|
+
debug_proc(@example)
|
38
|
+
check_error_includes 'Undefined command: "foobar". Try "help".'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "must show a command's help" do
|
42
|
+
enter 'help break'
|
43
|
+
debug_proc(@example)
|
44
|
+
check_output_includes \
|
45
|
+
"b[reak] file:line [if expr]\n" \
|
46
|
+
"b[reak] class(.|#)method [if expr]\n\n" \
|
47
|
+
"Set breakpoint to some position, (optionally) if expr == true\n"
|
48
|
+
end
|
40
49
|
end
|
41
|
-
end
|
42
50
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
51
|
+
describe 'when typed with command and subcommand' do
|
52
|
+
it "must show subcommand's help" do
|
53
|
+
enter 'help info breakpoints'
|
54
|
+
debug_proc(@example)
|
55
|
+
check_output_includes "Status of user-settable breakpoints.\n"
|
56
|
+
end
|
48
57
|
end
|
49
58
|
end
|
50
59
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module HistoryTest
|
2
|
+
class HistoryTestCase < TestDsl::TestCase
|
3
|
+
before do
|
4
|
+
@example = -> do
|
5
|
+
byebug
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'history command' do
|
10
|
+
temporary_change_const Readline, 'HISTORY', %w(aaa bbb ccc ddd)
|
11
|
+
|
12
|
+
describe 'with autosave disabled' do
|
13
|
+
temporary_change_hash Byebug::Setting, :autosave, false
|
14
|
+
|
15
|
+
it 'must not show records from readline' do
|
16
|
+
enter 'history'
|
17
|
+
debug_proc(@example)
|
18
|
+
check_error_includes "Not currently saving history. " \
|
19
|
+
'Enable it with "set autosave"'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'with autosave enabled' do
|
24
|
+
temporary_change_hash Byebug::Setting, :autosave, true
|
25
|
+
|
26
|
+
describe 'must show records from readline' do
|
27
|
+
it 'displays last max_size records from readline history' do
|
28
|
+
enter 'set histsize 3', 'history'
|
29
|
+
debug_proc(@example)
|
30
|
+
check_output_includes(/2 bbb\n 3 ccc\n 4 ddd/)
|
31
|
+
check_output_doesnt_include(/1 aaa/)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'max records' do
|
36
|
+
it 'displays whole history if max_size is bigger than Readline::HISTORY' do
|
37
|
+
enter 'set histsize 7', 'history'
|
38
|
+
debug_proc(@example)
|
39
|
+
check_output_includes(/1 aaa\n 2 bbb\n 3 ccc\n 4 ddd/)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'with specified size' do
|
44
|
+
it 'displays the specified number of entries most recent first' do
|
45
|
+
enter 'history 2'
|
46
|
+
debug_proc(@example)
|
47
|
+
check_output_includes(/3 ccc\n 4 ddd/)
|
48
|
+
check_output_doesnt_include(/1 aaa\n 2 bbb/)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/test/info_test.rb
CHANGED
@@ -1,307 +1,320 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
def a(y, z)
|
8
|
-
w = "1" * 30
|
9
|
-
x = 2
|
10
|
-
w + x.to_s + y + z + @foo
|
11
|
-
end
|
12
|
-
|
13
|
-
def c
|
14
|
-
a = BasicObject.new
|
15
|
-
a
|
16
|
-
end
|
17
|
-
|
18
|
-
def b
|
19
|
-
a('a', 'b')
|
20
|
-
e = "%.2f"
|
21
|
-
e
|
22
|
-
end
|
23
|
-
|
24
|
-
def d
|
25
|
-
raise "bang"
|
26
|
-
rescue
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
class TestInfo < TestDsl::TestCase
|
31
|
-
include Columnize
|
32
|
-
|
33
|
-
describe 'Args info' do
|
34
|
-
it 'must show info about all args' do
|
35
|
-
enter "break #{__FILE__}:10", 'cont', 'info args'
|
36
|
-
debug_file 'info'
|
37
|
-
check_output_includes 'y = "a"', 'z = "b"'
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe 'Breakpoints info' do
|
42
|
-
it 'must show info about all breakpoints' do
|
43
|
-
enter 'break 4', 'break 5 if y == z', 'info breakpoints'
|
44
|
-
debug_file 'info'
|
45
|
-
check_output_includes 'Num Enb What',
|
46
|
-
/\d+ +y at #{fullpath('info')}:4/,
|
47
|
-
/\d+ +y at #{fullpath('info')}:5 if y == z/
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'must show info about specific breakpoint' do
|
51
|
-
enter 'break 4', 'break 5',
|
52
|
-
->{ "info breakpoints #{Byebug.breakpoints.first.id}" }
|
53
|
-
debug_file 'info'
|
54
|
-
check_output_includes 'Num Enb What', /\d+ +y at #{fullpath('info')}:4/
|
55
|
-
check_output_doesnt_include(/\d+ +y at #{fullpath('info')}:5/)
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'must show an error if no breakpoints are found' do
|
59
|
-
enter 'info breakpoints'
|
60
|
-
debug_file 'info'
|
61
|
-
check_output_includes 'No breakpoints.'
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'must show an error if no breakpoints are found' do
|
65
|
-
enter 'break 4', 'info breakpoints 123'
|
66
|
-
debug_file 'info'
|
67
|
-
check_error_includes 'No breakpoints found among list given.'
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'must show hit count' do
|
71
|
-
enter 'break 5', 'cont', 'info breakpoints'
|
72
|
-
debug_file 'info'
|
73
|
-
check_output_includes(
|
74
|
-
/\d+ +y at #{fullpath('info')}:5/, 'breakpoint already hit 1 time')
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
describe 'Display info' do
|
79
|
-
it 'must show all display expressions' do
|
80
|
-
enter 'display 3 + 3', 'display a + b', 'info display'
|
81
|
-
debug_file 'info'
|
82
|
-
check_output_includes "Auto-display expressions now in effect:\n" \
|
83
|
-
'Num Enb Expression',
|
84
|
-
'1: y 3 + 3',
|
85
|
-
'2: y a + b'
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'must show a message if there are no display expressions created' do
|
89
|
-
enter 'info display'
|
90
|
-
debug_file 'info'
|
91
|
-
check_output_includes 'There are no auto-display expressions now.'
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe 'Files info' do
|
96
|
-
let(:files) { SCRIPT_LINES__.keys.uniq.sort }
|
97
|
-
|
98
|
-
it 'must show all files read in' do
|
99
|
-
enter 'info files'
|
100
|
-
debug_file 'info'
|
101
|
-
check_output_includes files.map { |f| "File #{f}" }
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'must show all files read in using "info file" too' do
|
105
|
-
enter 'info file'
|
106
|
-
debug_file 'info'
|
107
|
-
check_output_includes files.map { |f| "File #{f}" }
|
108
|
-
end
|
109
|
-
|
110
|
-
it 'must show explicitly loaded files' do
|
111
|
-
enter 'info files stat'
|
112
|
-
debug_file 'info'
|
113
|
-
check_output_includes "File #{fullpath('info')}",
|
114
|
-
LineCache.stat(fullpath('info')).mtime.to_s
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
describe 'File info' do
|
119
|
-
let(:file) { fullpath('info') }
|
120
|
-
let(:filename) { "File #{file}" }
|
121
|
-
let(:lines) { "#{LineCache.size(file)} lines" }
|
122
|
-
let(:mtime) { LineCache.stat(file).mtime.to_s }
|
123
|
-
let(:sha1) { LineCache.sha1(file) }
|
124
|
-
let(:breakpoint_line_numbers) {
|
125
|
-
columnize(LineCache.trace_line_numbers(file).to_a.sort,
|
126
|
-
Byebug.settings[:width]) }
|
127
|
-
|
128
|
-
it 'must show basic info about the file' do
|
129
|
-
enter "info file #{file} basic"
|
130
|
-
debug_file 'info'
|
131
|
-
check_output_includes filename, lines
|
132
|
-
check_output_doesnt_include breakpoint_line_numbers, mtime, sha1
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'must show number of lines' do
|
136
|
-
enter "info file #{file} lines"
|
137
|
-
debug_file 'info'
|
138
|
-
check_output_includes filename, lines
|
139
|
-
check_output_doesnt_include breakpoint_line_numbers, mtime, sha1
|
1
|
+
module InfoTest
|
2
|
+
class Example
|
3
|
+
def initialize
|
4
|
+
@foo = 'bar'
|
5
|
+
@bla = 'blabla'
|
140
6
|
end
|
141
7
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
check_output_doesnt_include lines, breakpoint_line_numbers, sha1
|
8
|
+
def a(y, z)
|
9
|
+
w = '1' * 30
|
10
|
+
x = 2
|
11
|
+
w + x.to_s + y + z + @foo
|
147
12
|
end
|
148
13
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
check_output_includes filename, sha1
|
153
|
-
check_output_doesnt_include lines, breakpoint_line_numbers, mtime
|
154
|
-
end
|
155
|
-
|
156
|
-
it 'must show breakpoints in the file' do
|
157
|
-
enter 'break 4', 'break 5', "info file #{file} breakpoints"
|
158
|
-
debug_file 'info'
|
159
|
-
check_output_includes(/Created breakpoint \d+ at #{file}:4/,
|
160
|
-
/Created breakpoint \d+ at #{file}:5/,
|
161
|
-
filename,
|
162
|
-
'breakpoint line numbers:', breakpoint_line_numbers)
|
163
|
-
check_output_doesnt_include lines, mtime, sha1
|
164
|
-
end
|
165
|
-
|
166
|
-
it 'must show all info about the file' do
|
167
|
-
enter "info file #{file} all"
|
168
|
-
debug_file 'info'
|
169
|
-
check_output_includes \
|
170
|
-
filename, lines, breakpoint_line_numbers, mtime, sha1
|
171
|
-
end
|
172
|
-
|
173
|
-
it 'must not show any info if the parameter is invalid' do
|
174
|
-
enter "info file #{file} blabla"
|
175
|
-
debug_file 'info'
|
176
|
-
check_error_includes 'Invalid parameter blabla'
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
describe 'Instance variables info' do
|
181
|
-
it 'must show instance variables' do
|
182
|
-
enter "break #{__FILE__}:10", 'cont', 'info instance_variables'
|
183
|
-
debug_file 'info'
|
184
|
-
check_output_includes '@bla = "blabla"', '@foo = "bar"'
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
describe 'Line info' do
|
189
|
-
it 'must show the current line' do
|
190
|
-
enter "break #{__FILE__}:10", 'cont', 'info line'
|
191
|
-
debug_file 'info'
|
192
|
-
check_output_includes "Line 10 of \"#{__FILE__}\""
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
describe 'Locals info' do
|
197
|
-
temporary_change_hash Byebug.settings, :width, 28
|
198
|
-
|
199
|
-
it 'must show the current local variables' do
|
200
|
-
enter "break #{__FILE__}:10", 'cont', 'info locals'
|
201
|
-
debug_file 'info'
|
202
|
-
check_output_includes 'w = "11111111111111111111...', 'x = 2'
|
203
|
-
end
|
204
|
-
|
205
|
-
it 'must fail if local variable doesn\'t respond to #to_s or to #inspect' do
|
206
|
-
enter "break #{__FILE__}:15", 'cont', 'info locals'
|
207
|
-
debug_file 'info'
|
208
|
-
check_output_includes 'a = *Error in evaluation*'
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
describe 'Program info' do
|
213
|
-
it 'must show the initial stop reason' do
|
214
|
-
enter 'info program'
|
215
|
-
debug_file 'info'
|
216
|
-
check_output_includes \
|
217
|
-
'It stopped after stepping, next\'ing or initial start.'
|
218
|
-
end
|
219
|
-
|
220
|
-
it 'must show the step stop reason' do
|
221
|
-
enter 'step', 'info program'
|
222
|
-
debug_file 'info'
|
223
|
-
check_output_includes \
|
224
|
-
'Program stopped.',
|
225
|
-
'It stopped after stepping, next\'ing or initial start.'
|
226
|
-
end
|
227
|
-
|
228
|
-
it 'must show the breakpoint stop reason' do
|
229
|
-
enter 'break 4', 'cont', 'info program'
|
230
|
-
debug_file 'info'
|
231
|
-
check_output_includes 'Program stopped.', 'It stopped at a breakpoint.'
|
232
|
-
end
|
233
|
-
|
234
|
-
it 'must show the catchpoint stop reason' do
|
235
|
-
enter 'catch Exception', 'cont', 'info program'
|
236
|
-
debug_file 'info'
|
237
|
-
check_output_includes 'Program stopped.', 'It stopped at a catchpoint.'
|
238
|
-
end
|
239
|
-
|
240
|
-
it 'must show the unknown stop reason' do
|
241
|
-
enter 'break 5', 'cont',
|
242
|
-
->{ context.stubs(:stop_reason).returns('blabla'); 'info program' }
|
243
|
-
debug_file 'info'
|
244
|
-
check_output_includes 'Program stopped.', 'unknown reason: blabla'
|
245
|
-
end
|
246
|
-
|
247
|
-
it 'must show an error if the program is crashed' do
|
248
|
-
skip('TODO')
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
describe 'Stack info' do
|
253
|
-
it 'must show stack info' do
|
254
|
-
enter 'set fullpath', "break #{__FILE__}:8", 'cont', 'info stack'
|
255
|
-
debug_file 'info'
|
256
|
-
check_output_includes(
|
257
|
-
/--> #0 InfoExample.a\(y\#String, z\#String\)\s+at #{__FILE__}:8/,
|
258
|
-
/#1 InfoExample.b\s+at #{__FILE__}:19/,
|
259
|
-
/#2 <top \(required\)>\s+at #{fullpath('info')}:4/)
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
describe 'Global Variables info' do
|
264
|
-
it 'must show global variables' do
|
265
|
-
enter 'info global_variables'
|
266
|
-
debug_file 'info'
|
267
|
-
check_output_includes "$$ = #{Process.pid}"
|
268
|
-
end
|
269
|
-
end
|
270
|
-
|
271
|
-
describe 'Variables info' do
|
272
|
-
temporary_change_hash Byebug.settings, :width, 30
|
273
|
-
|
274
|
-
it 'must show all variables' do
|
275
|
-
enter "break #{__FILE__}:10", 'cont', 'info variables'
|
276
|
-
debug_file 'info'
|
277
|
-
check_output_includes(/self = #<InfoExample:\S+.../,
|
278
|
-
'w = "1111111111111111111111...',
|
279
|
-
'x = 2',
|
280
|
-
'@bla = "blabla"',
|
281
|
-
'@foo = "bar"')
|
14
|
+
def c
|
15
|
+
a = BasicObject.new
|
16
|
+
a
|
282
17
|
end
|
283
18
|
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
/self = #<InfoExample:\S+.../,
|
289
|
-
'@bla = "blabla"',
|
290
|
-
'@foo = "bar"'
|
19
|
+
def b
|
20
|
+
a('a', 'b')
|
21
|
+
e = "%.2f"
|
22
|
+
e
|
291
23
|
end
|
292
24
|
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
check_output_includes 'e = "%.2f"'
|
25
|
+
def d
|
26
|
+
raise 'bang'
|
27
|
+
rescue
|
297
28
|
end
|
298
29
|
end
|
299
30
|
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
31
|
+
class InfoTestCase < TestDsl::TestCase
|
32
|
+
include Columnize
|
33
|
+
|
34
|
+
before do
|
35
|
+
@example = -> do
|
36
|
+
byebug
|
37
|
+
i = Example.new
|
38
|
+
i.b
|
39
|
+
i.c
|
40
|
+
i.d
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'Args info' do
|
45
|
+
it 'must show info about all args' do
|
46
|
+
enter 'break 11', 'cont', 'info args'
|
47
|
+
debug_proc(@example)
|
48
|
+
check_output_includes 'y = "a"', 'z = "b"'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'Breakpoints info' do
|
53
|
+
it 'must show info about all breakpoints' do
|
54
|
+
enter 'break 38', 'break 39 if y == z', 'info breakpoints'
|
55
|
+
debug_proc(@example)
|
56
|
+
check_output_includes 'Num Enb What',
|
57
|
+
/\d+ +y at #{__FILE__}:38/,
|
58
|
+
/\d+ +y at #{__FILE__}:39 if y == z/
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'must show info about specific breakpoint' do
|
62
|
+
enter 'break 38', 'break 39',
|
63
|
+
-> { "info breakpoints #{Byebug.breakpoints.first.id}" }
|
64
|
+
debug_proc(@example)
|
65
|
+
check_output_includes 'Num Enb What', /\d+ +y at #{__FILE__}:38/
|
66
|
+
check_output_doesnt_include(/\d+ +y at #{__FILE__}:39/)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'must show an error if no breakpoints are found' do
|
70
|
+
enter 'info breakpoints'
|
71
|
+
debug_proc(@example)
|
72
|
+
check_output_includes 'No breakpoints.'
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'must show an error if no breakpoints are found' do
|
76
|
+
enter 'break 38', 'info breakpoints 100'
|
77
|
+
debug_proc(@example)
|
78
|
+
check_error_includes 'No breakpoints found among list given.'
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'must show hit count' do
|
82
|
+
enter 'break 39', 'cont', 'info breakpoints'
|
83
|
+
debug_proc(@example)
|
84
|
+
check_output_includes(
|
85
|
+
/\d+ +y at #{__FILE__}:39/, 'breakpoint already hit 1 time')
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe 'Display info' do
|
90
|
+
it 'must show all display expressions' do
|
91
|
+
enter 'display 3 + 3', 'display a + b', 'info display'
|
92
|
+
debug_proc(@example)
|
93
|
+
check_output_includes "Auto-display expressions now in effect:\n" \
|
94
|
+
'Num Enb Expression',
|
95
|
+
'1: y 3 + 3',
|
96
|
+
'2: y a + b'
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'must show a message if there are no display expressions created' do
|
100
|
+
enter 'info display'
|
101
|
+
debug_proc(@example)
|
102
|
+
check_output_includes 'There are no auto-display expressions now.'
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe 'Files info' do
|
107
|
+
let(:files) { SCRIPT_LINES__.keys.uniq.sort }
|
108
|
+
|
109
|
+
it 'must show all files read in' do
|
110
|
+
enter 'info files'
|
111
|
+
debug_proc(@example)
|
112
|
+
check_output_includes files.map { |f| "File #{f}" }
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'must show all files read in using "info file" too' do
|
116
|
+
enter 'info file'
|
117
|
+
debug_proc(@example)
|
118
|
+
check_output_includes files.map { |f| "File #{f}" }
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'must show explicitly loaded files' do
|
122
|
+
enter 'info files stat'
|
123
|
+
debug_proc(@example)
|
124
|
+
check_output_includes "File #{__FILE__}",
|
125
|
+
LineCache.stat(__FILE__).mtime.to_s
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe 'File info' do
|
130
|
+
let(:file) { __FILE__ }
|
131
|
+
let(:filename) { "File #{file}" }
|
132
|
+
let(:lines) { "#{LineCache.size(file)} lines" }
|
133
|
+
let(:mtime) { LineCache.stat(file).mtime.to_s }
|
134
|
+
let(:sha1) { LineCache.sha1(file) }
|
135
|
+
let(:breakpoint_line_numbers) {
|
136
|
+
columnize(LineCache.trace_line_numbers(file).to_a.sort,
|
137
|
+
Byebug::Setting[:width]) }
|
138
|
+
|
139
|
+
it 'must show basic info about the file' do
|
140
|
+
enter "info file #{file} basic"
|
141
|
+
debug_proc(@example)
|
142
|
+
check_output_includes filename, lines
|
143
|
+
check_output_doesnt_include breakpoint_line_numbers, mtime, sha1
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'must show number of lines' do
|
147
|
+
enter "info file #{file} lines"
|
148
|
+
debug_proc(@example)
|
149
|
+
check_output_includes filename, lines
|
150
|
+
check_output_doesnt_include breakpoint_line_numbers, mtime, sha1
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'must show mtime of the file' do
|
154
|
+
enter "info file #{file} mtime"
|
155
|
+
debug_proc(@example)
|
156
|
+
check_output_includes filename, mtime
|
157
|
+
check_output_doesnt_include lines, breakpoint_line_numbers, sha1
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'must show sha1 of the file' do
|
161
|
+
enter "info file #{file} sha1"
|
162
|
+
debug_proc(@example)
|
163
|
+
check_output_includes filename, sha1
|
164
|
+
check_output_doesnt_include lines, breakpoint_line_numbers, mtime
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'must show breakpoints in the file' do
|
168
|
+
enter 'break 38', 'break 39', "info file #{file} breakpoints"
|
169
|
+
debug_proc(@example)
|
170
|
+
check_output_includes(/Created breakpoint \d+ at #{file}:38/,
|
171
|
+
/Created breakpoint \d+ at #{file}:39/,
|
172
|
+
filename,
|
173
|
+
'breakpoint line numbers:', breakpoint_line_numbers)
|
174
|
+
check_output_doesnt_include lines, mtime, sha1
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'must show all info about the file' do
|
178
|
+
enter "info file #{file} all"
|
179
|
+
debug_proc(@example)
|
180
|
+
check_output_includes \
|
181
|
+
filename, lines, breakpoint_line_numbers, mtime, sha1
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'must not show any info if the parameter is invalid' do
|
185
|
+
enter "info file #{file} blabla"
|
186
|
+
debug_proc(@example)
|
187
|
+
check_error_includes 'Invalid parameter blabla'
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe 'Instance variables info' do
|
192
|
+
it 'must show instance variables' do
|
193
|
+
enter 'break 11', 'cont', 'info instance_variables'
|
194
|
+
debug_proc(@example)
|
195
|
+
check_output_includes '@bla = "blabla"', '@foo = "bar"'
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
describe 'Line info' do
|
200
|
+
it 'must show the current line' do
|
201
|
+
enter 'break 11', 'cont', 'info line'
|
202
|
+
debug_proc(@example)
|
203
|
+
check_output_includes "Line 11 of \"#{__FILE__}\""
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
describe 'Locals info' do
|
208
|
+
temporary_change_hash Byebug::Setting, :width, 28
|
209
|
+
|
210
|
+
it 'must show the current local variables' do
|
211
|
+
enter 'break 11', 'cont', 'info locals'
|
212
|
+
debug_proc(@example)
|
213
|
+
check_output_includes 'w = "11111111111111111111...', 'x = 2'
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'must fail if local variable doesn\'t respond to #to_s or to #inspect' do
|
217
|
+
enter 'break 16', 'cont', 'info locals'
|
218
|
+
debug_proc(@example)
|
219
|
+
check_output_includes 'a = *Error in evaluation*'
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
describe 'Program info' do
|
224
|
+
it 'must show the initial stop reason' do
|
225
|
+
enter 'info program'
|
226
|
+
debug_proc(@example)
|
227
|
+
check_output_includes \
|
228
|
+
"It stopped after stepping, next'ing or initial start."
|
229
|
+
end
|
230
|
+
|
231
|
+
it 'must show the step stop reason' do
|
232
|
+
enter 'step', 'info program'
|
233
|
+
debug_proc(@example)
|
234
|
+
check_output_includes \
|
235
|
+
'Program stopped.',
|
236
|
+
"It stopped after stepping, next'ing or initial start."
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'must show the breakpoint stop reason' do
|
240
|
+
enter 'break 38', 'cont', 'info program'
|
241
|
+
debug_proc(@example)
|
242
|
+
check_output_includes 'Program stopped.', 'It stopped at a breakpoint.'
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'must show the catchpoint stop reason' do
|
246
|
+
enter 'catch Exception', 'cont', 'info program'
|
247
|
+
debug_proc(@example)
|
248
|
+
check_output_includes 'Program stopped.', 'It stopped at a catchpoint.'
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'must show the unknown stop reason' do
|
252
|
+
enter 'break 39', 'cont',
|
253
|
+
->{ context.stubs(:stop_reason).returns('blabla'); 'info program' }
|
254
|
+
debug_proc(@example)
|
255
|
+
check_output_includes 'Program stopped.', 'unknown reason: blabla'
|
256
|
+
end
|
257
|
+
|
258
|
+
it 'must show an error if the program is crashed' do
|
259
|
+
skip('TODO')
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
describe 'Stack info' do
|
264
|
+
it 'must show stack info' do
|
265
|
+
file = __FILE__
|
266
|
+
enter 'set fullpath', 'break 9', 'cont', 'info stack'
|
267
|
+
debug_proc(@example)
|
268
|
+
check_output_includes(
|
269
|
+
/--> #0 InfoTest::Example.a\(y#String, z#String\)\s+at #{file}:9/,
|
270
|
+
/#1 InfoTest::Example.b\s+at #{file}:20/,
|
271
|
+
/#2 block \(2 levels\) in <class:InfoTestCase>\s+at #{file}:38/)
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
describe 'Global Variables info' do
|
276
|
+
it 'must show global variables' do
|
277
|
+
enter 'info global_variables'
|
278
|
+
debug_proc(@example)
|
279
|
+
check_output_includes "$$ = #{Process.pid}"
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
describe 'Variables info' do
|
284
|
+
temporary_change_hash Byebug::Setting, :width, 30
|
285
|
+
|
286
|
+
it 'must show all variables' do
|
287
|
+
enter 'break 11', 'cont', 'info variables'
|
288
|
+
debug_proc(@example)
|
289
|
+
check_output_includes(/self = #<InfoTest::Example:\S*.../,
|
290
|
+
'w = "1111111111111111111111...',
|
291
|
+
'x = 2',
|
292
|
+
'@bla = "blabla"',
|
293
|
+
'@foo = "bar"')
|
294
|
+
end
|
295
|
+
|
296
|
+
it 'must fail if the variable doesn\'t respond to #to_s or to #inspect' do
|
297
|
+
enter 'break 16', 'cont', 'info variables'
|
298
|
+
debug_proc(@example)
|
299
|
+
check_output_includes 'a = *Error in evaluation*',
|
300
|
+
/self = #<InfoTest::Example:\S*.../,
|
301
|
+
'@bla = "blabla"',
|
302
|
+
'@foo = "bar"'
|
303
|
+
end
|
304
|
+
|
305
|
+
it 'must correctly print variables containing % sign' do
|
306
|
+
enter 'break 22', 'cont', 'info variables'
|
307
|
+
debug_proc(@example)
|
308
|
+
check_output_includes 'e = "%.2f"'
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
describe 'Help' do
|
313
|
+
it 'must show help when typing just "info"' do
|
314
|
+
enter 'info', 'cont'
|
315
|
+
debug_proc(@example)
|
316
|
+
check_output_includes(/List of "info" subcommands:/)
|
317
|
+
end
|
305
318
|
end
|
306
319
|
end
|
307
320
|
end
|