3 assert_kind_of Fiber, f
6 assert('Fiber#resume') do
8 assert_equal 2, f.resume(2)
11 assert('Fiber#transfer') do
22 assert_equal 1, f2.resume
23 assert_raise(FiberError) { f2.resume }
24 assert_equal 2, f2.transfer
25 assert_raise(FiberError) { f1.resume }
28 assert_false f1.alive?
29 assert_false f2.alive?
32 assert('Fiber#alive?') do
33 f = Fiber.new{ Fiber.yield }
42 assert_equal root, root
43 assert_equal root, Fiber.current
44 assert_false root != Fiber.current
46 assert_false root == Fiber.current
49 assert_false f == root
53 assert('Fiber.yield') do
54 f = Fiber.new{|x| Fiber.yield x }
55 assert_equal 3, f.resume(3)
59 assert('FiberError') do
60 assert_equal StandardError, FiberError.superclass
63 assert('Fiber iteration') do
65 [1,2,3].each{|x| Fiber.yield(x)}
68 [9,8,7].each{|x| Fiber.yield(x)}
75 assert_equal [1,9,2,8,3,7], a
78 assert('Fiber with splat in the block argument list') {
79 Fiber.new{|*x|x}.resume(1) == [1]
82 assert('Fiber raises on resume when dead') do
83 assert_raise(FiberError) do
91 assert('Yield raises when called on root fiber') do
92 assert_raise(FiberError) { Fiber.yield }
95 assert('Double resume of Fiber') do
99 assert_raise(FiberError) { f2.resume }
102 assert_equal 0, f2.resume
104 assert_false f1.alive?
105 assert_false f2.alive?
108 assert('Recursive resume of Fiber') do
110 f1 = Fiber.new { assert_raise(FiberError) { f2.resume } }
118 assert_equal 0, f3.resume
120 assert_false f1.alive?
121 assert_false f2.alive?
122 assert_false f3.alive?
125 assert('Root fiber resume') do
127 assert_raise(FiberError) { root.resume }
129 assert_raise(FiberError) { root.resume }
132 assert_false f.alive?
135 assert('Fiber without block') do
136 assert_raise(ArgumentError) { Fiber.new }
140 assert('Transfer to self.') do
142 f = Fiber.new { result << :start; f.transfer; result << :end }
144 assert_equal [:start, :end], result
147 f = Fiber.new { result << :start; f.transfer; result << :end }
149 assert_equal [:start, :end], result
152 assert('Resume transferred fiber') do
154 assert_raise(FiberError) { f.resume }
159 assert('Root fiber transfer.') do
168 assert_equal :ok, result
171 assert('Break nested fiber with root fiber transfer') do
177 Fiber.yield f2.resume
182 root.transfer :from_f2
185 assert_equal :from_f2, f1.resume
186 assert_equal :to_root, result
187 assert_equal :f2, f2.transfer
188 assert_equal :f2, result
189 assert_false f2.alive?
190 assert_equal :f1, f1.resume
191 assert_equal :f1, result
192 assert_false f1.alive?
195 assert('CRuby Fiber#transfer test.') do
199 ary << f2.transfer(:foo)
203 ary << f1.transfer(:baz)
206 assert_equal :ok, f1.transfer
207 assert_equal [:baz], ary