<!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/media/capture/mojo/image_capture.mojom.js"></script>
<script src="resources/mock-imagecapture.js"></script>
<body>
<canvas id='canvas' width=10 height=10/>
</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.setOptions() rejects if any passed
// option is unsupported or outside its allowed range.
function makePromiseTest(getOption) {
  promise_test(async function() {
    mockImageCapture.state().redEyeReduction = 0;

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

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

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' }),
];

for (key in optionsGenerators) {
  generate_tests(
      makePromiseTest,
      [[ 'ImageCapture.setOptions(options) rejects with bad options, #' + key,
         optionsGenerators[key] ]]);
}

</script>
