byebug 3.2.0 → 3.3.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.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/CHANGELOG.md +125 -99
  4. data/CONTRIBUTING.md +4 -6
  5. data/GUIDE.md +42 -20
  6. data/Gemfile +5 -3
  7. data/README.md +2 -3
  8. data/Rakefile +11 -7
  9. data/bin/byebug +2 -252
  10. data/byebug.gemspec +7 -4
  11. data/ext/byebug/byebug.c +17 -18
  12. data/ext/byebug/byebug.h +4 -5
  13. data/ext/byebug/context.c +37 -39
  14. data/ext/byebug/threads.c +39 -18
  15. data/lib/byebug.rb +2 -110
  16. data/lib/byebug/attacher.rb +23 -0
  17. data/lib/byebug/breakpoint.rb +60 -0
  18. data/lib/byebug/command.rb +62 -70
  19. data/lib/byebug/commands/break.rb +24 -24
  20. data/lib/byebug/commands/catchpoint.rb +18 -10
  21. data/lib/byebug/commands/condition.rb +18 -17
  22. data/lib/byebug/commands/continue.rb +17 -9
  23. data/lib/byebug/commands/delete.rb +19 -13
  24. data/lib/byebug/commands/display.rb +19 -53
  25. data/lib/byebug/commands/edit.rb +7 -4
  26. data/lib/byebug/commands/enable_disable.rb +130 -0
  27. data/lib/byebug/commands/eval.rb +40 -22
  28. data/lib/byebug/commands/finish.rb +13 -4
  29. data/lib/byebug/commands/frame.rb +65 -45
  30. data/lib/byebug/commands/help.rb +17 -18
  31. data/lib/byebug/commands/history.rb +14 -8
  32. data/lib/byebug/commands/info.rb +160 -182
  33. data/lib/byebug/commands/interrupt.rb +4 -1
  34. data/lib/byebug/commands/irb.rb +30 -0
  35. data/lib/byebug/commands/kill.rb +7 -8
  36. data/lib/byebug/commands/list.rb +71 -66
  37. data/lib/byebug/commands/method.rb +14 -6
  38. data/lib/byebug/commands/pry.rb +35 -0
  39. data/lib/byebug/commands/quit.rb +9 -6
  40. data/lib/byebug/commands/reload.rb +5 -2
  41. data/lib/byebug/commands/restart.rb +13 -9
  42. data/lib/byebug/commands/save.rb +17 -17
  43. data/lib/byebug/commands/set.rb +16 -15
  44. data/lib/byebug/commands/show.rb +10 -11
  45. data/lib/byebug/commands/source.rb +11 -5
  46. data/lib/byebug/commands/stepping.rb +38 -24
  47. data/lib/byebug/commands/threads.rb +45 -31
  48. data/lib/byebug/commands/trace.rb +22 -9
  49. data/lib/byebug/commands/undisplay.rb +45 -0
  50. data/lib/byebug/commands/variables.rb +83 -27
  51. data/lib/byebug/context.rb +25 -22
  52. data/lib/byebug/core.rb +82 -0
  53. data/lib/byebug/helper.rb +37 -28
  54. data/lib/byebug/history.rb +8 -4
  55. data/lib/byebug/interface.rb +12 -17
  56. data/lib/byebug/interfaces/local_interface.rb +11 -8
  57. data/lib/byebug/interfaces/remote_interface.rb +11 -8
  58. data/lib/byebug/interfaces/script_interface.rb +9 -6
  59. data/lib/byebug/options.rb +46 -0
  60. data/lib/byebug/processor.rb +7 -1
  61. data/lib/byebug/processors/command_processor.rb +135 -125
  62. data/lib/byebug/processors/control_command_processor.rb +23 -23
  63. data/lib/byebug/remote.rb +17 -26
  64. data/lib/byebug/runner.rb +100 -0
  65. data/lib/byebug/setting.rb +33 -8
  66. data/lib/byebug/settings/autoeval.rb +5 -15
  67. data/lib/byebug/settings/autoirb.rb +4 -1
  68. data/lib/byebug/settings/autolist.rb +5 -2
  69. data/lib/byebug/settings/autoreload.rb +5 -2
  70. data/lib/byebug/settings/autosave.rb +6 -2
  71. data/lib/byebug/settings/basename.rb +7 -2
  72. data/lib/byebug/settings/callstyle.rb +4 -1
  73. data/lib/byebug/settings/forcestep.rb +6 -3
  74. data/lib/byebug/settings/fullpath.rb +5 -2
  75. data/lib/byebug/settings/histfile.rb +5 -3
  76. data/lib/byebug/settings/histsize.rb +5 -3
  77. data/lib/byebug/settings/linetrace.rb +4 -1
  78. data/lib/byebug/settings/listsize.rb +5 -1
  79. data/lib/byebug/settings/post_mortem.rb +21 -13
  80. data/lib/byebug/settings/stack_on_error.rb +6 -2
  81. data/lib/byebug/settings/testing.rb +6 -1
  82. data/lib/byebug/settings/tracing_plus.rb +5 -1
  83. data/lib/byebug/settings/verbose.rb +13 -2
  84. data/lib/byebug/settings/width.rb +4 -1
  85. data/lib/byebug/version.rb +1 -1
  86. data/test/{break_test.rb → commands/break_test.rb} +41 -53
  87. data/test/{condition_test.rb → commands/condition_test.rb} +14 -14
  88. data/test/{continue_test.rb → commands/continue_test.rb} +0 -0
  89. data/test/{delete_test.rb → commands/delete_test.rb} +2 -2
  90. data/test/commands/display_test.rb +37 -0
  91. data/test/{edit_test.rb → commands/edit_test.rb} +0 -0
  92. data/test/{eval_test.rb → commands/eval_test.rb} +1 -0
  93. data/test/{finish_test.rb → commands/finish_test.rb} +11 -1
  94. data/test/{frame_test.rb → commands/frame_test.rb} +12 -16
  95. data/test/{help_test.rb → commands/help_test.rb} +21 -4
  96. data/test/{history_test.rb → commands/history_test.rb} +0 -0
  97. data/test/{info_test.rb → commands/info_test.rb} +5 -55
  98. data/test/{interrupt_test.rb → commands/interrupt_test.rb} +0 -0
  99. data/test/commands/irb_test.rb +28 -0
  100. data/test/{kill_test.rb → commands/kill_test.rb} +1 -1
  101. data/test/{list_test.rb → commands/list_test.rb} +1 -1
  102. data/test/{method_test.rb → commands/method_test.rb} +0 -0
  103. data/test/{post_mortem_test.rb → commands/post_mortem_test.rb} +6 -10
  104. data/test/{pry_test.rb → commands/pry_test.rb} +4 -13
  105. data/test/{quit_test.rb → commands/quit_test.rb} +4 -4
  106. data/test/{reload_test.rb → commands/reload_test.rb} +0 -0
  107. data/test/{restart_test.rb → commands/restart_test.rb} +6 -0
  108. data/test/{save_test.rb → commands/save_test.rb} +2 -2
  109. data/test/{set_test.rb → commands/set_test.rb} +9 -2
  110. data/test/{show_test.rb → commands/show_test.rb} +1 -1
  111. data/test/{source_test.rb → commands/source_test.rb} +3 -3
  112. data/test/{stepping_test.rb → commands/stepping_test.rb} +44 -35
  113. data/test/{thread_test.rb → commands/thread_test.rb} +0 -0
  114. data/test/{trace_test.rb → commands/trace_test.rb} +0 -0
  115. data/test/{display_test.rb → commands/undisplay_test.rb} +7 -45
  116. data/test/{variables_test.rb → commands/variables_test.rb} +10 -1
  117. data/test/debugger_alias_test.rb +2 -2
  118. data/test/runner_test.rb +127 -0
  119. data/test/support/matchers.rb +27 -25
  120. data/test/support/test_interface.rb +9 -5
  121. data/test/support/utils.rb +96 -101
  122. data/test/test_helper.rb +32 -20
  123. metadata +93 -68
  124. data/lib/byebug/commands/enable.rb +0 -154
  125. data/lib/byebug/commands/repl.rb +0 -126
  126. data/test/irb_test.rb +0 -47
  127. data/test/support/breakpoint.rb +0 -13
