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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: byebug
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.2
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Rodriguez
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-04-23 00:00:00.000000000 Z
13
+ date: 2014-08-02 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: columnize
@@ -75,11 +75,11 @@ files:
75
75
  - ext/byebug/threads.c
76
76
  - lib/byebug.rb
77
77
  - lib/byebug/command.rb
78
- - lib/byebug/commands/breakpoints.rb
78
+ - lib/byebug/commands/break.rb
79
79
  - lib/byebug/commands/catchpoint.rb
80
80
  - lib/byebug/commands/condition.rb
81
81
  - lib/byebug/commands/continue.rb
82
- - lib/byebug/commands/control.rb
82
+ - lib/byebug/commands/delete.rb
83
83
  - lib/byebug/commands/display.rb
84
84
  - lib/byebug/commands/edit.rb
85
85
  - lib/byebug/commands/enable.rb
@@ -89,16 +89,17 @@ files:
89
89
  - lib/byebug/commands/help.rb
90
90
  - lib/byebug/commands/history.rb
91
91
  - lib/byebug/commands/info.rb
92
+ - lib/byebug/commands/interrupt.rb
92
93
  - lib/byebug/commands/kill.rb
93
94
  - lib/byebug/commands/list.rb
94
95
  - lib/byebug/commands/method.rb
95
96
  - lib/byebug/commands/quit.rb
96
97
  - lib/byebug/commands/reload.rb
97
98
  - lib/byebug/commands/repl.rb
99
+ - lib/byebug/commands/restart.rb
98
100
  - lib/byebug/commands/save.rb
99
101
  - lib/byebug/commands/set.rb
100
102
  - lib/byebug/commands/show.rb
101
- - lib/byebug/commands/skip.rb
102
103
  - lib/byebug/commands/source.rb
103
104
  - lib/byebug/commands/stepping.rb
104
105
  - lib/byebug/commands/threads.rb
@@ -136,10 +137,11 @@ files:
136
137
  - lib/byebug/settings/verbose.rb
137
138
  - lib/byebug/settings/width.rb
138
139
  - lib/byebug/version.rb
139
- - test/breakpoints_test.rb
140
- - test/conditions_test.rb
140
+ - test/break_test.rb
141
+ - test/condition_test.rb
141
142
  - test/continue_test.rb
142
143
  - test/debugger_alias_test.rb
144
+ - test/delete_test.rb
143
145
  - test/display_test.rb
144
146
  - test/edit_test.rb
145
147
  - test/eval_test.rb
@@ -149,13 +151,14 @@ files:
149
151
  - test/history_test.rb
150
152
  - test/info_test.rb
151
153
  - test/interrupt_test.rb
154
+ - test/irb_test.rb
152
155
  - test/kill_test.rb
153
156
  - test/list_test.rb
154
157
  - test/method_test.rb
155
158
  - test/post_mortem_test.rb
159
+ - test/pry_test.rb
156
160
  - test/quit_test.rb
157
161
  - test/reload_test.rb
158
- - test/repl_test.rb
159
162
  - test/restart_test.rb
160
163
  - test/save_test.rb
161
164
  - test/set_test.rb
@@ -164,8 +167,8 @@ files:
164
167
  - test/stepping_test.rb
165
168
  - test/support/breakpoint.rb
166
169
  - test/support/matchers.rb
167
- - test/support/test_dsl.rb
168
170
  - test/support/test_interface.rb
171
+ - test/support/utils.rb
169
172
  - test/test_helper.rb
170
173
  - test/thread_test.rb
171
174
  - test/trace_test.rb
@@ -195,10 +198,11 @@ signing_key:
195
198
  specification_version: 4
196
199
  summary: Ruby 2.0 fast debugger - base + cli
197
200
  test_files:
198
- - test/breakpoints_test.rb
199
- - test/conditions_test.rb
201
+ - test/break_test.rb
202
+ - test/condition_test.rb
200
203
  - test/continue_test.rb
201
204
  - test/debugger_alias_test.rb
205
+ - test/delete_test.rb
202
206
  - test/display_test.rb
203
207
  - test/edit_test.rb
204
208
  - test/eval_test.rb
@@ -208,13 +212,14 @@ test_files:
208
212
  - test/history_test.rb
209
213
  - test/info_test.rb
210
214
  - test/interrupt_test.rb
