v8/test/mjsunit/code-coverage-ad-hoc.js
yangguo c39123dd53 [debugger] implement inspector-facing API for code coverage.
The inspector uses V8's API handles and should not access
V8 internals. This change makes sure it can use the coverage
data in an encapsulated way.

R=jgruber@chromium.org, kozyatinskiy@chromium.org
BUG=v8:5808

Review-Url: https://codereview.chromium.org/2696163002
Cr-Commit-Position: refs/heads/master@{#43231}
2017-02-16 08:36:12 +00:00

106 lines
1.8 KiB
JavaScript

// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --allow-natives-syntax --no-always-opt
// Test code coverage without explicitly activating it upfront.
function GetCoverage(source) {
for (var script of %DebugCollectCoverage()) {
if (script.script.source == source) return script.toplevel;
}
return undefined;
}
function ApplyCoverageToSource(source, range) {
var content = "";
var cursor = range.start;
if (range.inner) for (var inner of range.inner) {
content += source.substring(cursor, inner.start);
content += ApplyCoverageToSource(source, inner);
cursor = inner.end;
}
content += source.substring(cursor, range.end);
return `[${content}](${range.name}:${range.count})`;
}
function TestCoverage(name, source, expectation) {
source = source.trim();
expectation = expectation.trim();
eval(source);
var coverage = GetCoverage(source);
var result = ApplyCoverageToSource(source, coverage);
print(result);
assertEquals(expectation, result, name + " failed");
}
TestCoverage(
"call simple function twice",
`
function f() {}
f();
f();
`,
`
[[function f() {}](f:2)
f();
f();](:1)
`
);
TestCoverage(
"call arrow function twice",
`
var f = () => 1;
f();
f();
`,
`
[var f = [() => 1](f:2);
f();
f();](:1)
`
);
TestCoverage(
"call nested function",
`
function f() {
function g() {}
g();
g();
}
f();
f();
`,
`
[[function f() {
[function g() {}](g:4)
g();
g();
}](f:2)
f();
f();](:1)
`
);
TestCoverage(
"call recursive function",
`
function fib(x) {
if (x < 2) return 1;
return fib(x-1) + fib(x-2);
}
fib(5);
`,
`
[[function fib(x) {
if (x < 2) return 1;
return fib(x-1) + fib(x-2);
}](fib:15)
fib(5);](:1)
`
);