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

<script>

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

// |shouldSucceed| - true if the hit test request is expected to succeed, false otherwise
// |endSession| - true if the test case should call session.end() prior to requesting hit test
const testFunctionGenerator = function(shouldSucceed, endSession) {
  const testFunction = function(session, fakeDeviceController, t) {
    session.requestReferenceSpace('viewer').then((viewerRefSpace) => {

      const hitTestOptionsInit = {
        space: viewerRefSpace,
        offsetRay: new XRRay(),
      };

      if(endSession) {
        session.end();
      }

      return session.requestHitTestSource(hitTestOptionsInit).then((hitTestSource) => {
        t.step(() => {
          assert_true(shouldSucceed,
            "`requestHitTestSource` succeeded when it was expected to fail");
        });
      }).catch((error) => {
        t.step(() => {
          assert_false(shouldSucceed,
            "`requestHitTestSource` failed when it was expected to succeed, error: " + error);
        });
      });
    });
  };

  return testFunction;
};

xr_session_promise_test("Hit test subscription succeeds if the feature was requested",
  testFunctionGenerator(/*shouldSucceed=*/true, /*endSession=*/false),
  fakeDeviceInitParams,
  'immersive-ar', { 'requiredFeatures': ['hit-test'] });

xr_session_promise_test("Hit test subscription fails if the feature was not requested",
  testFunctionGenerator(/*shouldSucceed=*/false, /*endSession=*/false),
  fakeDeviceInitParams,
  'immersive-ar', {});

xr_session_promise_test("Hit test subscription fails if the feature was requested but the session already ended",
  testFunctionGenerator(/*shouldSucceed=*/false, /*endSession=*/true),
  fakeDeviceInitParams,
  'immersive-ar', { 'requiredFeatures': ['hit-test'] });

</script>
