<!DOCTYPE html>
<body>
  <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>
  <canvas></canvas>

  <script>

    let immersiveTestName =
      "Identity reference space provides correct poses for immersive sessions";
    let inlineTestName =
      "Identity reference space provides correct poses for inline sessions";

    let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;

    let testFunction = function(session, fakeDeviceController, t) {
      return session.requestReferenceSpace('viewer')
        .then((referenceSpace) => new Promise((resolve, reject) => {
          let counter = 0;
          function onFrame(time, xrFrame) {
            session.requestAnimationFrame(onFrame);
            if (counter == 0) {
              t.step( () => {
                // Expect to always get a pose, even if none has been supplied.
                let pose = xrFrame.getViewerPose(referenceSpace);
                assert_not_equals(pose, null);

                let poseMatrix = pose.transform.matrix;
                assert_not_equals(poseMatrix, null);

                for(let i = 0; i < poseMatrix.length; i++) {
                  assert_equals(poseMatrix[i], IDENTITY_MATRIX[i]);
                }

                fakeDeviceController.setViewerOrigin(VALID_POSE_TRANSFORM);
              });
            } else {
              t.step( () => {
                // Assert that the identity matrix is always given as the pose
                // even when a valid pose is set by the device.
                let pose = xrFrame.getViewerPose(referenceSpace);
                assert_not_equals(pose, null);

                let poseMatrix = pose.transform.matrix;
                assert_not_equals(poseMatrix, null);

                for(let i = 0; i < poseMatrix.length; i++) {
                  assert_equals(poseMatrix[i], IDENTITY_MATRIX[i]);
                }
              });

              // Finished.
              resolve();
            }
            counter++;
          }

          session.requestAnimationFrame(onFrame);
        }));
    };

    xr_session_promise_test(inlineTestName, testFunction,
      fakeDeviceInitParams, 'inline');
    xr_session_promise_test(immersiveTestName, testFunction,
      fakeDeviceInitParams, 'immersive-vr');

  </script>
</body>
