blob: 04f26d10da91c83768373958fd05535a2c59229b (
plain)
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
|
describe "watch expression" do
# Custom eval that will:
# 1) Create an instance of pry that can use for multiple calls
# 2) Exercise the after_eval hook
# 3) Return the output
def watch_eval(expr)
output = @tester.eval(expr)
@tester.pry.hooks.exec_hook :after_eval, nil, @tester.pry
output
end
before do
@tester = pry_tester
@tester.pry.hooks.clear_event_hooks(:after_eval)
watch_eval('watch --delete')
end
it "registers the after_eval hook" do
watch_eval('watch 1+1')
watch_eval('')
expect(@tester.pry.hooks.hook_exists?(:after_eval, :watch_expression)).to eq(true)
end
it "prints no watched expressions" do
expect(watch_eval('watch')).to match(/No watched expressions/)
end
it "watches an expression" do
watch_eval 'watch 1+1'
expect(watch_eval('watch')).to match(/=> 2/)
end
it "watches a local variable" do
watch_eval('foo = :bar')
watch_eval('watch foo')
expect(watch_eval('watch')).to match(/=> :bar/)
end
it "prints when an expression changes" do
ReplTester.start do
input 'a = 1'
output '=> 1'
input 'watch a'
output "Watching a\nwatch: a => 1"
input "a = 2"
output "watch: a => 2\n=> 2"
end
end
it "prints when an expression is mutated" do
ReplTester.start do
input 'a = "one"'
output '=> "one"'
input 'watch a'
output %(Watching a\nwatch: a => "one")
input "a.sub! 'o', 'p'"
output %(watch: a => "pne"\n=> "pne")
end
end
it "doesn't print when an expresison remains the same" do
ReplTester.start do
input 'a = 1'
output '=> 1'
input 'watch a'
output "Watching a\nwatch: a => 1"
input "a = 1"
output "=> 1"
end
end
it "continues to work if you start a second pry instance" do
ReplTester.start do
input 'a = 1'
output '=> 1'
input 'watch a'
output "Watching a\nwatch: a => 1"
input "a = 2"
output "watch: a => 2\n=> 2"
end
ReplTester.start do
input 'b = 1'
output '=> 1'
input 'watch b'
output "Watching b\nwatch: b => 1"
input "b = 2"
output "watch: b => 2\n=> 2"
end
end
describe "deleting expressions" do
before do
watch_eval('watch :keeper')
watch_eval('watch :delete')
watch_eval('watch -d 2')
end
it "keeps keeper" do
expect(watch_eval('watch')).to match(/keeper/)
end
it "deletes delete" do
expect(watch_eval('watch')).not_to match(/delete/)
end
end
end
|