<!DOCTYPE html>
<html>
<head>
<script src='../../resources/testharness.js'></script>
<script src='../../resources/testharnessreport.js'></script>
</head>
<style>
  /* regression test for failing to unzoom transform coefficients */
  body { zoom: 1.5; }
</style>
<body>
<div id='testElement'></div>

<svg>
  <g id='testSvgGroup'>
  </g>
</svg>

<script>

var testElement = document.getElementById('testElement');
var testSvgGroup = document.getElementById('testSvgGroup');
var computedStyleMap = testElement.computedStyleMap();

test(function() {
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'none');
}, 'transform is none by default');

test(function() {
  testElement.style.transform = 'translate(100px, 30%)';
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'translate(100px, 30%)');
}, 'transform preserves a translate value');

test(function() {
  testElement.style.transform = 'translate3d(100px, 30%, 40px)';
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'translate3d(100px, 30%, 40px)');
}, 'transform preserves a translate3d value');

test(function() {
  testElement.style.transform = 'rotate(90deg)';
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'rotate(90deg)');
}, 'transform preserves a rotate value');

test(function() {
  testElement.style.transform = 'rotate3d(0, 0, 1, 90deg)';
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'rotate3d(0, 0, 1, 90deg)');
}, 'transform preserves a rotate3d value');

test(function() {
  testElement.style.transform = 'scale(1, 2)';
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'scale(1, 2)');
}, 'transform preserves a scale value');

test(function() {
  testElement.style.transform = 'scale3d(1, 2, 3)';
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'scale3d(1, 2, 3)');
}, 'transform preserves a scale3d value');

test(function() {
  testElement.style.transform = 'perspective(100px)';
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'perspective(100px)');
}, 'transform preserves a perspective value');

test(function() {
  testElement.style.transform = 'skew(10deg, 10deg)';
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'skew(10deg, 10deg)');
}, 'transform preserves a skew value');

test(function() {
  testElement.style.transform = 'matrix(1, 0, 0, 2, 3, 4)';
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'matrix(1, 0, 0, 2, 3, 4)');
}, 'transform preserves a matrix value');

test(function() {
  testElement.style.transform = 'matrix3d(1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 4, 5, 6, 1)';
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'matrix3d(1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 4, 5, 6, 1)');
}, 'transform preserves a matrix3d value');

test(function() {
  testElement.style.transform = 'matrix3d(1, 0, 0, 0.01, 0, 2, 0, 0.02, 0, 0, 3, 0.03, 4, 5, 6, 1)';
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'matrix3d(1, 0, 0, 0.01, 0, 2, 0, 0.02, 0, 0, 3, 0.03, 4, 5, 6, 1)');
}, 'transform preserves a matrix3d value with perspective');

test(function() {
  testElement.style.transform = 'matrix3d(2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 4, 5, 0, 1)';
  var result = computedStyleMap.get('transform');
  assert_equals(result.toString(), 'matrix3d(2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 4, 5, 0, 1)',
      'Computes as specified (matrix3d)');
  assert_equals(getComputedStyle(testElement).transform, 'matrix(2, 0, 0, 3, 4, 5)', 'Resolves as 2D');
}, 'transform preserves a matrix3d value which reperesents a 2d transform');

test(function() {
  // Chosen for floating-point stability as 90deg was returning episilon
  // for coefficients which should have been zero.
  testSvgGroup.setAttribute('transform', 'rotate(45, 10, 0)');
  var result = testSvgGroup.computedStyleMap().get('transform');

  // TODO(https://github.com/w3c/csswg-drafts/issues/5011):
  // Update this once there is consensus.
  assert_equals(result.toString(), "matrix(0.707107, 0.707107, -0.707107, 0.707107, 2.92893, -7.07107)");
}, 'transform serializes a three-valued rotate from an svg presentation attribute value as a matrix.');

test(function() {
  testElement.style.width = '100px';
  var anim = testElement.animate({transform: ['translate(0px, 25px) rotate(90deg)', 'translate(0px, 25px) translateX(100%)']}, 1000);
  anim.pause();
  anim.currentTime = 500;
  var result = computedStyleMap.get('transform');


  assert_equals(result.toString(), 'translate(0px, 25px) matrix(0.707107, 0.707107, -0.707107, 0.707107, 0, 0)',
      'Computes as the absolute part of a deferred interpolation.');
  assert_equals(getComputedStyle(testElement).transform, 'matrix(0.707107, 0.707107, -0.707107, 0.707107, 50, 25)',
      'Resolves as the full transform, including relative parts.');
}, 'transform preserves as much of a deferred interpolation as currently possible');

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