text: // 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;
    }
    return undefined;
  }
  
  function TestCoverage(name, source, expectation) {
    source = source.trim();
    eval(source);
    var coverage = GetCoverage(source);
    var result = JSON.stringify(coverage);
    print(result);
    assertEquals(JSON.stringify(expectation), result, name + " failed");
  }
  
  TestCoverage(
  "call simple function twice",
  `
  function f() {}
  f();
  f();
  `,
  [{"start":0,"end":25,"count":1},
   {"start":0,"end":15,"count":1}]
  );
  
  TestCoverage(
  "call arrow function twice",
  `
  var f = () => 1;
  f();
  f();
  `,
  [{"start":0,"end":26,"count":1},
   {"start":8,"end":15,"count":1}]
  );
  
  TestCoverage(
  "call nested function",
  `
  function f() {
    function g() {}
    g();
    g();
  }
  f();
  f();
  `,
  [{"start":0,"end":58,"count":1},
   {"start":0,"end":48,"count":1},
   {"start":17,"end":32,"count":1}]
  );
  
  TestCoverage(
  "call recursive function",
  `
  function fib(x) {
    if (x < 2) return 1;
    return fib(x-1) + fib(x-2);
  }
  fib(5);
  `,
  [{"start":0,"end":80,"count":1},
   {"start":0,"end":72,"count":1}]
  );
  