jsinstrument 0.0.12 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/jsinstrument/inserting.js +8 -1
- data/lib/jsinstrument/instrumenter.rb +32 -5
- data/lib/jsinstrument/version.rb +1 -1
- metadata +1 -1
@@ -162,7 +162,14 @@
|
|
162
162
|
}
|
163
163
|
|
164
164
|
// register the instrumented lines for current file
|
165
|
-
root.%{js_object_name}.register('%{src_filename}',
|
165
|
+
root.%{js_object_name}.register('%{src_filename}',
|
166
|
+
// line coverage
|
167
|
+
%{instrumented_lines},
|
168
|
+
// function coverage
|
169
|
+
%{instrumented_func_lines},
|
170
|
+
// branch coverage
|
171
|
+
%{instrumented_branch_lines}
|
172
|
+
);
|
166
173
|
}(this);
|
167
174
|
|
168
175
|
|
@@ -22,7 +22,7 @@ module JSInstrument
|
|
22
22
|
self.src_filename = filename
|
23
23
|
ast = RKelly::Parser.new.parse src
|
24
24
|
raise 'Parse source failed.' unless ast
|
25
|
-
ast, instrumented_lines, instrumented_func_lines = instrument_ast ast
|
25
|
+
ast, instrumented_lines, instrumented_func_lines, instrumented_branch_lines = instrument_ast ast
|
26
26
|
instrumented_src = ast.to_ecma
|
27
27
|
|
28
28
|
inserting = File.open(File.dirname(__FILE__) + '/inserting.js').read
|
@@ -36,7 +36,8 @@ module JSInstrument
|
|
36
36
|
batch_text: self.batch_text,
|
37
37
|
data_compress_method: self.data_compress_method,
|
38
38
|
instrumented_lines: instrumented_lines,
|
39
|
-
instrumented_func_lines: instrumented_func_lines
|
39
|
+
instrumented_func_lines: instrumented_func_lines,
|
40
|
+
instrumented_branch_lines: instrumented_branch_lines
|
40
41
|
}
|
41
42
|
|
42
43
|
(inserting % bindings) + instrumented_src
|
@@ -48,11 +49,12 @@ module JSInstrument
|
|
48
49
|
ast = RKelly::Visitors::ParentBuilder.new.build ast
|
49
50
|
instrumented_lines = Set.new
|
50
51
|
instrumented_func_lines = Set.new
|
52
|
+
instrumented_branch_lines = Set.new
|
51
53
|
ast.each do |node|
|
52
54
|
parent = node.parent
|
53
55
|
line = node.line
|
54
|
-
node_classname = node
|
55
|
-
parent_classname = parent
|
56
|
+
node_classname = get_node_classname node
|
57
|
+
parent_classname = get_node_classname parent
|
56
58
|
|
57
59
|
# instrument only if we can get the line no. and we haven't instrumented it
|
58
60
|
|
@@ -93,6 +95,7 @@ module JSInstrument
|
|
93
95
|
end
|
94
96
|
end
|
95
97
|
end
|
98
|
+
|
96
99
|
# function coverage
|
97
100
|
#
|
98
101
|
if line and not instrumented_func_lines.member? line
|
@@ -103,11 +106,31 @@ module JSInstrument
|
|
103
106
|
end
|
104
107
|
end
|
105
108
|
end
|
109
|
+
|
110
|
+
# branch coverage
|
111
|
+
#
|
112
|
+
if line and not instrumented_branch_lines.member? line
|
113
|
+
if 'If' == parent_classname
|
114
|
+
if 'Block' == node_classname
|
115
|
+
if parent.value.eql? node
|
116
|
+
instrumented_branch_lines.add line
|
117
|
+
insert_hitbranch_in node
|
118
|
+
elsif parent.else.eql? node
|
119
|
+
instrumented_branch_lines.add line
|
120
|
+
insert_hitbranch_in node
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
106
125
|
end
|
107
|
-
[ast, instrumented_lines.sort, instrumented_func_lines.sort]
|
126
|
+
[ast, instrumented_lines.sort, instrumented_func_lines.sort, instrumented_branch_lines.sort]
|
108
127
|
end
|
109
128
|
|
110
129
|
private
|
130
|
+
def get_node_classname node
|
131
|
+
node.class.name.split(/::/)[-1].sub('Node', '')
|
132
|
+
end
|
133
|
+
|
111
134
|
def get_hit_call line, func
|
112
135
|
ExpressionStatementNode.new(
|
113
136
|
FunctionCallNode.new(
|
@@ -152,5 +175,9 @@ module JSInstrument
|
|
152
175
|
function_body_node.value.value.unshift get_hit_call(line, "hit_func")
|
153
176
|
end
|
154
177
|
|
178
|
+
def insert_hitbranch_in block_node
|
179
|
+
# Block.value(SourceElement).value(array).unshift hit_func
|
180
|
+
block_node.value.value.unshift get_hit_call(block_node.line, "hit_branch")
|
181
|
+
end
|
155
182
|
end
|
156
183
|
end
|
data/lib/jsinstrument/version.rb
CHANGED