<!doctype html>
<title>MediaStreamTrack applyConstraints</title>
<p class="instructions">When prompted, accept to share your video stream.</p>
<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=permission-helper.js></script>
<script>
  'use strict'

  // https://w3c.github.io/mediacapture-main/#dom-mediastreamtrack-applyconstraints

  promise_test(async t => {
    await setMediaPermission("granted", ["camera"]);
    return navigator.mediaDevices.getUserMedia({ video: true })
      .then(t.step_func(stream => {
        return stream.getVideoTracks()[0].applyConstraints(
          { groupId: { exact: "INVALID" } }).then(
            t.unreached_func('Accepted invalid groupID'),
            t.step_func(e => {
              assert_equals(e.name, 'OverconstrainedError');
              assert_equals(e.constraint, 'groupId');
            }));
      }));
  }, 'applyConstraints rejects invalid groupID');

  promise_test(t => {
    return navigator.mediaDevices.getUserMedia({ video: true })
      .then(t.step_func(stream => {
        var track = stream.getVideoTracks()[0];
        var groupId = track.getSettings().groupId;
        return track.applyConstraints({ groupId: "INVALID" }).then(
          t.step_func(() => {
            assert_equals(track.getSettings().groupId, groupId);
          }));
      }));
  }, 'applyConstraints accepts invalid ideal groupID, does not change setting');

  promise_test(t => {
    return navigator.mediaDevices.getUserMedia({ video: true })
      .then(t.step_func(stream => {
        var track = stream.getVideoTracks()[0];
        var groupId = track.getSettings().groupId;
        return navigator.mediaDevices.enumerateDevices().then(devices => {
          var anotherDevice = devices.find(device => {
            return device.kind == "videoinput" && device.groupId != groupId;
          });
          if (anotherDevice !== undefined) {
            return track.applyConstraints(
              { groupId: { exact: anotherDevice.groupId } }).then(
                t.unreached_func(),
                t.step_func(e => {
                  assert_equals(e.name, 'OverconstrainedError');
                  assert_equals(e.constraint, 'groupId');
                }));
          }
        });
      }));
  }, 'applyConstraints rejects attempt to switch device using groupId');

  promise_test(async t => {
    const stream = await navigator.mediaDevices.getUserMedia({ video: true });
    const [track] = stream.getVideoTracks();
    t.add_cleanup(() => track.stop());
    try {
      await track.applyConstraints({ resizeMode: { exact: "INVALID" } });
      t.unreached_func('applyConstraints() must fail with invalid resizeMode')();
    } catch (e) {
      assert_equals(e.name, 'OverconstrainedError');
      assert_equals(e.constraint, 'resizeMode');
    }
  }, 'applyConstraints rejects invalid resizeMode');

  promise_test(async t => {
    const stream = await navigator.mediaDevices.getUserMedia({ video: true });
    const [track] = stream.getVideoTracks();
    t.add_cleanup(() => track.stop());
    const resizeMode = track.getSettings().resizeMode;
    await track.applyConstraints({ resizeMode: "INVALID" });
    assert_equals(track.getSettings().resizeMode, resizeMode);
  }, 'applyConstraints accepts invalid ideal resizeMode, does not change setting');
</script>
