<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script>
<script src="../external/wpt/resources/chromium/webxr-test.js"></script>
<script src="resources/vr-test-utils.js "></script>
<script src="resources/test-constants.js"></script>

<canvas id="webgl-canvas"></canvas>
<script src="resources/presentation-setup.js"></script>
<script>
let fakeDisplays = fakeVRDisplays();
let fakeDisplay = fakeDisplays["Pixel"];

vr_test( (t) => {
  return navigator.getVRDisplays().then( (displays) => {
    let display = displays[0];
    let scale = fakeDisplay.webvrDefaultFramebufferScale;

    function compareEyes(actual, expected) {
      t.step( () => {
        assert_equals(actual.offset.length, expected.offset.length);
        for (let i = 0; i < expected.offset.length; i++) {
          assert_approx_equals(actual.offset[i], expected.offset[i],
              FLOAT_EPSILON);
        }

        assert_equals(actual.renderWidth, expected.renderWidth * scale);
        assert_equals(actual.renderHeight, expected.renderHeight * scale);
      }, "Returned eye parameters match provided parameters");
    }

    compareEyes(display.getEyeParameters("left"), fakeDisplay.leftEye);
    compareEyes(display.getEyeParameters("right"), fakeDisplay.rightEye);
    t.done();
  }, (err) => {
    t.step( () => {
      assert_unreached(err);
    }, "getVRDisplays rejected");
    t.done();
  });
}, [fakeDisplay],
"Test that actual eye parameters match the expected parameters");

</script>
