<!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(async t => {
    let long_string_groupId = "2".padStart(501);
    await setMediaPermission("granted", ["camera"]);
    return navigator.mediaDevices.getUserMedia({ video: true })
      .then(t.step_func(stream => {
        return stream.getVideoTracks()[0].applyConstraints(
          { groupId: { ideal: long_string_groupId } }).then(
            t.unreached_func('Accepted ideal long string groupID'),
            t.step_func(e => {
              assert_equals(e.name, 'OverconstrainedError');
            }));
      }));
  }, 'applyConstraints rejects long string ideal groupID');

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

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

  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>
