<!DOCTYPE html>
<!-- Copied directly from https://chromium.googlesource.com/chromium/src/+/master/third_party/WebKit/LayoutTests/fast/dom/NodeList/nodelist-iterable.html -->
<meta charset="utf-8">
<title>Ensure NodeList semantically matches WebIDL iterable</title>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<div id="container">
    <div id="div1"></div>
    <div id="div2"></div><br>
    <div id="div3"></div><br>
    <div id="div4"></div><br>
    <div id="div5"></div><br>
    <form id="form">
        <input id="rad1" type="radio" name="radio" value="a">
        <input id="rad2" type="radio" name="radio" value="b">
        <input id="rad3" type="radio" name="radio" value="c">
        <input id="rad4" type="radio" name="radio" value="d">
    </form>
</div>
<script>
"use strict";
test(function() {
    let nodeList = container.querySelectorAll("div");
    let ids = [];
    for (let node of nodeList) {
        assert_true(node instanceof HTMLDivElement, "elements should be expected types");
        ids.push(node.id);

    }
    assert_array_equals(ids, ["div1", "div2", "div3", "div4", "div5"], "elements should be the expected values");

}, "for (node of NodeList)");
test(function() {
    let nodeList = container.querySelectorAll("div");
    for (let entry of nodeList.entries()) {
        assert_equals(typeof entry[0], "number", "value-iterable keys should be integers");
        let id = entry[0] + 1;
        let node = entry[1];
        assert_true(node instanceof HTMLDivElement, "elements should be expected types");
        assert_equals(node.id, "div" + id, "elements should be the expected values");

    }

}, "for ([index, node] of NodeList.entries())");
test(function() {
    let nodeList = container.querySelectorAll("div");
    for (let id of nodeList.keys()) {
        assert_equals(typeof id, "number", "value-iterable keys should be integers");
        let node = nodeList[id];
        assert_true(node instanceof HTMLDivElement, "elements should be expected types");
        assert_equals(node.id, "div" + (id + 1), "elements should be the expected values");

    }

}, "for (index of NodeList.keys())");
test(function() {
    let nodeList = container.querySelectorAll("div");
    let ids = [];
    for (let node of nodeList.values()) {
        assert_true(node instanceof HTMLDivElement, "elements should be expected types");
        ids.push(node.id);

    }
    assert_array_equals(ids, ["div1", "div2", "div3", "div4", "div5"], "elements should be the expected values");

}, "for (node of NodeList.values())");
test(function() {
    let nodeList = container.querySelectorAll("div");
    nodeList.forEach(function(node, id) {
        assert_true(node instanceof HTMLDivElement, "elements should be expected types");
        assert_equals(node.id, "div" + (id + 1), "elements should be the expected values");

    });

}, "NodeList.prototype.forEach()");
test(function() {
    let nodeList = form.radio;
    let rad = rad1;
    let ids = [];
    for (let node of nodeList) {
        assert_true(node instanceof HTMLInputElement, "elements should be expected types");
        ids.push(node.id);
        if (node === rad2) rad1.remove();

    }
    assert_array_equals(ids, ["rad1", "rad2", "rad4"], "elements should be the expected values");
    form.insertBefore(rad, rad2);

}, "Delete earlier element in live NodeList");
test(function() {
    let nodeList = form.radio;
    let rad = rad2;
    let ids = [];
    for (let node of nodeList) {
        assert_true(node instanceof HTMLInputElement, "elements should be expected types");
        ids.push(node.id);
        if (node === rad1) rad.remove();

    }
    assert_array_equals(ids, ["rad1", "rad3", "rad4"], "elements should be the expected values");
    form.insertBefore(rad, rad3);

}, "Delete later element in live NodeList");
</script>
</script>
</form>
</div></title>
