<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/mediacapture-image/resources/imagecapture-helpers.js"></script>
<script>

// This test verifies that the |constraints| configured in the mock Mojo
// service implementation, are returned by MediaStreamTrack.getSettings().

image_capture_test(async t => {
  await test_driver.set_permission({name: 'camera', panTiltZoom: true},
        'granted', false);

  const constraints = { advanced : [{ whiteBalanceMode : 'single-shot',
                                      exposureMode     : 'manual',
                                      focusMode        : 'single-shot',

                                      pointsOfInterest : [{x : 0.1, y : 0.2},
                                                          {x : 0.3, y : 0.4}],

                                      exposureCompensation : 133.77,
                                      // in nano-seconds.
                                      exposureTime         : 10000,
                                      colorTemperature     : 6000,
                                      iso                  : 120.0,

                                      brightness           : 3,
                                      contrast             : 4,
                                      saturation           : 5,
                                      sharpness            : 6,
                                      focusDistance        : 7,

                                      pan                  : 8,
                                      tilt                 : 9,
                                      zoom                 : 3.141592,

                                      torch                : true
                                    }]};

  let stream = await navigator.mediaDevices.getUserMedia({video: true});
  let videoTrack = stream.getVideoTracks()[0];

  try {
    await videoTrack.applyConstraints(constraints);
  } catch (error) {
    assert_unreached('Error applying constraints: ' + error.message);
  }

  let settings = videoTrack.getSettings();
  assert_equals(typeof settings, 'object');

  assert_equals(constraints.advanced[0].whiteBalanceMode,
                settings.whiteBalanceMode, 'whiteBalanceMode');
  assert_equals(constraints.advanced[0].exposureMode, settings.exposureMode,
                'exposureMode');
  assert_equals(constraints.advanced[0].focusMode, settings.focusMode,
                'focusMode');

  assert_point2d_array_approx_equals(
      constraints.advanced[0].pointsOfInterest, settings.pointsOfInterest,
      0.01);

  assert_equals(constraints.advanced[0].exposureCompensation,
                settings.exposureCompensation, 'exposureCompensation');
  assert_equals(constraints.advanced[0].exposureTime,
                settings.exposureTime, 'exposureTime');
  assert_equals(constraints.advanced[0].colorTemperature,
                settings.colorTemperature, 'colorTemperature');
  assert_equals(constraints.advanced[0].iso, settings.iso, 'iso');

  assert_equals(constraints.advanced[0].brightness, settings.brightness,
                'brightness');
  assert_equals(constraints.advanced[0].contrast, settings.contrast,
                'contrast');
  assert_equals(constraints.advanced[0].saturation, settings.saturation,
                'saturation');
  assert_equals(constraints.advanced[0].sharpness, settings.sharpness,
                'sharpness');

  assert_equals(constraints.advanced[0].focusDistance, settings.focusDistance,
                'focusDistance');

  assert_equals(constraints.advanced[0].pan, settings.pan, 'pan');
  assert_equals(constraints.advanced[0].tilt, settings.tilt, 'tilt');
  assert_equals(constraints.advanced[0].zoom, settings.zoom, 'zoom');

  assert_equals(constraints.advanced[0].torch, settings.torch, 'torch');

}, 'exercises an applyConstraints() - getSettings() cycle with PTZ permission granted');


// This test verifies that the PTZ |constraints| configured in the mock Mojo
// service implementation can't be applied if PTZ permission is denied.

image_capture_test(async t => {
  await test_driver.set_permission({name: 'camera', panTiltZoom: true},
      'denied', false);

  let stream = await navigator.mediaDevices.getUserMedia({video: true});
  let videoTrack = stream.getVideoTracks()[0];

  const constraints = [{ pan: 8 }, { tilt: 9 }];
  await Promise.all(constraints.map(async constraint =>
    promise_rejects_dom(
        t, 'NotSupportedError',
        videoTrack.applyConstraints({ advanced: [constraint] }),
        "applyConstraints should throw a NotSupportedError for " +
        JSON.stringify(constraint))
  ));

}, 'exercises an applyConstraints() with PTZ permission denied');

</script>
