summaryrefslogtreecommitdiff
path: root/test/ruby/test_fiber.rb
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-08-21 18:51:39 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-08-21 18:51:39 +0000
commitc5e4cd063838033dff617f360a5b670b9eedaece (patch)
tree778e478e788a5284ebdb9798c7193233be428ac3 /test/ruby/test_fiber.rb
parentc4d6f4c01e44aa48070d091649795c586f3583e6 (diff)
* cont.c: add Fiber#resume and Fiber.yield.
and Fiber::Core class to realize Coroutine. * include/ruby/intern.h: declare rb_fiber_yield(), rb_fiber_resume(), * enumerator.c: use above api. * test/ruby/test_fiber.rb: fix and add tests for above changes. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13130 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/ruby/test_fiber.rb')
-rw-r--r--test/ruby/test_fiber.rb81
1 files changed, 51 insertions, 30 deletions
diff --git a/test/ruby/test_fiber.rb b/test/ruby/test_fiber.rb
index d6212cc7ea..bd39ba5af4 100644
--- a/test/ruby/test_fiber.rb
+++ b/test/ruby/test_fiber.rb
@@ -6,25 +6,24 @@ class TestFiber < Test::Unit::TestCase
assert_equal(:ok2,
Fiber.new{|e|
assert_equal(:ok1, e)
- assert_equal(f, Fiber.prev)
Fiber.yield :ok2
- }.yield(:ok1)
+ }.resume(:ok1)
)
- assert_equal([:a, :b], Fiber.new{|a, b| [a, b]}.yield(:a, :b))
+ assert_equal([:a, :b], Fiber.new{|a, b| [a, b]}.resume(:a, :b))
end
def test_term
- assert_equal(:ok, Fiber.new{:ok}.yield)
+ assert_equal(:ok, Fiber.new{:ok}.resume)
assert_equal([:a, :b, :c, :d, :e],
Fiber.new{
Fiber.new{
Fiber.new{
Fiber.new{
[:a]
- }.yield + [:b]
- }.yield + [:c]
- }.yield + [:d]
- }.yield + [:e])
+ }.resume + [:b]
+ }.resume + [:c]
+ }.resume + [:d]
+ }.resume + [:e])
end
def test_many_fibers
@@ -35,7 +34,7 @@ class TestFiber < Test::Unit::TestCase
assert_equal(max,
max.times{|i|
Fiber.new{
- }.yield
+ }.resume
}
)
end
@@ -48,7 +47,7 @@ class TestFiber < Test::Unit::TestCase
max.times{|i|
Fiber.new{
@cnt += 1
- }.yield
+ }.resume
}
}
}.each{|t|
@@ -63,50 +62,72 @@ class TestFiber < Test::Unit::TestCase
}
assert_raise(FiberError){
f = Fiber.new{}
- Thread.new{f.yield}.join # Fiber yielding across thread
+ Thread.new{f.resume}.join # Fiber yielding across thread
}
assert_raise(FiberError){
f = Fiber.new{}
- f.yield
- f.yield
+ f.resume
+ f.resume
}
assert_raise(RuntimeError){
f = Fiber.new{
@c = callcc{|c| @c = c}
- }.yield
+ }.resume
@c.call # cross fiber callcc
}
- end
-
- def test_loop
- ary = []
- f2 = nil
- f1 = Fiber.new{
- ary << f2.yield(:foo)
- :bar
+ assert_raise(RuntimeError){
+ Fiber.new{
+ raise
+ }.resume
}
- f2 = Fiber.new{
- ary << f1.yield(:baz)
- :ok
+ assert_raise(FiberError){
+ Fiber.yield
+ }
+ assert_raise(FiberError){
+ fib = Fiber.new{
+ fib.resume
+ }
+ fib.resume
+ }
+ assert_raise(FiberError){
+ fib = Fiber.new{
+ Fiber.new{
+ fib.resume
+ }.resume
+ }
+ fib.resume
}
- assert_equal(:ok, f1.yield)
- assert_equal([:baz, :bar], ary)
end
def test_return
assert_raise(LocalJumpError){
Fiber.new do
return
- end.yield
+ end.resume
}
end
def test_throw
- assert_raise(RuntimeError){
+ assert_raise(NameError){
Fiber.new do
throw :a
- end.yield
+ end.resume
+ }
+ end
+
+ def test_transfer
+ ary = []
+ f2 = nil
+ f1 = Fiber::Core.new{
+ ary << f2.transfer(:foo)
+ :ok
+ }
+ f2 = Fiber::Core.new{
+ ary << f1.transfer(:baz)
+ :ng
}
+ assert_equal(:ok, f1.transfer)
+ assert_equal([:baz], ary)
end
end