@@ -13,28 +13,28 @@ module Byebug
13
13
  QuitCommand.any_instance.expects(:exit!)
14
14
  enter 'quit', 'y'
15
15
  debug_proc(@example)
16
- check_output_includes 'Really quit? (y/n)', interface.confirm_queue
16
+ check_confirm_includes 'Really quit? (y/n)'
17
17
  end
18
18
 
19
19
  def test_does_not_quit_if_user_did_not_confirm
20
20
  QuitCommand.any_instance.expects(:exit!).never
21
21
  enter 'quit', 'n'
22
22
  debug_proc(@example)
23
- check_output_includes 'Really quit? (y/n)', interface.confirm_queue
23
+ check_confirm_includes 'Really quit? (y/n)'
24
24
  end
25
25
 
26
26
  def test_quits_inmediately_if_used_with_bang
27
27
  QuitCommand.any_instance.expects(:exit!)
28
28
  enter 'quit!'
29
29
  debug_proc(@example)
30
- check_output_doesnt_include 'Really quit? (y/n)', interface.confirm_queue
30
+ check_confirm_doesnt_include 'Really quit? (y/n)'
31
31
  end
32
32
 
33
33
  def test_quits_inmediately_if_used_with_unconditionally
34
34
  QuitCommand.any_instance.expects(:exit!)