215
+ - test/irb_test.rb
211
216
  - test/kill_test.rb
212
217
  - test/list_test.rb
213
218
  - test/method_test.rb
214
219
  - test/post_mortem_test.rb
220
+ - test/pry_test.rb
215
221
  - test/quit_test.rb
216
222
  - test/reload_test.rb
217
- - test/repl_test.rb
218
223
  - test/restart_test.rb
219
224
  - test/save_test.rb
220
225
  - test/set_test.rb
@@ -223,8 +228,8 @@ test_files:
223
228
  - test/stepping_test.rb
224
229
  - test/support/breakpoint.rb
225
230
  - test/support/matchers.rb
226
- - test/support/test_dsl.rb
227
231
  - test/support/test_interface.rb
232
+ - test/support/utils.rb
228
233
  - test/test_helper.rb
229
234
  - test/thread_test.rb
230
235
  - test/trace_test.rb
@@ -1,137 +0,0 @@
1
- module Byebug
2
-
3
- # Implements byebug "break" command.
4
- class BreakCommand < Command
5
- self.allow_in_post_mortem = false
6
- self.allow_in_control = true
7
-
8
- def regexp
9
- /^\s* b(?:reak)? (?:\s+#{Position_regexp})? (?:\s+(.+))? \s*$/x
10
- end
11
-
12
- def execute
13
- return print BreakCommand.help(nil) if BreakCommand.names.include?(@match[0])
14
-
15
- if @match[1]
16
- line, _, _, expr = @match.captures
17
- else
18
- _, file, line, expr = @match.captures
19
- end
20
- if expr
21
- if expr !~ /^\s*if\s+(.+)/
22
- if file or line
23
- errmsg "Expecting \"if\" in breakpoint condition; got: #{expr}.\n"
24
- else
25
- errmsg "Invalid breakpoint location: #{expr}.\n"
26
- end
27
- return
28
- else
29
- expr = $1
30
- end
31
- end
32
-
33
- brkpt_filename = file
34
- if file.nil?
35
- unless @state.context
36
- errmsg "We are not in a state that has an associated file.\n"
37
- return
38
- end
39
- brkpt_filename = @state.file
40
- if line.nil?
41
- # Set breakpoint at current line
42
- line = @state.line.to_s
43
- end
44
- elsif line !~ /^\d+$/
45
- # See if "line" is a method/function name
46
- klass = bb_warning_eval(file)
47
- if klass && klass.kind_of?(Module)
48
- class_name = klass.name if klass
49
- else
50
- errmsg "Unknown class #{file}.\n"
51
- throw :debug_error
52
- end
53
- end
54
-
55
- if line =~ /^\d+$/
56
- line = line.to_i
57
- if LineCache.cache(brkpt_filename, Setting[:autoreload])
58
- last_line = LineCache.size(brkpt_filename)
59
- return errmsg "There are only #{last_line} lines in file " \
60
- "#{brkpt_filename}\n" if line > last_line
61
-
62
- return errmsg "Line #{line} is not a stopping point in file " \
63
- "#{brkpt_filename}\n" unless
64
- LineCache.trace_line_numbers(brkpt_filename).member?(line)
65
- else
66
- errmsg "No source file named #{brkpt_filename}\n"
67
- return unless confirm("Set breakpoint anyway? (y/n) ")
68
- end
69
-
70
- b = Byebug.add_breakpoint brkpt_filename, line, expr
71
- print "Created breakpoint #{b.id} at " \
72
- "#{CommandProcessor.canonic_file(brkpt_filename)}:#{line.to_s}\n"
73
- unless syntax_valid?(expr)
74
- errmsg "Expression \"#{expr}\" syntactically incorrect; breakpoint" \
75
- " disabled.\n"
76
- b.enabled = false
77
- end
78
- else
79
- method = line.intern
80
- b = Byebug.add_breakpoint class_name, method, expr
81
- print "Created breakpoint #{b.id} at #{class_name}::#{method.to_s}\n"
82
- end
83
- end
84
-
85
- class << self
86
- def names
87
- %w(break)
88
- end
89
-
90
- def description
91
- %{b[reak] file:line [if expr]
92
- b[reak] class(.|#)method [if expr]
93
-
94
- Set breakpoint to some position, (optionally) if expr == true}
95
- end
96
- end
97
- end
98
-
99
- # Implements byebug "delete" command.
100
- class DeleteCommand < Command
101
- self.allow_in_post_mortem = false
102
- self.allow_in_control = true
103
-
104
- def regexp
105
- /^\s* del(?:ete)? (?:\s+(.*))?$/x
106
- end
107
-
108
- def execute
109
- return errmsg "We are not in a state we can delete breakpoints.\n" unless
110
- @state.context
111
-
112
- if not @match[1]
113
- Byebug.breakpoints.clear if confirm("Delete all breakpoints? (y or n) ")
114
- else
115
- @match[1].split(/[ \t]+/).each do |pos|
116
- return unless pos = get_int(pos, "Delete", 1)
117
- errmsg "No breakpoint number %d\n", pos unless
118
- Byebug.remove_breakpoint(pos)
119
- end
120
- end
121
- end
122
-
123
- class << self
124
- def names
125
- %w(delete)
126
- end
127
-
128
- def description
129
- %{del[ete][ nnn...]
130
-
131
- Without and argument, deletes all breakpoints. With integer arguments,
132
- it deletes specific breakpoints.}
133
- end
134
- end
135
- end
136
-
137
- end
@@ -1,30 +0,0 @@
1
- module Byebug
2
-
3
- # Implements byebug "skip" command
4
- class SkipCommand < Command
5
- self.allow_in_control = true
6
-
7
- def regexp
8
- /^\s* sk(?:ip)? \s*$/x
9
- end
10
-
11
- def execute
12
- Byebug::skip_next_exception
13
- print "ok\n"
14
- end
15
-
16
- class << self
17
- def names
18
- %w(skip)
19
- end
20
-
21
- def description
22
- %{sk[ip]\tskip the next thrown exception
23
-
24
- This is useful if you've explicitly caught an exception through the
25
- "catch" command, and wish to pass the exception on to the code that
26
- you're debugging.}
27
- end
28
- end
29
- end
30
- end
@@ -1,474 +0,0 @@
1
- module BreakpointsTest
2
- class Example
3
- def self.a(num)
4
- 4
5
- end
6
-
7
- def b
8
- 3
9
- end
10
- end
11
-
12
- class DeepExample
13
- def a
14
- z = 2
15
- b(z)
16
- end
17
-
18
- def b(num)
19
- v2 = 5 if 1 == num ; [1,2,v2].map { |a| a.to_f }
20
- c
21
- end
22
-
23
- def c
24
- z = 4
25
- z += 5
26
- byebug
27
- end
28
- end
29
-
30
- class BreakpointsTestCase < TestDsl::TestCase
31
- before do
32
- @example = -> do
33
- y = 3
34
- # A comment
35
- byebug
36
- z = 5
37
- Example.new.b
38
- Example.a(y+z)
39
- end
40
- end
41
-
42
- def first
43
- Byebug.breakpoints.first
44
- end
45
-
46
- def last
47
- Byebug.breakpoints.last
48
- end
49
-
50
- describe 'setting breakpoint in the current file' do
51
- before { enter 'break 33' }
52
-
53
- def check_first(field, value)
54
- debug_proc(@example) { first.send(field).must_equal value }
55
- end
56
-
57
- it('must have correct pos') { check_first(:pos, 33) }
58
- it('must have correct source') { check_first(:source, __FILE__) }
59
- it('must have correct expression') { check_first(:expr, nil) }
60
- it('must have correct hit count') { check_first(:hit_count, 0) }
61
- it('must have correct hit value') { check_first(:hit_value, 0) }
62
- it('must be enabled') { check_first(:enabled?, true) }
63
-
64
- it('must return right response') do
65
- id = nil
66
- debug_proc(@example) { id = first.id }
67
- check_output_includes "Created breakpoint #{id} at #{__FILE__}:33"
68
- end
69
- end
70
-
71
- describe 'using shortcut for the command' do
72
- before { enter 'b 33' }
73
- it 'must set a breakpoint' do
74
- debug_proc(@example) { Byebug.breakpoints.size.must_equal 1 }
75
- end
76
- end
77
-
78
- describe 'setting breakpoint to unexistent line' do
79
- before { enter 'break 1000' }
80
-
81
- it 'must not create a breakpoint' do
82
- debug_proc(@example) { Byebug.breakpoints.must_be_empty }
83
- end
84
-
85
- it 'must show an error' do
86
- debug_proc(@example)
87
- check_error_includes \
88
- "There are only #{LineCache.size(__FILE__)} lines in file #{__FILE__}"
89
- end
90
- end
91
-
92
- describe 'setting breakpoint to incorrect line' do
93
- before { enter 'break 6' }
94
-
95
- it 'must not create a breakpoint' do
96
- debug_proc(@example) { Byebug.breakpoints.must_be_empty }
97
- end
98
-
99
- it 'must show an error' do
100
- debug_proc(@example)
101
- check_error_includes \
102
- "Line 6 is not a stopping point in file #{__FILE__}"
103
- end
104
- end
105
-
106
- describe 'stopping at breakpoint' do
107
- before { enter 'break 37', 'cont' }
108
-
109
- it 'must stop at the correct line' do
110
- debug_proc(@example) { state.line.must_equal 37 }
111
- end
112
-
113
- it 'must stop at the correct file' do
114
- debug_proc(@example) { state.file.must_equal __FILE__ }
115
- end
116
-
117
- describe 'show a message' do
118
- describe 'with full filename' do
119
- it 'must show a message with full filename' do
120
- debug_proc(@example) { @id = first.id }
121
- check_output_includes "Created breakpoint #{@id} at #{__FILE__}:37"
122
- end
123
- end
124
-
125
- describe 'with basename' do
126
- temporary_change_hash Byebug::Setting, :basename, true
127
-
128
- it 'must show a message with basename' do
129
- debug_proc(@example) { @id = first.id }
130
- check_output_includes \
131
- "Created breakpoint #{@id} at #{File.basename(__FILE__)}:37"
132
- end
133
- end
134
- end
135
- end
136
-
137
- describe 'reloading source on change' do
138
- describe 'autoreload not set' do
139
- temporary_change_hash Byebug::Setting, :autoreload, false
140
-
141
- it 'must not reload source' do
142
- id = nil
143
- enter \
144
- -> { change_line_in_file(__FILE__, 37, ''); 'break 37' },
145
- -> { change_line_in_file(__FILE__, 37, ' Example.new.b');
146
- cont }
147
-
148
- debug_proc(@example) { id = first.id }
149
- check_output_includes "Created breakpoint #{id} at #{__FILE__}:37"
150
- end
151
- end
152
-
153
- describe 'autoreload set' do
154
- it 'must reload source' do
155
- enter \
156
- -> { change_line_in_file(__FILE__, 37, ''); 'break 37' },
157
- -> { change_line_in_file(__FILE__, 37, ' Example.new.b');
158
- 'next' }
159
-
160
- debug_proc(@example)
161
- check_error_includes \
162
- "Line 37 is not a stopping point in file #{__FILE__}"
163
- end
164
- end
165
- end
166
-
167
- describe 'set breakpoint in a file' do
168
- describe 'successfully' do
169
- before { enter "break #{__FILE__}:4", 'cont' }
170
-
171
- it 'must stop at the correct line' do
172
- debug_proc(@example) { state.line.must_equal 4 }
173
- end
174
-
175
- it 'must stop at the correct file' do
176
- debug_proc(@example) { state.file.must_equal __FILE__ }
177
- end
178
- end
179
-
180
- describe 'when setting breakpoint to unexisted file' do
181
- before do
182
- enter 'break asf:324'
183
- debug_proc(@example)
184
- end
185
-
186
- it 'must show an error' do
187
- check_error_includes 'No source file named asf'
188
- end
189
-
190
- it 'must ask about setting breakpoint anyway' do
191
- check_output_includes \
192
- 'Set breakpoint anyway? (y/n)', interface.confirm_queue
193
- end
194
- end
195
- end
196
-
197
- describe 'set breakpoint to a method' do
198
- describe 'set breakpoint to an instance method' do
199
- before { enter 'break Example#b', 'cont' }
200
-
201
- it 'must stop at the correct line' do
202
- debug_proc(@example) { state.line.must_equal 7 }
203
- end
204
-
205
- it 'must stop at the correct file' do
206
- debug_proc(@example) { state.file.must_equal __FILE__ }
207
- end
208
- end
209
-
210
- describe 'set breakpoint to a class method' do
211
- before { enter 'break Example.a', 'cont' }
212
-
213
- it 'must stop at the correct line' do
214
- debug_proc(@example) { state.line.must_equal 3 }
215
- end
216
-
217
- it 'must stop at the correct file' do
218
- debug_proc(@example) { state.file.must_equal __FILE__ }
219
- end
220
- end
221
-
222
- describe 'set breakpoint to unexisted class' do
223
- it 'must show an error' do
224
- enter 'break B.a'
225
- debug_proc(@example)
226
- check_error_includes 'Unknown class B.'
227
- end
228
- end
229
- end
230
-
231
- describe 'set breakpoint to an invalid location' do
232
- before { enter 'break foo' }
233
-
234
- it 'must not create a breakpoint' do
235
- debug_proc(@example) { Byebug.breakpoints.must_be_empty }
236
- end
237
-
238
- it 'must show an error' do
239
- debug_proc(@example)
240
- check_error_includes 'Invalid breakpoint location: foo.'
241
- end
242
- end
243
-
244
- describe 'disabling breakpoints' do
245
- describe 'successfully' do
246
- before { enter 'break 37', 'break 38' }
247
-
248
- describe 'short syntax' do
249
- before { enter ->{ "disable #{first.id}" } }
250
-
251
- it 'must have a breakpoint with #enabled? returning false' do
252
- debug_proc(@example) { first.enabled?.must_equal false }
253
- end
254
-
255
- it 'must not stop on the disabled breakpoint' do
256
- enter 'cont'
257
- debug_proc(@example) { state.line.must_equal 38 }
258
- end
259
- end
260
-
261
- describe 'full syntax' do
262
- describe 'with no args' do
263
- before { enter 'disable breakpoints' }
264
-
265
- it 'must have all breakoints with #enabled? returning false' do
266
- debug_proc(@example) do
267
- first.enabled?.must_equal false
268
- last.enabled?.must_equal false
269
- end
270
- end
271
-
272
- it 'must not stop on any disabled breakpoint' do
273
- enter 'cont'
274
- debug_proc(@example)
275
- # Obscure assert to check for program termination
276
- state.proceed.must_equal true
277
- end
278
- end
279
-
280
- describe 'with specific breakpoint' do
281
- before do
282
- enter ->{ "disable breakpoints #{first.id}" }
283
- end
284
-
285
- it 'must have a breakpoint with #enabled? returning false' do
286
- debug_proc(@example) {
287
- first.enabled?.must_equal false }
288
- end
289
- end
290
- end
291
- end
292
-
293
- describe 'unsuccesfully' do
294
- it 'must show an error if syntax is incorrect' do
295
- enter 'disable'
296
- debug_proc(@example)
297
- check_error_includes '"disable" must be followed by "display", ' \
298
- '"breakpoints" or breakpoint numbers.'
299
- end
300
-
301
- it 'must show an error if no breakpoints are set' do
302
- enter 'disable 1'
303
- debug_proc(@example)
304
- check_error_includes 'No breakpoints have been set.'
305
- end
306
-
307
- it 'must show an error if a number is not provided as an argument' do
308
- enter 'break 5', 'disable foo'
309
- debug_proc(@example)
310
- check_output_includes \
311
- '"disable breakpoints" argument "foo" needs to be a number'
312
- end
313
- end
314
- end
315
-
316
- describe 'enabling breakpoints' do
317
- describe 'successfully' do
318
- before { enter 'break 37', 'break 38', 'disable breakpoints' }
319
-
320
- describe 'short syntax' do
321
- before { enter ->{ "enable #{first.id}" } }
322
-
323
- it 'must have a breakpoint with #enabled? returning true' do
324
- debug_proc(@example) { first.enabled?.must_equal true }
325
- end
326
-
327
- it 'must stop on the enabled breakpoint' do
328
- enter 'cont'
329
- debug_proc(@example) { state.line.must_equal 37 }
330
- end
331
- end
332
-
333
- describe 'full syntax' do
334
- describe 'with no args' do
335
- before { enter 'enable breakpoints' }
336
-
337
- it 'must have all breakoints with #enabled? returning true' do
338
- debug_proc(@example) do
339
- first.enabled?.must_equal true
340
- last.enabled?.must_equal true
341
- end
342
- end
343
-
344
- it 'must stop on the first breakpoint' do
345
- enter 'cont'
346
- debug_proc(@example) { state.line.must_equal 37 }
347
- end
348
-
349
- it 'must stop on the last breakpoint' do
350
- enter 'cont', 'cont'
351
- debug_proc(@example) { state.line.must_equal 38 }
352
- end
353
- end
354
-
355
- describe 'with specific breakpoint' do
356
- before { enter ->{ "enable breakpoints #{last.id}" } }
357
-
358
- it 'must have a breakpoint with #enabled? returning true' do
359
- debug_proc(@example) { last.enabled?.must_equal true }
360
- end
361
-
362
- it 'must stop only on the enabled breakpoint' do
363
- enter 'cont'
364
- debug_proc(@example) { state.line.must_equal 38 }
365
- end
366
- end
367
- end
368
- end
369
-
370
- describe 'errors' do
371
- it 'must show an error if syntax is incorrect' do
372
- enter 'enable'
373
- debug_proc(@example)
374
- check_error_includes '"enable" must be followed by "display", ' \
375
- '"breakpoints" or breakpoint numbers.'
376
- end
377
- end
378
- end
379
-
380
- describe 'deleting a breakpoint' do
381
- before { enter 'break 37', -> { "delete #{first.id}" }, 'break 38' }
382
-
383
- it 'must have only one breakpoint' do
384
- debug_proc(@example) { Byebug.breakpoints.size.must_equal 1 }
385
- end
386
-
387
- it 'must not stop on the disabled breakpoint' do
388
- enter 'cont'
389
- debug_proc(@example) { state.line.must_equal 38 }
390
- end
391
- end
392
-
393
- describe 'Conditional breakpoints' do
394
- it 'must stop if the condition is true' do
395
- enter 'break 37 if z == 5', 'break 38', 'cont'
396
- debug_proc(@example) { state.line.must_equal 37 }
397
- end
398
-
399
- it 'must skip if the condition is false' do
400
- enter 'break 37 if z == 3', 'break 38', 'cont'
401
- debug_proc(@example) { state.line.must_equal 38 }
402
- end
403
-
404
- it 'must show an error when conditional syntax is wrong' do
405
- enter 'break 37 ifa z == 3', 'break 38', 'cont'
406
- debug_proc(@example) { state.line.must_equal 38 }
407
- check_error_includes \
408
- 'Expecting "if" in breakpoint condition; got: ifa z == 3.'
409
- end
410
-
411
- describe 'enabling with wrong conditional syntax' do
412
- before do
413
- enter 'break 37', -> { "disable #{first.id}" },
414
- -> { "cond #{first.id} z -=( 3" },
415
- -> { "enable #{first.id}"}
416
- end
417
-
418
- it 'must not enable a breakpoint' do
419
- debug_proc(@example) { first.enabled?.must_equal false }
420
- end
421
-
422
- it 'must show an error' do
423
- debug_proc(@example)
424
- check_error_includes 'Expression "z -=( 3" syntactically incorrect; ' \
425
- 'breakpoint remains disabled.'
426
- end
427
- end
428
-
429
- it 'must show an error if no file or line is specified' do
430
- enter 'break ifa z == 3', 'break 38', 'cont'
431
- debug_proc(@example) { state.line.must_equal 38 }
432
- check_error_includes 'Invalid breakpoint location: ifa z == 3.'
433
- end
434
-
435
- it 'must show an error if expression syntax is invalid' do
436
- enter 'break if z -=) 3', 'break 38', 'cont'
437
- debug_proc(@example) { state.line.must_equal 38 }
438
- check_error_includes \
439
- 'Expression "z -=) 3" syntactically incorrect; breakpoint disabled.'
440
- end
441
- end
442
-
443
- describe 'Stopping through `byebug` keyword' do
444
- describe 'when not the last instruction of a method' do
445
- it 'must stop in the next line' do
446
- debug_proc(@example) { state.line.must_equal 36 }
447
- end
448
- end
449
-
450
- describe 'when last instruction of a method' do
451
- before do
452
- @deep_example = lambda do
453
- ex = DeepExample.new.a
454
- 2.times do
455
- ex = ex ? ex : 1
456
- end
457
- end
458
- end
459
-
460
- it 'must stop right before returning from the frame' do
461
- debug_proc(@deep_example) { state.line.must_equal 27 }
462
- end
463
- end
464
- end
465
-
466
- describe 'Help' do
467
- it 'must show info about setting breakpoints when using just "break"' do
468
- enter 'break', 'cont'
469
- debug_proc(@example)
470
- check_output_includes(/b\[reak\] file:line \[if expr\]/)
471
- end
472
- end
473
- end
474
- end