benchmarker 0.1.0
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.
- data/CHANGES.txt +6 -0
- data/benchmarker.gemspec +66 -0
- data/examples/bench_loop.rb +51 -0
- data/examples/bench_require.rb +34 -0
- data/setup.rb +1585 -0
- data/test/benchmarker_test.rb +694 -0
- data/test/oktest.rb +825 -0
- metadata +94 -0
@@ -0,0 +1,694 @@
|
|
1
|
+
###
|
2
|
+
### $Release: 0.1.0 $
|
3
|
+
### $Copyright: copyright(c) 2010-2011 kuwata-lab.com all rights reserved $
|
4
|
+
### $License: Public Domain $
|
5
|
+
###
|
6
|
+
|
7
|
+
$:.unshift File.class_eval { expand_path(dirname(__FILE__)) }
|
8
|
+
$:.unshift File.class_eval { expand_path(join(dirname(__FILE__), '../lib')) }
|
9
|
+
|
10
|
+
require 'oktest'
|
11
|
+
require 'benchmarker'
|
12
|
+
|
13
|
+
|
14
|
+
class Benchmarker_TC
|
15
|
+
include Oktest::TestCase
|
16
|
+
|
17
|
+
def test_SELF_new
|
18
|
+
spec "creates runner object and returns it." do
|
19
|
+
ret = Benchmarker.new
|
20
|
+
ok {ret}.is_a?(Benchmarker::RUNNER)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_SELF_platform
|
25
|
+
spec "returns platform information." do
|
26
|
+
s = Benchmarker.platform()
|
27
|
+
ok {s} =~ /^benchmarker\.rb:\s+release \d+\.\d+\.\d+/
|
28
|
+
rexp = /^RUBY_VERSION:\s+(.*)/
|
29
|
+
ok {s} =~ rexp
|
30
|
+
ok {s =~ rexp and $1} == RUBY_VERSION
|
31
|
+
rexp = /^RUBY_PATCHLEVEL:\s+(.*)/
|
32
|
+
ok {s} =~ rexp
|
33
|
+
ok {s =~ rexp and $1} == RUBY_PATCHLEVEL.to_s
|
34
|
+
rexp = /^RUBY_PLATFORM:\s+(.*)/
|
35
|
+
ok {s} =~ rexp
|
36
|
+
ok {s =~ rexp and $1} == RUBY_PLATFORM
|
37
|
+
i = 0
|
38
|
+
s.each_line {|line| i += 1 }
|
39
|
+
ok {i} == 4
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
class Benchmarker::Runner_TC
|
47
|
+
include Oktest::TestCase
|
48
|
+
|
49
|
+
def test_initialize
|
50
|
+
spec "takes :loop, :cycle, and :extra options." do
|
51
|
+
runner = Benchmarker::RUNNER.new(:loop=>10, :cycle=>20, :extra=>30)
|
52
|
+
ok {runner.instance_variable_get('@loop')} == 10
|
53
|
+
ok {runner.instance_variable_get('@cycle')} == 20
|
54
|
+
ok {runner.instance_variable_get('@extra')} == 30
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_task
|
59
|
+
runner = nil
|
60
|
+
ret = nil
|
61
|
+
called = false
|
62
|
+
sout, serr = dummy_io() do
|
63
|
+
runner = Benchmarker::RUNNER.new # should be inside dummy_io() block!
|
64
|
+
ret = runner.task("label1") { called = true }
|
65
|
+
runner.task("label2", :skip=>"# not installed.") { nil }
|
66
|
+
end
|
67
|
+
spec "prints section title if not printed yet." do
|
68
|
+
ok {sout} =~ /\A\n## {28} user sys total real\n.*\n/
|
69
|
+
ok {serr} == ""
|
70
|
+
end
|
71
|
+
spec "creates task objet and returns it." do
|
72
|
+
ok {ret}.is_a?(Benchmarker::TASK)
|
73
|
+
end
|
74
|
+
spec "saves created task object unless :skip optin is not specified." do
|
75
|
+
task = ret
|
76
|
+
ok {runner.tasks} == [task]
|
77
|
+
end
|
78
|
+
spec "runs task when :skip option is not specified." do
|
79
|
+
ok {called} == true
|
80
|
+
ok {sout} =~ /\A\n.*\nlabel1 0\.\d+ 0\.\d+ 0\.\d+ 0\.\d+\n/
|
81
|
+
end
|
82
|
+
spec "skip block and prints message when :skip option is specified." do
|
83
|
+
ok {sout} =~ /^label2 *\# not installed\.\n/
|
84
|
+
end
|
85
|
+
spec "subtracts times of empty task if exists." do
|
86
|
+
empty_task = runner.empty_task { nil }
|
87
|
+
empty_task.user = 10.0
|
88
|
+
empty_task.sys = 5.0
|
89
|
+
empty_task.total = 15.0
|
90
|
+
empty_task.real = 20.0
|
91
|
+
t = runner.task("label2") { x = 1+1 }
|
92
|
+
ok {t.user }.in_delta?(-10.0, 0.1)
|
93
|
+
ok {t.sys }.in_delta?(- 5.0, 0.1)
|
94
|
+
ok {t.total}.in_delta?(-15.0, 0.1)
|
95
|
+
ok {t.real }.in_delta?(-20.0, 0.1)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_empty_task
|
100
|
+
runner = task = sout = nil
|
101
|
+
spec "creates empty task object and returns it." do
|
102
|
+
sout, serr = dummy_io() do
|
103
|
+
runner = Benchmarker::RUNNER.new # should be inside dummy_io() block!
|
104
|
+
task = runner.empty_task { nil }
|
105
|
+
end
|
106
|
+
ok {task}.is_a?(Benchmarker::TASK)
|
107
|
+
ok {task.label} == "(Empty)"
|
108
|
+
end
|
109
|
+
spec "prints section title if not printed yet." do
|
110
|
+
ok {sout} =~ /^## +user +sys +total +real\n/
|
111
|
+
end
|
112
|
+
spec "saves empty task object." do
|
113
|
+
ok {runner.instance_variable_get('@_empty_task')} == task
|
114
|
+
end
|
115
|
+
spec "don't add empty task to @tasks." do
|
116
|
+
ok {runner.tasks} == []
|
117
|
+
end
|
118
|
+
spec "clear @_empty_task." do
|
119
|
+
# pass
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_skip_task
|
124
|
+
runner = nil
|
125
|
+
sout, serr = dummy_io() do
|
126
|
+
runner = Benchmarker::RUNNER.new
|
127
|
+
runner.skip_task("bench1", "-- not installed --")
|
128
|
+
runner.skip_task("bench2", "** not supported **")
|
129
|
+
end
|
130
|
+
spec "prints headers if they are not printed." do
|
131
|
+
ok {sout} =~ /^## +user +sys +total +real\n/
|
132
|
+
end
|
133
|
+
spec "prints task label and message instead of times." do
|
134
|
+
ok {sout} =~ /^bench1 +\-\- not installed \-\-\n/
|
135
|
+
ok {sout} =~ /^bench2 +\*\* not supported \*\*\n/
|
136
|
+
end
|
137
|
+
spec "don't change @tasks." do
|
138
|
+
ok {runner.instance_variable_get('@tasks')} == []
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def test__before_all
|
143
|
+
spec "prints platform information." do
|
144
|
+
sout, serr = dummy_io() do
|
145
|
+
runner = Benchmarker::RUNNER.new
|
146
|
+
runner._before_all()
|
147
|
+
end
|
148
|
+
ok {sout} == Benchmarker.platform()
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def test__after_all
|
153
|
+
spec "prints statistics of benchmarks." do
|
154
|
+
tr = tracer()
|
155
|
+
sout, serr = dummy_io() do
|
156
|
+
runner = Benchmarker::RUNNER.new
|
157
|
+
tr.trace_method(runner.stats, :all)
|
158
|
+
runner.task("label1") { nil }
|
159
|
+
runner.task("label2") { nil }
|
160
|
+
runner._after_all()
|
161
|
+
end
|
162
|
+
ok {tr[0].name} == :all
|
163
|
+
ok {sout} =~ /^## Ranking/
|
164
|
+
ok {sout} =~ /^## Matrix/
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def test__run
|
169
|
+
spec "when @cycle > 1..." do
|
170
|
+
runner = sout = serr = block_param = nil
|
171
|
+
spec "yields block @cycle times when @extra is not specified." do
|
172
|
+
i = 0
|
173
|
+
sout, serr = dummy_io() do
|
174
|
+
runner = Benchmarker::RUNNER.new(:cycle=>2)
|
175
|
+
runner._run do |r|
|
176
|
+
i +=1
|
177
|
+
block_param = r
|
178
|
+
r.task('taskA') { nil }
|
179
|
+
r.task('taskB') { nil }
|
180
|
+
end
|
181
|
+
end
|
182
|
+
ok {i} == 2
|
183
|
+
end
|
184
|
+
runner2 = sout2 = serr2 = block_param2 = nil
|
185
|
+
spec "yields block @cycle + 2*@extra times when @extra is specified." do
|
186
|
+
i = 0
|
187
|
+
sout2, serr2 = dummy_io() do
|
188
|
+
runner2 = Benchmarker::RUNNER.new(:cycle=>5, :extra=>1)
|
189
|
+
runner2._run do |r|
|
190
|
+
i +=1
|
191
|
+
block_param2 = r
|
192
|
+
r.task('taskA') { nil }
|
193
|
+
r.task('taskB') { nil }
|
194
|
+
end
|
195
|
+
end
|
196
|
+
ok {i} == 7
|
197
|
+
end
|
198
|
+
spec "prints output of cycle into stderr." do
|
199
|
+
not_ok {sout} =~ /^## \(#1\)/
|
200
|
+
not_ok {sout} =~ /^## \(#2\)/
|
201
|
+
ok {serr} =~ /^## \(#1\)/
|
202
|
+
ok {serr} =~ /^## \(#2\)/
|
203
|
+
not_ok {sout2} =~ /^## \(#1\)/
|
204
|
+
not_ok {sout2} =~ /^## \(#2\)/
|
205
|
+
ok {serr2} =~ /^## \(#1\)/
|
206
|
+
ok {serr2} =~ /^## \(#2\)/
|
207
|
+
end
|
208
|
+
spec "yields block with self as block paramter." do
|
209
|
+
ok {block_param}.same?(runner)
|
210
|
+
ok {block_param2}.same?(runner2)
|
211
|
+
end
|
212
|
+
spec "reports average of results." do
|
213
|
+
ok {sout} =~ /^## Average of 2/
|
214
|
+
ok {sout2} =~ /^## Average of 5 \(=7-2\*1\)/
|
215
|
+
end
|
216
|
+
end
|
217
|
+
spec "when @cycle == 0 or not specified..." do
|
218
|
+
runner = sout = block_param = nil
|
219
|
+
spec "yields block only once." do
|
220
|
+
i = 0
|
221
|
+
sout, serr = dummy_io() do
|
222
|
+
runner = Benchmarker::RUNNER.new()
|
223
|
+
runner._run do |r|
|
224
|
+
i +=1
|
225
|
+
block_param = r
|
226
|
+
r.task('taskA') { nil }
|
227
|
+
r.task('taskB') { nil }
|
228
|
+
end
|
229
|
+
end
|
230
|
+
ok {i} == 1
|
231
|
+
ok {sout} =~ /^## *user/
|
232
|
+
end
|
233
|
+
spec "yields block with self as block paramter." do
|
234
|
+
ok {block_param}.same?(runner)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def test__calc_average
|
240
|
+
sos = proc do |label, user, sys, total, real|
|
241
|
+
t = Benchmarker::TASK.new(label)
|
242
|
+
t.user, t.sys, t.total, t.real = user, sys, total, real
|
243
|
+
t
|
244
|
+
end
|
245
|
+
all_tasks = []
|
246
|
+
all_tasks << [
|
247
|
+
sos.call("Haruhi", 11.1, 0.2, 11.3, 11.3),
|
248
|
+
sos.call("Mikuru", 14.1, 0.2, 14.3, 14.1),
|
249
|
+
sos.call("Yuki", 10.1, 0.2, 10.3, 10.4),
|
250
|
+
sos.call("Itsuki", 12.1, 0.2, 12.3, 12.1),
|
251
|
+
sos.call("Kyon", 13.1, 0.2, 13.3, 13.5),
|
252
|
+
]
|
253
|
+
all_tasks << [
|
254
|
+
sos.call("Haruhi", 11.1, 0.2, 11.3, 11.9),
|
255
|
+
sos.call("Mikuru", 14.1, 0.2, 14.3, 14.2),
|
256
|
+
sos.call("Yuki", 10.1, 0.2, 10.3, 10.6),
|
257
|
+
sos.call("Itsuki", 12.1, 0.2, 12.3, 12.5),
|
258
|
+
sos.call("Kyon", 13.1, 0.2, 13.3, 13.3),
|
259
|
+
]
|
260
|
+
all_tasks << [
|
261
|
+
sos.call("Haruhi", 11.1, 0.2, 11.3, 11.5),
|
262
|
+
sos.call("Mikuru", 14.1, 0.2, 14.3, 14.8),
|
263
|
+
sos.call("Yuki", 10.1, 0.2, 10.3, 10.9),
|
264
|
+
sos.call("Itsuki", 12.1, 0.2, 12.3, 12.7),
|
265
|
+
sos.call("Kyon", 13.1, 0.2, 13.3, 13.9),
|
266
|
+
]
|
267
|
+
all_tasks << [
|
268
|
+
sos.call("Haruhi", 11.1, 0.2, 11.3, 11.3),
|
269
|
+
sos.call("Mikuru", 14.1, 0.2, 14.3, 14.2),
|
270
|
+
sos.call("Yuki", 10.1, 0.2, 10.3, 10.3),
|
271
|
+
sos.call("Itsuki", 12.1, 0.2, 12.3, 12.8),
|
272
|
+
sos.call("Kyon", 13.1, 0.2, 13.3, 13.4),
|
273
|
+
]
|
274
|
+
all_tasks << [
|
275
|
+
sos.call("Haruhi", 11.1, 0.2, 11.3, 11.6),
|
276
|
+
sos.call("Mikuru", 14.1, 0.2, 14.3, 14.2),
|
277
|
+
sos.call("Yuki", 10.1, 0.2, 10.3, 10.6),
|
278
|
+
sos.call("Itsuki", 12.1, 0.2, 12.3, 12.4),
|
279
|
+
sos.call("Kyon", 13.1, 0.2, 13.3, 13.3),
|
280
|
+
]
|
281
|
+
all_tasks << [
|
282
|
+
sos.call("Haruhi", 11.1, 0.2, 11.3, 11.3),
|
283
|
+
sos.call("Mikuru", 14.1, 0.2, 14.3, 14.8),
|
284
|
+
sos.call("Yuki", 10.1, 0.2, 10.3, 10.3),
|
285
|
+
sos.call("Itsuki", 12.1, 0.2, 12.3, 12.2),
|
286
|
+
sos.call("Kyon", 13.1, 0.2, 13.3, 13.7),
|
287
|
+
]
|
288
|
+
#
|
289
|
+
expected = <<'END'
|
290
|
+
|
291
|
+
## Remove Min & Max min cycle max cycle
|
292
|
+
Haruhi 11.3000 (#1) 11.9000 (#2)
|
293
|
+
11.3000 (#6) 11.6000 (#5)
|
294
|
+
Mikuru 14.1000 (#1) 14.8000 (#6)
|
295
|
+
14.2000 (#2) 14.8000 (#3)
|
296
|
+
Yuki 10.3000 (#6) 10.9000 (#3)
|
297
|
+
10.3000 (#4) 10.6000 (#5)
|
298
|
+
Itsuki 12.1000 (#1) 12.8000 (#4)
|
299
|
+
12.2000 (#6) 12.7000 (#3)
|
300
|
+
Kyon 13.3000 (#5) 13.9000 (#3)
|
301
|
+
13.3000 (#2) 13.7000 (#6)
|
302
|
+
|
303
|
+
## Average of 2 user sys total real
|
304
|
+
Haruhi 11.1000 0.2000 11.3000 11.4000
|
305
|
+
Mikuru 14.1000 0.2000 14.3000 14.2000
|
306
|
+
Yuki 10.1000 0.2000 10.3000 10.5000
|
307
|
+
Itsuki 12.1000 0.2000 12.3000 12.4500
|
308
|
+
Kyon 13.1000 0.2000 13.3000 13.4500
|
309
|
+
END
|
310
|
+
#
|
311
|
+
spec "calculates average times of tasks." do
|
312
|
+
avg_tasks = nil
|
313
|
+
sout, serr = dummy_io() do
|
314
|
+
runner = Benchmarker::RUNNER.new(:cycle=>2)
|
315
|
+
avg_tasks = runner.__send__(:_calc_averages, all_tasks, 2)
|
316
|
+
runner.__send__(:_report_average_section, avg_tasks)
|
317
|
+
end
|
318
|
+
ok {sout} == expected
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
def test__get_average_section_title
|
323
|
+
spec "returns 'Average of N (=x-2*y)' string if label width is enough wide." do
|
324
|
+
runner = Benchmarker::RUNNER.new(:width=>24, :cycle=>5, :extra=>1)
|
325
|
+
title = runner.__send__(:_get_average_section_title)
|
326
|
+
ok {title} == "Average of 5 (=7-2*1)"
|
327
|
+
end
|
328
|
+
spec "returns 'Average of N' string if label width is not enough wide." do
|
329
|
+
runner = Benchmarker::RUNNER.new(:width=>23, :cycle=>5, :extra=>1)
|
330
|
+
title = runner.__send__(:_get_average_section_title)
|
331
|
+
ok {title} == "Average of 5"
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
end
|
336
|
+
|
337
|
+
|
338
|
+
class Benchmarker::Task_TC
|
339
|
+
include Oktest::TestCase
|
340
|
+
|
341
|
+
def before
|
342
|
+
@task1 = Benchmarker::TASK.new("label1")
|
343
|
+
@task1.user = 1.5
|
344
|
+
@task1.sys = 0.5
|
345
|
+
@task1.total = 2.0
|
346
|
+
@task1.real = 2.25
|
347
|
+
@task2 = Benchmarker::TASK.new("label1")
|
348
|
+
@task2.user = 1.125
|
349
|
+
@task2.sys = 0.25
|
350
|
+
@task2.total = 1.375
|
351
|
+
@task2.real = 1.5
|
352
|
+
end
|
353
|
+
|
354
|
+
def test_initialize
|
355
|
+
t = nil
|
356
|
+
spec "takes label and loop." do
|
357
|
+
t = Benchmarker::TASK.new("label1", 123)
|
358
|
+
ok {t.label} == "label1"
|
359
|
+
ok {t.loop} == 123
|
360
|
+
end
|
361
|
+
spec "sets all times to zero." do
|
362
|
+
ok {t.user} == 0.0
|
363
|
+
ok {t.sys} == 0.0
|
364
|
+
ok {t.total} == 0.0
|
365
|
+
ok {t.real} == 0.0
|
366
|
+
end
|
367
|
+
end
|
368
|
+
|
369
|
+
def test_run
|
370
|
+
spec "yields block for @loop times." do
|
371
|
+
task = Benchmarker::TASK.new("label2")
|
372
|
+
i = 0
|
373
|
+
task.run { i += 1 }
|
374
|
+
ok {i} == i
|
375
|
+
task.loop = 3
|
376
|
+
i = 0
|
377
|
+
task.run { i += 1 }
|
378
|
+
ok {i} == 3
|
379
|
+
end
|
380
|
+
spec "measures times." do
|
381
|
+
task = Benchmarker::TASK.new("label2")
|
382
|
+
task.user = task.sys = task.total = task.real = -1.0
|
383
|
+
task.run { nil }
|
384
|
+
delta = 0.001
|
385
|
+
ok {task.user }.in_delta?(0.0, delta)
|
386
|
+
ok {task.sys }.in_delta?(0.0, delta)
|
387
|
+
ok {task.total}.in_delta?(0.0, delta)
|
388
|
+
ok {task.real }.in_delta?(0.0, delta)
|
389
|
+
end
|
390
|
+
end
|
391
|
+
|
392
|
+
def test_add
|
393
|
+
spec "returns self." do
|
394
|
+
ok {@task1.add(@task2)}.same?(@task1)
|
395
|
+
end
|
396
|
+
spec "adds other's times into self." do
|
397
|
+
ok {@task1.user } == 2.625
|
398
|
+
ok {@task1.sys } == 0.75
|
399
|
+
ok {@task1.total} == 3.375
|
400
|
+
ok {@task1.real } == 3.75
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
def test_sub
|
405
|
+
spec "returns self." do
|
406
|
+
ok {@task1.sub(@task2)}.same?(@task1)
|
407
|
+
end
|
408
|
+
spec "substracts other's times from self." do
|
409
|
+
ok {@task1.user } == 0.375
|
410
|
+
ok {@task1.sys } == 0.25
|
411
|
+
ok {@task1.total} == 0.625
|
412
|
+
ok {@task1.real } == 0.75
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
416
|
+
def test_mul
|
417
|
+
spec "returns self." do
|
418
|
+
ok {@task1.mul(2)}.same?(@task1)
|
419
|
+
end
|
420
|
+
spec "multiplies times with n." do
|
421
|
+
ok {@task1.user } == 3.0
|
422
|
+
ok {@task1.sys } == 1.0
|
423
|
+
ok {@task1.total} == 4.0
|
424
|
+
ok {@task1.real } == 4.5
|
425
|
+
end
|
426
|
+
end
|
427
|
+
|
428
|
+
def test_div
|
429
|
+
spec "returns self." do
|
430
|
+
ok {@task1.div(2)}.same?(@task1)
|
431
|
+
end
|
432
|
+
spec "divides times by n." do
|
433
|
+
ok {@task1.user } == 0.75
|
434
|
+
ok {@task1.sys } == 0.25
|
435
|
+
ok {@task1.total} == 1.0
|
436
|
+
ok {@task1.real } == 1.125
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
def test_SELF_average
|
441
|
+
klass = Benchmarker::TASK
|
442
|
+
spec "returns empty task when argument is empty." do
|
443
|
+
t = klass.average([])
|
444
|
+
ok {t.label} == nil
|
445
|
+
ok {t.user} == 0.0
|
446
|
+
end
|
447
|
+
spec "create new task with label." do
|
448
|
+
t = klass.average([@task1, @task2])
|
449
|
+
ok {t.label} == @task1.label
|
450
|
+
not_ok {t.label}.same?(@task1)
|
451
|
+
end
|
452
|
+
spec "returns averaged task." do
|
453
|
+
t = klass.average([@task1, @task2, @task1, @task2])
|
454
|
+
ok {t.user } == (@task1.user + @task2.user ) / 2
|
455
|
+
ok {t.sys } == (@task1.sys + @task2.sys ) / 2
|
456
|
+
ok {t.total} == (@task1.total + @task2.total) / 2
|
457
|
+
ok {t.real } == (@task1.real + @task2.real ) / 2
|
458
|
+
end
|
459
|
+
end
|
460
|
+
|
461
|
+
end
|
462
|
+
|
463
|
+
|
464
|
+
class Benchmarker::Reporter_TC
|
465
|
+
include Oktest::TestCase
|
466
|
+
|
467
|
+
def before
|
468
|
+
@buf = ""
|
469
|
+
@r = Benchmarker::Reporter.new(:out=>@buf)
|
470
|
+
end
|
471
|
+
|
472
|
+
def test_initialize
|
473
|
+
spec "takes :out, :err, :width, and :format options." do
|
474
|
+
r = Benchmarker::Reporter.new(:out=>$stderr, :err=>$stdout, :width=>123, :format=>"%10.1f")
|
475
|
+
ok {r.out}.same?($stderr)
|
476
|
+
ok {r.err}.same?($stdout)
|
477
|
+
ok {r.label_width} == 123
|
478
|
+
ok {r.format_time} == "%10.1f"
|
479
|
+
end
|
480
|
+
end
|
481
|
+
|
482
|
+
def test__switch_out_to_err
|
483
|
+
spec "switches @out to @err temporarily." do
|
484
|
+
sout, serr = dummy_io() do
|
485
|
+
r = Benchmarker::Reporter.new()
|
486
|
+
r.write("Haruhi\n")
|
487
|
+
r._switch_out_to_err() do
|
488
|
+
r.write("Sasaki\n")
|
489
|
+
end
|
490
|
+
r.write("Kyon\n")
|
491
|
+
end
|
492
|
+
ok {sout} == "Haruhi\nKyon\n"
|
493
|
+
ok {serr} == "Sasaki\n"
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
497
|
+
def test_label_width=()
|
498
|
+
spec "sets @label_width." do
|
499
|
+
@r.label_width = 123
|
500
|
+
ok {@r.label_width} == 123
|
501
|
+
end
|
502
|
+
spec "sets @format_label, too." do
|
503
|
+
ok {@r.instance_variable_get('@format_label')} == "%-123s"
|
504
|
+
end
|
505
|
+
end
|
506
|
+
|
507
|
+
def test_format_time=()
|
508
|
+
spec "sets @format_time." do
|
509
|
+
@r.format_time = "%10.2f"
|
510
|
+
ok {@r.format_time} == "%10.2f"
|
511
|
+
end
|
512
|
+
spec "sets @format_header, too." do
|
513
|
+
ok {@r.instance_variable_get('@format_header')} == "%10s"
|
514
|
+
end
|
515
|
+
end
|
516
|
+
|
517
|
+
def test_write
|
518
|
+
spec "writes arguments to @out with '<<' operator." do
|
519
|
+
@r.write("Haruhi", nil, 32)
|
520
|
+
ok {@buf} == "Haruhi32"
|
521
|
+
end
|
522
|
+
spec "saves the last argument." do
|
523
|
+
ok {@r.instance_variable_get('@_prev')} == 32
|
524
|
+
end
|
525
|
+
spec "returns self." do
|
526
|
+
ok {@r.write()}.same?(@r)
|
527
|
+
end
|
528
|
+
end
|
529
|
+
|
530
|
+
def test_report_section_title
|
531
|
+
ret = @r.report_section_title("SOS")
|
532
|
+
spec "prints newline at first." do
|
533
|
+
ok {@buf} =~ /\A\n/
|
534
|
+
end
|
535
|
+
spec "prints section title with @format_label." do
|
536
|
+
ok {@buf} =~ /\A\n## SOS {24}/
|
537
|
+
end
|
538
|
+
spec "returns self." do
|
539
|
+
ok {ret}.same?(@r)
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
543
|
+
def test_report_section_headers
|
544
|
+
args = ["user", "sys", "total", "real"]
|
545
|
+
ret = @r.report_section_headers(*args)
|
546
|
+
spec "prints headers." do
|
547
|
+
ok {@buf} == " user sys total real\n"
|
548
|
+
end
|
549
|
+
spec "prints newline at end." do
|
550
|
+
ok {@buf} =~ /\n\z/
|
551
|
+
end
|
552
|
+
spec "returns self." do
|
553
|
+
ok {ret}.same?(@r)
|
554
|
+
end
|
555
|
+
end
|
556
|
+
|
557
|
+
def test_report_section_header
|
558
|
+
ret = @r.report_section_header("Haruhi")
|
559
|
+
spec "prints header with @format_header." do
|
560
|
+
ok {@buf} == " Haruhi"
|
561
|
+
@buf[0..-1] = ""
|
562
|
+
@r.format_time = "%5.2f"
|
563
|
+
@r.report_section_header("SOS")
|
564
|
+
ok {@buf} == " SOS"
|
565
|
+
end
|
566
|
+
spec "returns self." do
|
567
|
+
ok {ret}.same?(@r)
|
568
|
+
end
|
569
|
+
end
|
570
|
+
|
571
|
+
def test_report_task_label
|
572
|
+
ret = @r.report_task_label("Sasaki")
|
573
|
+
spec "prints task label with @format_label." do
|
574
|
+
ok {@buf} == "Sasaki "
|
575
|
+
@buf[0..-1] = ""
|
576
|
+
@r.instance_variable_set('@format_label', "%-12s")
|
577
|
+
@r.report_task_label("Sasakisan")
|
578
|
+
ok {@buf} == "Sasakisan "
|
579
|
+
end
|
580
|
+
spec "returns self." do
|
581
|
+
ok {ret}.same?(@r)
|
582
|
+
end
|
583
|
+
end
|
584
|
+
|
585
|
+
def test_report_task_times
|
586
|
+
ret = @r.report_task_times(1.1, 1.2, 1.3, 1.4)
|
587
|
+
spec "prints task times with @format_time." do
|
588
|
+
ok {@buf} == " 1.1000 1.2000 1.3000 1.4000\n"
|
589
|
+
end
|
590
|
+
spec "returns self." do
|
591
|
+
ok {ret}.same?(@r)
|
592
|
+
end
|
593
|
+
end
|
594
|
+
|
595
|
+
def test_report_task_time
|
596
|
+
ret = @r.report_task_time(12.3)
|
597
|
+
spec "prints task time with @format_time." do
|
598
|
+
ok {@buf} == " 12.3000"
|
599
|
+
end
|
600
|
+
spec "returns self." do
|
601
|
+
ok {ret}.same?(@r)
|
602
|
+
end
|
603
|
+
end
|
604
|
+
|
605
|
+
end
|
606
|
+
|
607
|
+
|
608
|
+
class Benchmarker::Stats_TC
|
609
|
+
include Oktest::TestCase
|
610
|
+
|
611
|
+
def before
|
612
|
+
@out = ""
|
613
|
+
@r = Benchmarker::Reporter.new(:out=>@out)
|
614
|
+
@stats = Benchmarker::Stats.new(@r)
|
615
|
+
#
|
616
|
+
@tasks = []
|
617
|
+
sos = proc do |label, user, sys, total, real|
|
618
|
+
t = Benchmarker::TASK.new(label)
|
619
|
+
t.user, t.sys, t.total, t.real = user, sys, total, real
|
620
|
+
@tasks << t
|
621
|
+
end
|
622
|
+
sos.call("Haruhi", 11.1, 0.2, 11.3, 11.5)
|
623
|
+
sos.call("Mikuru", 14.1, 0.2, 14.3, 14.5)
|
624
|
+
sos.call("Yuki", 10.1, 0.2, 10.3, 10.5)
|
625
|
+
sos.call("Itsuki", 12.1, 0.2, 12.3, 12.5)
|
626
|
+
sos.call("Kyon", 13.1, 0.2, 13.3, 13.5)
|
627
|
+
end
|
628
|
+
|
629
|
+
def test_initialize
|
630
|
+
r = Benchmarker::Reporter.new
|
631
|
+
stats = Benchmarker::Stats.new(r)
|
632
|
+
spec "takes reporter object." do
|
633
|
+
ok {stats.instance_variable_get('@report')} == r
|
634
|
+
end
|
635
|
+
#spec "takes :real, :barchar, and :loop options." do
|
636
|
+
#end
|
637
|
+
end
|
638
|
+
|
639
|
+
def test_ranking
|
640
|
+
expected1 = <<'END'
|
641
|
+
|
642
|
+
## Ranking real
|
643
|
+
Yuki 10.5000 (100.0%) ********************
|
644
|
+
Haruhi 11.5000 ( 91.3%) ******************
|
645
|
+
Itsuki 12.5000 ( 84.0%) *****************
|
646
|
+
Kyon 13.5000 ( 77.8%) ****************
|
647
|
+
Mikuru 14.5000 ( 72.4%) **************
|
648
|
+
END
|
649
|
+
expected2 = <<'END'
|
650
|
+
|
651
|
+
## Ranking real
|
652
|
+
Yuki 10.5000 (100.0%) 95238.10 per sec
|
653
|
+
Haruhi 11.5000 ( 91.3%) 86956.52 per sec
|
654
|
+
Itsuki 12.5000 ( 84.0%) 80000.00 per sec
|
655
|
+
Kyon 13.5000 ( 77.8%) 74074.07 per sec
|
656
|
+
Mikuru 14.5000 ( 72.4%) 68965.52 per sec
|
657
|
+
END
|
658
|
+
spec "prints ranking." do
|
659
|
+
spec "prints barchart if @numerator is not specified." do
|
660
|
+
@stats.ranking(@tasks)
|
661
|
+
ok {@out} == expected1
|
662
|
+
end
|
663
|
+
spec "prints inverse number if @numerator specified." do
|
664
|
+
@out = ""
|
665
|
+
@r = Benchmarker::Reporter.new(:out=>@out)
|
666
|
+
@stats = Benchmarker::Stats.new(@r, :numerator=>1000*1000)
|
667
|
+
@stats.ranking(@tasks)
|
668
|
+
ok {@out} == expected2
|
669
|
+
end
|
670
|
+
end
|
671
|
+
end
|
672
|
+
|
673
|
+
def test_ratio_matrix
|
674
|
+
expected = <<'END'
|
675
|
+
|
676
|
+
## Matrix real [01] [02] [03] [04] [05]
|
677
|
+
[01] Yuki 10.5000 100.0% 109.5% 119.0% 128.6% 138.1%
|
678
|
+
[02] Haruhi 11.5000 91.3% 100.0% 108.7% 117.4% 126.1%
|
679
|
+
[03] Itsuki 12.5000 84.0% 92.0% 100.0% 108.0% 116.0%
|
680
|
+
[04] Kyon 13.5000 77.8% 85.2% 92.6% 100.0% 107.4%
|
681
|
+
[05] Mikuru 14.5000 72.4% 79.3% 86.2% 93.1% 100.0%
|
682
|
+
END
|
683
|
+
spec "prints matrix." do
|
684
|
+
@stats.ratio_matrix(@tasks)
|
685
|
+
ok {@out} == expected
|
686
|
+
end
|
687
|
+
end
|
688
|
+
|
689
|
+
end
|
690
|
+
|
691
|
+
|
692
|
+
if __FILE__ == $0
|
693
|
+
Oktest::run_all()
|
694
|
+
end
|