35
35
  enter 'quit unconditionally'
36
36
  debug_proc(@example)
37
- check_output_doesnt_include 'Really quit? (y/n)', interface.confirm_queue
37
+ check_confirm_doesnt_include 'Really quit? (y/n)'
38
38
  end
39
39
 
40
40
  def test_closes_interface_before_quitting
@@ -15,9 +15,15 @@ module Byebug
15
15
  RestartExample.new.concat_args(a, b, c)
16
16
  end
17
17
 
18
+ @old_prog_script = Byebug::PROG_SCRIPT if defined?(Byebug::PROG_SCRIPT)
19
+
18
20
  super
19
21
  end
20
22
 
23
+ def after
24
+ force_set_const(Byebug, 'PROG_SCRIPT', @old_prog_script)
25
+ end
26
+
21
27
  def must_restart(cmd = nil)
22
28
  expectation = RestartCommand.any_instance.expects(:exec)
23
29
  expectation = expectation.with(cmd) if cmd
@@ -54,14 +54,14 @@ module Byebug
54
54
  enter 'save'
55
55
  debug_proc(@example)
56
56
  assert_includes File.read(interface.restart_file), 'set autoirb false'
57
- FileUtils.rm(interface.restart_file)
57
+ File.delete(interface.restart_file)
58
58
  end
59
59
 
60
60
  def test_save_without_a_filename_shows_a_message_with_the_file_used
61
61
  enter 'save'
62
62
  debug_proc(@example)
63
63
  check_output_includes "Saved to '#{interface.restart_file}'"
64
- FileUtils.rm(interface.restart_file)
64
+ File.delete(interface.restart_file)
65
65
  end
66
66
  end
67
67
  end
@@ -96,7 +96,7 @@ module Byebug
96
96
  def test_set_histsize_shows_an_error_message_if_no_size_is_provided
97
97
  enter 'set histsize'
98
98
  debug_proc(@example)
