Ruby  2.4.2p198(2017-09-14revision59899)
coverage.c
Go to the documentation of this file.
1 /************************************************
2 
3  coverage.c -
4 
5  $Author: $
6 
7  Copyright (c) 2008 Yusuke Endoh
8 
9 ************************************************/
10 
11 #include "ruby.h"
12 #include "vm_core.h"
13 
14 /*
15  * call-seq:
16  * Coverage.start => nil
17  *
18  * Enables coverage measurement.
19  */
20 static VALUE
22 {
23  VALUE coverages = rb_get_coverages();
24  if (!RTEST(coverages)) {
25  coverages = rb_hash_new();
26  rb_obj_hide(coverages);
27  rb_set_coverages(coverages);
28  }
29  return Qnil;
30 }
31 
32 static int
34 {
35  VALUE path = (VALUE)key;
36  VALUE coverage = (VALUE)val;
37  VALUE coverages = (VALUE)h;
38  coverage = rb_ary_dup(coverage);
39  rb_ary_freeze(coverage);
40  rb_hash_aset(coverages, path, coverage);
41  return ST_CONTINUE;
42 }
43 
44 /*
45  * call-seq:
46  * Coverage.peek_result => hash
47  *
48  * Returns a hash that contains filename as key and coverage array as value.
49  */
50 static VALUE
52 {
53  VALUE coverages = rb_get_coverages();
54  VALUE ncoverages = rb_hash_new();
55  if (!RTEST(coverages)) {
56  rb_raise(rb_eRuntimeError, "coverage measurement is not enabled");
57  }
58  st_foreach(RHASH_TBL(coverages), coverage_peek_result_i, ncoverages);
59  rb_hash_freeze(ncoverages);
60  return ncoverages;
61 }
62 
63 /*
64  * call-seq:
65  * Coverage.result => hash
66  *
67  * Returns a hash that contains filename as key and coverage array as value
68  * and disables coverage measurement.
69  */
70 static VALUE
72 {
73  VALUE ncoverages = rb_coverage_peek_result(klass);
75  return ncoverages;
76 }
77 
78 /* Coverage provides coverage measurement feature for Ruby.
79  * This feature is experimental, so these APIs may be changed in future.
80  *
81  * = Usage
82  *
83  * 1. require "coverage"
84  * 2. do Coverage.start
85  * 3. require or load Ruby source file
86  * 4. Coverage.result will return a hash that contains filename as key and
87  * coverage array as value. A coverage array gives, for each line, the
88  * number of line execution by the interpreter. A +nil+ value means
89  * coverage is disabled for this line (lines like +else+ and +end+).
90  *
91  * = Example
92  *
93  * [foo.rb]
94  * s = 0
95  * 10.times do |x|
96  * s += x
97  * end
98  *
99  * if s == 45
100  * p :ok
101  * else
102  * p :ng
103  * end
104  * [EOF]
105  *
106  * require "coverage"
107  * Coverage.start
108  * require "foo.rb"
109  * p Coverage.result #=> {"foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}
110  */
111 void
113 {
114  VALUE rb_mCoverage = rb_define_module("Coverage");
115  rb_define_module_function(rb_mCoverage, "start", rb_coverage_start, 0);
116  rb_define_module_function(rb_mCoverage, "result", rb_coverage_result, 0);
117  rb_define_module_function(rb_mCoverage, "peek_result", rb_coverage_peek_result, 0);
118 }
static VALUE rb_coverage_result(VALUE klass)
Definition: coverage.c:71
VALUE rb_ary_freeze(VALUE ary)
Definition: array.c:403
static VALUE rb_coverage_start(VALUE klass)
Definition: coverage.c:21
#define st_foreach
Definition: regint.h:186
Definition: st.h:99
void Init_coverage(void)
Definition: coverage.c:112
void rb_raise(VALUE exc, const char *fmt,...)
Definition: error.c:2207
#define RHASH_TBL(h)
Definition: ruby.h:1063
RUBY_SYMBOL_EXPORT_BEGIN typedef unsigned long st_data_t
Definition: st.h:22
static VALUE coverage(VALUE fname, int n)
Definition: ripper.c:12176
static VALUE rb_coverage_peek_result(VALUE klass)
Definition: coverage.c:51
VALUE rb_hash_aset(VALUE hash, VALUE key, VALUE val)
Definition: hash.c:1576
#define val
VALUE rb_eRuntimeError
Definition: error.c:761
VALUE rb_get_coverages(void)
Definition: thread.c:5004
void rb_define_module_function(VALUE module, const char *name, VALUE(*func)(ANYARGS), int argc)
Defines a module function for module.
Definition: class.c:1731
VALUE rb_hash_new(void)
Definition: hash.c:441
#define Qnil
Definition: ruby.h:438
unsigned long VALUE
Definition: ruby.h:85
VALUE rb_obj_hide(VALUE obj)
Definition: object.c:51
VALUE rb_hash_freeze(VALUE hash)
Definition: hash.c:76
void rb_reset_coverages(void)
Definition: thread.c:5026
static int coverage_peek_result_i(st_data_t key, st_data_t val, st_data_t h)
Definition: coverage.c:33
#define RTEST(v)
Definition: ruby.h:450
VALUE rb_ary_dup(VALUE ary)
Definition: array.c:1927
VALUE rb_define_module(const char *name)
Definition: class.c:768
void rb_set_coverages(VALUE coverages)
Definition: thread.c:5010