<html>
<head>
<link rel="stylesheet" href="resources/stylesheet.css">
<script>
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);
}

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

var cssRule, cssValue, nodeFilter, event;

function test() {
    if (window.testRunner)
        testRunner.dumpAsText();
        
    cssRule = document.styleSheets[0].cssRules[0];
    shouldBe("cssRule.UNKNOWN_RULE", 0);
    shouldBe("cssRule.STYLE_RULE", 1);
    shouldBe("cssRule.CHARSET_RULE", 2);
    shouldBe("cssRule.IMPORT_RULE", 3);
    shouldBe("cssRule.MEDIA_RULE", 4);
    shouldBe("cssRule.FONT_FACE_RULE", 5);
    shouldBe("cssRule.PAGE_RULE", 6);

    shouldBe("window.CSSRule.UNKNOWN_RULE", 0);
    shouldBe("window.CSSRule.STYLE_RULE", 1);
    shouldBe("window.CSSRule.CHARSET_RULE", 2);
    shouldBe("window.CSSRule.IMPORT_RULE", 3);
    shouldBe("window.CSSRule.MEDIA_RULE", 4);
    shouldBe("window.CSSRule.FONT_FACE_RULE", 5);
    shouldBe("window.CSSRule.PAGE_RULE", 6);

    cssValue = cssRule.style.getPropertyCSSValue("color");
    shouldBe("cssValue.CSS_INHERIT", 0);
    shouldBe("cssValue.CSS_PRIMITIVE_VALUE", 1);
    shouldBe("cssValue.CSS_VALUE_LIST", 2);
    shouldBe("cssValue.CSS_CUSTOM", 3);
    
    shouldBe("window.CSSValue.CSS_INHERIT", 0);
    shouldBe("window.CSSValue.CSS_PRIMITIVE_VALUE", 1);
    shouldBe("window.CSSValue.CSS_VALUE_LIST", 2);
    shouldBe("window.CSSValue.CSS_CUSTOM", 3);

    var nodeIterator;
    try {
        nodeIterator = document.createNodeIterator(document, 
                                                   NodeFilter.SHOW_ELEMENT, 
                                                   function () { return NodeFilter.FILTER_ACCEPT; }, 
                                                   false);
    } catch(e) {
        nodeIterator = new Object();
    }
    
    nodeFilter = nodeIterator.filter;
    shouldBe("nodeFilter.FILTER_ACCEPT", 1);
    shouldBe("nodeFilter.FILTER_REJECT", 2);
    shouldBe("nodeFilter.FILTER_SKIP", 3);
    shouldBe("nodeFilter.SHOW_ALL", -1);
    shouldBe("nodeFilter.SHOW_ELEMENT", 0x00000001);
    shouldBe("nodeFilter.SHOW_ATTRIBUTE", 0x00000002);
    shouldBe("nodeFilter.SHOW_TEXT", 0x00000004);
    shouldBe("nodeFilter.SHOW_CDATA_SECTION", 0x00000008);
    shouldBe("nodeFilter.SHOW_ENTITY_REFERENCE", 0x00000010);
    shouldBe("nodeFilter.SHOW_ENTITY", 0x00000020);
    shouldBe("nodeFilter.SHOW_PROCESSING_INSTRUCTION", 0x00000040);
    shouldBe("nodeFilter.SHOW_COMMENT", 0x00000080);
    shouldBe("nodeFilter.SHOW_DOCUMENT", 0x00000100);
    shouldBe("nodeFilter.SHOW_DOCUMENT_TYPE", 0x00000200);
    shouldBe("nodeFilter.SHOW_DOCUMENT_FRAGMENT", 0x00000400);
    shouldBe("nodeFilter.SHOW_NOTATION", 0x00000800);

    shouldBe("window.NodeFilter.FILTER_ACCEPT", 1);
    shouldBe("window.NodeFilter.FILTER_REJECT", 2);
    shouldBe("window.NodeFilter.FILTER_SKIP", 3);
    shouldBe("window.NodeFilter.SHOW_ALL", -1);
    shouldBe("window.NodeFilter.SHOW_ELEMENT", 0x00000001);
    shouldBe("window.NodeFilter.SHOW_ATTRIBUTE", 0x00000002);
    shouldBe("window.NodeFilter.SHOW_TEXT", 0x00000004);
    shouldBe("window.NodeFilter.SHOW_CDATA_SECTION", 0x00000008);
    shouldBe("window.NodeFilter.SHOW_ENTITY_REFERENCE", 0x00000010);
    shouldBe("window.NodeFilter.SHOW_ENTITY", 0x00000020);
    shouldBe("window.NodeFilter.SHOW_PROCESSING_INSTRUCTION", 0x00000040);
    shouldBe("window.NodeFilter.SHOW_COMMENT", 0x00000080);
    shouldBe("window.NodeFilter.SHOW_DOCUMENT", 0x00000100);
    shouldBe("window.NodeFilter.SHOW_DOCUMENT_TYPE", 0x00000200);
    shouldBe("window.NodeFilter.SHOW_DOCUMENT_FRAGMENT", 0x00000400);
    shouldBe("window.NodeFilter.SHOW_NOTATION", 0x00000800);

    event = document.createEvent("Event");
    shouldBe("event.NONE", 0);
    shouldBe("event.CAPTURING_PHASE", 1);
    shouldBe("event.AT_TARGET", 2);
    shouldBe("event.BUBBLING_PHASE", 3);
    shouldBe("event.MOUSEDOWN", 1);    
    shouldBe("event.MOUSEUP", 2);    
    shouldBe("event.MOUSEOVER", 4);    
    shouldBe("event.MOUSEOUT", 8);    
    shouldBe("event.MOUSEMOVE", 16);   
    shouldBe("event.MOUSEDRAG", 32);   
    shouldBe("event.CLICK", 64);   
    shouldBe("event.DBLCLICK", 128);  
    shouldBe("event.KEYDOWN", 256);  
    shouldBe("event.KEYUP", 512);  
    shouldBe("event.KEYPRESS", 1024); 
    shouldBe("event.DRAGDROP", 2048); 
    shouldBe("event.FOCUS", 4096); 
    shouldBe("event.BLUR", 8192); 
    shouldBe("event.SELECT", 16384);
    shouldBe("event.CHANGE", 32768);

    shouldBe("window.Event.NONE", 0);
    shouldBe("window.Event.CAPTURING_PHASE", 1);
    shouldBe("window.Event.AT_TARGET", 2);
    shouldBe("window.Event.BUBBLING_PHASE", 3);
    shouldBe("window.Event.MOUSEDOWN", 1);    
    shouldBe("window.Event.MOUSEUP", 2);    
    shouldBe("window.Event.MOUSEOVER", 4);    
    shouldBe("window.Event.MOUSEOUT", 8);    
    shouldBe("window.Event.MOUSEMOVE", 16);   
    shouldBe("window.Event.MOUSEDRAG", 32);   
    shouldBe("window.Event.CLICK", 64);   
    shouldBe("window.Event.DBLCLICK", 128);  
    shouldBe("window.Event.KEYDOWN", 256);  
    shouldBe("window.Event.KEYUP", 512);  
    shouldBe("window.Event.KEYPRESS", 1024); 
    shouldBe("window.Event.DRAGDROP", 2048); 
    shouldBe("window.Event.FOCUS", 4096); 
    shouldBe("window.Event.BLUR", 8192); 
    shouldBe("window.Event.SELECT", 16384);
    shouldBe("window.Event.CHANGE", 32768);
}
</script>
</head>
<body onload="test();">
<p>This page tests CSSRule, CSSValue, NodeFilter, and Event. It tests:</p>
<ol>
    <li>Whether their global constructors have the correct constant values</li>
    <li>Whether their objects have the correct constant values</li>
</ol>
<hr>
<div id='console'></div>
</body>
</html>
