byebug 3.5.1 → 4.0.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/.gitignore +4 -1
- data/.rubocop.yml +18 -1
- data/.travis.yml +21 -1
- data/CHANGELOG.md +356 -308
- data/CONTRIBUTING.md +31 -15
- data/GUIDE.md +859 -475
- data/Gemfile +8 -10
- data/LICENSE +1 -1
- data/README.md +41 -45
- data/Rakefile +30 -28
- data/byebug.gemspec +18 -18
- data/ext/byebug/breakpoint.c +88 -75
- data/ext/byebug/byebug.c +253 -252
- data/ext/byebug/byebug.h +53 -53
- data/ext/byebug/context.c +188 -159
- data/ext/byebug/extconf.rb +9 -6
- data/ext/byebug/locker.c +53 -11
- data/ext/byebug/threads.c +137 -39
- data/lib/byebug/attacher.rb +7 -2
- data/lib/byebug/breakpoint.rb +30 -0
- data/lib/byebug/command.rb +36 -32
- data/lib/byebug/commands/break.rb +49 -48
- data/lib/byebug/commands/catch.rb +64 -0
- data/lib/byebug/commands/condition.rb +13 -9
- data/lib/byebug/commands/continue.rb +8 -4
- data/lib/byebug/commands/delete.rb +10 -4
- data/lib/byebug/commands/display.rb +33 -25
- data/lib/byebug/commands/edit.rb +18 -13
- data/lib/byebug/commands/enable_disable.rb +26 -24
- data/lib/byebug/commands/eval.rb +77 -35
- data/lib/byebug/commands/finish.rb +9 -5
- data/lib/byebug/commands/frame.rb +66 -125
- data/lib/byebug/commands/help.rb +14 -21
- data/lib/byebug/commands/history.rb +5 -1
- data/lib/byebug/commands/info.rb +41 -106
- data/lib/byebug/commands/interrupt.rb +6 -2
- data/lib/byebug/commands/irb.rb +5 -2
- data/lib/byebug/commands/kill.rb +6 -2
- data/lib/byebug/commands/list.rb +21 -14
- data/lib/byebug/commands/method.rb +17 -9
- data/lib/byebug/commands/pry.rb +13 -3
- data/lib/byebug/commands/quit.rb +10 -5
- data/lib/byebug/commands/restart.rb +12 -19
- data/lib/byebug/commands/save.rb +10 -6
- data/lib/byebug/commands/set.rb +15 -14
- data/lib/byebug/commands/show.rb +8 -8
- data/lib/byebug/commands/source.rb +14 -8
- data/lib/byebug/commands/stepping.rb +15 -29
- data/lib/byebug/commands/threads.rb +73 -49
- data/lib/byebug/commands/tracevar.rb +56 -0
- data/lib/byebug/commands/undisplay.rb +8 -4
- data/lib/byebug/commands/untracevar.rb +38 -0
- data/lib/byebug/commands/var.rb +107 -0
- data/lib/byebug/context.rb +78 -42
- data/lib/byebug/core.rb +78 -40
- data/lib/byebug/helper.rb +58 -42
- data/lib/byebug/history.rb +12 -1
- data/lib/byebug/interface.rb +91 -11
- data/lib/byebug/interfaces/local_interface.rb +12 -19
- data/lib/byebug/interfaces/remote_interface.rb +12 -15
- data/lib/byebug/interfaces/script_interface.rb +14 -18
- data/lib/byebug/interfaces/test_interface.rb +54 -0
- data/lib/byebug/printers/base.rb +64 -0
- data/lib/byebug/printers/plain.rb +53 -0
- data/lib/byebug/processor.rb +20 -1
- data/lib/byebug/processors/command_processor.rb +57 -172
- data/lib/byebug/processors/control_command_processor.rb +16 -43
- data/lib/byebug/remote.rb +13 -7
- data/lib/byebug/runner.rb +102 -54
- data/lib/byebug/setting.rb +45 -68
- data/lib/byebug/settings/autoeval.rb +2 -0
- data/lib/byebug/settings/autoirb.rb +3 -0
- data/lib/byebug/settings/autolist.rb +3 -0
- data/lib/byebug/settings/autosave.rb +2 -0
- data/lib/byebug/settings/basename.rb +2 -0
- data/lib/byebug/settings/callstyle.rb +2 -0
- data/lib/byebug/settings/fullpath.rb +2 -0
- data/lib/byebug/settings/histfile.rb +2 -0
- data/lib/byebug/settings/histsize.rb +2 -0
- data/lib/byebug/settings/linetrace.rb +2 -0
- data/lib/byebug/settings/listsize.rb +2 -0
- data/lib/byebug/settings/post_mortem.rb +7 -2
- data/lib/byebug/settings/stack_on_error.rb +2 -0
- data/lib/byebug/settings/verbose.rb +2 -0
- data/lib/byebug/settings/width.rb +2 -0
- data/lib/byebug/state.rb +12 -0
- data/lib/byebug/states/control_state.rb +26 -0
- data/lib/byebug/states/regular_state.rb +178 -0
- data/lib/byebug/version.rb +1 -1
- metadata +24 -109
- data/lib/byebug/commands/catchpoint.rb +0 -53
- data/lib/byebug/commands/reload.rb +0 -29
- data/lib/byebug/commands/trace.rb +0 -50
- data/lib/byebug/commands/variables.rb +0 -206
- data/lib/byebug/options.rb +0 -46
- data/lib/byebug/settings/autoreload.rb +0 -12
- data/lib/byebug/settings/forcestep.rb +0 -14
- data/lib/byebug/settings/testing.rb +0 -12
- data/lib/byebug/settings/tracing_plus.rb +0 -11
- data/test/commands/break_test.rb +0 -364
- data/test/commands/condition_test.rb +0 -85
- data/test/commands/continue_test.rb +0 -47
- data/test/commands/delete_test.rb +0 -26
- data/test/commands/display_test.rb +0 -37
- data/test/commands/edit_test.rb +0 -52
- data/test/commands/eval_test.rb +0 -89
- data/test/commands/finish_test.rb +0 -74
- data/test/commands/frame_test.rb +0 -223
- data/test/commands/help_test.rb +0 -66
- data/test/commands/history_test.rb +0 -61
- data/test/commands/info_test.rb +0 -238
- data/test/commands/interrupt_test.rb +0 -45
- data/test/commands/irb_test.rb +0 -28
- data/test/commands/kill_test.rb +0 -50
- data/test/commands/list_test.rb +0 -174
- data/test/commands/method_test.rb +0 -52
- data/test/commands/post_mortem_test.rb +0 -71
- data/test/commands/pry_test.rb +0 -26
- data/test/commands/quit_test.rb +0 -53
- data/test/commands/reload_test.rb +0 -39
- data/test/commands/restart_test.rb +0 -46
- data/test/commands/save_test.rb +0 -67
- data/test/commands/set_test.rb +0 -140
- data/test/commands/show_test.rb +0 -76
- data/test/commands/source_test.rb +0 -46
- data/test/commands/stepping_test.rb +0 -192
- data/test/commands/thread_test.rb +0 -164
- data/test/commands/trace_test.rb +0 -71
- data/test/commands/undisplay_test.rb +0 -75
- data/test/commands/variables_test.rb +0 -105
- data/test/debugger_alias_test.rb +0 -7
- data/test/runner_test.rb +0 -150
- data/test/support/matchers.rb +0 -65
- data/test/support/test_interface.rb +0 -59
- data/test/support/utils.rb +0 -122
- data/test/test_helper.rb +0 -58
@@ -1,85 +0,0 @@
|
|
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 #{Breakpoint.first.id} b == 5" }
|
16
|
-
|
17
|
-
debug_proc(@example) { assert_equal 'b == 5', Breakpoint.first.expr }
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_setting_condition_w_full_syntax_assigns_expression_to_breakpoint
|
21
|
-
enter 'break 7', -> { "condition #{Breakpoint.first.id} b == 5" }
|
22
|
-
|
23
|
-
debug_proc(@example) { assert_equal 'b == 5', Breakpoint.first.expr }
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_setting_condition_w_wrong_syntax_does_not_enable_breakpoint
|
27
|
-
enter 'break 7', -> { "disable #{Breakpoint.first.id}" },
|
28
|
-
-> { "cond #{Breakpoint.first.id} b ==" }
|
29
|
-
|
30
|
-
debug_proc(@example) { assert_equal false, Breakpoint.first.enabled? }
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_setting_condition_w_wrong_syntax_shows_error
|
34
|
-
enter 'break 7', -> { "disable #{Breakpoint.first.id}" },
|
35
|
-
-> { "cond #{Breakpoint.first.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 #{Breakpoint.first.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 #{Breakpoint.first.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 'b 7', 'b 8', -> { "cond #{Breakpoint.first.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 #{Breakpoint.first.id}" }, 'c'
|
62
|
-
|
63
|
-
debug_proc(@example) do
|
64
|
-
assert_nil Breakpoint.first.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 2 b == 3'
|
78
|
-
|
79
|
-
debug_proc(@example)
|
80
|
-
check_error_includes \
|
81
|
-
'Invalid breakpoint id. ' \
|
82
|
-
'Use "info breakpoint" to find out the correct id'
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module Byebug
|
2
|
-
class ContinueExample
|
3
|
-
def self.a(num)
|
4
|
-
num + 4
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
class ContinueTestCase < TestCase
|
9
|
-
def setup
|
10
|
-
@example = -> do
|
11
|
-
byebug
|
12
|
-
|
13
|
-
b = 5
|
14
|
-
c = b + 5
|
15
|
-
ContinueExample.a(c)
|
16
|
-
end
|
17
|
-
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_continues_up_to_breakpoint_if_no_line_specified
|
22
|
-
enter 'break 14', 'continue'
|
23
|
-
debug_proc(@example) { assert_equal 14, state.line }
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_works_in_abbreviated_mode_too
|
27
|
-
enter 'break 14', 'cont'
|
28
|
-
debug_proc(@example) { assert_equal 14, state.line }
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_continues_up_to_the_specified_line
|
32
|
-
enter 'cont 14'
|
33
|
-
debug_proc(@example) { assert_equal 14, state.line }
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_ignores_the_command_if_specified_line_is_not_valid
|
37
|
-
enter 'cont 100'
|
38
|
-
debug_proc(@example) { assert_equal 13, state.line }
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_shows_error_if_specified_line_is_not_valid
|
42
|
-
enter 'cont 100'
|
43
|
-
debug_proc(@example)
|
44
|
-
check_error_includes 'Line 100 is not a valid stopping point in file'
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Byebug
|
2
|
-
class DeleteTestCase < TestCase
|
3
|
-
def setup
|
4
|
-
@example = -> do
|
5
|
-
byebug
|
6
|
-
x = 1
|
7
|
-
x += 1
|
8
|
-
return x
|
9
|
-
end
|
10
|
-
|
11
|
-
super
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_deleting_a_breakpoint_removes_it_from_breakpoints_list
|
15
|
-
enter 'break 7', -> { "delete #{Breakpoint.first.id}" }
|
16
|
-
|
17
|
-
debug_proc(@example) { assert_empty Byebug.breakpoints }
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_does_not_stop_at_the_deleted_breakpoint
|
21
|
-
enter 'b 7', 'b 8', -> { "delete #{Breakpoint.first.id}" }, 'cont'
|
22
|
-
|
23
|
-
debug_proc(@example) { assert_equal 8, state.line }
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module Byebug
|
2
|
-
class DisplayTestCase < TestCase
|
3
|
-
def setup
|
4
|
-
@example = -> do
|
5
|
-
d = 0
|
6
|
-
byebug
|
7
|
-
d = d + 3
|
8
|
-
d = d + 6
|
9
|
-
end
|
10
|
-
|
11
|
-
super
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_shows_expressions
|
15
|
-
enter 'display d + 1'
|
16
|
-
debug_proc(@example)
|
17
|
-
check_output_includes '1: d + 1 = 1'
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_works_when_using_a_shortcut
|
21
|
-
enter 'disp d + 1'
|
22
|
-
debug_proc(@example)
|
23
|
-
check_output_includes '1: d + 1 = 1'
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_saves_displayed_expressions
|
27
|
-
enter 'display d + 1'
|
28
|
-
debug_proc(@example) { assert_equal [[true, 'd + 1']], state.display }
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_displays_all_expressions_available
|
32
|
-
enter 'display d', 'display d + 1', 'display'
|
33
|
-
debug_proc(@example)
|
34
|
-
check_output_includes '1: d = 0', '2: d + 1 = 1'
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
data/test/commands/edit_test.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
module Byebug
|
2
|
-
class EditTestCase < TestCase
|
3
|
-
def setup
|
4
|
-
@example = -> do
|
5
|
-
byebug
|
6
|
-
Object.new
|
7
|
-
end
|
8
|
-
|
9
|
-
super
|
10
|
-
end
|
11
|
-
|
12
|
-
def after
|
13
|
-
ENV['EDITOR'] = @previous_editor
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_edit_opens_current_file_in_current_line_in_configured_editor
|
17
|
-
ENV['EDITOR'] = 'edi'
|
18
|
-
file = __FILE__
|
19
|
-
EditCommand.any_instance.expects(:system).with("edi +6 #{file}")
|
20
|
-
enter 'edit'
|
21
|
-
debug_proc(@example)
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_edit_calls_vim_if_no_EDITOR_environment_variable_is_set
|
25
|
-
ENV['EDITOR'] = nil
|
26
|
-
file = __FILE__
|
27
|
-
EditCommand.any_instance.expects(:system).with("vim +6 #{file}")
|
28
|
-
enter 'edit'
|
29
|
-
debug_proc(@example)
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_edit_opens_configured_editor_at_specific_line_and_file
|
33
|
-
ENV['EDITOR'] = 'edi'
|
34
|
-
file = File.expand_path('test/test_helper.rb')
|
35
|
-
EditCommand.any_instance.expects(:system).with("edi +3 #{file}")
|
36
|
-
enter "edit #{file}:3"
|
37
|
-
debug_proc(@example)
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_edit_shows_an_error_if_file_specified_does_not_exists
|
41
|
-
enter "edit no_such_file:6"
|
42
|
-
debug_proc(@example)
|
43
|
-
check_error_includes 'File "no_such_file" is not readable.'
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_edit_shows_an_error_if_incorrect_syntax_is_used
|
47
|
-
enter 'edit blabla'
|
48
|
-
debug_proc(@example)
|
49
|
-
check_error_includes 'Invalid file[:line] number specification: blabla'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
data/test/commands/eval_test.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
module Byebug
|
2
|
-
class EvalExample
|
3
|
-
def sum(a,b)
|
4
|
-
a + b
|
5
|
-
end
|
6
|
-
|
7
|
-
def inspect
|
8
|
-
raise 'Broken'
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class EvalTestCase < TestCase
|
13
|
-
def setup
|
14
|
-
@example = -> do
|
15
|
-
byebug
|
16
|
-
@foo = EvalExample.new
|
17
|
-
@foo.sum(1, 2)
|
18
|
-
end
|
19
|
-
|
20
|
-
super
|
21
|
-
end
|
22
|
-
|
23
|
-
%w(eval e p).each do |cmd_alias|
|
24
|
-
define_method(:"test_#{cmd_alias}_properly_evaluates_expressions") do
|
25
|
-
enter 'eval 3 + 2'
|
26
|
-
debug_proc(@example)
|
27
|
-
check_output_includes '5'
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_eval_properly_evaluates_an_expression_using_timeout
|
32
|
-
enter 'eval Timeout::timeout(60) { 1 }'
|
33
|
-
debug_proc(@example)
|
34
|
-
check_output_includes '1'
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_eval_works_when_inspect_raises_an_exception
|
38
|
-
enter 'c 17', 'p @foo'
|
39
|
-
debug_proc(@example) { assert_equal 17, state.line }
|
40
|
-
check_output_includes 'RuntimeError Exception: Broken'
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_autoeval_works_by_default
|
44
|
-
enter '[5, 6 , 7].inject(&:+)'
|
45
|
-
debug_proc(@example)
|
46
|
-
check_output_includes '18'
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_auto_eval_can_be_turned_off_and_back_on
|
50
|
-
enter 'set noautoeval', '[5, 6, 7].inject(&:+)',
|
51
|
-
'set autoeval', '[1, 2, 3].inject(&:+)'
|
52
|
-
debug_proc(@example)
|
53
|
-
check_output_doesnt_include '18'
|
54
|
-
check_output_includes '6'
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_eval_shows_backtrace_on_error_if_stack_on_error_enabled
|
58
|
-
enter 'set stack_on_error', 'eval 2 / 0'
|
59
|
-
debug_proc(@example)
|
60
|
-
check_output_includes(/\s*from \S+:in \`eval\'/)
|
61
|
-
check_output_doesnt_include 'ZeroDivisionError Exception: divided by 0'
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_eval_shows_only_exception_if_stack_on_error_disabled
|
65
|
-
enter 'set stack_on_error off', 'eval 2 / 0'
|
66
|
-
debug_proc(@example)
|
67
|
-
check_output_includes 'ZeroDivisionError Exception: divided by 0'
|
68
|
-
check_output_doesnt_include(/\S+:\d+:in `eval':divided by 0/)
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_pp_pretty_print_the_expressions_result
|
72
|
-
enter "pp { a: '3' * 40, b: '4' * 30 }"
|
73
|
-
debug_proc(@example)
|
74
|
-
check_output_includes "{:a=>\"#{'3' * 40}\",\n :b=>\"#{'4' * 30}\"}"
|
75
|
-
end
|
76
|
-
|
77
|
-
def test_putl_prints_expression_and_columnize_the_result
|
78
|
-
enter 'set width 20', 'putl [1, 2, 3, 4, 5, 9, 8, 7, 6]'
|
79
|
-
debug_proc(@example)
|
80
|
-
check_output_includes "1 3 5 8 6\n2 4 9 7"
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_putl_prints_expression_and_sorts_and_columnize_the_result
|
84
|
-
enter 'set width 20', 'ps [1, 2, 3, 4, 5, 9, 8, 7, 6]'
|
85
|
-
debug_proc(@example)
|
86
|
-
check_output_includes "1 3 5 7 9\n2 4 6 8"
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
@@ -1,74 +0,0 @@
|
|
1
|
-
module Byebug
|
2
|
-
class FinishExample
|
3
|
-
def a
|
4
|
-
b
|
5
|
-
end
|
6
|
-
|
7
|
-
def b
|
8
|
-
c
|
9
|
-
2
|
10
|
-
end
|
11
|
-
|
12
|
-
def c
|
13
|
-
d
|
14
|
-
3
|
15
|
-
end
|
16
|
-
|
17
|
-
def d
|
18
|
-
5
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
class FinishTestCase < TestCase
|
23
|
-
def setup
|
24
|
-
@example = -> do
|
25
|
-
byebug
|
26
|
-
FinishExample.new.a
|
27
|
-
end
|
28
|
-
|
29
|
-
super
|
30
|
-
enter 'break 18', 'cont'
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_finish_stops_after_current_frame_is_finished
|
34
|
-
enter 'finish'
|
35
|
-
debug_proc(@example) { assert_equal 14, state.line }
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_finish_0_stops_before_current_frame_finishes
|
39
|
-
enter 'finish 0'
|
40
|
-
debug_proc(@example) { assert_equal 19, state.line }
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_finish_1_stops_after_current_frame_is_finished
|
44
|
-
enter 'finish 1'
|
45
|
-
debug_proc(@example) { assert_equal 14, state.line }
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_finish_works_for_frame_numbers_higher_than_one
|
49
|
-
enter 'finish 2'
|
50
|
-
debug_proc(@example) { assert_equal 9, state.line }
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_finish_behaves_consistenly_even_if_current_frame_has_been_changed
|
54
|
-
enter 'up', 'finish'
|
55
|
-
debug_proc(@example) { assert_equal 9, state.line }
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_finish_shows_an_error_if_incorrect_frame_number_specified
|
59
|
-
enter 'finish foo'
|
60
|
-
debug_proc(@example)
|
61
|
-
check_error_includes '"finish" argument "foo" needs to be a number'
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_finish_stays_at_the_same_line_if_incorrect_frame_number_specified
|
65
|
-
enter 'finish foo'
|
66
|
-
debug_proc(@example) { assert_equal 18, state.line }
|
67
|
-
end
|
68
|
-
|
69
|
-
def test_finish_does_not_stop_in_byebug_internal_frames
|
70
|
-
enter 'finish 4'
|
71
|
-
debug_proc(@example) { refute_match(/byebug.test.support/, state.file) }
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
data/test/commands/frame_test.rb
DELETED
@@ -1,223 +0,0 @@
|
|
1
|
-
module Byebug
|
2
|
-
class FrameExample
|
3
|
-
def initialize(f)
|
4
|
-
@f = f
|
5
|
-
end
|
6
|
-
|
7
|
-
def a
|
8
|
-
b
|
9
|
-
end
|
10
|
-
|
11
|
-
def b
|
12
|
-
c
|
13
|
-
2
|
14
|
-
end
|
15
|
-
|
16
|
-
def c
|
17
|
-
d('a')
|
18
|
-
3
|
19
|
-
end
|
20
|
-
|
21
|
-
def d(e)
|
22
|
-
4
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
class FrameTestCase < TestCase
|
27
|
-
def setup
|
28
|
-
@example = -> do
|
29
|
-
byebug
|
30
|
-
fr_ex = FrameExample.new('f')
|
31
|
-
fr_ex.a()
|
32
|
-
end
|
33
|
-
|
34
|
-
super
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_up_moves_up_in_the_callstack
|
38
|
-
enter 'break 22', 'cont', 'up'
|
39
|
-
debug_proc(@example) { assert_equal 17, state.line }
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_up_moves_up_in_the_callstack_a_specific_number_of_frames
|
43
|
-
enter 'break 22', 'cont', 'up 2'
|
44
|
-
debug_proc(@example) { assert_equal 12, state.line }
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_down_moves_down_in_the_callstack
|
48
|
-
enter 'break 22', 'cont', 'up', 'down'
|
49
|
-
debug_proc(@example) { assert_equal 22, state.line }
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_down_moves_down_in_the_callstack_a_specific_number_of_frames
|
53
|
-
enter 'break 22', 'cont', 'up 3', 'down 2'
|
54
|
-
debug_proc(@example) { assert_equal 17, state.line }
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_frame_moves_to_a_specific_frame
|
58
|
-
enter 'break 22', 'cont', 'frame 2'
|
59
|
-
debug_proc(@example) { assert_equal 12, state.line }
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_frame_prints_the_callstack_when_called_without_arguments
|
63
|
-
enter 'break 22', 'cont', 'up', 'frame'
|
64
|
-
debug_proc(@example)
|
65
|
-
check_output_includes(/#1 Byebug::FrameExample\.c\s+at #{__FILE__}:17/)
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_frame_0_sets_frame_to_the_first_one
|
69
|
-
enter 'break 22', 'cont', 'up', 'frame 0'
|
70
|
-
debug_proc(@example) { assert_equal 22, state.line }
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_frame_minus_one_sets_frame_to_the_last_one
|
74
|
-
enter 'break 22', 'cont', 'frame -1'
|
75
|
-
debug_proc(@example) { assert_match 'frame_test.rb', state.file }
|
76
|
-
end
|
77
|
-
|
78
|
-
def test_down_does_not_move_if_frame_number_to_too_low
|
79
|
-
enter 'break 22', 'cont', 'down'
|
80
|
-
debug_proc(@example) { assert_equal 22, state.line }
|
81
|
-
check_error_includes "Can't navigate beyond the newest frame"
|
82
|
-
end
|
83
|
-
|
84
|
-
def test_up_does_not_move_if_frame_number_to_too_high
|
85
|
-
enter 'break 22', 'cont', 'up 100'
|
86
|
-
debug_proc(@example) { assert_equal 22, state.line }
|
87
|
-
check_error_includes "Can't navigate beyond the oldest frame"
|
88
|
-
end
|
89
|
-
|
90
|
-
def test_where_displays_current_backtrace_with_fullpaths
|
91
|
-
enter 'break 22', 'cont', 'where'
|
92
|
-
debug_proc(@example)
|
93
|
-
check_output_includes(
|
94
|
-
/--> #0 Byebug::FrameExample\.d\(e#String\)\s+at #{__FILE__}:22/,
|
95
|
-
/#1 Byebug::FrameExample\.c\s+at #{__FILE__}:17/,
|
96
|
-
/#2 Byebug::FrameExample\.b\s+at #{__FILE__}:12/,
|
97
|
-
/#3 Byebug::FrameExample\.a\s+at #{__FILE__}:8/)
|
98
|
-
end
|
99
|
-
|
100
|
-
def test_where_displays_current_backtrace_w_shorpaths_if_fullpath_disabled
|
101
|
-
enter 'break 22', 'cont', 'set nofullpath', 'where'
|
102
|
-
debug_proc(@example)
|
103
|
-
path = File.basename(__FILE__)
|
104
|
-
check_output_includes(
|
105
|
-
/--> #0 Byebug::FrameExample\.d\(e#String\)\s+at \.\.\..*#{path}:22/,
|
106
|
-
/#1 Byebug::FrameExample\.c\s+at \.\.\..*#{path}:17/,
|
107
|
-
/#2 Byebug::FrameExample\.b\s+at \.\.\..*#{path}:12/,
|
108
|
-
/#3 Byebug::FrameExample\.a\s+at \.\.\..*#{path}:8/)
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_where_displays_backtraces_using_long_callstyle
|
112
|
-
enter 'break 22', 'cont', 'set callstyle long', 'where'
|
113
|
-
debug_proc(@example)
|
114
|
-
check_output_includes(
|
115
|
-
/--> #0 Byebug::FrameExample\.d\(e#String\)\s+at #{__FILE__}:22/,
|
116
|
-
/#1 Byebug::FrameExample\.c\s+at #{__FILE__}:17/,
|
117
|
-
/#2 Byebug::FrameExample\.b\s+at #{__FILE__}:12/,
|
118
|
-
/#3 Byebug::FrameExample\.a\s+at #{__FILE__}:8/)
|
119
|
-
end
|
120
|
-
|
121
|
-
def test_where_displays_backtraces_using_short_callstyle
|
122
|
-
enter 'break 22', 'cont', 'set callstyle short', 'where'
|
123
|
-
debug_proc(@example)
|
124
|
-
check_output_includes(/--> #0 d\(e\)\s+at #{__FILE__}:22/,
|
125
|
-
/#1 c\s+at #{__FILE__}:17/,
|
126
|
-
/#2 b\s+at #{__FILE__}:12/,
|
127
|
-
/#3 a\s+at #{__FILE__}:8/)
|
128
|
-
end
|
129
|
-
|
130
|
-
def test_where_marks_c_frames_when_printing_the_callstack
|
131
|
-
enter 'break 4', 'cont', 'where'
|
132
|
-
debug_proc(@example)
|
133
|
-
path = __FILE__
|
134
|
-
check_output_includes(
|
135
|
-
/--> #0 Byebug::FrameExample.initialize\(f#String\)\s+at #{path}:4/,
|
136
|
-
/ͱ-- #1 Class.new\(\*args\)\s+at #{__FILE__}:30/,
|
137
|
-
/#2 block in Byebug::FrameTestCase.setup\s+at #{path}:30/)
|
138
|
-
end
|
139
|
-
|
140
|
-
def test_up_skips_c_frames
|
141
|
-
enter 'break 4', 'cont', 'where', 'up', 'where'
|
142
|
-
debug_proc(@example)
|
143
|
-
check_output_includes(
|
144
|
-
/--> #2 block in Byebug::FrameTestCase.setup\s+at #{__FILE__}:30/)
|
145
|
-
end
|
146
|
-
|
147
|
-
def test_down_skips_c_frames
|
148
|
-
enter 'break 4', 'cont', 'up', 'down', 'eval f'
|
149
|
-
debug_proc(@example)
|
150
|
-
check_output_includes '"f"'
|
151
|
-
end
|
152
|
-
|
153
|
-
def test_frame_cannot_navigate_to_c_frames
|
154
|
-
enter 'break 4', 'cont', 'frame 1'
|
155
|
-
debug_proc(@example)
|
156
|
-
check_error_includes "Can't navigate to c-frame"
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
class DeepFrameExample
|
161
|
-
def a
|
162
|
-
z = 1
|
163
|
-
z += b
|
164
|
-
end
|
165
|
-
|
166
|
-
def b
|
167
|
-
z = 2
|
168
|
-
z += c
|
169
|
-
end
|
170
|
-
|
171
|
-
def c
|
172
|
-
z = 3
|
173
|
-
byebug
|
174
|
-
z += d('a')
|
175
|
-
end
|
176
|
-
|
177
|
-
def d(e)
|
178
|
-
4
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
class DeepFrameTestCase < TestCase
|
183
|
-
def setup
|
184
|
-
@deep_example = -> do
|
185
|
-
DeepFrameExample.new.a
|
186
|
-
end
|
187
|
-
|
188
|
-
super
|
189
|
-
enter 'break 178', 'cont'
|
190
|
-
end
|
191
|
-
|
192
|
-
def test_where_correctly_prints_the_backtrace
|
193
|
-
enter 'where'
|
194
|
-
debug_proc(@deep_example)
|
195
|
-
check_output_includes(
|
196
|
-
/--> #0 Byebug::DeepFrameExample\.d\(e#String\)\s+at #{__FILE__}:178/,
|
197
|
-
/#1 Byebug::DeepFrameExample\.c\s+at #{__FILE__}:174/,
|
198
|
-
/#2 Byebug::DeepFrameExample\.b\s+at #{__FILE__}:168/,
|
199
|
-
/#3 Byebug::DeepFrameExample\.a\s+at #{__FILE__}:163/)
|
200
|
-
end
|
201
|
-
|
202
|
-
def test_up_moves_up_in_the_callstack
|
203
|
-
enter 'up'
|
204
|
-
debug_proc(@deep_example) { assert_equal 174, state.line }
|
205
|
-
end
|
206
|
-
|
207
|
-
def test_down_moves_down_in_the_callstack
|
208
|
-
enter 'up', 'down'
|
209
|
-
debug_proc(@deep_example) { assert_equal 178, state.line }
|
210
|
-
end
|
211
|
-
|
212
|
-
def test_frame_moves_to_a_specific_frame
|
213
|
-
enter 'frame 2'
|
214
|
-
debug_proc(@deep_example) { assert_equal 168, state.line }
|
215
|
-
end
|
216
|
-
|
217
|
-
def test_eval_works_properly_when_moving_through_the_stack
|
218
|
-
enter 'p z', 'up', 'p z', 'up', 'p z'
|
219
|
-
debug_proc(@deep_example)
|
220
|
-
check_output_includes 'nil', '3', '2'
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|