<!DOCTYPE html>
<html>
<body>
<script src="../../resources/js-test-pre.js"></script>
<div id="container"></div>
<form></form>
<script>

description("This tests verifies that namedItem and named getter returns the first matched item for all but all, options, and form controls collections.");

function createElementWithId(name, id, attributes) {
    var element = document.createElement(name);
    element.id = id;
    for (var attr in attributes)
        element.setAttribute(attr, attributes[attr]);
    return element;
}

function insertElementWithId(name, id, attributes) {
    var element = createElementWithId(name, id, attributes);
    document.getElementById('container').appendChild(element);
    return element;
}

function removeTestElements() {
    document.getElementById('container').innerHTML = '';
    document.querySelector('form').innerHTML = '';
}

var elements;
debug('document.all');
shouldBeTrue("document.all instanceof HTMLAllCollection");
shouldBeTrue("document.all instanceof HTMLCollection");
shouldBe("initialLength = document.all.length; elements = [insertElementWithId('b', 'foo'), insertElementWithId('q', 'foo')];\n"
    + "     document.all.length", "initialLength + 2;");
shouldBe("document.all['foo'].length", "2");
shouldBe("document.all['foo'][0]", "elements[0]");
shouldBe("document.all['foo'][1]", "elements[1]");
shouldBe("elements[0].parentNode.removeChild(elements[0]); document.all['foo']", 'elements[1]');
debug("");

var form = document.querySelector('form');
debug("form.elements");
shouldBeTrue("form.elements instanceof HTMLFormControlsCollection");
shouldBeTrue("form.elements instanceof HTMLCollection");
shouldBe("form.elements.length", "0");
shouldBe("elements = [createElementWithId('input', 'foo'), createElementWithId('input', 'foo')];\n"
    + "     form.appendChild(elements[0]); form.elements.length", "1");
shouldBe("form.elements['foo']", "elements[0]");
shouldBe("form.appendChild(elements[1]); form.elements.length", "2");
shouldBe("form.elements['foo'].toString()", "'[object RadioNodeList]'");
shouldBe("form.elements['foo'].length", "2");
shouldBe("form.elements['foo'][0]", "elements[0]");
shouldBe("form.elements['foo'][1]", "elements[1]");
shouldBe("form.removeChild(elements[0]); form.elements['foo']", "elements[1]");
shouldBe("removeTestElements(); form.elements.length", "0");
debug("");

debug("select.options");
shouldBe("form.appendChild(createElementWithId('select', 'bar')); form.elements.length", "1");
shouldBeTrue("select = form.elements[0]; select.options instanceof HTMLOptionsCollection");
shouldBeTrue("select.options instanceof HTMLCollection");
shouldBe("select.options.length", "0");
shouldBe("elements = [createElementWithId('option', 'foo'), createElementWithId('option', 'foo')];\n"
    + "     select.appendChild(elements[0]); select.options.length", "1");
shouldBe("select.options['foo']", "elements[0]");
shouldBe("select.appendChild(elements[1]); select.options.length", "2");
shouldBe("select.options['foo']", "elements[0]");
shouldBe("select.removeChild(elements[0]); select.options['foo']", "elements[1]");
shouldBe("select.innerHTML = ''; select.options.length", "0");
shouldBe("removeTestElements(); form.elements.length", "0");
debug("");

function testFirstItemReturnsFirstMatch(collection, initialLength, elementNames, attributes) {
    debug(collection);
    shouldBe(collection + ".length", initialLength.toString());
    elements = [];
    for (var i = 0; i < elementNames.length; i++) {
        var attrs = attributes ? ", " + JSON.stringify(attributes) : '';
        shouldBe("elements[" + i + "] = insertElementWithId('" + elementNames[i] + "', 'foo'" + attrs + "); "
            + collection + ".length", (initialLength + i + 1).toString());
    }
    shouldBe(collection + "['foo']", "elements[0]");
    shouldBe("removeTestElements(); " + collection + ".length", initialLength.toString());
    debug("");
}

testFirstItemReturnsFirstMatch('document.images', 0, ['img', 'img']);
testFirstItemReturnsFirstMatch('document.applets', 0, ['applet', 'applet']);
testFirstItemReturnsFirstMatch('document.embeds', 0, ['embed', 'embed']);
testFirstItemReturnsFirstMatch('document.forms', 1, ['form', 'form']);
testFirstItemReturnsFirstMatch('document.links', 0, ['a', 'a', 'area'], {'href': 'some url'});
testFirstItemReturnsFirstMatch('document.anchors', 0, ['a', 'a'], {'name': 'some name'});
testFirstItemReturnsFirstMatch('document.scripts', 2, ['script', 'script']);

var successfullyParsed = true;

</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
