<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
<body>
<canvas id='canvas' width=10 height=10></canvas>
</body>
<script>

let canvas = document.getElementById('canvas');
let context = canvas.getContext('2d');
context.fillStyle = 'red';
context.fillRect(0, 0, 10, 10);

// This test verifies that ImageCapture.takePhoto() rejects if any passed
// option is unsupported or outside its allowed range.
function makePromiseTest(getOption, name) {
  image_capture_test(async (t, imageCaptureTest) => {
    imageCaptureTest.mockImageCapture().state().redEyeReduction = 0;

    let stream = canvas.captureStream();
    let capturer = new ImageCapture(stream.getVideoTracks()[0]);
    await capturer.getPhotoCapabilities();
    const options = getOption(imageCaptureTest.mockImageCapture().state());

    try {
      await capturer.takePhoto(options);
      assert_unreached('expected takePhoto to reject');
    } catch (error) {
      assert_equals(error.name, 'NotSupportedError');
    }
  }, name);
}

const optionsGenerators = [
  capabilities => ({ redEyeReduction: true }),
  capabilities => ({ imageHeight: capabilities.height.max + 1 }),
  capabilities => ({ imageHeight: capabilities.height.min - 1 }),
  capabilities => ({ imageWidth: capabilities.width.max + 1 }),
  capabilities => ({ imageWidth: capabilities.width.min - 1 }),
  capabilities => ({ fillLightMode: 'off' }),
];

optionsGenerators.forEach((optionsGenerator, key) => {
  makePromiseTest(
      optionsGenerator,
      `ImageCapture.takePhoto(options) rejects with bad options, #${key}`);
});
</script>
