1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
# frozen_string_literal: true
require "test_helper"
module Byebug
#
# Tests +finish+ functionality when it needs to stop after method return
# events.
#
class FinishAfterReturnTest < TestCase
def program
strip_line_numbers <<-RUBY
1: module Byebug
2: #
3: # Toy class to test the +finish+ command
4: #
5: class #{example_class}
6: def a
7: b
8: end
9:
10: def b
11: c
12: 2
13: end
14:
15: def c
16: d
17: 3
18: end
19:
20: def d
21: 5
22: end
23: end
24:
25: byebug
26:
27: #{example_class}.new.a
28: end
RUBY
end
def test_finish_stops_after_current_single_line_frame_is_finished
enter "break 21", "cont", "finish"
debug_code(program) { assert_equal 17, frame.line }
end
def test_finish_stops_after_current_multiline_frame_is_finished
enter "break 16", "cont", "finish"
debug_code(program) { assert_equal 12, frame.line }
end
def test_finish_1_stops_after_current_frame_is_finished
enter "break 21", "cont", "finish 1"
debug_code(program) { assert_equal 17, frame.line }
end
def test_finish_works_for_frame_numbers_higher_than_one
enter "break 21", "cont", "finish 2"
debug_code(program) { assert_equal 12, frame.line }
end
def test_finish_behaves_consistenly_even_if_current_frame_has_been_changed
enter "break 21", "cont", "up", "finish"
debug_code(program) { assert_equal 12, frame.line }
end
def test_finish_shows_an_error_if_incorrect_frame_number_specified
enter "break 21", "cont", "finish foo"
debug_code(program)
check_error_includes '"finish" argument "foo" needs to be a number'
end
def test_finish_stays_at_the_same_line_if_incorrect_frame_number_specified
enter "break 21", "cont", "finish foo"
debug_code(program) { assert_equal 21, frame.line }
end
def test_finish_does_not_stop_in_byebug_internal_frames
enter "break 21", "cont", "finish 4"
debug_code(program) { assert_program_finished }
end
end
#
# Tests +finish+ functionality when it needs to stop before method return
# events.
#
class FinishBeforeReturnTest < TestCase
def program
strip_line_numbers <<-RUBY
1: module Byebug
2: #
3: # Toy class to test the +finish+ command
4: #
5: class #{example_class}
6: def a
7: b
8: end
9:
10: def b
11: (1..5).map do |i|
12: i**2
13: end
14: end
15: end
16:
17: byebug
18:
19: #{example_class}.new.a
20: end
RUBY
end
def test_finish_0_stops_right_before_frame_returns__simple_case
enter "b 7", "cont", "finish 0"
debug_code(program) { assert_equal 8, frame.line }
end
def test_finish_0_shows_information_about_the_return_value
enter "b 7", "cont", "finish 0"
debug_code(program)
check_output_includes "Return value is: [1, 4, 9, 16, 25]"
end
def test_finish_0_stops_right_before_frame_returns__convoluted_case
enter "b 11", "cont", "finish 0"
debug_code(program) { assert_equal 14, frame.line }
end
end
#
# Tests +finish+ functionality inside autoloaded files.
#
class FinishInsideAutoloadedFilesTest < TestCase
def program
strip_line_numbers <<-RUBY
1: autoload :ByebugBar, "./byebug_bar"
2:
3: def main
4: b = ByebugBar
5: b
6: end
7:
8: main
9:
10: sleep 0
RUBY
end
def teardown
super
force_remove_const(Object, :ByebugBar)
end
def test_finish_inside_autoloaded_files
with_new_file("byebug_bar.rb", "byebug\nmodule ByebugBar; end") do
enter "finish"
debug_code(program) { assert_equal 5, frame.line }
end
end
end
end
|