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

<script>
let testName =
  "'XRBoundedReferenceSpace updates properly when the changes are applied";

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

let testFunction = function(session, fakeDeviceController, t) {

  return new Promise((resolve, reject) => {
    session.requestReferenceSpace('bounded-floor')
      .then((referenceSpace) => {
          t.step(() => {
              // A bounded space may be created if no bounds have been set but the system has the capability to support bounded-floor
              // A lack of bounds is indicated by an empty boundsGeometry
              assert_equals(referenceSpace.boundsGeometry.length, 0);
          });

          function onFrame(time, xrFrame) {
            // After the bounds have been explicitly set, they should be what we expect.
            t.step(() => {
              assert_equals(referenceSpace.boundsGeometry.length, VALID_BOUNDS.length);
              for (i = 0; i < VALID_BOUNDS.length; ++i) {
                let valid_point = VALID_BOUNDS[i];
                let bounds_point = referenceSpace.boundsGeometry[i];
                assert_equals(valid_point.x, bounds_point.x);
                assert_equals(bounds_point.y, 0.0);
                assert_equals(valid_point.z, bounds_point.z);
                assert_equals(bounds_point.w, 1.0);
              }
            });

            resolve();
          }

          // Now set the bounds explicitly and check again on the next frame.
          fakeDeviceController.setBoundsGeometry(VALID_BOUNDS);
          requestSkipAnimationFrame(session, onFrame);
        });
    });
};

xr_session_promise_test(testName, testFunction, fakeDeviceInitParams, 'immersive-vr', { 'requiredFeatures': ['bounded-floor'] });

</script>