99
- check_output_includes 'You must specify a value for setting :histsize'
99
+ check_error_includes 'You must specify a value for setting :histsize'
100
100
  end
101
101
 
102
102
  def test_set_histfile_sets_command_history_file
@@ -110,7 +110,7 @@ module Byebug
110
110
  def test_set_histfile_shows_an_error_message_if_no_filename_is_provided
111
111
  enter 'set histfile'
112
112
  debug_proc(@example)
113
- check_output_includes 'You must specify a value for setting :histfile'
113
+ check_error_includes 'You must specify a value for setting :histfile'
114
114
  end
115
115
 
116
116
  [:listsize, :width].each do |set|
@@ -122,6 +122,13 @@ module Byebug
122
122
  end
123
123
  end
124
124
 
125
+ def test_verbose_prints_tracepoint_api_event_information
126
+ enter 'set verbose'
127
+ debug_proc(@example)
128
+ assert_equal true, Byebug.verbose?
129
+ Byebug.verbose = false
130
+ end
131
+
125
132
  def test_set_without_arguments_shows_help_for_set_command
126
133
  enter 'set'
127
134
  debug_proc(@example)
@@ -48,7 +48,7 @@ module Byebug
48
48
  def test_show_unknown_setting
49
49
  enter 'show bla'
50
50
  debug_proc(@example)
51
- check_output_includes 'Unknown setting :bla'
51
+ check_error_includes 'Unknown setting :bla'
52
52
  end
53
53
 
54
54
  def test_show_histfile
@@ -16,7 +16,7 @@ module Byebug
16
16
  end
17
17
 
18
18
  def teardown
19
- FileUtils.rm('source_example.txt')
19
+ File.delete('source_example.txt')
20
20
  end
21
21
 
22
22
  %w(source so).each do |cmd_alias|
@@ -38,8 +38,8 @@ module Byebug
38
38
  define_method(:"test_#{cmd_alias}_without_arguments_shows_help") do
39
39
  enter 'source'
40
40
  debug_proc(@example)
41
- check_output_includes \
42
- "source FILE\texecutes a file containing byebug commands"
41
+ check_output_includes(
42
+ /Executes file <file> containing byebug commands./)
43
43
  end
44
44
  end
45
45
  end
@@ -47,9 +47,14 @@ module Byebug
47
47
  enter 's'
48
48
  debug_proc(@example) { assert_equal 14, state.line }
49
49
  end
50
+
51
+ def test_next_does_not_stop_at_byebug_internal_frames
52
+ enter 'set forcestep', 'next 2'
53
+ debug_proc(@example) { refute_match(/byebug.test.support/, state.file) }
54
+ end
50
55
  end
51
56
 
52
- class AdvancedStepping < TestCase
57
+ class AdvancedSteppingTestCase < TestCase
53
58
  def setup
54
59
  @example = -> do
55
60
  byebug
@@ -101,7 +106,7 @@ module Byebug
101
106
 
102
107
  def test_next_goes_the_specified_number_of_lines_forward_by_default
103
108
  enter 'set forcestep', 'next 2'
104
- debug_proc(@example) { assert_equal 58, state.line }
109
+ debug_proc(@example) { assert_equal 63, state.line }
105
110
  end
106
111
 
107
112
  def test_next_informs_when_not_staying_in_the_same_frame
@@ -113,35 +118,37 @@ module Byebug
113
118
 
114
119
  def step_goes_the_specified_number_of_statements_forward_by_default
115
120
  enter 'set forcestep', 'step 2'
116
- debug_proc(@example) { assert_equal 58, state.line }
121
+ debug_proc(@example) { assert_equal 63, state.line }
117
122
  end
118
123
 
119
124
  def test_next_steps_OVER_blocks
120
- enter 'break 58', 'cont', 'next'
121
- debug_proc(@example) { assert_equal 62, state.line }
125
+ enter 'break 63', 'cont', 'next'
126
+ debug_proc(@example) { assert_equal 67, state.line }
122
127
  end
