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

const meteringModeNames = ["none", "manual", "single-shot", "continuous"];
const fillLightModeNames = ["none", "off", "auto", "flash", "torch"];

// This test verifies that MediaTrackCapabilities are returned upon
// MediaStreamTrack.getCapabilities(), with a mock Mojo service implementation.

async_test(function(t) {
  var canvas = document.getElementById('canvas');
  var context = canvas.getContext("2d");
  context.fillStyle = "red";
  context.fillRect(0, 0, 10, 10);

  var mock_capabilities;
  mockImageCaptureReady
    .then(mock => {
      mock_capabilities = mock.capabilities();

      // |stream| must be created _after_ |mock| is constructed to give the
      // latter time to override the bindings.
      var stream = canvas.captureStream();
      assert_equals(stream.getAudioTracks().length, 0);
      assert_equals(stream.getVideoTracks().length, 1);

      var videoTrack = stream.getVideoTracks()[0];
      assert_equals(typeof videoTrack.getCapabilities, 'function');

      // |videoTrack|s capabilities, just like the actual capture, is a process
      // kicked right after creation, we introduce a small delay to allow for
      // those to be collected.
      setTimeout(() => {
        capabilities = videoTrack.getCapabilities();
        assert_equals(typeof capabilities, 'object');

        // TODO(mcasas): Change the following checks when the supported modes
        // are changed to a list: https://crbug.com/700607.
        assert_equals(capabilities.focusMode[0],
            meteringModeNames[mock_capabilities.focus_mode], 'focusMode');

        assert_equals(capabilities.exposureMode[0],
            meteringModeNames[mock_capabilities.exposure_mode], 'exposureMode;');

        assert_equals(capabilities.whiteBalanceMode[0],
            meteringModeNames[mock_capabilities.white_balance_mode],
            'whiteBalanceMode');

        assert_true(capabilities.exposureCompensation instanceof
                    MediaSettingsRange);
        assert_equals(capabilities.exposureCompensation.max,
                      mock_capabilities.exposure_compensation.max);
        assert_equals(capabilities.exposureCompensation.min,
                      mock_capabilities.exposure_compensation.min);
        assert_equals(capabilities.exposureCompensation.current,
                      mock_capabilities.exposure_compensation.current);
        assert_equals(capabilities.exposureCompensation.step,
                      mock_capabilities.exposure_compensation.step);

        assert_true(capabilities.colorTemperature instanceof MediaSettingsRange);
        assert_equals(capabilities.colorTemperature.max,
                      mock_capabilities.color_temperature.max);
        assert_equals(capabilities.colorTemperature.min,
                      mock_capabilities.color_temperature.min);
        assert_equals(capabilities.colorTemperature.current,
                      mock_capabilities.color_temperature.current);
        assert_equals(capabilities.colorTemperature.step,
                      mock_capabilities.color_temperature.step);

        assert_true(capabilities.iso instanceof MediaSettingsRange);
        assert_equals(capabilities.iso.max, mock_capabilities.iso.max);
        assert_equals(capabilities.iso.min, mock_capabilities.iso.min);
        assert_equals(capabilities.iso.current, mock_capabilities.iso.current);
        assert_equals(capabilities.iso.step, mock_capabilities.iso.step);

        assert_true(capabilities.brightness instanceof MediaSettingsRange);
        assert_equals(capabilities.brightness.max,
                      mock_capabilities.brightness.max);
        assert_equals(capabilities.brightness.min,
                      mock_capabilities.brightness.min);
        assert_equals(capabilities.brightness.current,
                      mock_capabilities.brightness.current);
        assert_equals(capabilities.brightness.step,
                      mock_capabilities.brightness.step);

        assert_true(capabilities.contrast instanceof MediaSettingsRange);
        assert_equals(capabilities.contrast.max, mock_capabilities.contrast.max);
        assert_equals(capabilities.contrast.min, mock_capabilities.contrast.min);
        assert_equals(capabilities.contrast.current,
                      mock_capabilities.contrast.current);
        assert_equals(capabilities.contrast.step,
                      mock_capabilities.contrast.step);

        assert_true(capabilities.saturation instanceof MediaSettingsRange);
        assert_equals(capabilities.saturation.max,
                      mock_capabilities.saturation.max);
        assert_equals(capabilities.saturation.min,
                      mock_capabilities.saturation.min);
        assert_equals(capabilities.saturation.current,
                      mock_capabilities.saturation.current);
        assert_equals(capabilities.saturation.step,
                      mock_capabilities.saturation.step);

        assert_true(capabilities.sharpness instanceof MediaSettingsRange);
        assert_equals(capabilities.sharpness.max,
                      mock_capabilities.sharpness.max);
        assert_equals(capabilities.sharpness.min,
                      mock_capabilities.sharpness.min);
        assert_equals(capabilities.sharpness.current,
                      mock_capabilities.sharpness.current);
        assert_equals(capabilities.sharpness.step,
                      mock_capabilities.sharpness.step);

        assert_true(capabilities.zoom instanceof MediaSettingsRange);
        assert_equals(capabilities.zoom.max, mock_capabilities.zoom.max);
        assert_equals(capabilities.zoom.min, mock_capabilities.zoom.min);
        assert_equals(capabilities.zoom.current, mock_capabilities.zoom.current);
        assert_equals(capabilities.zoom.step, mock_capabilities.zoom.step);

        // TODO(mcasas): check |torch| when the mojom interface is updated,
        // https://crbug.com/700607.

        t.done();
      }, 100);
    })
    .catch(error => {
      assert_unreached("Error creating MockImageCapture: " + error);
    })

}, 'exercises the retrieval of MediaTrackCapabilities');

</script>
