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

<script>

let immersiveTestName = "XRWebGLLayer reports a valid viewports for immersive sessions";
let inlineTestName = "XRWebGLLayer reports a valid viewports for inline sessions";

let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;

let testFunction = function(session, fakeDeviceController, t) {
  return session.requestReferenceSpace('viewer')
      .then((space) => new Promise((resolve) => {
    function onFrame(time, xrFrame) {
      let viewer_pose = xrFrame.getViewerPose(space);

      let layer = xrFrame.session.renderState.baseLayer;
      for (view of viewer_pose.views) {
        let viewport = layer.getViewport(view);

        t.step(() => {
          // Ensure the returned object is an XRViewport object
          assert_not_equals(viewport, null);
          assert_true(viewport instanceof XRViewport);

          // Ensure the viewport dimensions are valid
          assert_greater_than_equal(viewport.x, 0);
          assert_greater_than_equal(viewport.y, 0);
          assert_greater_than_equal(viewport.width, 1);
          assert_greater_than_equal(viewport.height, 1);
        });

        // Ensure none of the viewports overlap
        for (other of viewer_pose.views) {
          if (view !== other) {
            let otherport = layer.getViewport(other);
            let no_overlap = (viewport.x + viewport.width <= otherport.x) ||
              (otherport.x + otherport.width <= viewport.x) ||
              (viewport.y + viewport.height <= otherport.y) ||
              (otherport.y + otherport.height <= viewport.y);

            t.step(() => {
              assert_true(no_overlap, "Overlap between viewport " + view.eye + " and " + other.eye);
            });
          }
        }
      }

      // Finished test.
      resolve();
    }

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

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

</script>
