<!doctype html>
<meta charset=utf-8>
<title>RTCRtpSendParameters degradationPreference</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
  'use strict';

promise_test(async t => {
  const pc = new RTCPeerConnection();
  t.add_cleanup(() => pc.close());
  const { sender } = pc.addTransceiver('video');

  let param = sender.getParameters();

  assert_equals(param.degradationPreference, undefined,
    'Expect initial param.degradationPreference to be undefined');

  param.degradationPreference = 'maintain-framerate';
  await sender.setParameters(param);
  param = sender.getParameters();
  assert_equals(param.degradationPreference, 'maintain-framerate');

  param.degradationPreference = 'maintain-resolution';
  await sender.setParameters(param);
  param = sender.getParameters();
  assert_equals(param.degradationPreference, 'maintain-resolution');

  param.degradationPreference = 'balanced';
  await sender.setParameters(param);
  param = sender.getParameters();
  assert_equals(param.degradationPreference, 'balanced');

  param.degradationPreference = undefined;
  await sender.setParameters(param);
  param = sender.getParameters();
  assert_equals(param.degradationPreference, undefined);
}, 'setParameters with degradationPreference set should succeed on video transceiver');

promise_test(async t => {
  const pc = new RTCPeerConnection();
  t.add_cleanup(() => pc.close());
  const { sender } = pc.addTransceiver('video');

  let param = sender.getParameters();

  assert_equals(param.degradationPreference, undefined,
    'Expect initial param.degradationPreference to be undefined');

  param.degradationPreference = undefined;

  await sender.setParameters(param);

  param = sender.getParameters();
  assert_equals(param.degradationPreference, undefined);
}, 'setParameters with degradationPreference unset should succeed on video transceiver');

promise_test(async t => {
  const pc = new RTCPeerConnection();
  t.add_cleanup(() => pc.close());
  const { sender } = pc.addTransceiver('video');

  let param = sender.getParameters();
  param.degradationPreference = 'invalid';

  return promise_rejects_js(t, TypeError, sender.setParameters(param));
}, 'setParameters with invalid degradationPreference should throw TypeError on video transceiver');

promise_test(async t => {
  const pc = new RTCPeerConnection();
  t.add_cleanup(() => pc.close());
  const { sender } = pc.addTransceiver('audio');

  let param = sender.getParameters();

  assert_equals(param.degradationPreference, undefined,
    'Expect initial param.degradationPreference to be undefined');

  param.degradationPreference = 'maintain-framerate';
  await sender.setParameters(param);
  param = sender.getParameters();
  assert_equals(param.degradationPreference, 'maintain-framerate');

  param.degradationPreference = 'maintain-resolution';
  await sender.setParameters(param);
  param = sender.getParameters();
  assert_equals(param.degradationPreference, 'maintain-resolution');

  param.degradationPreference = 'balanced';
  await sender.setParameters(param);
  param = sender.getParameters();
  assert_equals(param.degradationPreference, 'balanced');

  param.degradationPreference = undefined;
  await sender.setParameters(param);
  param = sender.getParameters();
  assert_equals(param.degradationPreference, undefined);
}, 'setParameters with degradationPreference set should succeed on audio transceiver');

promise_test(async t => {
  const pc = new RTCPeerConnection();
  t.add_cleanup(() => pc.close());
  const { sender } = pc.addTransceiver('audio');

  let param = sender.getParameters();

  assert_equals(param.degradationPreference, undefined,
    'Expect initial param.degradationPreference to be undefined');

  param.degradationPreference = undefined;

  await sender.setParameters(param);

  param = sender.getParameters();
  assert_equals(param.degradationPreference, undefined);
}, 'setParameters with degradationPreference unset should succeed on audio transceiver');

promise_test(async t => {
  const pc = new RTCPeerConnection();
  t.add_cleanup(() => pc.close());
  const { sender } = pc.addTransceiver('audio');

  let param = sender.getParameters();
  param.degradationPreference = 'invalid';

  return promise_rejects_js(t, TypeError, sender.setParameters(param));
}, 'setParameters with invalid degradationPreference should throw TypeError on audio transceiver');

</script>
