/
pry_repl_spec.rb
142 lines (118 loc) · 3.21 KB
/
pry_repl_spec.rb
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
# frozen_string_literal: true
describe Pry::REPL do
it "should let you run commands in the middle of multiline expressions" do
ReplTester.start do
input 'def a'
input '!'
output(/^Input buffer cleared/)
input '5'
output '=> 5'
end
end
it "should rescue exceptions" do
ReplTester.start do
input 'raise "lorum"'
output(/^RuntimeError: lorum/)
if defined?(java)
input 'raise java.lang.Exception.new("foo")'
output(/Exception: foo/)
input 'raise java.io.IOException.new("bar")'
output(/IOException: bar/)
end
end
end
describe "eval_string and binding_stack" do
it "shouldn't break if we start a nested REPL" do
ReplTester.start do
input 'Pry::REPL.new(pry_instance, :target => 10).start'
output ''
prompt(/10.*> $/)
input 'self'
output '=> 10'
input nil # Ctrl-D
output ''
input 'self'
output '=> main'
end
end
it "shouldn't break if we start a nested instance" do
ReplTester.start do
input 'Pry.start(10)'
output ''
prompt(/10.*> $/)
input 'self'
output '=> 10'
input nil # Ctrl-D
output '=> nil' # return value of Pry session
input 'self'
output '=> main'
end
end
it "shouldn't break if we pop bindings in Ruby" do
ReplTester.start do
input 'cd 10'
output ''
prompt(/10.*> $/)
input 'pry_instance.binding_stack.pop'
output(/^=> #<Binding/)
prompt(/main.*> $/)
input 'pry_instance.binding_stack.pop'
output(/^=> #<Binding/)
assert_exited
end
end
it "should immediately evaluate eval_string after cmd if complete" do
set = Pry::CommandSet.new do
import Pry::Commands
command 'hello!' do
eval_string.replace('"hello"')
end
end
ReplTester.start(commands: set) do
input 'def x'
output ''
prompt(/\* $/)
input 'hello!'
output '=> "hello"'
prompt(/> $/)
end
end
end
describe "space prefix" do
describe "with 1 space" do
it "it prioritizes variables over commands" do
expect(pry_eval(' ls = 2+2', ' ls')).to eq(4)
end
end
describe "with more than 1 space" do
it "prioritizes commands over variables" do
expect(mock_pry(' ls = 2+2')).to match(/SyntaxError.+unexpected '='/)
end
end
end
describe "#piping?" do
it "returns false when $stdout is a non-IO object" do
repl = described_class.new(Pry.new, {})
old_stdout = $stdout
$stdout = Class.new { def write(*) end }.new
expect(repl.send(:piping?)).to eq(false)
$stdout = old_stdout
end
end
describe "autoindent" do
it "should raise no exception when indented with a tab" do
ReplTester.start(correct_indent: true, auto_indent: true) do
output = @pry.config.output
def output.tty?
true
end
input <<TAB
loop do
break #note the tab here
end
TAB
output("do\n break #note the tab here\nend\n\e\\[1B\e\\[0G=> nil")
end
end
end
end