<!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 =
      "Immersive XRSession requestReferenceSpace returns expected objects";
    let nonImmersiveTestName =
      "Non-immersive XRSession requestReferenceSpace returns expected objects";

    let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;

    let testFunction = function(session, fakeDeviceController, t) {
      return promise_rejects_js(t, TypeError, session.requestReferenceSpace('foo'))
        .then(() => Promise.all([
        session.requestReferenceSpace('viewer').then( (referenceSpace) => {
            t.step(() => {
              assert_true(referenceSpace instanceof XRSpace,
                "identity reference space is not correct type.");
              assert_true(referenceSpace instanceof XRReferenceSpace,
                "identity reference space is not correct type.");
            });
          }),
          session.requestReferenceSpace('local').then( (referenceSpace) => {
            t.step(() => {
              assert_true(referenceSpace instanceof XRSpace,
                "eye-level stationary reference space is not correct type.");
              assert_true(referenceSpace instanceof XRReferenceSpace,
                "eye-level stationary reference space is not correct type.");
            });
          }),
          session.requestReferenceSpace('local-floor').then( (referenceSpace) => {
            t.step(() => {
              assert_true(referenceSpace instanceof XRSpace,
                "floor-level stationary reference space is not correct type.");
              assert_true(referenceSpace instanceof XRReferenceSpace,
                "floor-level stationary reference space is not correct type.");
            });
          })
        ]))
        .then(() => {
          if (session.mode == 'inline') {
            // Bounded reference spaces are not allowed in inline sessions.
            return promise_rejects_dom(t, "NotSupportedError", session.requestReferenceSpace('bounded-floor'))
          }
        })
        .then(() => {
          if (session.mode == 'inline') {
            // Unbounded reference spaces are not allowed in inline sessions.
            return promise_rejects_dom(t, "NotSupportedError", session.requestReferenceSpace('unbounded'))
          }
        })
    };

    // Reference spaces that aren't included in the default feature list must
    // be specified as a required or optional features on session creation.
    xr_session_promise_test(
      immersiveTestName, testFunction, fakeDeviceInitParams, 'immersive-vr',
        {requiredFeatures: ['local-floor'],
         optionalFeatures: ['bounded-floor', 'unbounded']});
    xr_session_promise_test(
      nonImmersiveTestName, testFunction, fakeDeviceInitParams, 'inline',
        {requiredFeatures: ['local'],
         optionalFeatures: ['local-floor']});

  </script>
</body>
