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

const meteringModeNames = ['none', 'manual', 'single-shot', 'continuous'];

// This test verifies that we can all MediaStreamTrack.applyConstraints(), with
// a mock Mojo service implementation.

image_capture_test(async (t, imageCaptureTest) => {
  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,
                                      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('applyConstraints(): ' + error.message);
    }

    const constraintsDict = constraints.advanced[0];
    let appliedConstraints = videoTrack.getConstraints();
    const appliedConstraintsDict = appliedConstraints.advanced[0];

    // Check that |appliedConstraints| and |constraints| are equal.
    assert_equals(constraintsDict.length, appliedConstraintsDict.length);
    Object.keys(appliedConstraintsDict).forEach((key, value) => {
      assert_not_equals(constraintsDict[key], undefined, 'key ' + key);
      if (key != 'pointsOfInterest') {
        assert_equals(constraintsDict[key], appliedConstraintsDict[key], key);
      } else {
        assert_point2d_array_approx_equals(constraintsDict[key],
                                           appliedConstraintsDict[key], 0.01);
      }
    });

    let theMock = imageCaptureTest.mockImageCapture();
    assert_equals(constraintsDict.whiteBalanceMode,
                  meteringModeNames[theMock.options().whiteBalanceMode],
                  'whiteBalanceMode');
    assert_equals(constraintsDict.exposureMode,
                  meteringModeNames[theMock.options().exposureMode],
                  'exposureMode');
    assert_equals(constraintsDict.focusMode,
                  meteringModeNames[theMock.options().focusMode],
                  'focusMode');

    assert_point2d_array_approx_equals(constraintsDict.pointsOfInterest,
                                       theMock.options().pointsOfInterest,
                                       0.01);

    assert_equals(constraintsDict.exposureCompensation,
                  theMock.options().exposureCompensation,
                  'exposureCompensation');
    assert_equals(constraintsDict.exposureTime,
                  theMock.options().exposureTime,
                  'exposureTime');
    assert_equals(constraintsDict.colorTemperature,
                  theMock.options().colorTemperature, 'colorTemperature');
    assert_equals(constraintsDict.iso, theMock.options().iso, 'iso');

    assert_equals(constraintsDict.brightness, theMock.options().brightness,
                  'brightness');
    assert_equals(constraintsDict.contrast, theMock.options().contrast,
                  'constrast');
    assert_equals(constraintsDict.saturation, theMock.options().saturation,
                  'saturation');
    assert_equals(constraintsDict.sharpness, theMock.options().sharpness,
                  'sharpness');
    assert_equals(constraintsDict.focusDistance, theMock.options().focusDistance
                  ,'focusDistance');

    assert_equals(constraintsDict.pan, theMock.options().pan, 'pan');
    assert_equals(constraintsDict.tilt, theMock.options().tilt, 'tilt');
    assert_equals(constraintsDict.zoom, theMock.options().zoom, 'zoom');

    assert_equals(constraintsDict.torch, theMock.options().torch, 'torch');

}, 'exercises MediaStreamTrack.applyConstraints(constraints)');

</script>
