Test DOMJIT nodeType accessor works.

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


PASS successfullyParsed is true

TEST COMPLETE
PASS (
            function testElement(element, result)
            {
                for (var i = 0; i < 1e4; ++i) {
                    if (element.ownerDocument !== result)
                        return false;
                }
                return true;
            }
        )(target, result) is true
PASS (
            function testAttr(element, result)
            {
                for (var i = 0; i < 1e4; ++i) {
                    if (element.ownerDocument !== result)
                        return false;
                }
                return true;
            }
        )(target, result) is true
PASS (
            function testText(element, result)
            {
                for (var i = 0; i < 1e4; ++i) {
                    if (element.ownerDocument !== result)
                        return false;
                }
                return true;
            }
        )(target, result) is true
PASS (
            function testCDATA(element, result)
            {
                for (var i = 0; i < 1e4; ++i) {
                    if (element.ownerDocument !== result)
                        return false;
                }
                return true;
            }
        )(target, result) is true
PASS (
            function testProcessingInstruction(element, result)
            {
                for (var i = 0; i < 1e4; ++i) {
                    if (element.ownerDocument !== result)
                        return false;
                }
                return true;
            }
        )(target, result) is true
PASS (
            function testComment(element, result)
            {
                for (var i = 0; i < 1e4; ++i) {
                    if (element.ownerDocument !== result)
                        return false;
                }
                return true;
            }
        )(target, result) is true
PASS (
            function testDocument(element, result)
            {
                for (var i = 0; i < 1e4; ++i) {
                    if (element.ownerDocument !== result)
                        return false;
                }
                return true;
            }
        )(target, result) is true
PASS (
            function testXMLDocument(element, result)
            {
                for (var i = 0; i < 1e4; ++i) {
                    if (element.ownerDocument !== result)
                        return false;
                }
                return true;
            }
        )(target, result) is true
PASS (
            function testDocumentType(element, result)
            {
                for (var i = 0; i < 1e4; ++i) {
                    if (element.ownerDocument !== result)
                        return false;
                }
                return true;
            }
        )(target, result) is true
PASS (
            function testDocumentFragment(element, result)
            {
                for (var i = 0; i < 1e4; ++i) {
                    if (element.ownerDocument !== result)
                        return false;
                }
                return true;
            }
        )(target, result) is true