123
128
 
124
129
  def test_step_steps_INTO_blocks
125
- enter 'break 58', 'cont', 'step'
126
- debug_proc(@example) { assert_equal 59, state.line }
130
+ enter 'break 63', 'cont', 'step'
131
+ debug_proc(@example) { assert_equal 64, state.line }
127
132
  end
133
+ end
128
134
 
129
- class RaiseFromCMethodExample
130
- def a
131
- b
132
- rescue NameError
133
- 1
134
- end
135
+ class RaiseFromCMethodExample
136
+ def a
137
+ b
138
+ rescue NameError
139
+ 1
140
+ end
135
141
 
136
- def b
137
- c
138
- end
142
+ def b
143
+ c
144
+ end
139
145
 
140
- def c
141
- d
142
- end
146
+ def c
147
+ d
143
148
  end
149
+ end
144
150
 
151
+ class RaiseFromCMethodTestCase < TestCase
145
152
  def test_next_steps_over_rescue_when_raising_from_c_method
146
153
  example_raise = -> do
147
154
  byebug
@@ -149,26 +156,28 @@ module Byebug
149
156
  RaiseFromCMethodExample.new.a
150
157
  end
151
158
 
152
- enter 'break 131', 'cont', 'next'
153
- debug_proc(example_raise) { assert_equal 133, state.line }
159
+ enter 'break 137', 'cont', 'next'
160
+ debug_proc(example_raise) { assert_equal 139, state.line }
154
161
  end
162
+ end
155
163
 
156
- class RaiseFromRubyMethodExample
157
- def a
158
- b
159
- rescue
160
- 1
161
- end
164
+ class RaiseFromRubyMethodExample
165
+ def a
166
+ b
167
+ rescue
168
+ 1
169
+ end
162
170
 
163
- def b
164
- c
165
- end
171
+ def b
172
+ c
173
+ end
166
174
 
167
- def c
168
- raise 'bang'
169
- end
175
+ def c
176
+ raise 'bang'
170
177
  end
178
+ end
171
179
 
180
+ class RaiseFromRubyMethodTestCase < TestCase
172
181
  def test_next_steps_over_rescue_when_raising_from_ruby_method
173
182
  example_raise = -> do
174
183
  byebug
@@ -176,8 +185,8 @@ module Byebug
176
185
  RaiseFromRubyMethodExample.new.a
177
186
  end
178
187
 
179
- enter 'break 158', 'cont', 'next'
180
- debug_proc(example_raise) { assert_equal 160, state.line }
188
+ enter 'break 166', 'cont', 'next'
189
+ debug_proc(example_raise) { assert_equal 168, state.line }
181
190
  end
182
191
  end
183
192
  end
@@ -1,40 +1,4 @@
1
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
-
38
2
  class UndisplayTestCase < TestCase
39
3
  def setup
40
4
  @example = -> do
@@ -50,8 +14,7 @@ module Byebug
50
14
  def test_asks_for_confirmation
51
15
  enter 'display d', 'display d + 1', 'undisplay'
52
16
  debug_proc(@example)
53
- check_output_includes \
54
- 'Clear all expressions? (y/n)', interface.confirm_queue
17
+ check_confirm_includes 'Clear all expressions? (y/n)'
55
18
  end
56
19
 
57
20
  def test_removes_all_expressions_from_list_if_confirmed
@@ -59,7 +22,7 @@ module Byebug
59
22
  debug_proc(@example) do
60
23
  assert_equal [[false, 'd'], [false, 'd + 1']], state.display
61
24
  end
62
- check_output_doesnt_include '1: ', 'd = 3', '2: ', 'd + 1 = 4'
25
+ check_output_doesnt_include '1: d = 3', '2: d + 1 = 4'
63
26
  end
64
27
 
65
28
  def test_does_not_remove_all_expressions_from_list_unless_confirmed
