<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.layoutTestController)
        layoutTestController.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>