debugger 1.4.0 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +4 -0
- data/README.md +9 -3
- data/debugger.gemspec +1 -1
- data/ext/ruby_debug/192/ruby_debug.c +21 -9
- data/ext/ruby_debug/193/ruby_debug.c +15 -5
- data/lib/debugger/test.rb +6 -0
- data/{test/support → lib/debugger/test}/breakpoint.rb +0 -0
- data/{test/support → lib/debugger/test}/context.rb +0 -0
- data/{test/support → lib/debugger/test}/matchers.rb +0 -0
- data/{test/support → lib/debugger/test}/mocha_extensions.rb +1 -1
- data/lib/debugger/test/printer_helpers.rb +8 -0
- data/{test/support → lib/debugger/test}/processor.rb +0 -0
- data/{test/support → lib/debugger/test}/test_dsl.rb +22 -2
- data/{test/support → lib/debugger/test}/test_interface.rb +4 -0
- data/lib/debugger/version.rb +1 -1
- data/lib/ruby-debug.rb +4 -1
- data/lib/ruby-debug/command.rb +18 -6
- data/lib/ruby-debug/commands/breakpoints.rb +27 -29
- data/lib/ruby-debug/commands/condition.rb +7 -2
- data/lib/ruby-debug/commands/continue.rb +1 -2
- data/lib/ruby-debug/commands/control.rb +8 -9
- data/lib/ruby-debug/commands/display.rb +7 -15
- data/lib/ruby-debug/commands/edit.rb +6 -6
- data/lib/ruby-debug/commands/enable.rb +6 -7
- data/lib/ruby-debug/commands/eval.rb +1 -3
- data/lib/ruby-debug/commands/frame.rb +72 -101
- data/lib/ruby-debug/commands/info.rb +8 -14
- data/lib/ruby-debug/commands/irb.rb +1 -1
- data/lib/ruby-debug/commands/jump.rb +6 -6
- data/lib/ruby-debug/commands/kill.rb +0 -1
- data/lib/ruby-debug/commands/list.rb +4 -4
- data/lib/ruby-debug/commands/method.rb +8 -11
- data/lib/ruby-debug/commands/quit.rb +1 -1
- data/lib/ruby-debug/commands/reload.rb +1 -1
- data/lib/ruby-debug/commands/save.rb +1 -1
- data/lib/ruby-debug/commands/set.rb +10 -15
- data/lib/ruby-debug/commands/show.rb +28 -42
- data/lib/ruby-debug/commands/skip.rb +1 -1
- data/lib/ruby-debug/commands/source.rb +1 -1
- data/lib/ruby-debug/commands/start.rb +26 -0
- data/lib/ruby-debug/commands/threads.rb +29 -18
- data/lib/ruby-debug/commands/tmate.rb +1 -1
- data/lib/ruby-debug/commands/trace.rb +6 -7
- data/lib/ruby-debug/commands/variables.rb +36 -19
- data/lib/ruby-debug/helper.rb +5 -5
- data/lib/ruby-debug/interface.rb +15 -3
- data/lib/ruby-debug/printers/base.rb +58 -0
- data/lib/ruby-debug/printers/plain.rb +41 -0
- data/lib/ruby-debug/printers/texts/base.yml +146 -0
- data/lib/ruby-debug/printers/texts/plain.yml +60 -0
- data/lib/ruby-debug/processor.rb +56 -47
- data/test/breakpoints_test.rb +43 -54
- data/test/conditions_test.rb +18 -6
- data/test/continue_test.rb +1 -1
- data/test/display_test.rb +11 -11
- data/test/edit_test.rb +1 -2
- data/test/eval_test.rb +5 -6
- data/test/finish_test.rb +1 -1
- data/test/frame_test.rb +29 -27
- data/test/help_test.rb +0 -1
- data/test/info_test.rb +10 -14
- data/test/irb_test.rb +0 -1
- data/test/jump_test.rb +21 -2
- data/test/method_test.rb +3 -3
- data/test/new/printers/plain_test.rb +84 -0
- data/test/reload_test.rb +2 -2
- data/test/restart_test.rb +1 -2
- data/test/set_test.rb +8 -7
- data/test/show_test.rb +22 -22
- data/test/source_test.rb +1 -1
- data/test/test_helper.rb +2 -1
- data/test/thread_test.rb +11 -13
- data/test/trace_test.rb +7 -7
- data/test/variables_test.rb +33 -15
- metadata +20 -12
@@ -0,0 +1,60 @@
|
|
1
|
+
breakpoints:
|
2
|
+
set_breakpoint_to_line: "Breakpoint {id} file {file}, line {line}"
|
3
|
+
set_breakpoint_to_method: "Breakpoint {id} at {class}::{method}"
|
4
|
+
stop_at_breakpoint: "Breakpoint {id} at {file}:{line}"
|
5
|
+
delete: "Breakpoint {id} has been deleted"
|
6
|
+
|
7
|
+
conditions:
|
8
|
+
set_condition: "Condition '{expr}' is set for the breakpoint {id}"
|
9
|
+
unset_condition: "Condition is cleared for the breakpoint {id}"
|
10
|
+
|
11
|
+
display:
|
12
|
+
result: "{n}: {exp} = {result}"
|
13
|
+
|
14
|
+
eval:
|
15
|
+
exception: "{text_message}"
|
16
|
+
result: "{result}"
|
17
|
+
|
18
|
+
frame:
|
19
|
+
line: "{mark}#{pos} {call_str}at line {file}:{line}"
|
20
|
+
|
21
|
+
method:
|
22
|
+
methods: "{name}|c"
|
23
|
+
|
24
|
+
stop:
|
25
|
+
suspend: "{file}:{line_number}\n{line}"
|
26
|
+
|
27
|
+
toggle:
|
28
|
+
breakpoint_enabled: "Breakpoint {id} is enabled"
|
29
|
+
breakpoint_disabled: "Breakpoint {id} is disabled"
|
30
|
+
|
31
|
+
restart:
|
32
|
+
success: "Re exec'ing:\n\t{cmd}"
|
33
|
+
|
34
|
+
set:
|
35
|
+
errors:
|
36
|
+
no_subcommand: "\"set\" must be followed by the name of an set command:\nList of set subcommands:\n\n{subcommands}"
|
37
|
+
|
38
|
+
show:
|
39
|
+
errors:
|
40
|
+
no_subcommand: "\"show\" must be followed by the name of an show command:\nList of show subcommands:\n\n{subcommands}"
|
41
|
+
|
42
|
+
thread:
|
43
|
+
context: "{status_flag}{debug_flag}{id} {thread}\t{file_line}"
|
44
|
+
|
45
|
+
tmate:
|
46
|
+
errors:
|
47
|
+
wrong_frame: "Wrong frame number"
|
48
|
+
|
49
|
+
trace:
|
50
|
+
messages:
|
51
|
+
all_threads: "Tracing {status} all threads"
|
52
|
+
current_thread: "Tracing {status} on current thread"
|
53
|
+
errors:
|
54
|
+
wrong_var_subcommand: "expecting 'stop' or 'nostop'; got {subcmd}"
|
55
|
+
var_is_not_global: "{name} is not a global variable"
|
56
|
+
wrong_subcommand: "expecting 'on', 'off', 'var' or 'variable'; got: {subcmd}"
|
57
|
+
trace: "traced variable {name} has value {value}"
|
58
|
+
|
59
|
+
variable:
|
60
|
+
variable: "{key} = {value}"
|
data/lib/ruby-debug/processor.rb
CHANGED
@@ -6,6 +6,27 @@ module Debugger
|
|
6
6
|
# Should this be a mixin?
|
7
7
|
class Processor # :nodoc
|
8
8
|
attr_accessor :interface
|
9
|
+
extend Forwardable
|
10
|
+
def_delegator :"Debugger.printer", :print, :pr
|
11
|
+
|
12
|
+
def self.protect(mname)
|
13
|
+
alias_method "__#{mname}", mname
|
14
|
+
module_eval %{
|
15
|
+
def #{mname}(*args)
|
16
|
+
@mutex.synchronize do
|
17
|
+
return unless @interface
|
18
|
+
__#{mname}(*args)
|
19
|
+
end
|
20
|
+
rescue IOError, Errno::EPIPE
|
21
|
+
self.interface = nil
|
22
|
+
rescue SignalException
|
23
|
+
raise
|
24
|
+
rescue Exception
|
25
|
+
print "INTERNAL ERROR!!! #\{$!\}\n" rescue nil
|
26
|
+
print $!.backtrace.map{|l| "\t#\{l\}"}.join("\n") rescue nil
|
27
|
+
end
|
28
|
+
}
|
29
|
+
end
|
9
30
|
|
10
31
|
# Format msg with gdb-style annotation header
|
11
32
|
def afmt(msg, newline="\n")
|
@@ -31,6 +52,11 @@ module Debugger
|
|
31
52
|
@interface.print(*args)
|
32
53
|
end
|
33
54
|
|
55
|
+
# Split commands like this:
|
56
|
+
# split_commands("abc;def\\;ghi;jkl") => ["abc", "def;ghi", "jkl"]
|
57
|
+
def split_commands(input)
|
58
|
+
input.split(/(?<!\\);/).map { |e| e.gsub("\\;", ";") }
|
59
|
+
end
|
34
60
|
end
|
35
61
|
|
36
62
|
class CommandProcessor < Processor # :nodoc:
|
@@ -94,35 +120,23 @@ module Debugger
|
|
94
120
|
end
|
95
121
|
end
|
96
122
|
|
97
|
-
def self.print_location_and_text(file, line)
|
98
|
-
|
99
|
-
|
123
|
+
def self.print_location_and_text(file, line, context)
|
124
|
+
result = Debugger.printer.print("stop.suspend",
|
125
|
+
file: canonic_file(file), line_number: line, line: Debugger.line_at(file, line),
|
126
|
+
thnum: context && context.thnum, frames: context && context.stack_size
|
127
|
+
)
|
128
|
+
Debugger.handler.interface.print(annotate_location_and_text(result))
|
129
|
+
end
|
130
|
+
|
131
|
+
def self.annotate_location_and_text(output)
|
100
132
|
# FIXME: use annotations routines
|
101
133
|
if Debugger.annotate.to_i > 2
|
102
|
-
|
134
|
+
"\032\032source #{output}"
|
103
135
|
elsif ENV['EMACS']
|
104
|
-
|
136
|
+
"\032\032#{output}"
|
137
|
+
else
|
138
|
+
output
|
105
139
|
end
|
106
|
-
print file_line
|
107
|
-
end
|
108
|
-
|
109
|
-
def self.protect(mname)
|
110
|
-
alias_method "__#{mname}", mname
|
111
|
-
module_eval %{
|
112
|
-
def #{mname}(*args)
|
113
|
-
@mutex.synchronize do
|
114
|
-
return unless @interface
|
115
|
-
__#{mname}(*args)
|
116
|
-
end
|
117
|
-
rescue IOError, Errno::EPIPE
|
118
|
-
self.interface = nil
|
119
|
-
rescue SignalException
|
120
|
-
raise
|
121
|
-
rescue Exception
|
122
|
-
print "INTERNAL ERROR!!! #\{$!\}\n" rescue nil
|
123
|
-
print $!.backtrace.map{|l| "\t#\{l\}"}.join("\n") rescue nil
|
124
|
-
end
|
125
|
-
}
|
126
140
|
end
|
127
141
|
|
128
142
|
def at_breakpoint(context, breakpoint)
|
@@ -133,7 +147,10 @@ module Debugger
|
|
133
147
|
if Debugger.annotate.to_i > 2
|
134
148
|
print afmt("source #{file}:#{line}")
|
135
149
|
end
|
136
|
-
print
|
150
|
+
print pr(
|
151
|
+
"breakpoints.stop_at_breakpoint", id: n, file: file, line: line, thread_id: Debugger.current_context.thnum
|
152
|
+
)
|
153
|
+
@last_breakpoint = breakpoint
|
137
154
|
end
|
138
155
|
protect :at_breakpoint
|
139
156
|
|
@@ -170,12 +187,16 @@ module Debugger
|
|
170
187
|
protect :at_tracing
|
171
188
|
|
172
189
|
def at_line(context, file, line)
|
190
|
+
CommandProcessor.print_location_and_text(file, line, context) unless @last_breakpoint
|
173
191
|
process_commands(context, file, line)
|
192
|
+
ensure
|
193
|
+
@last_breakpoint = nil
|
174
194
|
end
|
175
195
|
protect :at_line
|
176
196
|
|
177
197
|
def at_return(context, file, line)
|
178
198
|
context.stop_frame = -1
|
199
|
+
CommandProcessor.print_location_and_text(file, line, context)
|
179
200
|
process_commands(context, file, line)
|
180
201
|
end
|
181
202
|
|
@@ -225,30 +246,14 @@ module Debugger
|
|
225
246
|
def process_commands(context, file, line)
|
226
247
|
state, commands = always_run(context, file, line, 1)
|
227
248
|
$rdebug_state = state if Command.settings[:debuggertesting]
|
228
|
-
splitter = lambda do |str|
|
229
|
-
str.split(/;/).inject([]) do |m, v|
|
230
|
-
if m.empty?
|
231
|
-
m << v
|
232
|
-
else
|
233
|
-
if m.last[-1] == ?\\
|
234
|
-
m.last[-1,1] = ''
|
235
|
-
m.last << ';' << v
|
236
|
-
else
|
237
|
-
m << v
|
238
|
-
end
|
239
|
-
end
|
240
|
-
m
|
241
|
-
end
|
242
|
-
end
|
243
249
|
|
244
250
|
preloop(commands, context)
|
245
|
-
CommandProcessor.print_location_and_text(file, line)
|
246
251
|
while !state.proceed?
|
247
252
|
input = if @interface.command_queue.empty?
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
253
|
+
@interface.read_command(prompt(context))
|
254
|
+
else
|
255
|
+
@interface.command_queue.shift
|
256
|
+
end
|
252
257
|
break unless input
|
253
258
|
catch(:debug_error) do
|
254
259
|
if input == ""
|
@@ -257,7 +262,7 @@ module Debugger
|
|
257
262
|
else
|
258
263
|
@last_cmd = input
|
259
264
|
end
|
260
|
-
|
265
|
+
split_commands(input).each do |cmd|
|
261
266
|
one_cmd(commands, context, cmd)
|
262
267
|
postcmd(commands, context, cmd)
|
263
268
|
end
|
@@ -375,6 +380,10 @@ module Debugger
|
|
375
380
|
@interface.print(*args)
|
376
381
|
end
|
377
382
|
|
383
|
+
def print_debug(*args)
|
384
|
+
@interface.print_debug(*args)
|
385
|
+
end
|
386
|
+
|
378
387
|
def confirm(*args)
|
379
388
|
@interface.confirm(*args)
|
380
389
|
end
|
data/test/breakpoints_test.rb
CHANGED
@@ -40,23 +40,9 @@ describe "Breakpoints" do
|
|
40
40
|
debug_file("breakpoint1") { Debugger.breakpoints.must_be_empty }
|
41
41
|
end
|
42
42
|
|
43
|
-
it "
|
44
|
-
debug_file("breakpoint1")
|
45
|
-
check_output_includes "There are only #{LineCache.size(fullpath('breakpoint1'))} lines in file \"breakpoint1.rb\".", interface.error_queue
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
|
50
|
-
describe "setting breakpoint to incorrect line" do
|
51
|
-
before { enter 'break 8' }
|
52
|
-
|
53
|
-
it "must not create a breakpoint" do
|
54
|
-
debug_file("breakpoint1") { Debugger.breakpoints.must_be_empty }
|
55
|
-
end
|
56
|
-
|
57
|
-
it "must show an error" do
|
43
|
+
it "shows an error" do
|
58
44
|
debug_file("breakpoint1")
|
59
|
-
check_output_includes
|
45
|
+
check_output_includes "There are only #{LineCache.size(fullpath('breakpoint1'))} lines in file 'breakpoint1.rb'", interface.error_queue
|
60
46
|
end
|
61
47
|
end
|
62
48
|
|
@@ -72,7 +58,7 @@ describe "Breakpoints" do
|
|
72
58
|
debug_file("breakpoint1") { state.file.must_equal fullpath("breakpoint1") }
|
73
59
|
end
|
74
60
|
|
75
|
-
describe "
|
61
|
+
describe "shows a message" do
|
76
62
|
temporary_change_hash_value(Debugger::Command.settings, :basename, false)
|
77
63
|
|
78
64
|
it "must show a message with full filename" do
|
@@ -90,32 +76,6 @@ describe "Breakpoints" do
|
|
90
76
|
end
|
91
77
|
|
92
78
|
|
93
|
-
describe "reloading source on change" do
|
94
|
-
temporary_change_hash_value(Debugger::Command.settings, :reload_source_on_change, false)
|
95
|
-
|
96
|
-
it "must not reload source if autoreload is not set" do
|
97
|
-
enter(
|
98
|
-
'set noautoreload',
|
99
|
-
->{change_line_in_file(fullpath('breakpoint1'), 14, ''); 'break 14'},
|
100
|
-
->{change_line_in_file(fullpath('breakpoint1'), 14, 'c = a + b'); 'cont'}
|
101
|
-
)
|
102
|
-
debug_file "breakpoint1"
|
103
|
-
check_output_includes "Breakpoint 1 at #{fullpath('breakpoint1')}:14"
|
104
|
-
end
|
105
|
-
|
106
|
-
it "must reload source if autoreload is set" do
|
107
|
-
enter(
|
108
|
-
'set autoreload',
|
109
|
-
->{change_line_in_file(fullpath('breakpoint1'), 14, ''); 'break 14'},
|
110
|
-
# Setting second breakpoint just to reload the source code after rolling the file changes back
|
111
|
-
->{change_line_in_file(fullpath('breakpoint1'), 14, 'c = a + b'); 'break 15'}, 'cont'
|
112
|
-
)
|
113
|
-
debug_file "breakpoint1"
|
114
|
-
check_output_includes "Line 14 is not a stopping point in file \"breakpoint1.rb\".", interface.error_queue
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
|
119
79
|
describe "set breakpoint in a file" do
|
120
80
|
describe "successfully" do
|
121
81
|
before do
|
@@ -132,10 +92,12 @@ describe "Breakpoints" do
|
|
132
92
|
end
|
133
93
|
|
134
94
|
describe "when setting breakpoint to unexisted file" do
|
95
|
+
|
135
96
|
before do
|
136
97
|
enter "break asf:324"
|
137
98
|
debug_file("breakpoint1")
|
138
99
|
end
|
100
|
+
|
139
101
|
it "must show an error" do
|
140
102
|
check_output_includes "No source file named asf", interface.error_queue
|
141
103
|
end
|
@@ -160,6 +122,12 @@ describe "Breakpoints" do
|
|
160
122
|
it "must stop at the correct file" do
|
161
123
|
debug_file("breakpoint1") { state.file.must_equal fullpath("breakpoint1") }
|
162
124
|
end
|
125
|
+
|
126
|
+
it "must show output in plain text" do
|
127
|
+
id = nil
|
128
|
+
debug_file("breakpoint1") { id = breakpoint.id }
|
129
|
+
check_output_includes "Breakpoint #{id} at A::b"
|
130
|
+
end
|
163
131
|
end
|
164
132
|
|
165
133
|
describe "set breakpoint to a class method" do
|
@@ -180,7 +148,7 @@ describe "Breakpoints" do
|
|
180
148
|
it "must show an error" do
|
181
149
|
enter "break B.a"
|
182
150
|
debug_file("breakpoint1")
|
183
|
-
check_output_includes "Unknown class B
|
151
|
+
check_output_includes "Unknown class B", interface.error_queue
|
184
152
|
end
|
185
153
|
end
|
186
154
|
end
|
@@ -195,7 +163,7 @@ describe "Breakpoints" do
|
|
195
163
|
|
196
164
|
it "must show an error" do
|
197
165
|
debug_file("breakpoint1")
|
198
|
-
check_output_includes 'Invalid breakpoint location: foo
|
166
|
+
check_output_includes 'Invalid breakpoint location: foo', interface.error_queue
|
199
167
|
end
|
200
168
|
end
|
201
169
|
|
@@ -214,6 +182,12 @@ describe "Breakpoints" do
|
|
214
182
|
enter "cont"
|
215
183
|
debug_file("breakpoint1") { state.line.must_equal 15 }
|
216
184
|
end
|
185
|
+
|
186
|
+
it "must show success message" do
|
187
|
+
id = nil
|
188
|
+
debug_file("breakpoint1") { id = breakpoint.id }
|
189
|
+
check_output_includes "Breakpoint #{id} is disabled"
|
190
|
+
end
|
217
191
|
end
|
218
192
|
|
219
193
|
describe "full syntax" do
|
@@ -229,7 +203,7 @@ describe "Breakpoints" do
|
|
229
203
|
enter "disable"
|
230
204
|
debug_file("breakpoint1")
|
231
205
|
check_output_includes(
|
232
|
-
'
|
206
|
+
"'disable' must be followed 'display', 'breakpoints' or breakpoint numbers",
|
233
207
|
interface.error_queue
|
234
208
|
)
|
235
209
|
end
|
@@ -237,14 +211,15 @@ describe "Breakpoints" do
|
|
237
211
|
it "must show an error if no breakpoints is set" do
|
238
212
|
enter "disable 1"
|
239
213
|
debug_file("breakpoint1")
|
240
|
-
check_output_includes 'No breakpoints have been set
|
214
|
+
check_output_includes 'No breakpoints have been set', interface.error_queue
|
241
215
|
end
|
242
216
|
|
243
217
|
it "must show an error if not a number is provided as an argument to 'disable' command" do
|
244
218
|
enter "break 14", "disable foo"
|
245
219
|
debug_file("breakpoint1")
|
246
|
-
check_output_includes "Disable breakpoints argument 'foo' needs to be a number
|
220
|
+
check_output_includes "Disable breakpoints argument 'foo' needs to be a number"
|
247
221
|
end
|
222
|
+
|
248
223
|
end
|
249
224
|
end
|
250
225
|
|
@@ -263,6 +238,12 @@ describe "Breakpoints" do
|
|
263
238
|
enter "cont"
|
264
239
|
debug_file("breakpoint1") { state.line.must_equal 14 }
|
265
240
|
end
|
241
|
+
|
242
|
+
it "must show success message" do
|
243
|
+
id = nil
|
244
|
+
debug_file("breakpoint1") { id = breakpoint.id }
|
245
|
+
check_output_includes "Breakpoint #{id} is enabled"
|
246
|
+
end
|
266
247
|
end
|
267
248
|
|
268
249
|
describe "full syntax" do
|
@@ -279,7 +260,7 @@ describe "Breakpoints" do
|
|
279
260
|
enter "enable"
|
280
261
|
debug_file("breakpoint1")
|
281
262
|
check_output_includes(
|
282
|
-
'
|
263
|
+
"'enable' must be followed 'display', 'breakpoints' or breakpoint numbers",
|
283
264
|
interface.error_queue
|
284
265
|
)
|
285
266
|
end
|
@@ -288,7 +269,10 @@ describe "Breakpoints" do
|
|
288
269
|
|
289
270
|
|
290
271
|
describe "deleting a breakpoint" do
|
291
|
-
before
|
272
|
+
before do
|
273
|
+
@breakpoint_id = nil
|
274
|
+
enter "break 14", ->{@breakpoint_id = breakpoint.id; "delete #{@breakpoint_id}"}, "break 15"
|
275
|
+
end
|
292
276
|
|
293
277
|
it "must have only one breakpoint" do
|
294
278
|
debug_file("breakpoint1") { Debugger.breakpoints.size.must_equal 1 }
|
@@ -298,6 +282,11 @@ describe "Breakpoints" do
|
|
298
282
|
enter "cont"
|
299
283
|
debug_file("breakpoint1") { state.line.must_equal 15 }
|
300
284
|
end
|
285
|
+
|
286
|
+
it "must show a success message" do
|
287
|
+
debug_file("breakpoint1")
|
288
|
+
check_output_includes "Breakpoint #{@breakpoint_id} has been deleted"
|
289
|
+
end
|
301
290
|
end
|
302
291
|
|
303
292
|
|
@@ -315,7 +304,7 @@ describe "Breakpoints" do
|
|
315
304
|
it "must show an error when conditional syntax is wrong" do
|
316
305
|
enter "break 14 ifa b == 3", "break 15", "cont"
|
317
306
|
debug_file("breakpoint1") { state.line.must_equal 15 }
|
318
|
-
check_output_includes "Expecting 'if' in breakpoint condition; got: ifa b == 3
|
307
|
+
check_output_includes "Expecting 'if' in breakpoint condition; got: ifa b == 3", interface.error_queue
|
319
308
|
end
|
320
309
|
|
321
310
|
describe "enabling with wrong conditional syntax" do
|
@@ -335,7 +324,7 @@ describe "Breakpoints" do
|
|
335
324
|
it "must show an error" do
|
336
325
|
debug_file("breakpoint1")
|
337
326
|
check_output_includes(
|
338
|
-
|
327
|
+
"Expression 'b -=( 3' syntactically incorrect; breakpoint remains disabled",
|
339
328
|
interface.error_queue
|
340
329
|
)
|
341
330
|
end
|
@@ -344,13 +333,13 @@ describe "Breakpoints" do
|
|
344
333
|
it "must show an error if no file or line is specified" do
|
345
334
|
enter "break ifa b == 3", "break 15", "cont"
|
346
335
|
debug_file("breakpoint1") { state.line.must_equal 15 }
|
347
|
-
check_output_includes "Invalid breakpoint location: ifa b == 3
|
336
|
+
check_output_includes "Invalid breakpoint location: ifa b == 3", interface.error_queue
|
348
337
|
end
|
349
338
|
|
350
339
|
it "must show an error if expression syntax is invalid" do
|
351
340
|
enter "break if b -=) 3", "break 15", "cont"
|
352
341
|
debug_file("breakpoint1") { state.line.must_equal 15 }
|
353
|
-
check_output_includes
|
342
|
+
check_output_includes "Expression 'b -=) 3' syntactically incorrect; breakpoint disabled", interface.error_queue
|
354
343
|
end
|
355
344
|
end
|
356
345
|
|