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

const fillLightModeNames = ['off', 'auto', 'flash'];

// This test verifies that ImageCapture can call getPhotoSettings(), 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 mockState = imageCaptureTest.mockImageCapture().state();
  let capturer = new ImageCapture(stream.getVideoTracks()[0]);
  let settings = await capturer.getPhotoSettings();
  assert_equals(settings.imageWidth, mockState.width.current, 'width');
  assert_equals(settings.imageHeight, mockState.height.current, 'height');
  // TODO(mcasas): check the remaining two entries https://crbug.com/732521.

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

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.getPhotoSettings())

}, 'getPhotoSettings() 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.getPhotoSettings()
  .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 settings');

</script>
