<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="resources/comparisons.js"></script>

<script>
var EPSILON = 10e-6; // Float epsilon

var testParams = [
{
  input: new DOMMatrixReadOnly([0, 0, 0, 0, 0, 0]),
  is2D: true,
  cssText: "matrix(0, 0, 0, 0, 0, 0)"
},
{
  input: new DOMMatrixReadOnly([2, 4, 6, 8, 10, 12]),
  is2D: true,
  cssText: "matrix(2, 4, 6, 8, 10, 12)"
},
{
  input: new DOMMatrixReadOnly([-2, -4, -6, -8, -10, -12]),
  is2D: true,
  cssText: "matrix(-2, -4, -6, -8, -10, -12)"
},
{
  input: new DOMMatrixReadOnly([1.1, -2.2, 3.3, -4.4, 5.5, 0.6]),
  is2D: true,
  cssText: "matrix(1.1, -2.2, 3.3, -4.4, 5.5, 0.6)"
},
{
  input: new DOMMatrixReadOnly(
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
  is2D: false,
  cssText: "matrix3d(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)"
},
{
  input: new DOMMatrixReadOnly(
      [11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44]),
  is2D: false,
  cssText: "matrix3d(11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44)"
},
{
  input: new DOMMatrixReadOnly(
      [1.1, 1.2, -13, -1.4, 2, 0, -2, 4, 3.1, 3, 3, 3.4, -4.1, 42, 43, 4.4]),
  is2D: false,
  cssText: "matrix3d(1.1, 1.2, -13, -1.4, 2, 0, -2, 4, 3.1, 3, 3, 3.4, -4.1, 42, 43, 4.4)"
},
// Set is2D to true with options, while also passing a 3D matrix. Should be
// truncated for cssText.
{
  input: new DOMMatrixReadOnly(
      [11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44]),
  is2D: true,
  cssText: "matrix(11, 12, 21, 22, 41, 42)"
}
];

for (let params of testParams) {
  let matrixComponent = new CSSMatrixComponent(params.input, {is2D: params.is2D});

  test(() => {
    assert_matrix_approx_equals(matrixComponent.matrix, params.input, EPSILON);
  }, "matrix getter returns same matrix as the input for " + params.cssText);

  test(() => {
    assert_equals(matrixComponent.is2D, params.is2D);
  }, "is2D value is correct for " + params.cssText);

  test(() => {
    assert_equals(matrixComponent.toString(), params.cssText);
  }, "toString is correct for " + params.cssText);
}

test(() => {
  assert_throws(new TypeError(), () => { new CSSMatrixComponent(); });
  assert_throws(new TypeError(), () => { new CSSMatrixComponent(0); });
  assert_throws(new TypeError(), () => { new CSSMatrixComponent("string") });
  assert_throws(new TypeError(), () => { new CSSMatrixComponent(null); });
  assert_throws(new TypeError(), () => { new CSSMatrixComponent(undefined); });
}, "invalid number of arguments to the constructor throws");

test(() => {
  let matrix3d = new DOMMatrixReadOnly(
        [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
  let matrix2d = new DOMMatrixReadOnly([1, 2, 5, 6, 13, 14]);
  let matrixComponent = new CSSMatrixComponent(matrix3d);
  matrixComponent.is2D = true;
  assert_matrix_approx_equals(matrixComponent.matrix, matrix3d, EPSILON);

  let transformValue = new CSSTransformValue([matrixComponent]);
  assert_true(transformValue.is2D);
  assert_matrix_approx_equals(transformValue.toMatrix(), matrix2d, EPSILON);
}, "Matrix is converted to 2D inside CSSTransformValue when is2D is true.");

</script>
