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

  const testName = "Validate enabledFeatures on XRSession";

  const supportedFeatureList = [
    'viewer',
    'local',
    'local-floor',
    'anchors',
    'hit-test',
    'dom-overlay'
  ];

  const fakeDeviceInitParams = {
    supportsImmersive: true,
    supportedModes: ["inline", "immersive-vr"],
    views: VALID_VIEWS,
    viewerOrigin: IDENTITY_TRANSFORM,
    supportedFeatures: supportedFeatureList
  };

  // NOTE: We explicit don't ask for the 'default' features of viewer/local to
  // verify that they are being added here.
  const requestFeatures = [
    'local-floor',
    'anchors',
    'secondary-views',
    'camera-access',
  ];

const testFunction = function(session, fakeDeviceController, t) {
  return new Promise((resolve,reject) => {
    const unsupportedRequestedFeatures = [];

    for (const feature of requestFeatures) {
      if (!supportedFeatureList.includes(feature))
      unsupportedRequestedFeatures.push(feature);
    }

    const enabledFeatures = session.enabledFeatures;
    const modeDefaultFeatures = DEFAULT_FEATURES[session.mode];

    t.step(() => {
      // Whether they were requested or not, all Default features should be
      // enabled.
      for (const feature of modeDefaultFeatures) {
        assert_true(enabledFeatures.includes(feature),
          "Did not support default feature: " + feature);
      }

      // Assert that we asked for everything that was included apart from the
      // default features
      for (const feature of enabledFeatures) {
        assert_true(requestFeatures.includes(feature) ||
                    modeDefaultFeatures.includes(feature),
                    "Enabled unrequested feature: " + feature);
      }

      // Assert that all of the features we asked are either excluded because
      // they were unsupported, or included because they were supported.
      for (const feature of requestFeatures) {
        if (unsupportedRequestedFeatures.includes(feature)) {
          assert_false(enabledFeatures.includes(feature),
            "Enabled supposedly unsupported feature: " + feature);
        } else {
          assert_true(enabledFeatures.includes(feature),
            "Did not enable supposedly supported feature: " + feature);
        }
      }
    });

    resolve();
  });
};

xr_session_promise_test(testName, testFunction,
  fakeDeviceInitParams, 'immersive-vr', { optionalFeatures: requestFeatures });

</script>
</body>
