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/lib/byebug/version.rb
CHANGED
data/test/break_test.rb
ADDED
@@ -0,0 +1,376 @@
|
|
1
|
+
module Byebug
|
2
|
+
class BreakExample
|
3
|
+
def self.a(num)
|
4
|
+
4
|
5
|
+
end
|
6
|
+
|
7
|
+
def b
|
8
|
+
3
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class BreakTestCase < TestCase
|
13
|
+
def setup
|
14
|
+
@example = -> do
|
15
|
+
y = 3
|
16
|
+
# A comment
|
17
|
+
byebug
|
18
|
+
z = 5
|
19
|
+
BreakExample.new.b
|
20
|
+
BreakExample.a(y+z)
|
21
|
+
end
|
22
|
+
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_setting_breakpoint_sets_correct_fields
|
27
|
+
enter 'break 19'
|
28
|
+
|
29
|
+
debug_proc(@example) do
|
30
|
+
assert_equal 19, first_brkpt.pos
|
31
|
+
assert_equal __FILE__, first_brkpt.source
|
32
|
+
assert_equal nil, first_brkpt.expr
|
33
|
+
assert_equal 0, first_brkpt.hit_count
|
34
|
+
assert_equal 0, first_brkpt.hit_value
|
35
|
+
assert_equal true, first_brkpt.enabled?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_setting_breakpoint_using_shortcut_properly_adds_the_breakpoint
|
40
|
+
enter 'break 19'
|
41
|
+
debug_proc(@example) { assert_equal 1, Byebug.breakpoints.size }
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_setting_breakpoint_to_nonexistent_line_does_not_create_breakpoint
|
45
|
+
enter 'break 1000'
|
46
|
+
debug_proc(@example) { assert_empty Byebug.breakpoints }
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_setting_breakpoint_to_nonexistent_file_does_not_create_breakpoint
|
50
|
+
enter 'break asf:324'
|
51
|
+
debug_proc(@example) { assert_empty Byebug.breakpoints }
|
52
|
+
check_error_includes 'No file named asf'
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_setting_breakpoint_to_invalid_line_does_not_create_breakpoint
|
56
|
+
enter 'break 6'
|
57
|
+
debug_proc(@example) { assert_empty Byebug.breakpoints }
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_stops_at_the_correct_place_when_a_breakpoint_is_set
|
61
|
+
enter 'break 19', 'cont'
|
62
|
+
debug_proc(@example) do
|
63
|
+
assert_equal 19, state.line
|
64
|
+
assert_equal __FILE__, state.file
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_setting_breakpoint_to_an_instance_method_stops_at_correct_place
|
69
|
+
enter 'break BreakExample#b', 'cont'
|
70
|
+
|
71
|
+
debug_proc(@example) do
|
72
|
+
assert_equal 7, state.line
|
73
|
+
assert_equal __FILE__, state.file
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_setting_breakpoint_to_a_class_method_stops_at_correct_place
|
78
|
+
enter 'break BreakExample.a', 'cont'
|
79
|
+
|
80
|
+
debug_proc(@example) do
|
81
|
+
assert_equal 3, state.line
|
82
|
+
assert_equal __FILE__, state.file
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_setting_breakpoint_to_nonexistent_class_does_not_create_breakpoint
|
87
|
+
enter 'break B.a'
|
88
|
+
|
89
|
+
debug_proc(@example)
|
90
|
+
check_error_includes 'Unknown class B'
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_setting_breakpoint_to_nonexistent_class_shows_error_message
|
94
|
+
enter 'break B.a'
|
95
|
+
|
96
|
+
debug_proc(@example)
|
97
|
+
check_error_includes 'Unknown class B'
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_setting_breakpoint_to_invalid_location_does_not_create_breakpoint
|
101
|
+
enter 'break foo'
|
102
|
+
|
103
|
+
debug_proc(@example) { assert_empty Byebug.breakpoints }
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_setting_breakpoint_to_invalid_location_shows_error_message
|
107
|
+
enter 'break foo'
|
108
|
+
|
109
|
+
debug_proc(@example)
|
110
|
+
check_error_includes 'Invalid breakpoint location: foo'
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_breaking_w_byebug_keywork_stops_at_the_next_line
|
114
|
+
debug_proc(@example) { assert_equal 18, state.line }
|
115
|
+
end
|
116
|
+
|
117
|
+
class BreakDeepExample
|
118
|
+
def a
|
119
|
+
z = 2
|
120
|
+
b(z)
|
121
|
+
end
|
122
|
+
|
123
|
+
def b(num)
|
124
|
+
v2 = 5 if 1 == num ; [1,2,v2].map { |a| a.to_f }
|
125
|
+
c
|
126
|
+
end
|
127
|
+
|
128
|
+
def c
|
129
|
+
z = 4
|
130
|
+
z += 5
|
131
|
+
byebug
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_breaking_w_byebug_keywork_stops_at_frame_end_when_last_instruction
|
136
|
+
@deep_example = lambda do
|
137
|
+
ex = BreakDeepExample.new.a
|
138
|
+
2.times do
|
139
|
+
ex = ex ? ex : 1
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
debug_proc(@deep_example) { assert_equal 132, state.line }
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_disabling_breakpoints_with_short_syntax_sets_enabled_to_false
|
147
|
+
enter 'break 19', 'break 20', -> { "disable #{first_brkpt.id}" }
|
148
|
+
|
149
|
+
debug_proc(@example) { assert_equal false, first_brkpt.enabled? }
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_disabling_breakpoints_with_short_syntax_properly_ignores_them
|
153
|
+
enter 'break 19', 'break 20', -> { "disable #{first_brkpt.id}" } , 'cont'
|
154
|
+
|
155
|
+
debug_proc(@example) { assert_equal 20, state.line }
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_disabling_breakpoints_with_full_syntax_sets_enabled_to_false
|
159
|
+
enter 'b 19', 'b 20', -> { "disable breakpoints #{first_brkpt.id}" }
|
160
|
+
|
161
|
+
debug_proc(@example) { assert_equal false, first_brkpt.enabled? }
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_disabling_breakpoints_with_full_syntax_properly_ignores_them
|
165
|
+
enter 'b 19', 'b 20', -> { "disable breakpoints #{first_brkpt.id}" },
|
166
|
+
'cont'
|
167
|
+
|
168
|
+
debug_proc(@example) { assert_equal 20, state.line }
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_disabling_all_breakpoints_sets_all_enabled_flags_to_false
|
172
|
+
enter 'break 19', 'break 20', 'disable breakpoints'
|
173
|
+
|
174
|
+
debug_proc(@example) do
|
175
|
+
assert_equal false, first_brkpt.enabled?
|
176
|
+
assert_equal false, last_brkpt.enabled?
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_disabling_all_breakpoints_ignores_all_breakpoints
|
181
|
+
enter 'break 19', 'break 20', 'disable breakpoints', 'cont'
|
182
|
+
|
183
|
+
debug_proc(@example)
|
184
|
+
assert_equal true, state.proceed # Obscure assert to check termination
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_disabling_breakpoints_shows_an_error_in_syntax_is_incorrect
|
188
|
+
enter 'disable'
|
189
|
+
|
190
|
+
debug_proc(@example)
|
191
|
+
check_error_includes \
|
192
|
+
'"disable" must be followed by "display", "breakpoints" or breakpoint ids'
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_disabling_breakpoints_shows_an_error_if_no_breakpoints_are_set
|
196
|
+
enter 'disable 1'
|
197
|
+
|
198
|
+
debug_proc(@example)
|
199
|
+
check_error_includes 'No breakpoints have been set'
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_disabling_breakpoints_shows_an_error_if_non_numeric_arg_is_provided
|
203
|
+
enter 'break 5', 'disable foo'
|
204
|
+
|
205
|
+
debug_proc(@example)
|
206
|
+
check_output_includes \
|
207
|
+
'"disable breakpoints" argument "foo" needs to be a number'
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_enabling_breakpoints_with_short_syntax_sets_enabled_to_true
|
211
|
+
enter 'b 19', 'b 20', 'disable breakpoints',
|
212
|
+
-> { "enable #{first_brkpt.id}" }
|
213
|
+
|
214
|
+
debug_proc(@example) { assert_equal true, first_brkpt.enabled? }
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_enabling_breakpoints_with_short_syntax_stops_at_enabled_breakpoint
|
218
|
+
enter 'break 19', 'break 20', 'disable breakpoints',
|
219
|
+
-> { "enable #{first_brkpt.id}" }, 'cont'
|
220
|
+
|
221
|
+
debug_proc(@example) { assert_equal 19, state.line }
|
222
|
+
end
|
223
|
+
|
224
|
+
def test_enabling_all_breakpoints_sets_all_enabled_flags_to_true
|
225
|
+
enter 'break 19', 'break 20', 'disable breakpoints', 'enable breakpoints'
|
226
|
+
|
227
|
+
debug_proc(@example) do
|
228
|
+
assert_equal true, first_brkpt.enabled?
|
229
|
+
assert_equal true, last_brkpt.enabled?
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
def test_enabling_all_breakpoints_stops_at_first_breakpoint
|
234
|
+
enter 'b 19', 'b 20', 'disable breakpoints', 'enable breakpoints', 'cont'
|
235
|
+
|
236
|
+
debug_proc(@example) { assert_equal 19, state.line }
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_enabling_all_breakpoints_stops_at_last_breakpoint
|
240
|
+
enter 'break 19', 'break 20', 'disable breakpoints',
|
241
|
+
'enable breakpoints', 'cont', 'cont'
|
242
|
+
|
243
|
+
debug_proc(@example) { assert_equal 20, state.line }
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_enabling_breakpoints_with_full_syntax_sets_enabled_to_false
|
247
|
+
enter 'break 19', 'break 20', 'disable breakpoints',
|
248
|
+
-> { "enable breakpoints #{last_brkpt.id}" }
|
249
|
+
|
250
|
+
debug_proc(@example) { assert_equal false, first_brkpt.enabled? }
|
251
|
+
end
|
252
|
+
|
253
|
+
def test_enabling_breakpoints_with_full_syntax_stops_at_enabled_breakpoint
|
254
|
+
enter 'break 19', 'break 20', 'disable breakpoints',
|
255
|
+
-> { "enable breakpoints #{last_brkpt.id}" }, 'cont'
|
256
|
+
|
257
|
+
debug_proc(@example) { assert_equal 20, state.line }
|
258
|
+
end
|
259
|
+
|
260
|
+
def test_enabling_breakpoints_shows_an_error_in_syntax_is_incorrect
|
261
|
+
enter 'enable'
|
262
|
+
|
263
|
+
debug_proc(@example)
|
264
|
+
check_error_includes \
|
265
|
+
'"enable" must be followed by "display", "breakpoints" or breakpoint ids'
|
266
|
+
end
|
267
|
+
|
268
|
+
def test_conditional_breakpoint_stops_if_condition_is_true
|
269
|
+
enter 'break 19 if z == 5', 'break 20', 'cont'
|
270
|
+
debug_proc(@example) { assert_equal 19, state.line }
|
271
|
+
end
|
272
|
+
|
273
|
+
def test_conditional_breakpoint_is_ignored_if_condition_is_false
|
274
|
+
enter 'break 19 if z == 3', 'break 20', 'cont'
|
275
|
+
debug_proc(@example) { assert_equal 20, state.line }
|
276
|
+
end
|
277
|
+
|
278
|
+
def test_setting_conditional_breakpoint_shows_error_if_syntax_wrong
|
279
|
+
enter 'break 19 ifa z == 3', 'break 20', 'cont'
|
280
|
+
debug_proc(@example) { assert_equal 20, state.line }
|
281
|
+
check_error_includes \
|
282
|
+
'Expecting "if" in breakpoint condition, got: ifa z == 3'
|
283
|
+
end
|
284
|
+
|
285
|
+
def test_setting_conditional_breakpoint_shows_error_if_no_breakpoint_id
|
286
|
+
enter 'break if z == 3', 'break 20', 'cont'
|
287
|
+
debug_proc(@example) { assert_equal 20, state.line }
|
288
|
+
check_error_includes 'Invalid breakpoint location: if z == 3'
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_setting_conditional_breakpoint_using_wrong_expression_ignores_it
|
292
|
+
enter 'break if z -=) 3', 'break 20', 'cont'
|
293
|
+
debug_proc(@example) { assert_equal 20, state.line }
|
294
|
+
end
|
295
|
+
|
296
|
+
def test_shows_info_about_setting_breakpoints_when_using_just_break
|
297
|
+
enter 'break', 'cont'
|
298
|
+
debug_proc(@example)
|
299
|
+
check_output_includes(/b\[reak\] file:line \[if expr\]/)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
module FilenameTests
|
304
|
+
def test_setting_breakpoint_prints_confirmation_message
|
305
|
+
enter 'break 19'
|
306
|
+
debug_proc(@example) { @id = first_brkpt.id }
|
307
|
+
check_output_includes "Created breakpoint #{@id} at #{@filename}:19"
|
308
|
+
end
|
309
|
+
|
310
|
+
def test_setting_breakpoint_to_nonexistent_line_shows_an_error
|
311
|
+
enter 'break 1000'
|
312
|
+
debug_proc(@example)
|
313
|
+
n = %x{wc -l #{__FILE__}}.split.first.to_i
|
314
|
+
check_error_includes "There are only #{n} lines in file #{@filename}"
|
315
|
+
end
|
316
|
+
|
317
|
+
def test_setting_breakpoint_to_invalid_line_shows_an_error
|
318
|
+
enter 'break 6'
|
319
|
+
debug_proc(@example)
|
320
|
+
check_error_includes \
|
321
|
+
"Line 6 is not a valid breakpoint in file #{@filename}"
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
class BreakTestCaseBasename < BreakTestCase
|
326
|
+
def setup
|
327
|
+
@filename = File.basename(__FILE__)
|
328
|
+
super
|
329
|
+
enter 'set basename'
|
330
|
+
end
|
331
|
+
|
332
|
+
include FilenameTests
|
333
|
+
end
|
334
|
+
|
335
|
+
class BreakTestCaseNobasename < BreakTestCase
|
336
|
+
def setup
|
337
|
+
@filename = __FILE__
|
338
|
+
super
|
339
|
+
enter 'set nobasename'
|
340
|
+
end
|
341
|
+
|
342
|
+
include FilenameTests
|
343
|
+
end
|
344
|
+
|
345
|
+
class BreakTestCaseAutoreload < BreakTestCase
|
346
|
+
def setup
|
347
|
+
super
|
348
|
+
enter 'set autoreload'
|
349
|
+
end
|
350
|
+
|
351
|
+
def test_setting_breakpoint_with_autoreload_uses_new_source
|
352
|
+
enter -> do
|
353
|
+
change_line_in_file(__FILE__, 19, '')
|
354
|
+
'break 19'
|
355
|
+
end
|
356
|
+
debug_proc(@example) { assert_empty Byebug.breakpoints }
|
357
|
+
change_line_in_file(__FILE__,19, ' BreakExample.new.b')
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
361
|
+
class BreakTestCaseNoAutoreload < BreakTestCase
|
362
|
+
def setup
|
363
|
+
super
|
364
|
+
enter 'set noautoreload'
|
365
|
+
end
|
366
|
+
|
367
|
+
def test_setting_breakpoint_with_autoreload_uses_new_source
|
368
|
+
enter -> do
|
369
|
+
change_line_in_file(__FILE__, 19, '')
|
370
|
+
'break 19'
|
371
|
+
end
|
372
|
+
debug_proc(@example) { assert_equal 1, Byebug.breakpoints.size }
|
373
|
+
change_line_in_file(__FILE__,19, ' BreakExample.new.b')
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Byebug
|
2
|
+
class ConditionTestCase < TestCase
|
3
|
+
def setup
|
4
|
+
@example = -> do
|
5
|
+
byebug
|
6
|
+
b = 5
|
7
|
+
c = b + 5
|
8
|
+
c = Object.new
|
9
|
+
end
|
10
|
+
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_setting_condition_w_short_syntax_assigns_expression_to_breakpoint
|
15
|
+
enter 'break 7', -> { "cond #{first_brkpt.id} b == 5" }
|
16
|
+
|
17
|
+
debug_proc(@example) { assert_equal 'b == 5', first_brkpt.expr }
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_setting_condition_w_full_syntax_assigns_expression_to_breakpoint
|
21
|
+
enter 'break 7', -> { "condition #{first_brkpt.id} b == 5" }
|
22
|
+
|
23
|
+
debug_proc(@example) { assert_equal 'b == 5', first_brkpt.expr }
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_setting_condition_w_wrong_syntax_does_not_enable_breakpoint
|
27
|
+
enter 'break 7', -> { "disable #{first_brkpt.id}" },
|
28
|
+
-> { "cond #{first_brkpt.id} b ==" }
|
29
|
+
|
30
|
+
debug_proc(@example) { assert_equal false, first_brkpt.enabled? }
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_setting_condition_w_wrong_syntax_shows_error
|
34
|
+
enter 'break 7', -> { "disable #{first_brkpt.id}" },
|
35
|
+
-> { "cond #{first_brkpt.id} b ==" }
|
36
|
+
|
37
|
+
debug_proc(@example)
|
38
|
+
check_error_includes \
|
39
|
+
'Incorrect expression "b ==", breakpoint not changed'
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_execution_stops_when_condition_is_true
|
43
|
+
enter 'break 7', -> { "cond #{first_brkpt.id} b == 5" }, 'cont'
|
44
|
+
|
45
|
+
debug_proc(@example) { assert_equal 7, state.line }
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_execution_does_not_stop_when_condition_is_false
|
49
|
+
enter 'b 7', 'b 8', -> { "cond #{first_brkpt.id} b == 3" }, 'cont'
|
50
|
+
|
51
|
+
debug_proc(@example) { assert_equal 8, state.line }
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_conditions_with_wrong_syntax_are_ignored
|
55
|
+
enter 'break 7', 'break 8', -> { "cond #{first_brkpt.id} b ==" }, 'cont'
|
56
|
+
|
57
|
+
debug_proc(@example) { assert_equal 7, state.line }
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_empty_condition_means_removing_any_conditions
|
61
|
+
enter 'b 7 if b == 3', 'b 8', -> { "cond #{first_brkpt.id}" }, 'cont'
|
62
|
+
|
63
|
+
debug_proc(@example) do
|
64
|
+
assert_nil first_brkpt.expr
|
65
|
+
assert_equal 7, state.line
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_shows_error_if_there_are_no_breakpoints
|
70
|
+
enter 'cond 1 true'
|
71
|
+
|
72
|
+
debug_proc(@example)
|
73
|
+
check_error_includes 'No breakpoints have been set'
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_shows_error_if_breakpoint_id_is_incorrect
|
77
|
+
enter 'break 7', 'cond 8 b == 3', 'cont'
|
78
|
+
|
79
|
+
debug_proc(@example) { assert_equal 7, state.line }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|