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

<script>

const fakeDeviceInitParams = {
  supportedModes: ["immersive-ar"],
  views: VALID_VIEWS,
  supportedFeatures: ALL_FEATURES,
};

const test_camera_present = (session, fakeDeviceController, t) => {
  return session.requestReferenceSpace('viewer').then(viewerRefSpace => {
    return new Promise((resolve, reject) => {
      const requestAnimationFrameCallbackWithCamera = (time, frame) => {
        const viewerPose = frame.getViewerPose(viewerRefSpace);

        t.step(() => {
          let foundCamera = false;

          assert_not_equals(viewerPose, null, "Viewer pose should not be null!");
          assert_equals(viewerPose.views.length, VALID_VIEWS.length, "View lengths should match!");

          for (const view of viewerPose.views) {
            if (view.camera) {
              assert_equals(view.camera.width, 333, "Width doesn't match expectations!");
              assert_equals(view.camera.height, 444, "Height doesn't match expectations!");

              foundCamera = true;
            }
          }

          assert_true(foundCamera, "There should be at least one camera! Didn't find any.")
        });

        resolve();
      };

      const requestAnimationFrameCallbackNoCamera = (time, frame) => {

        const viewerPose = frame.getViewerPose(viewerRefSpace);
        t.step(() => {
          assert_not_equals(viewerPose, null, "Viewer pose should not be null!");
          assert_equals(viewerPose.views.length, VALID_VIEWS.length, "View lengths should match!");

          for (const view of viewerPose.views) {
            assert_equals(view.camera, null, "Camera should be null!");
          }
        });

        const views_with_camera = VALID_VIEWS.map((element, index) => {
          return {
            ...element,
            resolution: { width: 111 * (index+1),  height: 222 * (index+1)},
            cameraImageInit: { width: 333, height: 444 },
          };
        });
        fakeDeviceController.setViews(views_with_camera);

        // After this rAFcb, the test is supposed to continue w/ a callback that
        // expects XRCamera to be present:
        session.requestAnimationFrame(requestAnimationFrameCallbackWithCamera);
      };

      // Kick off the test - start with rAFcb w/o an XRCamera:
      session.requestAnimationFrame(requestAnimationFrameCallbackNoCamera);
    });
  });
};

xr_session_promise_test("XRCamera object is present and carries expected dimensions",
  test_camera_present,
  fakeDeviceInitParams, 'immersive-ar', {'requiredFeatures': ['camera-access']});

</script>