<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description('Test styleWithCSS command');

function testStyleWithCSS(styleArg, expectedState)
{
    document.execCommand('styleWithCSS', false, styleArg); 
    if (document.queryCommandState('styleWithCSS') === expectedState)
        testPassed('styleWithCSS changed the state successfully');
    else
        testFailed('styleWithCSS failed with the argument ' + styleArg);
}

testStyleWithCSS(true, true);
testStyleWithCSS('false', false);
testStyleWithCSS('FALSE', false);
testStyleWithCSS('random string', true);
testStyleWithCSS(null, true);

document.execCommand('styleWithCSS', false, true);
if (document.queryCommandState('styleWithCSS') === true)
    testPassed("queryCommandState('styleWithCSS') returns true");
else
    testFailed("queryCommandState('styleWithCSS') should return boolean true");

if (document.queryCommandValue('styleWithCSS') === 'true')
    testPassed("queryCommandValue('styleWithCSS') returns 'true'");
else
    testFailed("queryCommandValue('styleWithCSS') should return 'true'");

document.execCommand('styleWithCSS', false, false);
if (document.queryCommandState('styleWithCSS') === false)
    testPassed("queryCommandState('styleWithCSS') returns false");
else
    testFailed("queryCommandState('styleWithCSS') should return boolean false");

if (document.queryCommandValue('styleWithCSS') === 'false')
    testPassed("queryCommandValue('styleWithCSS') returns 'false'");
else
    testFailed("queryCommandValue('styleWithCSS') should return 'false'");

</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
