(async function(testRunner) {
  var {page, session, dp} = await testRunner.startHTML(`
    <div id="depth-1">
        <div id="depth-2">
            <div id="depth-3">
                <div id="depth-4">
                    <div id="depth-5">
                        <div id="depth-6">
                            <div id="depth-7">
                                <div id="depth-8">
                                    <div id="depth-9">
                                        <div id="depth-10">
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
  `, 'Tests that DOM.requestChildNodes respects depth parameter.');
  testRunner.log("\n=== Get the Document ===\n");
  var response = await dp.DOM.getDocument();
  var bodyId = response.result.root.children[0].children[1].nodeId;

  testRunner.log("\n=== Get immediate children of the body ===\n");
  dp.DOM.requestChildNodes({nodeId: bodyId});
  var message = await dp.DOM.onceSetChildNodes();
  var firstDiv = message.params.nodes[0];
  assert("First child is a div", firstDiv.localName, "div");
  assert("First child is div#depth-1", firstDiv.attributes[1], "depth-1");
  assert("First child has one child", firstDiv.childNodeCount, 1);
  assert("First child has no .children property", firstDiv.children, undefined);

  testRunner.log("\n=== Get children of div#depth-1 three levels deep ===\n");
  dp.DOM.requestChildNodes({nodeId: firstDiv.nodeId, depth: 3});
  var message = await dp.DOM.onceSetChildNodes();
  var depth = 1;
  var firstChild = message.params.nodes[0];
  var node = firstChild;
  while (node && node.children) {
    depth++;
    node = node.children[0];
  }
  assert("div#depth-1 has nodes 3 levels deep", depth, 3);

  testRunner.log("\n=== Get all children of body ===\n");
  dp.DOM.requestChildNodes({nodeId: firstDiv.nodeId, depth: -1});
  var message = await dp.DOM.onceSetChildNodes();
  var depth = 0;
  var firstChild = message.params.nodes[0];
  var node = firstChild;
  while (node && node.children) {
    depth++;
    node = node.children[0];
  }
  // We have requested nodes 3-level deep so far, so
  // we should have gotten an additional 6 levels of depth.
  assert("div#depth-1 has nodes 9 levels deep", depth, 6);

  testRunner.log("\n=== Pass an invalid depth ===\n");
  var response = await dp.DOM.requestChildNodes({nodeId: firstDiv.nodeId, depth: 0});
  if (response.error)
    testRunner.log("Backend error: " + response.error.message + " (" + response.error.code + ")\n");
  testRunner.completeTest();

  function assert(message, actual, expected) {
    if (actual === expected) {
      testRunner.log("PASS: " + message);
    } else {
      testRunner.log("FAIL: " + message + ", expected \"" + expected + "\" but got \"" + actual + "\"");
      testRunner.completeTest();
    }
  };
});