@@ -68,7 +31,7 @@ module Byebug
68
31
  assert_equal [[true, 'd'], [true, 'd + 1']], state.display
69
32
  end
70
33
 
71
- check_output_includes '1: ', 'd = 0', '2: ', 'd + 1 = 1'
34
+ check_output_includes '1: d = 0', '2: d + 1 = 1'
72
35
  end
73
36
 
74
37
  def test_marks_specific_expression_from_list_as_inactive
@@ -82,8 +45,8 @@ module Byebug
82
45
  def test_displays_only_the_active_position
83
46
  enter 'display d', 'display d + 1', 'undisplay 1', 'next'
84
47
  debug_proc(@example)
85
- check_output_includes '2: ', 'd + 1 = 4'
86
- check_output_doesnt_include '1: ', 'd = 3'
48
+ check_output_includes '2: d + 1 = 4'
49
+ check_output_doesnt_include '1: d = 3'
87
50
  end
88
51
 
89
52
  def test_disable_display_removes_the_expression_from_display_list
@@ -94,14 +57,13 @@ module Byebug
94
57
  def test_disable_display_shows_an_error_if_no_displays_are_set
95
58
  enter 'disable display 1'
96
59
  debug_proc(@example)
97
- check_output_includes \
98
- 'No display expressions have been set', interface.error_queue
60
+ check_error_includes 'No display expressions have been set'
99
61
  end
100
62
 
101
63
  def test_disable_display_shows_an_error_if_theres_no_such_display_position
102
64
  enter 'display d', 'disable display 4'
103
65
  debug_proc(@example)
104
- check_output_includes \
66
+ check_error_includes \
105
67
  '"disable display" argument "4" needs to be at most 1'
106
68
  end
107
69
 
@@ -30,7 +30,7 @@ module Byebug
30
30
  super
31
31
  end
32
32
 
33
- # we check a class minitest variable... brittle but ok for now
33
+ # TODO: we check a class minitest variable... brittle...
34
34
  ['var class', 'v cl'].each do |cmd_alias|
35
35
  define_method(:"test_#{cmd_alias}_shows_class_variables") do
36
36
  enter cmd_alias
@@ -92,5 +92,14 @@ module Byebug
92
92
  debug_proc(@example)
93
93
  check_output_includes 'a => 4', 'b => nil', 'i => 1'
94
94
  end
95
+
96
+ # TODO: class variables not currently checked
97
+ ['var all', 'v a'].each do |cmd_alias|
98
+ define_method(:"test_#{cmd_alias}_shows_all_variables") do
99
+ enter 'break 15', 'cont', cmd_alias
100
+ debug_proc(@example)
101
+ check_output_includes '$VERBOSE = true', '@inst_a = 1', 'a => 4'
102
+ end
103
+ end
95
104
  end
96
105
  end
@@ -1,5 +1,5 @@
1
- module DebuggerAlias
2
- class DebuggerAliasTest < Minitest::Test
1
+ module Byebug
2
+ class DebuggerAliasTestCase < TestCase
3
3
  def test_aliases_debugger_to_byebug
4
4
  assert_equal Kernel.method(:byebug), Kernel.method(:debugger)
5
5
  end
