<!doctype html>
<!--
Tests that the provided WebXR device has the expected capabilities
-->
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="../resources/webxr_e2e.css">
  </head>
  <body>
    <canvas id="webgl-canvas"></canvas>
    <script src="../../../../../../third_party/blink/web_tests/resources/testharness.js"></script>
    <script src="../resources/webxr_e2e.js"></script>
    <script src="../resources/webxr_boilerplate.js"></script>
    <script>
      var expectations = {
        "Daydream": {
          "immersive": true,
          "non-immersive": true,
        }
      };
      var t = async_test("XRDevice capabilities match expectations");

      function stepCheckCapabilities(device) {
        if (!(device in expectations)) {
          t.step_func_done( () => {
            assert_unreached("Given device " + device + " not in expectations");
          })();
          return;
        }

        let expected = expectations[device];
        var supportsNonImmersive;
        var supportsImmersive;
        var ctx = webglCanvas.getContext("xrpresent");
        xrDevice.supportsSession(
            {immersive: false, outputContext: ctx}).then( () => {
          supportsNonImmersive = true;
        }, () => {
          supportsNonImmersive = false;
        }).then( () => {
          xrDevice.supportsSession({immersive: true}).then( () => {
            supportsImmersive = true;
          }, () => {
            supportsImmersive = false;
          }).then( () => {
            t.step( () => {
              assert_equals(supportsNonImmersive, expected["non-immersive"],
                  'Device supports non-immersive sessions');
              assert_equals(supportsImmersive, expected["immersive"],
                  'Device supports immersive sessions');
            });
            t.done();
          });
        });
      }
    </script>
  </body>
</html>
