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

// This test verifies that ImageCapture can get PhotoCapabilities(), with a mock
// Mojo interface implementation.

image_capture_test(async (t, imageCaptureTest) => {
  let canvas = document.getElementById('canvas');
  let context = canvas.getContext('2d');
  context.fillStyle = 'red';
  context.fillRect(0, 0, 10, 10);
  let stream = canvas.captureStream();

  let mockCapabilities = imageCaptureTest.mockImageCapture().state();
  let capturer = new ImageCapture(stream.getVideoTracks()[0]);
  assert_equals(typeof capturer.getPhotoCapabilities, 'function');

  let capabilities = await capturer.getPhotoCapabilities();

  assert_equals(capabilities.redEyeReduction, 'controllable',
                'redEyeReduction');

  assert_equals(capabilities.imageHeight.max, mockCapabilities.height.max);
  assert_equals(capabilities.imageHeight.min, mockCapabilities.height.min);
  assert_equals(capabilities.imageHeight.step, mockCapabilities.height.step);

  assert_equals(capabilities.imageWidth.max, mockCapabilities.width.max);
  assert_equals(capabilities.imageWidth.min, mockCapabilities.width.min);
  assert_equals(capabilities.imageWidth.step, mockCapabilities.width.step);

  assert_array_equals(capabilities.fillLightMode, [ 'auto', 'flash' ],
                      'fillLightMode');

}, 'exercises ImageCapture.getPhotoCapabilities()');

promise_test(t => {
  let canvas = document.getElementById('canvas');
  let context = canvas.getContext('2d');
  context.fillStyle = 'red';
  context.fillRect(0, 0, 10, 10);
  let stream = canvas.captureStream();
  let videoTrack = stream.getVideoTracks()[0];
  videoTrack.stop();

  let capturer = new ImageCapture(videoTrack);
  assert_equals(videoTrack.readyState, 'ended');

  return promise_rejects_dom(t, 'InvalidStateError', capturer.getPhotoCapabilities())

}, 'getPhotoCapabilities() of an ended Track should throw "InvalidStateError"');

async_test(t => {
  let canvas = document.getElementById('canvas');
  let context = canvas.getContext('2d');
  context.fillStyle = 'red';
  context.fillRect(0, 0, 10, 10);
  let stream = canvas.captureStream();
  let videoTrack = stream.getVideoTracks()[0];

  let capturer = new ImageCapture(videoTrack);
  capturer.getPhotoCapabilities()
  .then(t.step_func_done(() => assert_unreached('should throw "OperationError"')))
  .catch(t.step_func_done(e => assert_equals(e.name, 'OperationError')))
  videoTrack.stop();
}, 'throw "OperationError" when the MediaStreamTrack is stopped while getting photo capabilities');

</script>
