<!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"];

// 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.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.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.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.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.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.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.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.step, mock_capabilities.zoom.step);

        assert_equals(capabilities.torch, mock_capabilities.supports_torch, 'torch');

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

}, 'exercises MediaStreamTrack.getCapabilities()');

</script>
