<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<script>
description("The test to ensure that calling setTransform with a DOMMatrix works as expected.");

function shouldHaveMatrixEquality(matrixName, expected) {
    shouldEvaluateTo(matrixName + ".a", expected[0]);
    shouldEvaluateTo(matrixName + ".b", expected[1]);
    shouldEvaluateTo(matrixName + ".c", expected[2]);
    shouldEvaluateTo(matrixName + ".d", expected[3]);
    shouldEvaluateTo(matrixName + ".e", expected[4]);
    shouldEvaluateTo(matrixName + ".f", expected[5]);
}

var ctx = document.createElement("canvas").getContext("2d");
var originalTransform = ctx.getTransform();
shouldHaveMatrixEquality("originalTransform", [1, 0, 0, 1, 0, 0]);

ctx.resetTransform();
ctx.setTransform(new DOMMatrix([1, 2, 3, 4, 5, 6]));
var newTransformFromDOMMatrix = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromDOMMatrix", [1, 2, 3, 4, 5, 6]);

ctx.setTransform(1, 2, 3, 4, 5, 6);
ctx.setTransform(new DOMMatrix);
var newTransformFromEmptyDOMMatrix = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromEmptyDOMMatrix", [1, 0, 0, 1, 0, 0]);

ctx.resetTransform();
ctx.setTransform(new DOMMatrix([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]));
var newTransformFrom3dDOMMatrix = ctx.getTransform();
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m11", 1);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m12", 2);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m13", 0);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m14", 0);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m21", 5);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m22", 6);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m23", 0);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m24", 0);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m31", 0);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m32", 0);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m33", 1);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m34", 0);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m41", 13);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m42", 14);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m43", 0);
shouldEvaluateTo("newTransformFrom3dDOMMatrix.m44", 1);

ctx.setTransform(1, 2, 3, 4, 5, 6);
ctx.setTransform({});
var newTransformFromEmptyObject = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromEmptyObject", [1, 0, 0, 1, 0, 0]);

ctx.resetTransform();
ctx.setTransform({a: 1, b: 2, c: 3, d: 4, e: 5, f: 6});
var newTransformFromObject = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromObject", [1, 2, 3, 4, 5, 6]);

ctx.setTransform(1, 2, 3, 4, 5, 6);
shouldThrowErrorName(function() {
    ctx.setTransform({a: 1, m11: 11, b: 2, m12: 12, c: 3, m21: 21, d: 4, m22: 22, e: 5, m41: 41, f: 6, m42: 42});
}, "TypeError");
var newTransformFromInvalidMatrixObject = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromInvalidMatrixObject", [1, 2, 3, 4, 5, 6]);

ctx.setTransform(1, 2, 3, 4, 5, 6);
shouldThrowErrorName(function() {
    ctx.setTransform(1);
}, "TypeError");
var newTransformFromNonObjectNumber = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromNonObjectNumber", [1, 2, 3, 4, 5, 6]);

ctx.setTransform(1, 2, 3, 4, 5, 6);
shouldThrowErrorName(function() {
    ctx.setTransform("test");
}, "TypeError");
var newTransformFromNonObjectString = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromNonObjectString", [1, 2, 3, 4, 5, 6]);

ctx.setTransform(1, 2, 3, 4, 5, 6);
shouldThrowErrorName(function() {
    ctx.setTransform(true);
}, "TypeError");
var newTransformFromNonObjectBoolean = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromNonObjectBoolean", [1, 2, 3, 4, 5, 6]);

ctx.setTransform(1, 2, 3, 4, 5, 6);
ctx.setTransform({a: {}});
var newTransformFromInvalidValueObject = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromInvalidValueObject", [1, 2, 3, 4, 5, 6]);

ctx.setTransform(1, 2, 3, 4, 5, 6);
ctx.setTransform({test: 1});
var newTransformFromInvalidKeyObject = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromInvalidKeyObject", [1, 0, 0, 1, 0, 0]);

ctx.setTransform(1, 2, 3, 4, 5, 6);
ctx.setTransform(null);
var newTransformFromNull = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromNull", [1, 0, 0, 1, 0, 0]);

ctx.setTransform(1, 2, 3, 4, 5, 6);
ctx.setTransform([]);
var newTransformFromEmptyArray = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromEmptyArray", [1, 0, 0, 1, 0, 0]);

ctx.setTransform(1, 2, 3, 4, 5, 6);
ctx.setTransform([1, 2, 3, 4, 5, 6]);
var newTransformFromArray = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromArray", [1, 0, 0, 1, 0, 0]);

ctx.setTransform(1, 2, 3, 4, 5, 6);
ctx.setTransform(["test"]);
var newTransformFromInvalidArray = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromInvalidArray", [1, 0, 0, 1, 0, 0]);

ctx.setTransform(1, 2, 3, 4, 5, 6);
ctx.setTransform();
var newTransformFromNoArgument = ctx.getTransform();
shouldHaveMatrixEquality("newTransformFromNoArgument", [1, 0, 0, 1, 0, 0]);

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

