<!doctype html>
<meta charset=utf-8>
<title>DOMTokenList iteration: keys, values, etc.</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<span class="   a  a b "></span>
<script>
  test(() => {
    var list = document.querySelector("span").classList;
    assert_array_equals([...list], ["a", "b"]);
  }, "classList");

  test(() => {
    var keys = document.querySelector("span").classList.keys();
    assert_false(keys instanceof Array, "must not be Array");
    keys = [...keys];
    assert_array_equals(keys, [0, 1]);
  }, "classList.keys");

  test(() => {
    var values = document.querySelector("span").classList.values();
    assert_false(values instanceof Array, "must not be Array");
    values = [...values];
    assert_array_equals(values, ["a", "b"]);
  }, "classList.values");

  test(() => {
    var entries = document.querySelector("span").classList.entries();
    assert_false(entries instanceof Array, "must not be Array");
    entries = [...entries];
    var keys = [...document.querySelector("span").classList.keys()];
    var values = [...document.querySelector("span").classList.values()];
    assert_equals(entries.length, keys.length, "entries.length == keys.length");
    assert_equals(entries.length, values.length,
                  "entries.length == values.length");
    for (var i = 0; i < entries.length; ++i) {
      assert_array_equals(entries[i], [keys[i], values[i]],
                          "entries[" + i + "]");
    }
  }, "classList.entries");

  test(() => {
    var list = document.querySelector("span").classList;
    var values = [...list.values()];
    var keys = [...list.keys()];
    var entries = [...list.entries()];

    var cur = 0;
    var thisObj = {};
    list.forEach(function(value, key, listObj) {
      assert_equals(listObj, list, "Entry " + cur + " listObj");
      assert_equals(this, thisObj, "Entry " + cur + " this");
      assert_equals(value, values[cur], "Entry " + cur + " value");
      assert_equals(key, keys[cur], "Entry " + cur + " key");
      cur++;
    }, thisObj);
    assert_equals(cur, entries.length, "length");
  }, "classList.forEach");

  test(() => {
    var list = document.querySelector("span").classList;
    assert_equals(list[Symbol.iterator], Array.prototype[Symbol.iterator],
                  "[Symbol.iterator]");
    assert_equals(list.keys, Array.prototype.keys, ".keys");
    if (Array.prototype.values) {
      assert_equals(list.values, Array.prototype.values, ".values");
    }
    assert_equals(list.entries, Array.prototype.entries, ".entries");
    assert_equals(list.forEach, Array.prototype.forEach, ".forEach");
  }, "classList inheritance from Array.prototype");
</script>
