summaryrefslogtreecommitdiff
path: root/yarvtest/test_thread.rb
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-12-31 15:02:22 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-12-31 15:02:22 +0000
commita3e1b1ce7ed7e7ffac23015fc2fde56511b30681 (patch)
tree7b725552a9a4ded93849ca2faab1b257f7761790 /yarvtest/test_thread.rb
parent3e7566d8fb5138bb9cd647e5fdefc54fc9803509 (diff)
* Merge YARV
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'yarvtest/test_thread.rb')
-rw-r--r--yarvtest/test_thread.rb209
1 files changed, 209 insertions, 0 deletions
diff --git a/yarvtest/test_thread.rb b/yarvtest/test_thread.rb
new file mode 100644
index 0000000000..ba0c0838dd
--- /dev/null
+++ b/yarvtest/test_thread.rb
@@ -0,0 +1,209 @@
+
+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
+