utilrb 2.0.2.b2 → 2.1.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.boring +40 -0
- data/.gitignore +13 -0
- data/.travis.yml +5 -0
- data/CMakeLists.txt +18 -0
- data/Gemfile +3 -0
- data/Makefile +8 -0
- data/Manifest.txt +0 -8
- data/{README.rd → README.md} +11 -7
- data/Rakefile +16 -63
- data/benchmarks/validate_options.rb +79 -0
- data/ext/utilrb/extconf.rb +1 -17
- data/ext/utilrb/utilrb.cc +0 -23
- data/lib/utilrb/column_formatter.rb +8 -5
- data/lib/utilrb/common.rb +1 -6
- data/lib/utilrb/enumerable/uniq.rb +2 -8
- data/lib/utilrb/event_loop.rb +5 -10
- data/lib/utilrb/kernel/load_dsl_file.rb +1 -2
- data/lib/utilrb/kernel/options.rb +25 -29
- data/lib/utilrb/logger/hierarchy.rb +0 -1
- data/lib/utilrb/logger/io.rb +3 -3
- data/lib/utilrb/logger/root.rb +12 -6
- data/lib/utilrb/module/ancestor_p.rb +0 -12
- data/lib/utilrb/module/is_singleton.rb +6 -0
- data/lib/utilrb/module/singleton_class_p.rb +14 -0
- data/lib/utilrb/object/attribute.rb +33 -65
- data/lib/utilrb/object/singleton_class.rb +1 -20
- data/lib/utilrb/pkgconfig.rb +21 -10
- data/lib/utilrb/socket/tcp_server.rb +2 -2
- data/lib/utilrb/spawn.rb +1 -1
- data/lib/utilrb/test.rb +65 -0
- data/lib/utilrb/thread_pool.rb +11 -13
- data/lib/utilrb/timepoints.rb +15 -0
- data/lib/utilrb/value_set.rb +10 -1
- data/lib/utilrb/version.rb +4 -0
- data/lib/utilrb/weakref.rb +11 -12
- data/lib/utilrb/yard.rb +0 -111
- data/lib/utilrb.rb +6 -1
- data/lib/yard-utilrb.rb +1 -0
- data/manifest.xml +19 -0
- data/package.xml +29 -0
- data/utilrb.gemspec +27 -0
- metadata +56 -107
- data/ext/utilrb/proc.c +0 -39
- data/ext/utilrb/readline.c +0 -52
- data/ext/utilrb/weakref.cc +0 -143
- data/lib/utilrb/models/inherited_enumerable.rb +0 -341
- data/lib/utilrb/models/registration.rb +0 -115
- data/lib/utilrb/module/inherited_enumerable.rb +0 -6
- data/lib/utilrb/objectstats.rb +0 -193
- data/lib/utilrb/ruby_object_graph.rb +0 -384
- data/test/data/test_pkgconfig.pc +0 -9
- data/test/data/test_pkgconfig_empty.pc +0 -10
- data/test/test_array.rb +0 -15
- data/test/test_config.rb +0 -4
- data/test/test_dir.rb +0 -22
- data/test/test_enumerable.rb +0 -119
- data/test/test_event_loop.rb +0 -407
- data/test/test_exception.rb +0 -38
- data/test/test_gc.rb +0 -34
- data/test/test_hash.rb +0 -102
- data/test/test_kernel.rb +0 -300
- data/test/test_logger.rb +0 -204
- data/test/test_misc.rb +0 -42
- data/test/test_models.rb +0 -212
- data/test/test_module.rb +0 -126
- data/test/test_object.rb +0 -77
- data/test/test_objectstats.rb +0 -26
- data/test/test_pkgconfig.rb +0 -84
- data/test/test_proc.rb +0 -31
- data/test/test_set.rb +0 -19
- data/test/test_thread_pool.rb +0 -409
- data/test/test_time.rb +0 -47
- data/test/test_unbound_method.rb +0 -23
- data/test/test_weakref.rb +0 -81
data/test/test_thread_pool.rb
DELETED
@@ -1,409 +0,0 @@
|
|
1
|
-
require './test/test_config'
|
2
|
-
require 'utilrb/thread_pool'
|
3
|
-
require 'minitest/spec'
|
4
|
-
|
5
|
-
MiniTest::Unit.autorun
|
6
|
-
|
7
|
-
describe Utilrb::ThreadPool do
|
8
|
-
describe "when created" do
|
9
|
-
it "must create min number of threads." do
|
10
|
-
pool = Utilrb::ThreadPool.new(5)
|
11
|
-
sleep 0.1
|
12
|
-
assert_equal 5,pool.waiting
|
13
|
-
assert_equal 5,pool.spawned
|
14
|
-
assert_equal 5,(pool.instance_variable_get(:@workers)).size
|
15
|
-
pool.shutdown
|
16
|
-
pool.join
|
17
|
-
end
|
18
|
-
|
19
|
-
it "must create min number of threads." do
|
20
|
-
pool = Utilrb::ThreadPool.new(5)
|
21
|
-
sleep 0.1
|
22
|
-
assert_equal 5,pool.waiting
|
23
|
-
assert_equal 5,pool.spawned
|
24
|
-
assert_equal 5,(pool.instance_variable_get(:@workers)).size
|
25
|
-
pool.shutdown
|
26
|
-
pool.join
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe "when under heavy load" do
|
31
|
-
it "must spawn upto max threads." do
|
32
|
-
pool = Utilrb::ThreadPool.new(5,20)
|
33
|
-
0.upto 19 do
|
34
|
-
pool.process do
|
35
|
-
sleep 0.12
|
36
|
-
end
|
37
|
-
end
|
38
|
-
assert_equal 20,pool.backlog
|
39
|
-
assert_equal 20,pool.tasks.size
|
40
|
-
sleep 0.1
|
41
|
-
assert_equal 0,pool.backlog
|
42
|
-
assert_equal 0,pool.waiting
|
43
|
-
assert_equal 20,pool.spawned
|
44
|
-
sleep 0.1
|
45
|
-
assert_equal 20,pool.waiting
|
46
|
-
assert_equal 20,pool.spawned
|
47
|
-
pool.shutdown
|
48
|
-
pool.join
|
49
|
-
end
|
50
|
-
|
51
|
-
it "must be possible to resize its limit" do
|
52
|
-
pool = Utilrb::ThreadPool.new(5,5)
|
53
|
-
0.upto 19 do
|
54
|
-
pool.process do
|
55
|
-
sleep 0.32
|
56
|
-
end
|
57
|
-
end
|
58
|
-
sleep 0.1
|
59
|
-
assert_equal 0,pool.waiting
|
60
|
-
assert_equal 5,pool.spawned
|
61
|
-
pool.resize(5,20)
|
62
|
-
sleep 0.1
|
63
|
-
assert_equal 0,pool.waiting
|
64
|
-
assert_equal 20,pool.spawned
|
65
|
-
sleep 0.4
|
66
|
-
assert_equal 20,pool.spawned
|
67
|
-
assert_equal 20,pool.waiting
|
68
|
-
pool.shutdown
|
69
|
-
pool.join
|
70
|
-
end
|
71
|
-
|
72
|
-
it "must reduce its number of threads after the work is done if auto_trim == true." do
|
73
|
-
pool = Utilrb::ThreadPool.new(5,20)
|
74
|
-
pool.auto_trim = true
|
75
|
-
0.upto 19 do
|
76
|
-
pool.process do
|
77
|
-
sleep 0.15
|
78
|
-
end
|
79
|
-
end
|
80
|
-
sleep 0.13
|
81
|
-
assert_equal 0,pool.waiting
|
82
|
-
assert_equal 20,pool.spawned
|
83
|
-
sleep 0.4
|
84
|
-
assert_equal 5,pool.waiting
|
85
|
-
assert_equal 5,pool.spawned
|
86
|
-
pool.shutdown
|
87
|
-
pool.join
|
88
|
-
end
|
89
|
-
|
90
|
-
it "must not execute tasks with the same sync key in parallel" do
|
91
|
-
pool = Utilrb::ThreadPool.new(5,10)
|
92
|
-
pool.auto_trim = true
|
93
|
-
time = Time.now
|
94
|
-
0.upto 10 do
|
95
|
-
t = pool.process_with_options :sync_key => time do
|
96
|
-
sleep 0.1
|
97
|
-
end
|
98
|
-
assert_equal time, t.sync_key
|
99
|
-
end
|
100
|
-
while pool.backlog > 0
|
101
|
-
sleep 0.1
|
102
|
-
end
|
103
|
-
pool.shutdown
|
104
|
-
pool.join
|
105
|
-
assert Time.now - time >= 1.0
|
106
|
-
end
|
107
|
-
|
108
|
-
it "must not execute a task and a sync call in parallel if they have the same sync key" do
|
109
|
-
pool = Utilrb::ThreadPool.new(5,5)
|
110
|
-
time = Time.now
|
111
|
-
t = pool.process_with_options :sync_key => 1 do
|
112
|
-
sleep 0.2
|
113
|
-
end
|
114
|
-
pool.sync 1 do
|
115
|
-
sleep 0.2
|
116
|
-
end
|
117
|
-
while pool.backlog > 0
|
118
|
-
sleep 0.1
|
119
|
-
end
|
120
|
-
pool.shutdown
|
121
|
-
pool.join
|
122
|
-
assert Time.now - time >= 0.4
|
123
|
-
end
|
124
|
-
|
125
|
-
it "must execute a task and a sync call in parallel if they have different sync keys" do
|
126
|
-
pool = Utilrb::ThreadPool.new(5,5)
|
127
|
-
time = Time.now
|
128
|
-
t = pool.process_with_options :sync_key => 1 do
|
129
|
-
sleep 0.2
|
130
|
-
end
|
131
|
-
pool.sync 2 do
|
132
|
-
sleep 0.2
|
133
|
-
end
|
134
|
-
while pool.backlog > 0
|
135
|
-
sleep 0.1
|
136
|
-
end
|
137
|
-
pool.shutdown
|
138
|
-
pool.join
|
139
|
-
assert Time.now - time < 0.4
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
describe "when running" do
|
144
|
-
it "must call on_task_finished for each finised task." do
|
145
|
-
pool = Utilrb::ThreadPool.new(5)
|
146
|
-
count = 0
|
147
|
-
pool.on_task_finished do |task|
|
148
|
-
count += 1
|
149
|
-
end
|
150
|
-
task = pool.process do
|
151
|
-
sleep 0.05
|
152
|
-
end
|
153
|
-
task = pool.process do
|
154
|
-
raise
|
155
|
-
end
|
156
|
-
sleep 0.1
|
157
|
-
assert_equal 2,count
|
158
|
-
pool.shutdown
|
159
|
-
pool.join
|
160
|
-
end
|
161
|
-
|
162
|
-
it "must be able to reque a task" do
|
163
|
-
pool = Utilrb::ThreadPool.new(5)
|
164
|
-
count = 0
|
165
|
-
task = pool.process do
|
166
|
-
count += 1
|
167
|
-
end
|
168
|
-
while !task.finished?
|
169
|
-
sleep 0.001
|
170
|
-
end
|
171
|
-
pool << task
|
172
|
-
while !task.finished?
|
173
|
-
sleep 0.001
|
174
|
-
end
|
175
|
-
assert_equal 2, count
|
176
|
-
end
|
177
|
-
|
178
|
-
it "must process the next task if thread gets available" do
|
179
|
-
pool = Utilrb::ThreadPool.new(1)
|
180
|
-
count = 0
|
181
|
-
pool.process do
|
182
|
-
sleep 0.1
|
183
|
-
count +=1
|
184
|
-
end
|
185
|
-
pool.process do
|
186
|
-
sleep 0.1
|
187
|
-
count +=1
|
188
|
-
end
|
189
|
-
sleep 0.25
|
190
|
-
assert_equal 2, count
|
191
|
-
|
192
|
-
task3 = Utilrb::ThreadPool::Task.new do
|
193
|
-
count +=1
|
194
|
-
sleep 0.1
|
195
|
-
end
|
196
|
-
task4 = Utilrb::ThreadPool::Task.new do
|
197
|
-
count +=1
|
198
|
-
sleep 0.1
|
199
|
-
end
|
200
|
-
pool << task3
|
201
|
-
pool << task4
|
202
|
-
sleep 0.15
|
203
|
-
pool.shutdown
|
204
|
-
pool.join
|
205
|
-
assert_equal 4, count
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
describe "when shutting down" do
|
210
|
-
it "must terminate all threads" do
|
211
|
-
pool = Utilrb::ThreadPool.new(5)
|
212
|
-
task = pool.process do
|
213
|
-
sleep 0.2
|
214
|
-
end
|
215
|
-
pool.shutdown()
|
216
|
-
pool.join
|
217
|
-
end
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
|
222
|
-
describe Utilrb::ThreadPool::Task do
|
223
|
-
describe "when created" do
|
224
|
-
it "must raise if no block is given." do
|
225
|
-
assert_raises(ArgumentError) do
|
226
|
-
Utilrb::ThreadPool::Task.new
|
227
|
-
end
|
228
|
-
end
|
229
|
-
it "must be in waiting state." do
|
230
|
-
task = Utilrb::ThreadPool::Task.new do
|
231
|
-
end
|
232
|
-
assert !task.running?
|
233
|
-
assert !task.finished?
|
234
|
-
assert !task.exception?
|
235
|
-
assert !task.terminated?
|
236
|
-
assert !task.successfull?
|
237
|
-
assert !task.started?
|
238
|
-
assert_equal :waiting, task.state
|
239
|
-
end
|
240
|
-
it "must raise if wrong option is given." do
|
241
|
-
assert_raises ArgumentError do
|
242
|
-
task = Utilrb::ThreadPool::Task.new :bla => 123 do
|
243
|
-
end
|
244
|
-
end
|
245
|
-
end
|
246
|
-
it "must set its options." do
|
247
|
-
task = Utilrb::ThreadPool::Task.new :sync_key => 2 do
|
248
|
-
123
|
249
|
-
end
|
250
|
-
assert_equal 2,task.sync_key
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
|
-
describe "when executed" do
|
255
|
-
it "must be in finished state if task successfully executed." do
|
256
|
-
task = Utilrb::ThreadPool::Task.new do
|
257
|
-
123
|
258
|
-
end
|
259
|
-
task.pre_execute
|
260
|
-
task.execute
|
261
|
-
task.finalize
|
262
|
-
assert !task.running?
|
263
|
-
assert task.finished?
|
264
|
-
assert !task.exception?
|
265
|
-
assert !task.terminated?
|
266
|
-
assert task.successfull?
|
267
|
-
assert task.started?
|
268
|
-
end
|
269
|
-
|
270
|
-
it "must call the callback after it is finished." do
|
271
|
-
task = Utilrb::ThreadPool::Task.new do
|
272
|
-
123
|
273
|
-
end
|
274
|
-
result = nil
|
275
|
-
task.callback do |val,e|
|
276
|
-
result = val
|
277
|
-
end
|
278
|
-
task.pre_execute
|
279
|
-
task.execute
|
280
|
-
task.finalize
|
281
|
-
|
282
|
-
assert_equal 123,result
|
283
|
-
assert !task.running?
|
284
|
-
assert task.finished?
|
285
|
-
assert !task.exception?
|
286
|
-
assert !task.terminated?
|
287
|
-
assert task.successfull?
|
288
|
-
assert task.started?
|
289
|
-
end
|
290
|
-
|
291
|
-
it "must be in exception state if exception was raised." do
|
292
|
-
task = Utilrb::ThreadPool::Task.new do
|
293
|
-
raise
|
294
|
-
end
|
295
|
-
task.pre_execute
|
296
|
-
task.execute
|
297
|
-
task.finalize
|
298
|
-
assert !task.running?
|
299
|
-
assert task.finished?
|
300
|
-
assert task.exception?
|
301
|
-
assert !task.terminated?
|
302
|
-
assert !task.successfull?
|
303
|
-
assert task.started?
|
304
|
-
|
305
|
-
task = Utilrb::ThreadPool::Task.new do
|
306
|
-
raise
|
307
|
-
end
|
308
|
-
result = nil
|
309
|
-
task.callback do |val,e|
|
310
|
-
result = val ? val : e
|
311
|
-
end
|
312
|
-
task.pre_execute
|
313
|
-
task.execute
|
314
|
-
task.finalize
|
315
|
-
assert !task.running?
|
316
|
-
assert task.finished?
|
317
|
-
assert task.exception?
|
318
|
-
assert !task.terminated?
|
319
|
-
assert !task.successfull?
|
320
|
-
assert task.started?
|
321
|
-
assert_equal RuntimeError, result.class
|
322
|
-
end
|
323
|
-
|
324
|
-
it "must return the default value if an error was raised." do
|
325
|
-
task = Utilrb::ThreadPool::Task.new :default => 123 do
|
326
|
-
raise
|
327
|
-
end
|
328
|
-
result = nil
|
329
|
-
task.callback do |val,e|
|
330
|
-
result = val
|
331
|
-
end
|
332
|
-
task.pre_execute
|
333
|
-
task.execute
|
334
|
-
task.finalize
|
335
|
-
assert !task.running?
|
336
|
-
assert task.finished?
|
337
|
-
assert task.exception?
|
338
|
-
assert !task.terminated?
|
339
|
-
assert !task.successfull?
|
340
|
-
assert task.started?
|
341
|
-
assert_equal 123,result
|
342
|
-
end
|
343
|
-
|
344
|
-
it "must calculate its elapsed time." do
|
345
|
-
task = Utilrb::ThreadPool::Task.new do
|
346
|
-
sleep 0.2
|
347
|
-
end
|
348
|
-
assert_in_delta 0.0,task.time_elapsed,0.0001
|
349
|
-
thread = Thread.new do
|
350
|
-
task.pre_execute
|
351
|
-
task.execute
|
352
|
-
task.finalize
|
353
|
-
end
|
354
|
-
sleep 0.1
|
355
|
-
assert_in_delta 0.1,task.time_elapsed,0.01
|
356
|
-
thread.join
|
357
|
-
assert_in_delta 0.2,task.time_elapsed,0.001
|
358
|
-
sleep 0.1
|
359
|
-
assert_in_delta 0.2,task.time_elapsed,0.001
|
360
|
-
end
|
361
|
-
end
|
362
|
-
|
363
|
-
describe "when terminated" do
|
364
|
-
it "it must be in terminated state." do
|
365
|
-
task = Utilrb::ThreadPool::Task.new do
|
366
|
-
sleep 10
|
367
|
-
end
|
368
|
-
thread = Thread.new do
|
369
|
-
task.pre_execute
|
370
|
-
task.execute
|
371
|
-
task.finalize
|
372
|
-
end
|
373
|
-
sleep 0.1
|
374
|
-
task.terminate!
|
375
|
-
thread.join
|
376
|
-
|
377
|
-
assert !task.running?
|
378
|
-
assert task.finished?
|
379
|
-
assert !task.exception?
|
380
|
-
assert task.terminated?
|
381
|
-
assert !task.successfull?
|
382
|
-
assert task.started?
|
383
|
-
end
|
384
|
-
end
|
385
|
-
|
386
|
-
describe "when terminated" do
|
387
|
-
it "must be in state terminated." do
|
388
|
-
task = Utilrb::ThreadPool::Task.new do
|
389
|
-
sleep 10
|
390
|
-
end
|
391
|
-
thread = Thread.new do
|
392
|
-
task.pre_execute
|
393
|
-
task.execute
|
394
|
-
task.finalize
|
395
|
-
end
|
396
|
-
sleep 0.1
|
397
|
-
task.terminate!()
|
398
|
-
thread.join
|
399
|
-
|
400
|
-
assert !task.running?
|
401
|
-
assert task.finished?
|
402
|
-
assert !task.exception?
|
403
|
-
assert task.terminated?
|
404
|
-
assert !task.successfull?
|
405
|
-
assert task.started?
|
406
|
-
end
|
407
|
-
end
|
408
|
-
end
|
409
|
-
|
data/test/test_time.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
require './test/test_config'
|
2
|
-
require 'utilrb/time'
|
3
|
-
|
4
|
-
class TC_Time < Test::Unit::TestCase
|
5
|
-
def test_to_hms
|
6
|
-
assert_equal("0:00:00.000", Time.at(0).to_hms)
|
7
|
-
assert_equal("0:00:00.100", Time.at(0.1).to_hms)
|
8
|
-
assert_equal("0:00:34.100", Time.at(34.1).to_hms)
|
9
|
-
assert("0:21:34.100" == Time.at(21 * 60 + 34, 100000).to_hms)
|
10
|
-
assert("236:21:34.100", Time.at(236 * 3600 + 21 * 60 + 34, 100000).to_hms)
|
11
|
-
end
|
12
|
-
def test_from_hms
|
13
|
-
assert_equal([0, 0, 0, 1], Time.hms_decomposition('0:00:00.001'))
|
14
|
-
assert_equal([0, 0, 0, 10], Time.hms_decomposition('0:00:00.01'))
|
15
|
-
assert_equal([0, 0, 0, 10], Time.hms_decomposition('0:00:00.010'))
|
16
|
-
assert_equal([0, 0, 0, 100], Time.hms_decomposition('0:00:00.1'))
|
17
|
-
assert_equal([0, 0, 0, 100], Time.hms_decomposition('0:00:00.10'))
|
18
|
-
assert_equal([0, 0, 0, 100], Time.hms_decomposition('0:00:00.100'))
|
19
|
-
|
20
|
-
assert_equal([0, 0, 0, 0], Time.hms_decomposition("0:00:00.000"))
|
21
|
-
assert_equal(Time.at(34, 100000), Time.from_hms("0:00:34.100"))
|
22
|
-
assert_equal(Time.at(21 * 60 + 34, 100000), Time.from_hms("0:21:34.100"))
|
23
|
-
assert_equal(Time.at(236 * 3600 + 21 * 60 + 34, 100000), Time.from_hms("236:21:34.100"))
|
24
|
-
|
25
|
-
assert_equal([329991, 0, 10, 0], Time.hms_decomposition("329991:00:10"))
|
26
|
-
assert_equal([329991, 8, 8, 0], Time.hms_decomposition("329991:08:08"))
|
27
|
-
|
28
|
-
assert_equal(Time.at(0), Time.from_hms("0"))
|
29
|
-
assert_equal(Time.at(0), Time.from_hms(":0"))
|
30
|
-
assert_equal(Time.at(62), Time.from_hms("1:2"))
|
31
|
-
assert_equal(Time.at(3723), Time.from_hms("1:2:3"))
|
32
|
-
|
33
|
-
assert_equal(Time.at(0), Time.from_hms("0"))
|
34
|
-
assert_equal(Time.at(0), Time.from_hms("0."))
|
35
|
-
assert_in_delta(0, Time.at(1.2) - Time.from_hms("1.2"), 0.001, Time.from_hms("1.2").to_hms)
|
36
|
-
assert_in_delta(0, Time.at(121.3) - Time.from_hms("2:1.3"), 0.001)
|
37
|
-
assert_in_delta(0, Time.at(3723.4) - Time.from_hms("1:2:3.4"), 0.001)
|
38
|
-
assert_in_delta(0, Time.at(1.02) - Time.from_hms("1.02"), 0.001)
|
39
|
-
assert_in_delta(0, Time.at(121.03) - Time.from_hms("2:1.03"), 0.001)
|
40
|
-
assert_in_delta(0, Time.at(3723.04) - Time.from_hms("1:2:3.04"), 0.001)
|
41
|
-
assert_in_delta(0, Time.at(1.75) - Time.from_hms("1.75"), 0.001)
|
42
|
-
assert_in_delta(0, Time.at(121.75) - Time.from_hms("2:1.75"), 0.001)
|
43
|
-
assert_in_delta(0, Time.at(3723.75) - Time.from_hms("1:2:3.75"), 0.001)
|
44
|
-
assert_in_delta(0, Time.at(3723.243) - Time.from_hms("1:2:3.243"), 0.001)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
data/test/test_unbound_method.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require './test/test_config'
|
2
|
-
require 'utilrb/unbound_method'
|
3
|
-
require 'flexmock'
|
4
|
-
|
5
|
-
class TC_UnboundMethod < Test::Unit::TestCase
|
6
|
-
def test_call
|
7
|
-
FlexMock.use do |mock|
|
8
|
-
klass = Class.new do
|
9
|
-
define_method(:mock) { mock }
|
10
|
-
def tag(value, &block)
|
11
|
-
mock.method_called(value)
|
12
|
-
block.call(value)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
obj = klass.new
|
16
|
-
|
17
|
-
mock.should_receive(:method_called).with(42).once
|
18
|
-
mock.should_receive(:block_called).with(42).once
|
19
|
-
klass.instance_method(:tag).call(obj, 42) { |value| mock.block_called(value) }
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
data/test/test_weakref.rb
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'test/unit/testcase'
|
2
|
-
require 'utilrb/weakref'
|
3
|
-
|
4
|
-
Utilrb.require_ext('TC_WeakRef') do
|
5
|
-
class TC_WeakRef < Test::Unit::TestCase
|
6
|
-
WeakRef = Utilrb::WeakRef
|
7
|
-
def test_normal
|
8
|
-
obj = Object.new
|
9
|
-
ref = Utilrb::WeakRef.new(obj)
|
10
|
-
|
11
|
-
assert_equal(obj, ref.get)
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_initialize_validation
|
15
|
-
assert_raises(ArgumentError) { Utilrb::WeakRef.new(nil) }
|
16
|
-
assert_raises(ArgumentError) { Utilrb::WeakRef.new(5) }
|
17
|
-
|
18
|
-
ref = WeakRef.new(Object.new)
|
19
|
-
assert_raises(ArgumentError) { Utilrb::WeakRef.new(ref) }
|
20
|
-
end
|
21
|
-
|
22
|
-
def create_deep_pair(lvl)
|
23
|
-
if lvl == 0
|
24
|
-
100.times do
|
25
|
-
obj = Object.new
|
26
|
-
WeakRef.new(obj)
|
27
|
-
obj = nil
|
28
|
-
end
|
29
|
-
else
|
30
|
-
create_deep_pair(lvl - 1)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def create_deep_ref(lvl)
|
35
|
-
if lvl == 0
|
36
|
-
obj = Object.new
|
37
|
-
refs = (1..100).map { WeakRef.new(obj) }
|
38
|
-
return refs, obj.object_id
|
39
|
-
else
|
40
|
-
create_deep_ref(lvl - 1)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def create_deep_obj(lvl)
|
45
|
-
if lvl == 0
|
46
|
-
ref = WeakRef.new(obj = Object.new)
|
47
|
-
return obj, ref.object_id
|
48
|
-
else
|
49
|
-
create_deep_obj(lvl - 1)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_finalized_objects
|
54
|
-
refs, obj_id = create_deep_ref(100)
|
55
|
-
create_deep_ref(200) # erase the stack ...
|
56
|
-
GC.start
|
57
|
-
for ref in refs
|
58
|
-
assert_raises(WeakRef::RefError) { ref.get }
|
59
|
-
end
|
60
|
-
assert_equal(nil, WeakRef.refcount(obj_id))
|
61
|
-
end
|
62
|
-
|
63
|
-
def test_finalized_refs
|
64
|
-
obj, ref_id = create_deep_obj(100)
|
65
|
-
create_deep_ref(100) # erase the stack ...
|
66
|
-
GC.start
|
67
|
-
assert_raises(RangeError) do
|
68
|
-
ref = ObjectSpace._id2ref(ref_id)
|
69
|
-
if !ref.kind_of?(WeakRef)
|
70
|
-
raise RangeError
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_finalization_ordering_crash
|
76
|
-
create_deep_pair(100)
|
77
|
-
GC.start
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|