summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-fiber/test
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2014-03-21 22:10:39 +0900
committertake_cheeze <[email protected]>2014-03-21 22:10:47 +0900
commite854a0e8500c254fc845924888cdb20743e59e34 (patch)
treeb1b650e31c29a0c5f45d1600aa76fa9b00ea91d9 /mrbgems/mruby-fiber/test
parentd4d4f1b0d57bed96bb3341c2304e39afefa352c5 (diff)
downloadmruby-e854a0e8500c254fc845924888cdb20743e59e34.tar.gz
mruby-e854a0e8500c254fc845924888cdb20743e59e34.zip
make Fiber#transfer compatible with CRuby
Diffstat (limited to 'mrbgems/mruby-fiber/test')
-rw-r--r--mrbgems/mruby-fiber/test/fiber.rb83
1 files changed, 78 insertions, 5 deletions
diff --git a/mrbgems/mruby-fiber/test/fiber.rb b/mrbgems/mruby-fiber/test/fiber.rb
index c6f9d821f..c2bae2259 100644
--- a/mrbgems/mruby-fiber/test/fiber.rb
+++ b/mrbgems/mruby-fiber/test/fiber.rb
@@ -9,22 +9,24 @@ assert('Fiber#resume') {
}
assert('Fiber#transfer') do
+ f2 = nil
f1 = Fiber.new do |v|
- assert_raise(FiberError) { Fiber.current.transfer }
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_equal 2, f2.resume
- f1.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?
-
- assert_raise(FiberError) { Fiber.current.transfer }
end
assert('Fiber#alive?') {
@@ -133,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