| // Copyright 2019 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 --no-stress-flush-bytecode |
| // Flags: --no-stress-incremental-marking |
| // Files: test/mjsunit/code-coverage-utils.js |
| |
| %DebugToggleBlockCoverage(true); |
| |
| TestCoverage( |
| "await expressions", |
| ` |
| async function f() { // 0000 |
| await 42; // 0050 |
| await 42; // 0100 |
| }; // 0150 |
| f(); // 0200 |
| %PerformMicrotaskCheckpoint(); // 0250 |
| `, |
| [{"start":0,"end":299,"count":1}, |
| {"start":0,"end":151,"count":1}] |
| ); |
| |
| TestCoverage( |
| "for-await-of statements", |
| ` |
| !async function() { // 0000 |
| for await (var x of [0,1,2,3]) { // 0050 |
| nop(); // 0100 |
| } // 0150 |
| }(); // 0200 |
| %PerformMicrotaskCheckpoint(); // 0250 |
| `, |
| [{"start":0,"end":299,"count":1}, |
| {"start":1,"end":201,"count":1}, |
| {"start":83,"end":153,"count":4}] |
| ); |
| |
| TestCoverage( |
| "https://crbug.com/981313", |
| ` |
| class Foo { // 0000 |
| async timeout() { // 0000 |
| return new Promise( // 0100 |
| (r) => setTimeout(r, 10)); // 0000 |
| } // 0200 |
| } // 0000 |
| new Foo().timeout(); // 0300 |
| `, |
| [ {"start":0, "end":349, "count":1}, |
| {"start":52, "end":203, "count":1}, |
| {"start":158,"end":182, "count":1}]); |
| |
| TestCoverage( |
| "test async generator coverage", |
| ` |
| class Foo { // 0000 |
| async *timeout() { // 0000 |
| return new Promise( // 0100 |
| (r) => setTimeout(r, 10)); // 0000 |
| } // 0200 |
| } // 0000 |
| new Foo().timeout(); // 0300 |
| `, |
| [ {"start":0, "end":349, "count":1}, |
| {"start":52, "end":203, "count":1}, |
| {"start":158,"end":182, "count":0}]); |
| |
| TestCoverage( |
| "test async generator coverage with next call", |
| ` |
| class Foo { // 0000 |
| async *timeout() { // 0000 |
| return new Promise( // 0100 |
| (r) => setTimeout(r, 10)); // 0000 |
| } // 0200 |
| } // 0000 |
| new Foo().timeout().next(); // 0300 |
| `, |
| [ {"start":0, "end":349, "count":1}, |
| {"start":52, "end":203, "count":1}, |
| {"start":158,"end":182, "count":1}]); |
| |
| TestCoverage( |
| "test two consecutive returns", |
| ` |
| class Foo { // 0000 |
| timeout() { // 0000 |
| return new Promise( // 0100 |
| (r) => setTimeout(r, 10)); // 0000 |
| return new Promise( // 0200 |
| (r) => setTimeout(r, 10)); // 0000 |
| } // 0300 |
| } // 0000 |
| new Foo().timeout(); // 0400 |
| `, |
| [ {"start":0,"end":449,"count":1}, |
| {"start":52,"end":303,"count":1}, |
| {"start":184,"end":302,"count":0}, |
| {"start":158,"end":182,"count":1}] ); |
| |
| |
| TestCoverage( |
| "test async generator with two consecutive returns", |
| ` |
| class Foo { // 0000 |
| async *timeout() { // 0000 |
| return new Promise( // 0100 |
| (r) => setTimeout(r, 10)); // 0000 |
| return new Promise( // 0200 |
| (r) => setTimeout(r, 10)); // 0000 |
| } // 0300 |
| } // 0000 |
| new Foo().timeout().next(); // 0400 |
| `, |
| [ {"start":0,"end":449,"count":1}, |
| {"start":52,"end":303,"count":1}, |
| {"start":184,"end":302,"count":0}, |
| {"start":158,"end":182,"count":1}] ); |
| |
| TestCoverage( |
| "https://crbug.com/v8/9952", |
| ` |
| async function test(foo) { // 0000 |
| return {bar}; // 0050 |
| // 0100 |
| function bar() { // 0150 |
| console.log("test"); // 0200 |
| } // 0250 |
| } // 0300 |
| test().then(r => r.bar()); // 0350 |
| %PerformMicrotaskCheckpoint(); // 0400`, |
| [{"start":0,"end":449,"count":1}, |
| {"start":0,"end":301,"count":1}, |
| {"start":152,"end":253,"count":1}, |
| {"start":362,"end":374,"count":1}]); |
| |
| TestCoverage( |
| "https://crbug.com/v8/10628", |
| ` |
| async function abc() { // 0000 |
| try { // 0050 |
| return 'abc'; // 0100 |
| } finally { // 0150 |
| console.log('in finally'); // 0200 |
| } // 0250 |
| } // 0300 |
| abc(); // 0350 |
| %PerformMicrotaskCheckpoint(); // 0400 |
| `, |
| [{"start":0,"end":449,"count":1}, |
| {"start":0,"end":301,"count":1}]); |
| |
| TestCoverage( |
| "try/catch/finally statements async", |
| ` |
| !async function() { // 0000 |
| try { nop(); } catch (e) { nop(); } // 0050 |
| try { nop(); } finally { nop(); } // 0100 |
| try { // 0150 |
| try { throw 42; } catch (e) { nop(); }// 0200 |
| } catch (e) { nop(); } // 0250 |
| try { // 0300 |
| try { throw 42; } finally { nop(); } // 0350 |
| } catch (e) { nop(); } // 0400 |
| try { // 0450 |
| throw 42; // 0500 |
| } catch (e) { // 0550 |
| nop(); // 0600 |
| } finally { // 0650 |
| nop(); // 0700 |
| } // 0750 |
| }(); // 0800 |
| `, |
| [{"start":0,"end":849,"count":1}, |
| {"start":1,"end":801,"count":1}, |
| {"start":67,"end":87,"count":0}, |
| {"start":254,"end":274,"count":0}] |
| ); |
| |
| TestCoverage("try/catch/finally statements with early return async", |
| ` |
| !async function() { // 0000 |
| try { throw 42; } catch (e) { return; } // 0050 |
| nop(); // 0100 |
| }(); // 0150 |
| !async function() { // 0200 |
| try { throw 42; } catch (e) {} // 0250 |
| finally { return; } // 0300 |
| nop(); // 0350 |
| }(); // 0400 |
| `, |
| [{"start":0,"end":449,"count":1}, |
| {"start":1,"end":151,"count":1}, |
| {"start":91,"end":150,"count":0}, |
| {"start":201,"end":401,"count":1}, |
| {"start":321,"end":400,"count":0}] |
| ); |
| |
| %DebugToggleBlockCoverage(false); |