Module: Coverage
| Relationships & Source Files | |
| Defined in: | ext/coverage/coverage.c |
Overview
Coverage provides coverage measurement feature for Ruby. This feature is experimental, so these APIs may be changed in future.
Usage
-
require “coverage”
-
do .start
-
require or load Ruby source file
-
.result will return a hash that contains filename as key and coverage array as value. A coverage array gives, for each line, the number of line execution by the interpreter. A
nilvalue means coverage is disabled for this line (lines likeelseandend).
Example
[foo.rb]
s = 0
10.times do |x|
s += x
end
if s == 45
p :ok
else
p :ng
end
[EOF]
require "coverage"
Coverage.start
require "foo.rb"
p Coverage.result #=> {"foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}
Class Attribute Summary
- .running? ⇒ Boolean readonly mod_func
Class Method Summary
-
.peek_result ⇒ Hash
mod_func
Returns a hash that contains filename as key and coverage array as value.
-
.result ⇒ Hash
mod_func
Returns a hash that contains filename as key and coverage array as value and disables coverage measurement.
-
.start ⇒ nil
mod_func
Enables coverage measurement.
Class Attribute Details
.running? ⇒ Boolean (readonly, mod_func)
# File 'ext/coverage/coverage.c', line 255
static VALUE
rb_coverage_running(VALUE klass)
{
VALUE coverages = rb_get_coverages();
return RTEST(coverages) ? Qtrue : Qfalse;
}
Class Method Details
.peek_result ⇒ Hash (mod_func)
Returns a hash that contains filename as key and coverage array as value.
{
"file.rb" => [1, 2, nil],
#...
}
# File 'ext/coverage/coverage.c', line 214
static VALUE
rb_coverage_peek_result(VALUE klass)
{
VALUE coverages = rb_get_coverages();
VALUE ncoverages = rb_hash_new();
if (!RTEST(coverages)) {
rb_raise(rb_eRuntimeError, "coverage measurement is not enabled");
}
st_foreach(RHASH_TBL(coverages), coverage_peek_result_i, ncoverages);
if (current_mode & COVERAGE_TARGET_METHODS) {
rb_objspace_each_objects(method_coverage_i, &ncoverages);
}
rb_hash_freeze(ncoverages);
return ncoverages;
}
.result ⇒ Hash (mod_func)
Returns a hash that contains filename as key and coverage array as value and disables coverage measurement.
# File 'ext/coverage/coverage.c', line 239
static VALUE
rb_coverage_result(VALUE klass)
{
VALUE ncoverages = rb_coverage_peek_result(klass);
rb_reset_coverages();
me2counter = Qnil;
return ncoverages;
}
.start ⇒ nil (mod_func)
Enables coverage measurement.
# File 'ext/coverage/coverage.c', line 24
static VALUE
rb_coverage_start(int argc, VALUE *argv, VALUE klass)
{
VALUE coverages, opt;
int mode;
rb_scan_args(argc, argv, "01", &opt);
if (argc == 0) {
mode = 0; /* compatible mode */
}
else if (opt == ID2SYM(rb_intern("all"))) {
mode = COVERAGE_TARGET_LINES | COVERAGE_TARGET_BRANCHES | COVERAGE_TARGET_METHODS;
}
else {
mode = 0;
opt = rb_convert_type(opt, T_HASH, "Hash", "to_hash");
if (RTEST(rb_hash_lookup(opt, ID2SYM(rb_intern("lines")))))
mode |= COVERAGE_TARGET_LINES;
if (RTEST(rb_hash_lookup(opt, ID2SYM(rb_intern("branches")))))
mode |= COVERAGE_TARGET_BRANCHES;
if (RTEST(rb_hash_lookup(opt, ID2SYM(rb_intern("methods")))))
mode |= COVERAGE_TARGET_METHODS;
if (mode == 0) {
rb_raise(rb_eRuntimeError, "no measuring target is specified");
}
}
if (mode & COVERAGE_TARGET_METHODS) {
me2counter = rb_hash_new_compare_by_id();
}
else {
me2counter = Qnil;
}
coverages = rb_get_coverages();
if (!RTEST(coverages)) {
coverages = rb_hash_new();
rb_obj_hide(coverages);
current_mode = mode;
if (mode == 0) mode = COVERAGE_TARGET_LINES;
rb_set_coverages(coverages, mode, me2counter);
}
else if (current_mode != mode) {
rb_raise(rb_eRuntimeError, "cannot change the measuring target during coverage measurement");
}
return Qnil;
}