summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-fiber/test/fiber.rb
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/mruby-fiber/test/fiber.rb')
-rw-r--r--mrbgems/mruby-fiber/test/fiber.rb92
1 files changed, 92 insertions, 0 deletions
diff --git a/mrbgems/mruby-fiber/test/fiber.rb b/mrbgems/mruby-fiber/test/fiber.rb
index e10878bf4..c2bae2259 100644
--- a/mrbgems/mruby-fiber/test/fiber.rb
+++ b/mrbgems/mruby-fiber/test/fiber.rb
@@ -8,6 +8,27 @@ assert('Fiber#resume') {
f.resume(2)
}
+assert('Fiber#transfer') do
+ f2 = nil
+ f1 = Fiber.new do |v|
+ Fiber.yield v
+ f2.transfer
+ end
+ f2 = Fiber.new do
+ f1.transfer(1)
+ f1.transfer(1)
+ Fiber.yield 2
+ end
+ assert_equal 1, f2.resume
+ assert_raise(FiberError) { f2.resume }
+ assert_equal 2, f2.transfer
+ assert_raise(FiberError) { f1.resume }
+ f1.transfer
+ f2.resume
+ assert_false f1.alive?
+ assert_false f2.alive?
+end
+
assert('Fiber#alive?') {
f = Fiber.new{ Fiber.yield }
f.resume
@@ -114,3 +135,74 @@ end
assert('Fiber without block') do
assert_raise(ArgumentError) { Fiber.new }
end
+
+
+assert('Transfer to self.') do
+ result = []
+ f = Fiber.new { result << :start; f.transfer; result << :end }
+ f.transfer
+ assert_equal [:start, :end], result
+
+ result = []
+ f = Fiber.new { result << :start; f.transfer; result << :end }
+ f.resume
+ assert_equal [:start, :end], result
+end
+
+assert('Resume transferred fiber') do
+ f = Fiber.new {
+ assert_raise(FiberError) { f.resume }
+ }
+ f.transfer
+end
+
+assert('Root fiber transfer.') do
+ result = nil
+ root = Fiber.current
+ f = Fiber.new {
+ result = :ok
+ root.transfer
+ }
+ f.resume
+ assert_true f.alive?
+ assert_equal :ok, result
+end
+
+assert('Break nested fiber with root fiber transfer') do
+ root = Fiber.current
+
+ result = nil
+ f2 = nil
+ f1 = Fiber.new {
+ Fiber.yield f2.resume
+ result = :f1
+ }
+ f2 = Fiber.new {
+ result = :to_root
+ root.transfer :from_f2
+ result = :f2
+ }
+ assert_equal :from_f2, f1.resume
+ assert_equal :to_root, result
+ assert_equal :f2, f2.transfer
+ assert_equal :f2, result
+ assert_false f2.alive?
+ assert_equal :f1, f1.resume
+ assert_equal :f1, result
+ assert_false f1.alive?
+end
+
+assert('CRuby Fiber#transfer test.') do
+ ary = []
+ f2 = nil
+ f1 = Fiber.new{
+ ary << f2.transfer(:foo)
+ :ok
+ }
+ f2 = Fiber.new{
+ ary << f1.transfer(:baz)
+ :ng
+ }
+ assert_equal :ok, f1.transfer
+ assert_equal [:baz], ary
+end