<!doctype html>
<title>Range.selectNode() and .selectNodeContents() tests</title>
<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
<meta name=timeout content=long>
<div id=log></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=../common.js></script>
<script>
"use strict";

function testSelectNode(range, node) {
    try {
        range.collapsed;
    } catch (e) {
        // Range is detached
        assert_throws_dom("INVALID_STATE_ERR", function () {
            range.selectNode(node);
        }, "selectNode() on a detached node must throw INVALID_STATE_ERR");
        assert_throws_dom("INVALID_STATE_ERR", function () {
            range.selectNodeContents(node);
        }, "selectNodeContents() on a detached node must throw INVALID_STATE_ERR");
        return;
    }

    if (!node.parentNode) {
        assert_throws_dom("INVALID_NODE_TYPE_ERR", function() {
            range.selectNode(node);
        }, "selectNode() on a node with no parent must throw INVALID_NODE_TYPE_ERR");
    } else {
        var index = 0;
        while (node.parentNode.childNodes[index] != node) {
            index++;
        }

        range.selectNode(node);
        assert_equals(range.startContainer, node.parentNode,
            "After selectNode(), startContainer must equal parent node");
        assert_equals(range.endContainer, node.parentNode,
            "After selectNode(), endContainer must equal parent node");
        assert_equals(range.startOffset, index,
            "After selectNode(), startOffset must be index of node in parent (" + index + ")");
        assert_equals(range.endOffset, index + 1,
            "After selectNode(), endOffset must be one plus index of node in parent (" + (index + 1) + ")");
    }

    if (node.nodeType == Node.DOCUMENT_TYPE_NODE) {
        assert_throws_dom("INVALID_NODE_TYPE_ERR", function () {
            range.selectNodeContents(node);
        }, "selectNodeContents() on a doctype must throw INVALID_NODE_TYPE_ERR");
    } else {
        range.selectNodeContents(node);
        assert_equals(range.startContainer, node,
            "After selectNodeContents(), startContainer must equal node");
        assert_equals(range.endContainer, node,
            "After selectNodeContents(), endContainer must equal node");
        assert_equals(range.startOffset, 0,
            "After selectNodeContents(), startOffset must equal 0");
        var len = nodeLength(node);
        assert_equals(range.endOffset, len,
            "After selectNodeContents(), endOffset must equal node length (" + len + ")");
    }
}

var range = document.createRange();
var foreignRange = foreignDoc.createRange();
var xmlRange = xmlDoc.createRange();
var detachedRange = document.createRange();
detachedRange.detach();
var tests = [];
function testTree(root, marker) {
    if (root.nodeType == Node.ELEMENT_NODE && root.id == "log") {
        // This is being modified during the tests, so let's not test it.
        return;
    }
    tests.push([marker + ": " + root.nodeName.toLowerCase() + " node, current doc's range, type " + root.nodeType, range, root]);
    tests.push([marker + ": " + root.nodeName.toLowerCase() + " node, foreign doc's range, type " + root.nodeType, foreignRange, root]);
    tests.push([marker + ": " + root.nodeName.toLowerCase() + " node, XML doc's range, type " + root.nodeType, xmlRange, root]);
    tests.push([marker + ": " + root.nodeName.toLowerCase() + " node, detached range, type " + root.nodeType, detachedRange, root]);
    for (var i = 0; i < root.childNodes.length; i++) {
        testTree(root.childNodes[i], marker + "[" + i + "]");
    }
}
testTree(document, "current doc");
testTree(foreignDoc, "foreign doc");
testTree(detachedDiv, "detached div in current doc");

var otherTests = ["xmlDoc", "xmlElement", "detachedTextNode",
"foreignTextNode", "xmlTextNode", "processingInstruction", "comment",
"foreignComment", "xmlComment", "docfrag", "foreignDocfrag", "xmlDocfrag"];

for (var i = 0; i < otherTests.length; i++) {
    testTree(window[otherTests[i]], otherTests[i]);
}

generate_tests(testSelectNode, tests);

testDiv.style.display = "none";
</script>
