byebug 3.0.0 → 3.1.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/CHANGELOG.md +15 -0
- data/GUIDE.md +2 -2
- data/LICENSE +3 -3
- data/README.md +5 -4
- data/byebug.gemspec +1 -1
- data/ext/byebug/byebug.c +20 -19
- data/lib/byebug.rb +2 -53
- data/lib/byebug/command.rb +9 -109
- data/lib/byebug/commands/breakpoints.rb +1 -1
- data/lib/byebug/commands/control.rb +20 -21
- data/lib/byebug/commands/display.rb +2 -3
- data/lib/byebug/commands/eval.rb +6 -16
- data/lib/byebug/commands/finish.rb +1 -1
- data/lib/byebug/commands/frame.rb +9 -9
- data/lib/byebug/commands/help.rb +2 -3
- data/lib/byebug/commands/history.rb +28 -0
- data/lib/byebug/commands/info.rb +3 -3
- data/lib/byebug/commands/list.rb +2 -13
- data/lib/byebug/commands/method.rb +5 -45
- data/lib/byebug/commands/reload.rb +1 -12
- data/lib/byebug/commands/repl.rb +6 -15
- data/lib/byebug/commands/save.rb +2 -7
- data/lib/byebug/commands/set.rb +45 -116
- data/lib/byebug/commands/show.rb +22 -126
- data/lib/byebug/commands/stepping.rb +1 -1
- data/lib/byebug/commands/trace.rb +14 -25
- data/lib/byebug/commands/variables.rb +3 -41
- data/lib/byebug/helper.rb +11 -42
- data/lib/byebug/history.rb +5 -13
- data/lib/byebug/processors/command_processor.rb +6 -6
- data/lib/byebug/setting.rb +82 -0
- data/lib/byebug/settings/autoeval.rb +20 -0
- data/lib/byebug/settings/autoirb.rb +19 -0
- data/lib/byebug/settings/autolist.rb +19 -0
- data/lib/byebug/settings/autoreload.rb +11 -0
- data/lib/byebug/settings/autosave.rb +11 -0
- data/lib/byebug/settings/basename.rb +7 -0
- data/lib/byebug/settings/callstyle.rb +15 -0
- data/lib/byebug/settings/forcestep.rb +11 -0
- data/lib/byebug/settings/fullpath.rb +11 -0
- data/lib/byebug/settings/histfile.rb +16 -0
- data/lib/byebug/settings/histsize.rb +18 -0
- data/lib/byebug/settings/linetrace.rb +15 -0
- data/lib/byebug/settings/listsize.rb +15 -0
- data/lib/byebug/settings/post_mortem.rb +15 -0
- data/lib/byebug/settings/stack_on_error.rb +7 -0
- data/lib/byebug/settings/testing.rb +7 -0
- data/lib/byebug/settings/tracing_plus.rb +7 -0
- data/lib/byebug/settings/verbose.rb +7 -0
- data/lib/byebug/settings/width.rb +29 -0
- data/lib/byebug/version.rb +1 -1
- data/test/breakpoints_test.rb +345 -324
- data/test/conditions_test.rb +61 -48
- data/test/continue_test.rb +38 -27
- data/test/debugger_alias_test.rb +5 -3
- data/test/display_test.rb +103 -92
- data/test/edit_test.rb +42 -34
- data/test/eval_test.rb +91 -75
- data/test/finish_test.rb +51 -40
- data/test/frame_test.rb +197 -184
- data/test/help_test.rb +47 -38
- data/test/history_test.rb +54 -0
- data/test/info_test.rb +306 -293
- data/test/interrupt_test.rb +44 -38
- data/test/kill_test.rb +40 -31
- data/test/list_test.rb +166 -133
- data/test/method_test.rb +67 -60
- data/test/post_mortem_test.rb +56 -48
- data/test/quit_test.rb +44 -35
- data/test/reload_test.rb +36 -24
- data/test/repl_test.rb +57 -47
- data/test/restart_test.rb +56 -69
- data/test/save_test.rb +62 -53
- data/test/set_test.rb +140 -118
- data/test/show_test.rb +68 -201
- data/test/source_test.rb +39 -29
- data/test/stepping_test.rb +163 -136
- data/test/support/test_dsl.rb +9 -11
- data/test/test_helper.rb +2 -7
- data/test/thread_test.rb +121 -107
- data/test/trace_test.rb +86 -83
- data/test/variables_test.rb +104 -98
- metadata +27 -86
- data/test/examples/breakpoint.rb +0 -6
- data/test/examples/breakpoint_deep.rb +0 -4
- data/test/examples/conditions.rb +0 -4
- data/test/examples/continue.rb +0 -5
- data/test/examples/display.rb +0 -5
- data/test/examples/edit.rb +0 -4
- data/test/examples/eval.rb +0 -4
- data/test/examples/finish.rb +0 -3
- data/test/examples/frame.rb +0 -4
- data/test/examples/frame_deep.rb +0 -1
- data/test/examples/gcd.rb +0 -15
- data/test/examples/hanoi.rb +0 -34
- data/test/examples/help.rb +0 -1
- data/test/examples/info.rb +0 -6
- data/test/examples/info2.rb +0 -3
- data/test/examples/interrupt.rb +0 -8
- data/test/examples/kill.rb +0 -2
- data/test/examples/list.rb +0 -23
- data/test/examples/method.rb +0 -4
- data/test/examples/post_mortem.rb +0 -4
- data/test/examples/primes.rb +0 -25
- data/test/examples/quit.rb +0 -2
- data/test/examples/reload.rb +0 -6
- data/test/examples/repl.rb +0 -6
- data/test/examples/restart.rb +0 -6
- data/test/examples/save.rb +0 -3
- data/test/examples/set.rb +0 -3
- data/test/examples/settings.rb +0 -1
- data/test/examples/show.rb +0 -1
- data/test/examples/source.rb +0 -3
- data/test/examples/stepping.rb +0 -8
- data/test/examples/stepping_raise_from_c_method.rb +0 -3
- data/test/examples/stepping_raise_from_ruby_method.rb +0 -3
- data/test/examples/test-triangle.rb +0 -14
- data/test/examples/thread.rb +0 -5
- data/test/examples/tmate.rb +0 -10
- data/test/examples/trace.rb +0 -8
- data/test/examples/tri3.rb +0 -6
- data/test/examples/triangle.rb +0 -13
- data/test/examples/variables.rb +0 -4
- data/test/timeout_test.rb +0 -9
data/test/interrupt_test.rb
CHANGED
@@ -1,54 +1,60 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
num
|
4
|
-
|
5
|
-
|
1
|
+
module InterruptTest
|
2
|
+
class Example
|
3
|
+
def self.a(num)
|
4
|
+
num += 2
|
5
|
+
b(num)
|
6
|
+
end
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
def self.b(num)
|
9
|
+
v2 = 5 if 1 == num ; [1, 2, v2].map { |a| a.to_f }
|
10
|
+
c(num)
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
def self.c(num)
|
14
|
+
num += 4
|
15
|
+
num
|
16
|
+
end
|
15
17
|
end
|
16
|
-
end
|
17
|
-
|
18
|
-
class TestInterrupting < TestDsl::TestCase
|
19
|
-
describe 'Interrupt Command' do
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
state.file.must_equal __FILE__
|
19
|
+
class InterruptTestCase < TestDsl::TestCase
|
20
|
+
before do
|
21
|
+
@example = -> do
|
22
|
+
byebug
|
23
|
+
ex = Example.a(7)
|
24
|
+
2.times do
|
25
|
+
ex += 1
|
29
26
|
end
|
27
|
+
Example.b(ex)
|
30
28
|
end
|
29
|
+
end
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
describe 'Interrupt Command' do
|
32
|
+
describe 'method call behaviour' do
|
35
33
|
it 'must interrupt on the next line' do
|
36
|
-
enter 'interrupt'
|
37
|
-
|
38
|
-
|
39
|
-
state.line.must_equal 3
|
34
|
+
enter 'interrupt', 'continue'
|
35
|
+
debug_proc(@example) do
|
36
|
+
state.line.must_equal 4
|
40
37
|
state.file.must_equal __FILE__
|
41
38
|
end
|
42
39
|
end
|
43
40
|
|
44
|
-
describe '
|
45
|
-
|
41
|
+
describe 'when forcestep is set' do
|
42
|
+
temporary_change_hash Byebug::Setting, :forcestep, true
|
43
|
+
|
44
|
+
it 'must interrupt on the next line' do
|
45
|
+
enter 'interrupt', 'continue'
|
46
|
+
debug_proc(@example) do
|
47
|
+
state.line.must_equal 4
|
48
|
+
state.file.must_equal __FILE__
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'block behaviour' do
|
53
|
+
before { enter 'break 24', 'cont' }
|
46
54
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
debug_file('interrupt') do
|
51
|
-
state.line.must_equal 5
|
55
|
+
it 'must step into blocks' do
|
56
|
+
enter 'interrupt', 'continue'
|
57
|
+
debug_proc(@example) { state.line.must_equal 25 }
|
52
58
|
end
|
53
59
|
end
|
54
60
|
end
|
data/test/kill_test.rb
CHANGED
@@ -1,41 +1,50 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
module KillTest
|
2
|
+
class Example
|
3
|
+
def self.kill_me
|
4
|
+
'dieeee'
|
5
|
+
end
|
4
6
|
end
|
5
|
-
end
|
6
7
|
|
7
|
-
class
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
class KillTestCase < TestDsl::TestCase
|
9
|
+
before do
|
10
|
+
@example = -> do
|
11
|
+
byebug
|
12
|
+
Example.kill_me
|
13
|
+
end
|
14
|
+
end
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
16
|
+
it 'must send signal to some pid' do
|
17
|
+
Process.expects(:kill).with('USR1', Process.pid)
|
18
|
+
enter 'kill USR1'
|
19
|
+
debug_proc(@example)
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
it 'must close interface when sending KILL signal explicitly' do
|
23
|
+
Process.stubs(:kill).with('KILL', Process.pid)
|
24
|
+
interface.expects(:close)
|
25
|
+
enter 'kill KILL'
|
26
|
+
debug_proc(@example)
|
27
|
+
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
it 'must ask confirmation when sending KILL implicitly' do
|
30
|
+
Process.expects(:kill).with('KILL', Process.pid)
|
31
|
+
enter 'kill', 'y'
|
32
|
+
debug_proc(@example)
|
33
|
+
check_output_includes 'Really kill? (y/n)', interface.confirm_queue
|
33
34
|
end
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
describe 'unknown signal' do
|
37
|
+
it 'must not send the signal' do
|
38
|
+
Process.expects(:kill).with('BLA', Process.pid).never
|
39
|
+
enter 'kill BLA'
|
40
|
+
debug_proc(@example)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'must show an error' do
|
44
|
+
enter 'kill BLA'
|
45
|
+
debug_proc(@example)
|
46
|
+
check_error_includes 'signal name BLA is not a signal I know about'
|
47
|
+
end
|
39
48
|
end
|
40
49
|
end
|
41
50
|
end
|
data/test/list_test.rb
CHANGED
@@ -1,171 +1,204 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
module ListTest
|
2
|
+
class ListTestCase < TestDsl::TestCase
|
3
|
+
before do
|
4
|
+
@example = -> do
|
5
|
+
byebug
|
6
|
+
a = 6
|
7
|
+
a = 7
|
8
|
+
a = 8
|
9
|
+
a = 9
|
10
|
+
a = 10
|
11
|
+
a = 11
|
12
|
+
a = 12
|
13
|
+
a = 13
|
14
|
+
a = 14
|
15
|
+
a = 15
|
16
|
+
a = 16
|
17
|
+
a = 17
|
18
|
+
a = 18
|
19
|
+
a = 19
|
20
|
+
a = 20
|
21
|
+
a = 21
|
22
|
+
a = 22
|
23
|
+
a = 23
|
24
|
+
a = 24
|
25
|
+
a = 25
|
26
|
+
a = '%26'
|
27
|
+
end
|
7
28
|
end
|
8
29
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
30
|
+
def lines_between(min, max, mark_current = true)
|
31
|
+
lines = [*File.open(__FILE__)][min-1..max-1]
|
32
|
+
numbers = (min..max).to_a
|
33
|
+
output = numbers.zip(lines).map { |l| sprintf("%2d: %s", l[0], l[1]) }
|
34
|
+
if mark_current
|
35
|
+
middle = (output.size/2.0).ceil
|
36
|
+
output[middle] = "=> #{output[middle]}"
|
37
|
+
end
|
38
|
+
output
|
13
39
|
end
|
14
40
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
41
|
+
describe 'listsize' do
|
42
|
+
it 'must show lines according to :listsize setting' do
|
43
|
+
debug_proc(@example)
|
44
|
+
check_output_includes "[1, 10] in #{__FILE__}"
|
45
|
+
end
|
20
46
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
47
|
+
it 'must not set it if the param is not an integer' do
|
48
|
+
enter 'set listsize 4.0', 'list'
|
49
|
+
debug_proc(@example)
|
50
|
+
check_output_includes "[1, 10] in #{__FILE__}"
|
51
|
+
end
|
26
52
|
|
27
|
-
|
28
|
-
|
53
|
+
describe 'when it goes before beginning of file' do
|
54
|
+
temporary_change_hash Byebug::Setting, :listsize, 12
|
29
55
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
56
|
+
it 'must move range up' do
|
57
|
+
enter 'list'
|
58
|
+
debug_proc(@example)
|
59
|
+
check_output_includes "[1, 12] in #{__FILE__}"
|
60
|
+
end
|
34
61
|
end
|
35
|
-
end
|
36
|
-
end
|
37
62
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
63
|
+
describe 'when it goes after the end of file' do
|
64
|
+
it 'must move range down' do
|
65
|
+
skip "Can't test this with the current setup"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe 'very large' do
|
70
|
+
temporary_change_hash Byebug::Setting, :listsize, 1000
|
46
71
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
72
|
+
it 'must list whole file if number of lines is smaller than listsize' do
|
73
|
+
n_lines = %x{wc -l #{__FILE__}}.split.first.to_i
|
74
|
+
debug_proc(@example)
|
75
|
+
check_output_includes "[1, #{n_lines}] in #{__FILE__}"
|
76
|
+
end
|
77
|
+
end
|
53
78
|
end
|
54
|
-
end
|
55
79
|
|
56
|
-
|
57
|
-
|
80
|
+
describe 'without arguments' do
|
81
|
+
it 'must show surrounding lines with the first call' do
|
82
|
+
enter 'break 8', 'cont'
|
83
|
+
debug_proc(@example)
|
84
|
+
check_output_includes("[3, 12] in #{__FILE__}", *lines_between(3, 12))
|
85
|
+
end
|
58
86
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
87
|
+
it 'must list forward after second call' do
|
88
|
+
enter 'break 8', 'cont', 'list'
|
89
|
+
debug_proc(@example)
|
90
|
+
check_output_includes("[13, 22] in #{__FILE__}",
|
91
|
+
*lines_between(13, 22, false))
|
92
|
+
end
|
65
93
|
end
|
66
94
|
|
67
|
-
|
68
|
-
|
69
|
-
debug_file 'list'
|
70
|
-
check_output_includes "[1, 10] in #{fullpath('list')}", '1: byebug',
|
71
|
-
'2: a = 2', '3: a = 3', '4: a = 4', '5: a = 5', '6: a = 6', '7: a = 7',
|
72
|
-
'8: a = 8', '9: a = 9', '10: a = 10'
|
73
|
-
end
|
74
|
-
end
|
95
|
+
describe 'list backwards' do
|
96
|
+
temporary_change_hash Byebug::Setting, :autolist, false
|
75
97
|
|
76
|
-
|
77
|
-
|
98
|
+
it 'must show surrounding lines with the first call' do
|
99
|
+
enter 'break 18', 'cont', 'list -'
|
100
|
+
debug_proc(@example)
|
101
|
+
check_output_includes("[13, 22] in #{__FILE__}", *lines_between(13, 22))
|
102
|
+
end
|
78
103
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
104
|
+
it 'must list backward after second call' do
|
105
|
+
enter 'break 18', 'cont', 'list -', 'list -'
|
106
|
+
debug_proc(@example)
|
107
|
+
check_output_includes("[3, 12] in #{__FILE__}",
|
108
|
+
*lines_between(3, 12, false))
|
109
|
+
end
|
85
110
|
end
|
86
|
-
end
|
87
111
|
|
88
|
-
|
89
|
-
|
90
|
-
enter 'list 4-6'
|
91
|
-
debug_file 'list'
|
92
|
-
check_output_includes \
|
93
|
-
"[4, 6] in #{fullpath('list')}", '4: a = 4', '5: a = 5', '6: a = 6'
|
94
|
-
end
|
112
|
+
describe 'list surrounding' do
|
113
|
+
temporary_change_hash Byebug::Setting, :autolist, false
|
95
114
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
115
|
+
it 'must show the surrounding lines with =' do
|
116
|
+
enter 'break 8', 'cont', 'list ='
|
117
|
+
debug_proc(@example)
|
118
|
+
check_output_includes("[3, 12] in #{__FILE__}", *lines_between(3, 12))
|
119
|
+
end
|
101
120
|
end
|
102
121
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
122
|
+
describe 'specific range' do
|
123
|
+
it 'must show with mm-nn' do
|
124
|
+
enter 'list 7-9'
|
125
|
+
debug_proc(@example)
|
126
|
+
check_output_includes("[7, 9] in #{__FILE__}",
|
127
|
+
*lines_between(7, 9, false))
|
128
|
+
end
|
110
129
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
130
|
+
it 'must show with mm,nn' do
|
131
|
+
enter 'list 7,9'
|
132
|
+
debug_proc(@example)
|
133
|
+
check_output_includes("[7, 9] in #{__FILE__}",
|
134
|
+
*lines_between(7, 9, false))
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'must show nothing if there is no such lines' do
|
138
|
+
enter 'list 500,505'
|
139
|
+
debug_proc(@example)
|
140
|
+
check_error_includes 'Invalid line range'
|
141
|
+
check_output_doesnt_include "[500, 505] in #{__FILE__}"
|
142
|
+
check_output_doesnt_include(/^500 \S/)
|
143
|
+
end
|
117
144
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
'10: a = 10', '11: a = 11', '12: a = 12', '13: a = 13', '14: a = 14',
|
124
|
-
'15: a = 15', '16: a = 16', '17: a = 17', '18: a = 18'
|
145
|
+
it 'must show nothing if range is incorrect' do
|
146
|
+
enter 'list 5,4'
|
147
|
+
debug_proc(@example)
|
148
|
+
check_output_includes "[5, 4] in #{__FILE__}"
|
149
|
+
end
|
125
150
|
end
|
126
151
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
152
|
+
describe 'arround specific line' do
|
153
|
+
it 'must show surroundings with mm-' do
|
154
|
+
enter 'list 17-'
|
155
|
+
debug_proc(@example)
|
156
|
+
check_output_includes("[12, 21] in #{__FILE__}",
|
157
|
+
*lines_between(12, 21, false))
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'must show surroundings with mm,' do
|
161
|
+
enter 'list 17,'
|
162
|
+
debug_proc(@example)
|
163
|
+
check_output_includes("[12, 21] in #{__FILE__}",
|
164
|
+
*lines_between(12, 21, false))
|
165
|
+
end
|
133
166
|
end
|
134
|
-
end
|
135
167
|
|
136
|
-
|
137
|
-
|
168
|
+
describe 'reload source' do
|
169
|
+
after { change_line_in_file(__FILE__, 7, ' a = 7') }
|
138
170
|
|
139
|
-
|
140
|
-
|
171
|
+
describe 'when autoreload is false' do
|
172
|
+
temporary_change_hash Byebug::Setting, :autoreload, false
|
141
173
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
174
|
+
it 'must not reload listing with file changes' do
|
175
|
+
enter -> { change_line_in_file __FILE__, 7, ' a = 100' ;
|
176
|
+
'list 7-7' }
|
177
|
+
debug_proc(@example)
|
178
|
+
check_output_includes(/7:\s+a = 7/)
|
179
|
+
end
|
147
180
|
end
|
148
|
-
end
|
149
181
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
182
|
+
describe 'when autoreload is true' do
|
183
|
+
it 'must reload listing with file changes' do
|
184
|
+
enter -> { change_line_in_file __FILE__, 7, ' a = 100' ;
|
185
|
+
'list 7-7' }
|
186
|
+
debug_proc(@example)
|
187
|
+
check_output_includes(/7:\s+a = 100/)
|
188
|
+
end
|
156
189
|
end
|
157
190
|
end
|
158
|
-
end
|
159
191
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
192
|
+
it 'must show an error when there is no such file' do
|
193
|
+
enter -> { state.file = 'blabla'; 'list 7-7' }
|
194
|
+
debug_proc(@example)
|
195
|
+
check_error_includes 'No sourcefile available for blabla'
|
196
|
+
end
|
165
197
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
198
|
+
it 'must correctly print lines containing % sign' do
|
199
|
+
enter 'list 26'
|
200
|
+
debug_proc(@example)
|
201
|
+
check_output_includes "26: a = '%26'"
|
202
|
+
end
|
170
203
|
end
|
171
204
|
end
|