forked from rubinius/rubinius
/
raise_spec.rb
140 lines (119 loc) · 3.32 KB
/
raise_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
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../fixtures/classes', __FILE__)
require File.expand_path('../../../shared/kernel/raise', __FILE__)
describe "Thread#raise" do
it "ignores dead threads" do
t = Thread.new { :dead }
Thread.pass while t.alive?
lambda {t.raise("Kill the thread")}.should_not raise_error
lambda {t.value}.should_not raise_error
end
end
describe "Thread#raise on a sleeping thread" do
before :each do
ScratchPad.clear
@thr = ThreadSpecs.sleeping_thread
Thread.pass while @thr.status and @thr.status != "sleep"
end
after :each do
@thr.kill
end
it "raises a RuntimeError if no exception class is given" do
@thr.raise
Thread.pass while @thr.status
ScratchPad.recorded.should be_kind_of(RuntimeError)
end
it "raises the given exception" do
@thr.raise Exception
Thread.pass while @thr.status
ScratchPad.recorded.should be_kind_of(Exception)
end
it "raises the given exception with the given message" do
@thr.raise Exception, "get to work"
Thread.pass while @thr.status
ScratchPad.recorded.should be_kind_of(Exception)
ScratchPad.recorded.message.should == "get to work"
end
it "is captured and raised by Thread#value" do
t = Thread.new do
sleep
end
ThreadSpecs.spin_until_sleeping(t)
t.raise
lambda { t.value }.should raise_error(RuntimeError)
end
ruby_version_is "1.9" do
it "raises a RuntimeError when called with no arguments" do
t = Thread.new do
begin
1/0
rescue ZeroDivisionError
sleep 3
end
end
begin
raise RangeError
rescue
ThreadSpecs.spin_until_sleeping(t)
t.raise
end
lambda {t.value}.should raise_error(RuntimeError)
t.kill
end
end
end
describe "Thread#raise on a running thread" do
before :each do
ScratchPad.clear
ThreadSpecs.clear_state
@thr = ThreadSpecs.running_thread
Thread.pass until ThreadSpecs.state == :running
end
after :each do
@thr.kill
end
it "raises a RuntimeError if no exception class is given" do
@thr.raise
Thread.pass while @thr.status
ScratchPad.recorded.should be_kind_of(RuntimeError)
end
it "raises the given exception" do
@thr.raise Exception
Thread.pass while @thr.status
ScratchPad.recorded.should be_kind_of(Exception)
end
it "raises the given exception with the given message" do
@thr.raise Exception, "get to work"
Thread.pass while @thr.status
ScratchPad.recorded.should be_kind_of(Exception)
ScratchPad.recorded.message.should == "get to work"
end
it "can go unhandled" do
t = Thread.new do
loop {}
end
t.raise
lambda {t.value}.should raise_error(RuntimeError)
end
it "raise the given argument even when there is an active exception" do
raised = false
t = Thread.new do
begin
1/0
rescue ZeroDivisionError
raised = true
loop { }
end
end
begin
raise "Create an active exception for the current thread too"
rescue
Thread.pass until raised || !t.alive?
t.raise RangeError
lambda {t.value}.should raise_error(RangeError)
end
end
end
describe "Thread#raise on same thread" do
it_behaves_like :kernel_raise, :raise, Thread.current
end