@@ -0,0 +1,127 @@
1
+ require 'byebug/runner'
2
+
3
+ module Byebug
4
+
5
+ class RunnerTest < TestCase
6
+ def setup
7
+ super
8
+ @old_argv = ARGV
9
+ end
10
+
11
+ def after
12
+ ARGV.replace(@old_argv)
13
+ end
14
+
15
+ def test_run_with_version_flag
16
+ ARGV.replace(%w(--version))
17
+ Byebug::Runner.new.run
18
+
19
+ check_output_includes(/#{Byebug::VERSION}/)
20
+ end
21
+
22
+ def test_run_with_help_flag
23
+ ARGV.replace(%w(--help))
24
+ Byebug::Runner.new.run
25
+
26
+ check_output_includes(/-d.*-I.*-q.*-s.*-x.*-m.*-r.*-R.*-t.*-v.*-h/m)
27
+ end
28
+
29
+ def test_run_with_remote_option_only_with_a_port_number
30
+ ARGV.replace(%w(--remote 9999))
31
+ Byebug.expects(:start_client)
32
+ Byebug::Runner.new.run
33
+
34
+ check_output_includes(/Connecting to byebug server localhost:9999/)
35
+ end
36
+
37
+ def test_run_with_remote_option_with_host_and_port_specification
38
+ ARGV.replace(%w(--remote myhost:9999))
39
+ Byebug.expects(:start_client)
40
+ Byebug::Runner.new.run
41
+
42
+ check_output_includes(/Connecting to byebug server myhost:9999/)
43
+ end
44
+
45
+ def test_run_without_a_script_to_debug
46
+ ARGV.replace([])
47
+
48
+ assert_raises(SystemExit) { Byebug::Runner.new.run }
49
+
50
+ check_output_includes(/You must specify a program to debug.../)
51
+ end
52
+
53
+ def expect_it_debugs_script
54
+ Byebug.expects(:start)
55
+ Byebug::Runner.any_instance.expects(:debug_program)
56
+ Byebug.expects(:run_init_script)
57
+ end
58
+
59
+ def test_run_with_a_script_to_debug
60
+ ARGV.replace(%w(my_script))
61
+ expect_it_debugs_script
62
+
63
+ Byebug::Runner.new.run
64
+ end
65
+
66
+ def test_run_with_no_rc_option
67
+ ARGV.replace(%w(--no-rc my_script))
68
+ Byebug.expects(:start)
69
+ Byebug::Runner.any_instance.expects(:debug_program)
70
+ Byebug.expects(:run_init_script).never
71
+
72
+ Byebug::Runner.new.run
73
+ end
74
+
75
+ def test_run_with_post_mortem_mode_flag
76
+ ARGV.replace(%w(-m my_script))
77
+ expect_it_debugs_script
78
+
79
+ Byebug::Runner.new.run
80
+ assert_equal true, Byebug.post_mortem?
81
+ Byebug::Setting[:post_mortem] = false
82
+ end
83
+
84
+ def test_run_with_linetracing_flag
85
+ ARGV.replace(%w(-t my_script))
86
+ expect_it_debugs_script
87
+
88
+ Byebug::Runner.new.run
89
+ assert_equal true, Byebug.tracing?
90
+ Byebug::Setting[:linetrace] = false
91
+ end
92
+
93
+ def test_run_with_no_quit_flag
94
+ skip 'for now'
95
+ ARGV.replace(%w(--no-quit my_script))
96
+
97
+ Byebug::Runner.new.run
98
+ check_output_includes('(byebug:ctrl)')
99
+ end
100
+
101
+ def test_run_with_require_flag
102
+ ARGV.replace(%w(-r abbrev my_script))
103
+ expect_it_debugs_script
104
+
105
+ Byebug::Runner.new.run
106
+ hsh = { 'can' => 'can', 'cat' => 'cat' }
107
+ assert_equal hsh, %w(can cat).abbrev
108
+ end
109
+
110
+ def test_run_with_include_flag
111
+ ARGV.replace(%w(-I custom_dir my_script))
112
+ expect_it_debugs_script
113
+
114
+ Byebug::Runner.new.run
115
+ assert_includes $LOAD_PATH, 'custom_dir'
116
+ end
117
+
118
+ def test_run_with_debug_flag
119
+ ARGV.replace(%w(-d my_script))
120
+ expect_it_debugs_script
121
+
122
+ Byebug::Runner.new.run
123
+ assert_equal $DEBUG, true
124
+ $DEBUG = false
125
+ end
126
+ end
127
+ end