<html>
<head>
<script>
function debug(str) {
    var c = document.getElementById('console')
    c.appendChild(document.createTextNode(str + '\n'));
}

function print(message, color) 
{
    var paragraph = document.createElement("div");
    paragraph.appendChild(document.createTextNode(message));
    paragraph.style.fontFamily = "monospace";
    if (color)
        paragraph.style.color = color;
    document.getElementById("console").appendChild(paragraph);
}

var element, range, nodeFilter, cssRule, cssPrimitiveValue, cssStyleDeclaration, event;
var originalNodeConstructor;

function shouldBe(a, b)
{
    var evalA;
    try {
        evalA = eval(a);
    } catch(e) {
        evalA = e;
    }
    if (evalA == b)
        print("PASS: " + a + " should be " + b + " and is.", "green");
    else
        print("FAIL: " + a + " should be " + b + " but instead is " + evalA, "red");
}

function runTests() {
    if (window.testRunner)
        testRunner.dumpAsText();
        
    var src = '<root xmlns:foo="http://www.example.com" attr="test2" foo:attr="test" />';
    var doc = (new DOMParser()).parseFromString(src, 'text/xml')
    docElem = doc.documentElement;

    // Test getAttribute
    shouldBe("docElem.getAttribute('foo:attr')", "test");
    shouldBe("docElem.getAttribute('attr')", "test2");
    shouldBe("docElem.getAttribute('bar:attr')", null)
    
    // Test hasAttribute
    shouldBe("docElem.hasAttribute('foo:attr')", true);
    shouldBe("docElem.hasAttribute('attr')", true);
    shouldBe("docElem.hasAttribute('bar:attr')", false);
    
    // Test getAttributeNode
    shouldBe("docElem.getAttributeNode('foo:attr').value", "test");
    shouldBe("docElem.getAttributeNode('bar:attr')", null);
    
    // Test setAttribute
    shouldBe("docElem.attributes.length", 3);
    docElem.setAttribute("foo:attr", "new");
    shouldBe("docElem.attributes.length", 3);
    shouldBe("docElem.getAttribute('foo:attr')", "new");

    docElem.setAttribute("bar:attr", "new2");
    shouldBe("docElem.attributes.length", 4);
    shouldBe("docElem.getAttribute('bar:attr')", "new2");
    shouldBe("docElem.getAttributeNode('bar:attr').prefix", null);
    shouldBe("docElem.getAttributeNode('bar:attr').localName", "bar:attr");
    
    // Test removeAttribute
    docElem.removeAttribute('foo:attr');
    shouldBe("docElem.getAttribute('foo:attr')", null);
    shouldBe("docElem.attributes.length", 3);
    docElem.removeAttribute('bar:attr');
    shouldBe("docElem.getAttribute('bar:attr')", null);
    shouldBe("docElem.attributes.length", 2);
    docElem.removeAttribute('attr');
    shouldBe("docElem.getAttribute('attr')", null);
    shouldBe("docElem.attributes.length", 1);
    
    // Re-parse the document so we can test NamedNodeMap
    doc = (new DOMParser()).parseFromString(src, 'text/xml');
    attributes = doc.documentElement.attributes;
    
    // Test getNamedItem
    shouldBe("attributes.getNamedItem('foo:attr').value", "test");
    shouldBe("attributes.getNamedItem('attr').value", "test2");
    shouldBe("attributes.getNamedItem('bar:attr')", null);
    
    // Test removeNamedItem
    shouldBe("attributes.length", 3);
    attributes.removeNamedItem('foo:attr');
    shouldBe("attributes.getNamedItem('foo:attr')", null);
    shouldBe("attributes.length", 2);
    attributes.removeNamedItem('attr');
    shouldBe("attributes.getNamedItem('attr')", null);
    shouldBe("attributes.length", 1);

}

</script>
</head>
<body onload="runTests();">
<pre id="console">
</pre>
</body>
</html>