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

let testName = "XRRigidTransform constructor works";
let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;

let testFunction =
  (session, fakeDeviceController, t) => new Promise((resolve, reject) => {
  let coordDict = function(coords) {
    let tempDict = {
        x : coords[0],
        y : coords[1],
        z : coords[2]
    }

    if (coords.length >= 4) {
        tempDict["w"] = coords[3];
    }

    return tempDict;
  };

  let createDOMPoint = function(coords) {
    return DOMPoint.fromPoint(coordDict(coords));
  };

  let createDOMPointReadOnly = function(coords) {
    return DOMPointReadOnly.fromPoint(coordDict(coords));
  };

  let quaternionLength = function(point) {
    return Math.sqrt(
        (point.x * point.x) +
        (point.y * point.y) +
        (point.z * point.z) +
        (point.w * point.w));
  };

  let checkDOMPoint = function(point, x, y, z, w, desc) {
    t.step(() => {
      assert_approx_equals(point.x, x, FLOAT_EPSILON, `${desc}: x value`);
      assert_approx_equals(point.y, y, FLOAT_EPSILON, `${desc}: y value`);
      assert_approx_equals(point.z, z, FLOAT_EPSILON, `${desc}: z value`);
      assert_approx_equals(point.w, w, FLOAT_EPSILON, `${desc}: w value`);
    });
  };

  let checkTransform = function(transformObj, desc) {
    t.step(() => {
      assert_not_equals(transformObj, null, `${desc}: exists`);
      assert_not_equals(transformObj.position, null, `${desc}: position exists`);
      assert_not_equals(transformObj.orientation, null, `${desc}: orientation exists`);
      assert_not_equals(transformObj.matrix, null, `${desc}: matrix exists`);
      assert_equals(transformObj.matrix.length, 16, `${desc}: matrix of correct length`);
    });
  };

  // test creating transform with specified position and orientation
  // make sure that orientation was normalized to have length = 1.0
  let transform = new XRRigidTransform(
      createDOMPoint([1.0, 2.0, 3.0]),
      createDOMPoint([1.1, 2.1, 3.1, 1.0]));
  checkTransform(transform, "Arbitrary transform");
  checkDOMPoint(transform.position, 1.0, 2.0, 3.0, 1.0, "Arbitrary transform position");
  assert_approx_equals(quaternionLength(transform.orientation), 1.0, FLOAT_EPSILON,
                       "Arbitrary transform is normalized");

  // test creating identity transform
  let identity = new XRRigidTransform();
  checkTransform(identity, "Identity transform");
  checkDOMPoint(identity.position, 0.0, 0.0, 0.0, 1.0, "Identity transform position");
  checkDOMPoint(identity.orientation, 0.0, 0.0, 0.0, 1.0, "Identity transform orientation");

  // create transform with only position specified
  transform = new XRRigidTransform(createDOMPoint([1.0, 2.0, 3.0]));
  checkTransform(transform, "Position-only");

  // create transform with only orientation specified
  transform = new XRRigidTransform(undefined, createDOMPoint([1.1, 2.1, 3.1, 1.0]));
  checkTransform(transform, "orientation-only");

  // create transform with DOMPointReadOnly
  transform = new XRRigidTransform(
      createDOMPointReadOnly([1.0, 2.0, 3.0]),
      createDOMPointReadOnly([1.1, 2.1, 3.1, 1.0]));
  checkTransform(transform, "Created with DOMPointReadOnly");

  // create transform with dictionary
  transform = new XRRigidTransform(
      coordDict([1.0, 2.0, 3.0]),
      coordDict([1.1, 2.1, 3.1, 1.0]));
  checkTransform(transform, "Created with dict");

  assert_throws_js(TypeError, () => new XRRigidTransform(
      coordDict([1.0, 2.0, 3.0, 0.5]),
      coordDict([1.1, 2.1, 3.1, 1.0])
  ), "Constructor should throw TypeError for non-1 position w values");

  assert_throws_dom("InvalidStateError", () => new XRRigidTransform(
      coordDict([1.0, 2.0, 3.0, 1.0]),
      coordDict([0, 0, 0, 0])
  ), "Constructor should throw InvalidStateError for non-normalizeable orientation values");
  resolve();
});

xr_session_promise_test(testName, testFunction, fakeDeviceInitParams,
    'immersive-vr');

</script>
