OSDN Git Service

ruby-1.9.1-rc1
[splhack/AndroidRuby.git] / lib / ruby-1.9.1-rc1 / yarvtest / test_thread.rb
1
2 require 'yarvtest/yarvtest'
3
4 class TestThread < YarvTestBase
5   def test_create
6     ae %q{
7       Thread.new{
8       }.join
9       :ok
10     }
11     ae %q{
12       Thread.new{
13         :ok
14       }.value
15     }
16   end
17
18   def test_create_many_threads1
19     ae %q{
20       v = 0
21       (1..200).map{|i|
22         Thread.new{
23           i
24         }
25       }.each{|t|
26         v += t.value
27       }
28       v
29     }
30   end
31
32   def test_create_many_threads2
33     ae %q{
34       5000.times{|e|
35         (1..2).map{
36           Thread.new{
37           }
38         }.each{|e|
39           e.join
40         }
41       }
42     }
43   end
44
45   def test_create_many_threads3
46     ae %q{
47       5000.times{
48         t = Thread.new{}
49         while t.alive?
50           Thread.pass
51         end
52       }
53     }
54   end
55
56   def test_create_many_threads4
57     ae %q{
58       100.times{
59         Thread.new{loop{Thread.pass}}
60       }
61     }
62   end
63
64   def test_raise
65     ae %q{
66       t = Thread.new{
67         sleep
68       }
69       sleep 0.1
70       t.raise
71       begin
72         t.join
73         :ng
74       rescue
75         :ok
76       end
77     }
78     ae %q{
79       t = Thread.new{
80         loop{}
81       }
82       Thread.pass
83       t.raise
84       begin
85         t.join
86         :ng
87       rescue
88         :ok
89       end
90     }
91     ae %q{
92       t = Thread.new{
93       }
94       Thread.pass
95       t.join
96       t.raise # raise to exited thread
97       begin
98         t.join
99         :ok
100       rescue
101         :ng
102       end
103     }
104   end
105
106   def test_status
107     ae %q{
108       t = Thread.new{
109         loop{}
110       }
111       st = t.status
112       t.kill
113       st
114     }
115     ae %q{
116       t = Thread.new{
117         sleep
118       }
119       sleep 0.1
120       st = t.status
121       t.kill
122       st
123     }
124     ae %q{
125       t = Thread.new{
126       }
127       t.kill
128       sleep 0.1
129       t.status
130     }
131   end
132
133   def test_tlv
134     ae %q{
135       Thread.current[:a] = 1
136       Thread.new{
137         Thread.current[:a] = 10
138         Thread.pass
139         Thread.current[:a]
140       }.value + Thread.current[:a]
141     }
142   end
143
144   def test_thread_group
145     ae %q{
146       ptg = Thread.current.group
147       Thread.new{
148         ctg = Thread.current.group
149         [ctg.class, ctg == ptg]
150       }.value
151     }
152     ae %q{
153       thg = ThreadGroup.new
154
155       t = Thread.new{
156         thg.add Thread.current
157         sleep
158       }
159       sleep 0.1
160       [thg.list.size, ThreadGroup::Default.list.size]
161     }
162   end
163
164   def test_thread_local_svar
165     ae %q{
166       /a/ =~ 'a'
167       $a = $~
168       Thread.new{
169         $b = $~
170         /a/ =~ 'a'
171         $c = $~
172       }
173       $d = $~
174       [$a == $d, $b, $c != $d]
175     }
176   end
177
178   def test_join
179     ae %q{
180       Thread.new{
181         :ok
182       }.join.value
183     }
184     ae %q{
185       begin
186         Thread.new{
187           raise "ok"
188         }.join
189       rescue => e
190         e
191       end
192     }
193     ae %q{
194       ans = nil
195       t = Thread.new{
196         begin
197           sleep 0.5
198         ensure
199           ans = :ok
200         end
201       }
202       Thread.pass
203       t.kill
204       t.join
205       ans
206     }
207   end
208 end
209