<!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>
  <script src="resources/webxr_test_asserts.js"></script>

  <script>

    let immersiveTestName =
      "XRFrame getViewerPose updates on the next frame for immersive sessions";
    let nonImmersiveTestName =
      "XRFrame getViewerPose updates on the next frame for non-immersive sessions";

    let fakeDeviceInitParams = {
      supportsImmersive: true,
      supportedModes: ["inline", "immersive-vr"],
      views: VALID_VIEWS,
      supportedFeatures: ALL_FEATURES
    };

    // A valid pose matrix/transform for  when we don't care about specific values
    // Note that these two should be identical, just different representations
    const expectedPoseMatrix = [0, 1, 0, 0,
                                0, 0, 1, 0,
                                1, 0, 0, 0,
                                1, 1, 1, 1];

    const poseTransform = {
        position: [1, 1, 1],
        orientation: [0.5, 0.5, 0.5, 0.5]
    };

    let testFunction = function(session, fakeDeviceController, t) {
      return session.requestReferenceSpace('local')
        .then((referenceSpace) => new Promise((resolve, reject) => {
          let counter = 0;
          function onFrame(time, vrFrame) {
            if (counter == 0) {
              t.step( () => {
                // Expecting to not get a pose since none has been supplied
                assert_equals(vrFrame.getViewerPose(referenceSpace), null);

                fakeDeviceController.setViewerOrigin(poseTransform);

                // Check that pose does not update pose within the same frame.
                assert_equals(vrFrame.getViewerPose(referenceSpace), null);
              });

              // In order to avoid race conditions, after we've set the viewer
              // pose, we queue up the next requestAnimationFrame. This should
              // ensure that the next frame will be able to get the appropriate
              // pose.
              // Note that since the next frame will immediately resolve and end
              // the test we only need to request a new frame once, here.
              session.requestAnimationFrame(onFrame);
            } else {
              t.step( () => {
                let pose = vrFrame.getViewerPose(referenceSpace);
                assert_not_equals(pose, null);

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

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

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

    xr_session_promise_test(nonImmersiveTestName, testFunction,
      fakeDeviceInitParams, 'inline', { 'requiredFeatures': ['local'] });
    xr_session_promise_test(immersiveTestName, testFunction,
      fakeDeviceInitParams, 'immersive-vr');

  </script>
</body>
