<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script>window.enablePixelTesting = true;</script>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>

<svg id="svg1" xmlns="http://www.w3.org/2000/svg" width="200" height="200">
  <circle id="circle" cx="40" cy="40" r="40" fill="green" style="-webkit-transform: scale(2, 2) translate(10px, 10px)"/>
</svg>

<svg id="svg2" xmlns="http://www.w3.org/2000/svg" width="200" height="200">
    <rect id="rect" x="40" y="40" height="100" width="100" fill="green" transform="translate(1000, 1000) rotate(90)" style="-webkit-transform: translate(100px) rotate(45deg)"/>
</svg>

<p id="description"></p>
<p>Also, to pass the test, the rectangle should be rotated with 45deg</p>
<div id="console"></div>
<script type="text/javascript">
<![CDATA[
  description("This is a test of precedency between CSS and SVG transform");


  function dumpRect(r) {
    return "[" + r.x
          + " " + r.y
          + " " + r.width 
          + " " + r.height
          + "]";
  }

  function dumpMatrix(matrix) {
    return "[" + matrix.a.toFixed(1)
          + " " + matrix.b.toFixed(1)
          + " " + matrix.c.toFixed(1)
          + " " + matrix.d.toFixed(1)
          + " " + matrix.e.toFixed(1)
          + " " + matrix.f.toFixed(1)
          + "]";
  }

  function dumpTransform(transform) {
    var transformTypes = {
      "0": "SVG_TRANSFORM_UNKNOWN",
      "1": "SVG_TRANSFORM_MATRIX",
      "2": "SVG_TRANSFORM_TRANSLATE",
      "3": "SVG_TRANSFORM_SCALE",
      "4": "SVG_TRANSFORM_ROTATE",
      "5": "SVG_TRANSFORM_SKEWX",
      "6": "SVG_TRANSFORM_SKEWY"
    };

    return "type=" + transformTypes[transform.type] + " matrix=" + dumpMatrix(transform.matrix);
  }

  var svg1 = document.getElementById("svg1");
  var circle = document.getElementById("circle");

  var svg2 = document.getElementById("svg2");
  var rect = document.getElementById("rect");

  debug("");
  debug("Test SVGTransformList interface");
  shouldBe("circle.transform.baseVal.numberOfItems", "0");
  shouldBeNull("circle.getAttribute('transform')");
  shouldBe("rect.transform.baseVal.numberOfItems", "2");
  shouldBeEqualToString("rect.getAttribute('transform')", "translate(1000, 1000) rotate(90)");
  shouldBeEqualToString("dumpTransform(rect.transform.baseVal.getItem(0))", "type=SVG_TRANSFORM_TRANSLATE matrix=[1.0 0.0 0.0 1.0 1000.0 1000.0]");
  shouldBeEqualToString("dumpTransform(rect.transform.baseVal.getItem(1))", "type=SVG_TRANSFORM_ROTATE matrix=[0.0 1.0 -1.0 0.0 0.0 0.0]");

  debug("");
  debug("Test SVGLocatable interface");
  shouldBeEqualToString("dumpMatrix(circle.getCTM())", "[2.0 0.0 0.0 2.0 20.0 20.0]");
  shouldBeEqualToString("dumpMatrix(circle.getScreenCTM())", "[2.0 0.0 0.0 2.0 28.0 28.0]");
  shouldBeEqualToString("dumpRect(circle.getBBox())", "[0 0 80 80]");
  shouldBeEqualToString("dumpMatrix(circle.getTransformToElement(circle))", "[1.0 0.0 0.0 1.0 0.0 0.0]");

  shouldBeEqualToString("dumpMatrix(rect.getCTM())", "[0.7 0.7 -0.7 0.7 100.0 0.0]");
  shouldBeEqualToString("dumpMatrix(rect.getScreenCTM())", "[0.7 0.7 -0.7 0.7 312.0 8.0]");
  shouldBeEqualToString("dumpRect(rect.getBBox())", "[40 40 100 100]");
  shouldBeEqualToString("dumpMatrix(rect.getTransformToElement(rect))", "[1.0 0.0 0.0 1.0 0.0 0.0]");

  debug("");
  debug("Test CSSMatrix");
  shouldBeEqualToString("circle.style.webkitTransform", "scale(2, 2) translate(10px, 10px)");
  shouldBeEqualToString("dumpMatrix(new WebKitCSSMatrix(circle.style.webkitTransform))", "[2.0 0.0 0.0 2.0 20.0 20.0]");
  shouldBeEqualToString("rect.style.webkitTransform", "translate(100px) rotate(45deg)");
  shouldBeEqualToString("dumpMatrix(new WebKitCSSMatrix(rect.style.webkitTransform))", "[0.7 0.7 -0.7 0.7 100.0 0.0]");

  debug("");
  shouldBe("dumpMatrix(new WebKitCSSMatrix(circle.style.webkitTransform))", "dumpMatrix(circle.getCTM())");
  shouldBe("dumpMatrix(new WebKitCSSMatrix(rect.style.webkitTransform))", "dumpMatrix(rect.getCTM())");

  debug("");
  successfullyParsed = true;
]]>
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
