<!DOCTYPE HTML>
<html>
<head>
  <title>CSSValue comparison test</title>
  <script type="text/javascript" src="../resources/testharness.js"></script>
  <script type="text/javascript" src="../resources/testharnessreport.js"></script>
</head>
<body onload="run()">
<p>This test verifies that CSSValue objects comparison works correctly.</p>
<div id="test" contenteditable></div>

<script type="text/javascript">
setup({ "explicit_done": true });

function run() {
    var styleElement = document.createElement("style");
    styleElement.type = "text/css";
    var styleTextNode = document.createTextNode("");
    styleElement.appendChild(styleTextNode);
    document.getElementsByTagName("head")[0].appendChild(styleElement);

    var div = document.getElementById("test");
    div.focus();

    function runTest(propertyName, styleSheetPropertyValue, inlineStylePropertyValue, expectedResult) {
      styleTextNode.data = "div { " + propertyName + " : " + styleSheetPropertyValue + "; }";
      document.execCommand('insertHTML', false, "<div id=\"insertedDiv\" style=\"" + propertyName + " : " + inlineStylePropertyValue + "; \"></div>");
      var insertedDiv = document.getElementById('insertedDiv');
      var result = expectedResult;
      if (propertyName in insertedDiv.style)
          result = insertedDiv.style[propertyName] === "";
      insertedDiv.remove();
      return result;
    }

   var tests = [ {"width" : ["20%", "2em", "2rem", "20px", "2cm", "20mm", "4in", "20pt", "10pc", "6vw", "6vh", "4vmin", "-webkit-calc(-100px + 100%)"]}, // lengths, calc
                  {"-webkit-transform" : ["rotate(15deg)", "rotate(1.55rad)", "rotate(200grad)", "rotate(0.5turn)"]}, // angle
                  {"background-image" : ["url(dummy://test.png)", "url(dummy://green.png)"]}, // uri
                  {"font-weight" : ["bold", "inherit"]}, // ident
                  {"content" : ["counter(a)", "counters(a, '.')"]}, // counter
                  {"content" : ["attr(a)", "attr(p)"]}, // attr
                  {"clip" : ["rect(40px, 0, 45px, -5px)", "rect(10px, 5px, 15px, -10px)"]}, // rect
                  {"border-radius" : ["30px 75px 15px 15px", "164px / 82px", "40px"]}, // quads
                  {"stop-color" : ["rgb(255,0,0)", "#FF5566"]}, // hex, rgb color
                  {"-webkit-clip-path" : ["polygon(evenodd, 10px 75px, 180px 180px, 100px 10px, 10px 180px, 180px 75px, 10px 75px)", "polygon(nonzero, 20% 20%, 80% 20%, 80% 80%, 20% 80%)"]}, // shape value
                  {"-webkit-animation-duration" : ["10s", "100ms"]}, // seconds, milliseconds
                  {"color" : ["red", "blue"]}, // ident
                  {"border-image-source" : ["url(resources/greenbox.png)", "url(resources/redbox.png)"]}, // image
                  {"border-image-slice" : ["1 2 3 4", "2 3 4 5"]}, // border image slice
                  {"cursor" : ["url(resources/greenbox.png) 0 0, pointer", "url(resources/cursor.png) 1 1, wait"]}, // cursor
                  {"font" : ["italic bold 12px/30px arial", "italic bold 8px/16px helvetica"]}, // font
                  {"background-image" : ["-webkit-gradient(linear, left top, left bottom, from(#ccc), to(#000))", "-webkit-gradient(radial, 45 45, 0, 52 50, 0, from(#A7D30C), to(rgba(1,159,98,0)), color-stop(90%, #019F62))"]}, // gradients
                  {"background-image" : ["radial-gradient(circle, #ccc, #000)"]}, // gradients
                  {"background-image" : ["linear-gradient(#000, #234)", "linear-gradient(to top, #000, #234)"]}, // gradients
                  {"background-image" : ["-webkit-cross-fade(url(dummy://example.png), url(dummy://example.png), 50%)", "-webkit-cross-fade(url(dummy://background.png), url(dummy://foreground.png), 80%)"]}, // crossfade
                  {"-webkit-box-reflect" : ["below 10px", "below 0px -webkit-gradient(linear, left top, left bottom, from(transparent), to(rgba(10, 55, 234, 1)))"]}, // reflect
                  {"-webkit-box-shadow" : ["0 -20px 10px red, 0 20px 10px blue", "0 20px 10px blue", "5px 5px 5px rgba(0, 0, 0, 0.3)"]}, // shadow
                  {"-webkit-transition-timing-function" : ["cubic-bezier(0.25, 0.1, 0.25, 1)", "linear", "steps(3, end)"]}, // timing functions
                  {"-webkit-transform" : ["rotate(30deg)", "translate(50px,50px)", "scale(2,4)", "skew(30deg,20deg)", "matrix(0.4,0.5,-0.5,0.4,0,0)"]}, // transforms
                  {"-webkit-line-box-contain" : ["inline-box", "font", "glyphs", "replaced"]}, // line-box-contain
                  {"background-image" : ["-webkit-image-set(url(dummy://test.png) 1x, url(dummy://test.png) 2x)", "-webkit-image-set(url(dummy://small.png) 2x, url(dummy://big.png) 3x)"]}, // image set
                  {"background-image" : ["image-set(url(dummy://test.png) 1x, url(dummy://test.png) 2x)", "image-set(url(dummy://small.png) 2x, url(dummy://big.png) 3x)"]}, // image set
                  {"-webkit-filter" : ["grayscale(100%) sepia(100%)", "sepia(10%) grayscale(50%)"]} // filter
                ];

   for (var index in tests) {
        var testMap = tests[index];
        for (var key in testMap) {
            var testValues = testMap[key];

            // Tests for equality.
            for(var testIndex in testValues)
                test(function() {assert_true(runTest(key, testValues[testIndex], testValues[testIndex], true))}, "Two CSSValues \"" + testValues[testIndex] + "\" for property \"" + key + "\" are equal.");

            // Test that comparison of non-equal cssvalues return false.
            if (testValues.length > 1)
                test(function() {assert_false(runTest(key, testValues[0], testValues[1], false))}, "Two CSSValues \"" + testValues[0] + "\" and \"" + testValues[1] + "\" for property \"" + key + "\" are not equal.");
        }
    }

    done();
}

</script>
</body>
</html>
