<!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>

    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>
