ruby/yarvtest/test_thread.rb

210 строки
2.9 KiB
Ruby

require 'yarvtest/yarvtest'
class TestThread < YarvTestBase
def test_create
ae %q{
Thread.new{
}.join
:ok
}
ae %q{
Thread.new{
:ok
}.value
}
end
def test_create_many_threads1
ae %q{
v = 0
(1..200).map{|i|
Thread.new{
i
}
}.each{|t|
v += t.value
}
v
}
end
def test_create_many_threads2
ae %q{
5000.times{|e|
(1..2).map{
Thread.new{
}
}.each{|e|
e.join
}
}
}
end
def test_create_many_threads3
ae %q{
5000.times{
t = Thread.new{}
while t.alive?
Thread.pass
end
}
}
end
def test_create_many_threads4
ae %q{
100.times{
Thread.new{loop{Thread.pass}}
}
}
end
def test_raise
ae %q{
t = Thread.new{
sleep
}
sleep 0.1
t.raise
begin
t.join
:ng
rescue
:ok
end
}
ae %q{
t = Thread.new{
loop{}
}
Thread.pass
t.raise
begin
t.join
:ng
rescue
:ok
end
}
ae %q{
t = Thread.new{
}
Thread.pass
t.join
t.raise # raise to exited thread
begin
t.join
:ok
rescue
:ng
end
}
end
def test_status
ae %q{
t = Thread.new{
loop{}
}
st = t.status
t.kill
st
}
ae %q{
t = Thread.new{
sleep
}
sleep 0.1
st = t.status
t.kill
st
}
ae %q{
t = Thread.new{
}
t.kill
sleep 0.1
t.status
}
end
def test_tlv
ae %q{
Thread.current[:a] = 1
Thread.new{
Thread.current[:a] = 10
Thread.pass
Thread.current[:a]
}.value + Thread.current[:a]
}
end
def test_thread_group
ae %q{
ptg = Thread.current.group
Thread.new{
ctg = Thread.current.group
[ctg.class, ctg == ptg]
}.value
}
ae %q{
thg = ThreadGroup.new
t = Thread.new{
thg.add Thread.current
sleep
}
sleep 0.1
[thg.list.size, ThreadGroup::Default.list.size]
}
end
def test_thread_local_svar
ae %q{
/a/ =~ 'a'
$a = $~
Thread.new{
$b = $~
/a/ =~ 'a'
$c = $~
}
$d = $~
[$a == $d, $b, $c != $d]
}
end
def test_join
ae %q{
Thread.new{
:ok
}.join.value
}
ae %q{
begin
Thread.new{
raise "ok"
}.join
rescue => e
e
end
}
ae %q{
ans = nil
t = Thread.new{
begin
sleep 0.5
ensure
ans = :ok
end
}
Thread.pass
t.kill
t.join
ans
}
end
end